From 94b4e2341e6442ca3008cff81dd5842a147c0b9e Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Thu, 21 Mar 2013 17:36:25 +0100 Subject: ffmpeg decoder plugin: do not allocate an AVFrame on stack. AVFrame must be allocated with avcodec_alloc_frame(). --- src/decoder/FfmpegDecoderPlugin.cxx | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/decoder/FfmpegDecoderPlugin.cxx b/src/decoder/FfmpegDecoderPlugin.cxx index dd98b968..3f3e8a43 100644 --- a/src/decoder/FfmpegDecoderPlugin.cxx +++ b/src/decoder/FfmpegDecoderPlugin.cxx @@ -270,7 +270,8 @@ static enum decoder_command ffmpeg_send_packet(struct decoder *decoder, struct input_stream *is, const AVPacket *packet, AVCodecContext *codec_context, - const AVRational *time_base) + const AVRational *time_base, + AVFrame *frame) { if (packet->pts >= 0 && packet->pts != (int64_t)AV_NOPTS_VALUE) decoder_timestamp(decoder, @@ -293,14 +294,13 @@ ffmpeg_send_packet(struct decoder *decoder, struct input_stream *is, cmd == DECODE_COMMAND_NONE) { int audio_size = buffer_size; #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(53,25,0) - AVFrame frame; int got_frame = 0; int len = avcodec_decode_audio4(codec_context, - &frame, &got_frame, + frame, &got_frame, &packet2); if (len >= 0 && got_frame) { audio_size = copy_interleave_frame(codec_context, - &frame, + frame, aligned_buffer, buffer_size); if (audio_size < 0) @@ -528,6 +528,18 @@ ffmpeg_decode(struct decoder *decoder, struct input_stream *input) decoder_initialized(decoder, &audio_format, input->seekable, total_time); + AVFrame *frame = avcodec_alloc_frame(); + if (!frame) { + g_warning("Could not allocate frame\n"); +#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(53,17,0) + avformat_close_input(&format_context); +#else + av_close_input_stream(format_context); +#endif + mpd_ffmpeg_stream_close(stream); + return; + } + enum decoder_command cmd; do { AVPacket packet; @@ -538,7 +550,8 @@ ffmpeg_decode(struct decoder *decoder, struct input_stream *input) if (packet.stream_index == audio_stream) cmd = ffmpeg_send_packet(decoder, input, &packet, codec_context, - &av_stream->time_base); + &av_stream->time_base, + frame); else cmd = decoder_get_command(decoder); @@ -559,6 +572,12 @@ ffmpeg_decode(struct decoder *decoder, struct input_stream *input) } } while (cmd != DECODE_COMMAND_STOP); +#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(54, 28, 0) + avcodec_free_frame(&frame); +#else + av_freep(&frame); +#endif + avcodec_close(codec_context); #if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(53,17,0) avformat_close_input(&format_context); -- cgit v1.2.3