aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2021-12-05 21:08:06 +0100
committerAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2021-12-08 13:47:04 +0100
commitc9b30992102bbc4120b5c0139d1aa8a2dbb2ebb0 (patch)
treea94e566c93b951df271892cc6a89f4f3e5994c38
parenta0900a318a60e38ffeb14c322b09f98fcbd97c73 (diff)
downloadffmpeg-c9b30992102bbc4120b5c0139d1aa8a2dbb2ebb0.tar.gz
avformat/aadec: Don't unnecessarily reinitialize AVTEA context
We use ECB, not CBC mode here, so one does not need to reinitialize the context; for the same reason, one can also just let av_tea_crypt() loop over the blocks, avoiding a loop here. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
-rw-r--r--libavformat/aadec.c15
1 files changed, 4 insertions, 11 deletions
diff --git a/libavformat/aadec.c b/libavformat/aadec.c
index 7e97120070..24116b1f70 100644
--- a/libavformat/aadec.c
+++ b/libavformat/aadec.c
@@ -173,6 +173,7 @@ static int aa_read_header(AVFormatContext *s)
for (i = 0; i < 16; i++)
av_log(s, AV_LOG_DEBUG, "%02x", c->file_key[i]);
av_log(s, AV_LOG_DEBUG, "\n");
+ av_tea_init(c->tea_ctx, c->file_key, 16);
/* decoder setup */
st = avformat_new_stream(s, NULL);
@@ -246,9 +247,6 @@ static int aa_read_header(AVFormatContext *s)
static int aa_read_packet(AVFormatContext *s, AVPacket *pkt)
{
- int i;
- int blocks;
- uint8_t *buf;
int ret;
AADemuxContext *c = s->priv_data;
uint64_t pos = avio_tell(s->pb);
@@ -279,15 +277,10 @@ static int aa_read_packet(AVFormatContext *s, AVPacket *pkt)
if (ret != c->current_codec_second_size)
return AVERROR_EOF;
- buf = pkt->data;
- // decrypt c->current_codec_second_size bytes
+ // decrypt c->current_codec_second_size bytes in blocks of TEA_BLOCK_SIZE
// trailing bytes are left unencrypted!
- blocks = c->current_codec_second_size / TEA_BLOCK_SIZE;
- for (i = 0; i < blocks; i++) {
- av_tea_init(c->tea_ctx, c->file_key, 16);
- av_tea_crypt(c->tea_ctx, buf, buf, 1, NULL, 1);
- buf += TEA_BLOCK_SIZE;
- }
+ av_tea_crypt(c->tea_ctx, pkt->data, pkt->data,
+ c->current_codec_second_size / TEA_BLOCK_SIZE, NULL, 1);
// update state
c->current_chapter_size = c->current_chapter_size - c->current_codec_second_size;