From 9eb296572ec801c32d86b349ba1de27704953237 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Fri, 21 Sep 2012 09:09:01 +0200 Subject: lavf: use a malloced AVFrame in try_decode_frame(). This allows using avcodec_free_frame() to free it properly. --- libavformat/utils.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) (limited to 'libavformat') diff --git a/libavformat/utils.c b/libavformat/utils.c index 9dd58cc152..9c6b1439c2 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -2084,9 +2084,12 @@ static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **option { const AVCodec *codec; int got_picture = 1, ret = 0; - AVFrame picture; + AVFrame *frame = avcodec_alloc_frame(); AVPacket pkt = *avpkt; + if (!frame) + return AVERROR(ENOMEM); + if (!avcodec_is_open(st->codec) && !st->info->found_decoder) { AVDictionary *thread_opt = NULL; @@ -2095,7 +2098,8 @@ static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **option if (!codec) { st->info->found_decoder = -1; - return -1; + ret = -1; + goto fail; } /* force thread count to 1 since the h264 decoder will not extract SPS @@ -2106,14 +2110,16 @@ static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **option av_dict_free(&thread_opt); if (ret < 0) { st->info->found_decoder = -1; - return ret; + goto fail; } st->info->found_decoder = 1; } else if (!st->info->found_decoder) st->info->found_decoder = 1; - if (st->info->found_decoder < 0) - return -1; + if (st->info->found_decoder < 0) { + ret = -1; + goto fail; + } while ((pkt.size > 0 || (!pkt.data && got_picture)) && ret >= 0 && @@ -2121,14 +2127,14 @@ static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **option !has_decode_delay_been_guessed(st) || (!st->codec_info_nb_frames && st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF))) { got_picture = 0; - avcodec_get_frame_defaults(&picture); + avcodec_get_frame_defaults(frame); switch(st->codec->codec_type) { case AVMEDIA_TYPE_VIDEO: - ret = avcodec_decode_video2(st->codec, &picture, + ret = avcodec_decode_video2(st->codec, frame, &got_picture, &pkt); break; case AVMEDIA_TYPE_AUDIO: - ret = avcodec_decode_audio4(st->codec, &picture, &got_picture, &pkt); + ret = avcodec_decode_audio4(st->codec, frame, &got_picture, &pkt); break; default: break; @@ -2141,6 +2147,9 @@ static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **option ret = got_picture; } } + +fail: + avcodec_free_frame(&frame); return ret; } -- cgit v1.2.3 From 11d1ca4b2c406bee2d22b04268a43b0873096c92 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Fri, 21 Sep 2012 09:10:23 +0200 Subject: Use avcodec_free_frame() to free AVFrames. --- libavformat/output-example.c | 1 + 1 file changed, 1 insertion(+) (limited to 'libavformat') diff --git a/libavformat/output-example.c b/libavformat/output-example.c index 27950a162b..1011c2c645 100644 --- a/libavformat/output-example.c +++ b/libavformat/output-example.c @@ -165,6 +165,7 @@ static void write_audio_frame(AVFormatContext *oc, AVStream *st) fprintf(stderr, "Error while writing audio frame\n"); exit(1); } + avcodec_free_frame(&frame); } static void close_audio(AVFormatContext *oc, AVStream *st) -- cgit v1.2.3 From 7751e4693dd10ec98c20fbd9887233b575034272 Mon Sep 17 00:00:00 2001 From: Luca Barbato Date: Thu, 20 Sep 2012 01:01:43 +0200 Subject: ogg: check that the expected number of headers had been parsed Not having the header for a codec is a tell-tale of a broken file. --- libavformat/oggdec.c | 13 ++++++++++++- libavformat/oggdec.h | 5 +++++ libavformat/oggparsecelt.c | 1 + libavformat/oggparsedirac.c | 2 ++ libavformat/oggparseflac.c | 6 ++++-- libavformat/oggparseogm.c | 4 ++++ libavformat/oggparseskeleton.c | 1 + libavformat/oggparsespeex.c | 3 ++- libavformat/oggparsetheora.c | 3 ++- libavformat/oggparsevorbis.c | 1 + 10 files changed, 34 insertions(+), 5 deletions(-) (limited to 'libavformat') diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c index e04a4e7973..c8b2a858f1 100644 --- a/libavformat/oggdec.c +++ b/libavformat/oggdec.c @@ -406,6 +406,7 @@ static int ogg_packet(AVFormatContext *s, int *str, int *dstart, int *dsize, s->data_offset = FFMIN(s->data_offset, cur_os->sync_pos); } }else{ + os->nb_header++; os->pstart += os->psize; os->psize = 0; } @@ -445,7 +446,7 @@ static int ogg_packet(AVFormatContext *s, int *str, int *dstart, int *dsize, static int ogg_get_headers(AVFormatContext *s) { struct ogg *ogg = s->priv_data; - int ret; + int ret, i; do{ ret = ogg_packet(s, NULL, NULL, NULL, NULL); @@ -453,6 +454,16 @@ static int ogg_get_headers(AVFormatContext *s) return ret; }while (!ogg->headers); + for (i = 0; i < ogg->nstreams; i++) { + struct ogg_stream *os = ogg->streams + i; + + if (os->codec && os->codec->nb_header && + os->nb_header < os->codec->nb_header) { + av_log(s, AV_LOG_ERROR, + "Headers mismatch for stream %d\n", i); + return AVERROR_INVALIDDATA; + } + } av_dlog(s, "found headers\n"); return 0; diff --git a/libavformat/oggdec.h b/libavformat/oggdec.h index 184a628622..fa8a5bc29a 100644 --- a/libavformat/oggdec.h +++ b/libavformat/oggdec.h @@ -51,6 +51,10 @@ struct ogg_codec { * 0 if granule is the end time of the associated packet. */ int granule_is_start; + /** + * Number of expected headers + */ + int nb_header; }; struct ogg_stream { @@ -75,6 +79,7 @@ struct ogg_stream { int incomplete; ///< whether we're expecting a continuation in the next page int page_end; ///< current packet is the last one completed in the page int keyframe_seek; + int nb_header; ///< set to the number of parsed headers void *private; }; diff --git a/libavformat/oggparsecelt.c b/libavformat/oggparsecelt.c index 253ef76032..0deccc2d08 100644 --- a/libavformat/oggparsecelt.c +++ b/libavformat/oggparsecelt.c @@ -93,4 +93,5 @@ const struct ogg_codec ff_celt_codec = { .magic = "CELT ", .magicsize = 8, .header = celt_header, + .nb_header = 2, }; diff --git a/libavformat/oggparsedirac.c b/libavformat/oggparsedirac.c index cc6f7687ba..55a0b59127 100644 --- a/libavformat/oggparsedirac.c +++ b/libavformat/oggparsedirac.c @@ -104,6 +104,7 @@ const struct ogg_codec ff_dirac_codec = { .header = dirac_header, .gptopts = dirac_gptopts, .granule_is_start = 1, + .nb_header = 1, }; const struct ogg_codec ff_old_dirac_codec = { @@ -112,4 +113,5 @@ const struct ogg_codec ff_old_dirac_codec = { .header = old_dirac_header, .gptopts = old_dirac_gptopts, .granule_is_start = 1, + .nb_header = 1, }; diff --git a/libavformat/oggparseflac.c b/libavformat/oggparseflac.c index 9860a0eb97..f59b4008dc 100644 --- a/libavformat/oggparseflac.c +++ b/libavformat/oggparseflac.c @@ -88,11 +88,13 @@ old_flac_header (AVFormatContext * s, int idx) const struct ogg_codec ff_flac_codec = { .magic = "\177FLAC", .magicsize = 5, - .header = flac_header + .header = flac_header, + .nb_header = 2, }; const struct ogg_codec ff_old_flac_codec = { .magic = "fLaC", .magicsize = 4, - .header = old_flac_header + .header = old_flac_header, + .nb_header = 0, }; diff --git a/libavformat/oggparseogm.c b/libavformat/oggparseogm.c index b52969f9b2..7b3cda221e 100644 --- a/libavformat/oggparseogm.c +++ b/libavformat/oggparseogm.c @@ -156,6 +156,7 @@ const struct ogg_codec ff_ogm_video_codec = { .header = ogm_header, .packet = ogm_packet, .granule_is_start = 1, + .nb_header = 2, }; const struct ogg_codec ff_ogm_audio_codec = { @@ -164,6 +165,7 @@ const struct ogg_codec ff_ogm_audio_codec = { .header = ogm_header, .packet = ogm_packet, .granule_is_start = 1, + .nb_header = 2, }; const struct ogg_codec ff_ogm_text_codec = { @@ -172,6 +174,7 @@ const struct ogg_codec ff_ogm_text_codec = { .header = ogm_header, .packet = ogm_packet, .granule_is_start = 1, + .nb_header = 2, }; const struct ogg_codec ff_ogm_old_codec = { @@ -180,4 +183,5 @@ const struct ogg_codec ff_ogm_old_codec = { .header = ogm_dshow_header, .packet = ogm_packet, .granule_is_start = 1, + .nb_header = 1, }; diff --git a/libavformat/oggparseskeleton.c b/libavformat/oggparseskeleton.c index 62dd14ded1..a49d30be58 100644 --- a/libavformat/oggparseskeleton.c +++ b/libavformat/oggparseskeleton.c @@ -86,4 +86,5 @@ const struct ogg_codec ff_skeleton_codec = { .magic = "fishead", .magicsize = 8, .header = skeleton_header, + .nb_header = 0, }; diff --git a/libavformat/oggparsespeex.c b/libavformat/oggparsespeex.c index e4dfec5218..11b50d5905 100644 --- a/libavformat/oggparsespeex.c +++ b/libavformat/oggparsespeex.c @@ -122,5 +122,6 @@ const struct ogg_codec ff_speex_codec = { .magic = "Speex ", .magicsize = 8, .header = speex_header, - .packet = speex_packet + .packet = speex_packet, + .nb_header = 2, }; diff --git a/libavformat/oggparsetheora.c b/libavformat/oggparsetheora.c index 021d3aefb5..df7a89c09d 100644 --- a/libavformat/oggparsetheora.c +++ b/libavformat/oggparsetheora.c @@ -150,5 +150,6 @@ const struct ogg_codec ff_theora_codec = { .magic = "\200theora", .magicsize = 7, .header = theora_header, - .gptopts = theora_gptopts + .gptopts = theora_gptopts, + .nb_header = 3, }; diff --git a/libavformat/oggparsevorbis.c b/libavformat/oggparsevorbis.c index f762c940f0..396a3e3ea7 100644 --- a/libavformat/oggparsevorbis.c +++ b/libavformat/oggparsevorbis.c @@ -359,4 +359,5 @@ const struct ogg_codec ff_vorbis_codec = { .magicsize = 7, .header = vorbis_header, .packet = vorbis_packet, + .nb_header = 3, }; -- cgit v1.2.3