summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
authorMatthieu Bouron <matthieu.bouron@stupeflix.com>2015-11-24 14:14:54 +0100
committerMatthieu Bouron <matthieu.bouron@stupeflix.com>2015-11-26 21:50:55 +0100
commit72eaf726236331e739952806a5fe47b40165ac76 (patch)
treeda31de4492d921f278d508b676f81eddcd95ae99 /libavformat
parentf5b7a29ae893add491397bebe6f4cc5deec2d480 (diff)
lavf/utils: avoid decoding a frame to get the codec parameters
Avoid decoding a frame to get the codec parameters while the codec supports FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM. This is particulary useful to avoid decoding twice images (once in avformat_find_stream_info and once when the actual decode is made).
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/utils.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/libavformat/utils.c b/libavformat/utils.c
index f33f2f505b..8cb7d38b3e 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -2695,6 +2695,8 @@ static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt,
AVFrame *frame = av_frame_alloc();
AVSubtitle subtitle;
AVPacket pkt = *avpkt;
+ int do_skip_frame = 0;
+ enum AVDiscard skip_frame;
if (!frame)
return AVERROR(ENOMEM);
@@ -2733,6 +2735,12 @@ static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt,
goto fail;
}
+ if (st->codec->codec->caps_internal & FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM) {
+ do_skip_frame = 1;
+ skip_frame = st->codec->skip_frame;
+ st->codec->skip_frame = AVDISCARD_ALL;
+ }
+
while ((pkt.size > 0 || (!pkt.data && got_picture)) &&
ret >= 0 &&
(!has_codec_parameters(st, NULL) || !has_decode_delay_been_guessed(st) ||
@@ -2768,6 +2776,10 @@ static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt,
ret = -1;
fail:
+ if (do_skip_frame) {
+ st->codec->skip_frame = skip_frame;
+ }
+
av_frame_free(&frame);
return ret;
}