On Sat, Oct 17, 2015 at 10:34 PM, Matthieu Bouron <matthieu.bou...@gmail.com> wrote: > From: Matthieu Bouron <matthieu.bou...@stupeflix.com> > > Avoid decoding twice images such as jpeg and png, once in the > avformat_find_stream_info and once when the actual decode is made. > > The decoder must honor the skip_frame option in order to skip > decoding. For now the AVDISCARD_ALL flag is only set for the mjpeg and > png decoders. > --- > libavformat/utils.c | 15 +++++++++++++++ > 1 file changed, 15 insertions(+) > > diff --git a/libavformat/utils.c b/libavformat/utils.c > index 689473e..67dfffc 100644 > --- a/libavformat/utils.c > +++ b/libavformat/utils.c > @@ -2676,11 +2676,16 @@ static int has_codec_parameters(AVStream *st, const > char **errmsg_ptr) > static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket > *avpkt, > AVDictionary **options) > { > + int i; > const AVCodec *codec; > int got_picture = 1, ret = 0; > AVFrame *frame = av_frame_alloc(); > AVSubtitle subtitle; > AVPacket pkt = *avpkt; > + int skip_frame; > + static const enum AVCodecID no_decode_codecs[] = { > + AV_CODEC_ID_MJPEG, AV_CODEC_ID_PNG, > + };
Hardcoded lists of codecs in random places are never a good thing to have. If this is a feature we agree to have, its codecs should just get an internal capability that tells this code if it can parse all params without decoding. > > if (!frame) > return AVERROR(ENOMEM); > @@ -2719,6 +2724,14 @@ static int try_decode_frame(AVFormatContext *s, > AVStream *st, AVPacket *avpkt, > goto fail; > } > > + skip_frame = st->codec->skip_frame; > + for (i = 0; i < FF_ARRAY_ELEMS(no_decode_codecs); i++) { > + if (st->codec->codec_id == no_decode_codecs[i]) { > + st->codec->skip_frame = AVDISCARD_ALL; > + break; > + } > + } > + > while ((pkt.size > 0 || (!pkt.data && got_picture)) && > ret >= 0 && > (!has_codec_parameters(st, NULL) || > !has_decode_delay_been_guessed(st) || > @@ -2753,6 +2766,8 @@ static int try_decode_frame(AVFormatContext *s, > AVStream *st, AVPacket *avpkt, > if (!pkt.data && !got_picture) > ret = -1; > > + st->codec->skip_frame = skip_frame; > + > fail: > av_frame_free(&frame); > return ret; > -- > 2.6.1 > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel