summaryrefslogtreecommitdiff
path: root/src/lib/ffmpeg_decoder.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2013-06-18 19:35:24 +0100
committerCarl Hetherington <cth@carlh.net>2013-06-18 19:35:24 +0100
commitb1283679663c4775504b238378c588f972affcd8 (patch)
tree5fb7af334d70358f15ef0abc86a517d65e2d0d14 /src/lib/ffmpeg_decoder.cc
parent07f3bf84aad2d2dc6e8047a0c46c2a9bc37ec1c5 (diff)
Don't get stuck in an infinite loop when avcodec_decode_audio4 returns an error.
Diffstat (limited to 'src/lib/ffmpeg_decoder.cc')
-rw-r--r--src/lib/ffmpeg_decoder.cc33
1 files 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, &copy_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;
}
}