diff options
author | Andreas Rheinhardt <andreas.rheinhardt@gmail.com> | 2019-12-04 19:54:45 +0300 |
---|---|---|
committer | Andreas Rheinhardt <andreas.rheinhardt@gmail.com> | 2020-05-01 09:15:07 +0300 |
commit | 96012d17a9f5003f2695e137c4876485e2fdb03a (patch) | |
tree | 97e9b5f340702cb9d1e52d566156c8b423bbfa0e | |
parent | b577968cabae4a0927adcf5d7c24fca5a7a8385d (diff) |
avformat/matroskadec: Cache whether a track needs to be decoded
There is no need to recheck this for every frame.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
-rw-r--r-- | libavformat/matroskadec.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index 088eeabf2d..9e3e98e9c0 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -249,6 +249,7 @@ typedef struct MatroskaTrack { AVStream *stream; int64_t end_timecode; int ms_compat; + int needs_decoding; uint64_t max_block_additional_id; uint32_t palette[AVPALETTE_COUNT]; @@ -2405,6 +2406,11 @@ static int matroska_parse_tracks(AVFormatContext *s) } } } + track->needs_decoding = encodings && !encodings[0].type && + encodings[0].scope & 1 && + (encodings[0].compression.algo != + MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP || + encodings[0].compression.settings.size); for (j = 0; ff_mkv_codec_tags[j].id != AV_CODEC_ID_NONE; j++) { if (!strncmp(ff_mkv_codec_tags[j].str, track->codec_id, @@ -3413,12 +3419,11 @@ static int matroska_parse_frame(MatroskaDemuxContext *matroska, uint8_t *additional, uint64_t additional_id, int additional_size, int64_t discard_padding) { - MatroskaTrackEncoding *encodings = track->encodings.elem; uint8_t *pkt_data = data; int res = 0; AVPacket pktl, *pkt = &pktl; - if (encodings && !encodings->type && encodings->scope & 1) { + if (track->needs_decoding) { res = matroska_decode_buffer(&pkt_data, &pkt_size, track); if (res < 0) return res; |