summaryrefslogtreecommitdiff
path: root/libavformat/matroskadec.c
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2019-12-04 17:54:45 +0100
committerAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-05-01 08:15:07 +0200
commit96012d17a9f5003f2695e137c4876485e2fdb03a (patch)
tree97e9b5f340702cb9d1e52d566156c8b423bbfa0e /libavformat/matroskadec.c
parentb577968cabae4a0927adcf5d7c24fca5a7a8385d (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>
Diffstat (limited to 'libavformat/matroskadec.c')
-rw-r--r--libavformat/matroskadec.c9
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;