diff options
author | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2021-12-05 21:08:06 +0100 |
---|---|---|
committer | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2021-12-08 13:47:04 +0100 |
commit | c9b30992102bbc4120b5c0139d1aa8a2dbb2ebb0 (patch) | |
tree | a94e566c93b951df271892cc6a89f4f3e5994c38 | |
parent | a0900a318a60e38ffeb14c322b09f98fcbd97c73 (diff) | |
download | ffmpeg-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.c | 15 |
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; |