ffmpeg | branch: master | Matthieu Bouron <matthieu.bou...@stupeflix.com> | Tue Nov 24 14:14:54 2015 +0100| [72eaf726236331e739952806a5fe47b40165ac76] | committer: Matthieu Bouron
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). > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=72eaf726236331e739952806a5fe47b40165ac76 --- libavformat/utils.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/libavformat/utils.c b/libavformat/utils.c index f33f2f5..8cb7d38 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; } _______________________________________________ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog