diff options
author | Anton Khirnov <anton@khirnov.net> | 2013-03-22 07:05:00 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2013-04-05 23:34:10 +0200 |
commit | 8becbb8b085278ba6441ec750e23ab3b2f79b386 (patch) | |
tree | 283e5d1690f6f5434470905bf5056168381b0f15 /src | |
parent | 6f2e1c24151cd3734bd51673c5d2968e2c8bc1ae (diff) | |
download | mpd-8becbb8b085278ba6441ec750e23ab3b2f79b386.tar.gz mpd-8becbb8b085278ba6441ec750e23ab3b2f79b386.tar.xz mpd-8becbb8b085278ba6441ec750e23ab3b2f79b386.zip |
ffmpeg decoder plugin: do not allocate an AVFrame on stack.
AVFrame must be allocated with avcodec_alloc_frame().
Diffstat (limited to 'src')
-rw-r--r-- | src/decoder/FfmpegDecoderPlugin.cxx | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/src/decoder/FfmpegDecoderPlugin.cxx b/src/decoder/FfmpegDecoderPlugin.cxx index dd98b9686..3f3e8a43a 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); |