From b1283679663c4775504b238378c588f972affcd8 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 18 Jun 2013 19:35:24 +0100 Subject: [PATCH] Don't get stuck in an infinite loop when avcodec_decode_audio4 returns an error. --- src/lib/ffmpeg_decoder.cc | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/lib/ffmpeg_decoder.cc b/src/lib/ffmpeg_decoder.cc index bcfbea431..cad247e5a 100644 --- a/src/lib/ffmpeg_decoder.cc +++ b/src/lib/ffmpeg_decoder.cc @@ -691,23 +691,26 @@ FFmpegDecoder::decode_audio_packet () int frame_finished; int const decode_result = avcodec_decode_audio4 (_audio_codec_context, _frame, &frame_finished, ©_packet); - if (decode_result >= 0) { - if (frame_finished) { + if (decode_result < 0) { + /* error */ + break; + } + + if (frame_finished) { - /* Where we are in the source, in seconds */ - double const source_pts_seconds = av_q2d (_format_context->streams[copy_packet.stream_index]->time_base) - * av_frame_get_best_effort_timestamp(_frame); - - int const data_size = av_samples_get_buffer_size ( - 0, _audio_codec_context->channels, _frame->nb_samples, audio_sample_format (), 1 - ); - - assert (_audio_codec_context->channels == _film->audio_channels()); - Audio (deinterleave_audio (_frame->data, data_size), source_pts_seconds); - } + /* Where we are in the source, in seconds */ + double const source_pts_seconds = av_q2d (_format_context->streams[copy_packet.stream_index]->time_base) + * av_frame_get_best_effort_timestamp(_frame); - copy_packet.data += decode_result; - copy_packet.size -= decode_result; + int const data_size = av_samples_get_buffer_size ( + 0, _audio_codec_context->channels, _frame->nb_samples, audio_sample_format (), 1 + ); + + assert (_audio_codec_context->channels == _film->audio_channels()); + Audio (deinterleave_audio (_frame->data, data_size), source_pts_seconds); } + + copy_packet.data += decode_result; + copy_packet.size -= decode_result; } } -- 2.30.2