X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fffmpeg_decoder.cc;h=ddc9e71a073814cda61779d94b4b570e458770d5;hb=1cc240c747868e3cfca66b61de0f08ccb158b869;hp=e2e5b9d643cc5d565e00a98307aa6f507ee6906a;hpb=872557b0261c0daf2206a24e38f33b1c9871c8a3;p=dcpomatic.git diff --git a/src/lib/ffmpeg_decoder.cc b/src/lib/ffmpeg_decoder.cc index e2e5b9d64..ddc9e71a0 100644 --- a/src/lib/ffmpeg_decoder.cc +++ b/src/lib/ffmpeg_decoder.cc @@ -60,7 +60,7 @@ using libdcp::Size; FFmpegDecoder::FFmpegDecoder (shared_ptr f, shared_ptr c, bool video, bool audio) : Decoder (f) , VideoDecoder (f, c) - , AudioDecoder (f, c) + , AudioDecoder (f) , SubtitleDecoder (f) , FFmpeg (c) , _subtitle_codec_context (0) @@ -140,8 +140,6 @@ FFmpegDecoder::flush () decode_audio_packet (); } - AudioDecoder::flush (); - /* Stop us being asked for any more data */ _video_position = _ffmpeg_content->video_length (); _audio_position = _ffmpeg_content->audio_length (); @@ -365,43 +363,48 @@ FFmpegDecoder::decode_audio_packet () */ AVPacket copy_packet = _packet; - + while (copy_packet.size > 0) { 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 (_audio_position == 0) { - /* Where we are in the source, in seconds */ - double const pts = av_q2d (_format_context->streams[copy_packet.stream_index]->time_base) - * av_frame_get_best_effort_timestamp(_frame) + _audio_pts_offset; - - if (pts > 0) { - /* Emit some silence */ - shared_ptr silence ( - new AudioBuffers ( - _ffmpeg_content->audio_channels(), - pts * _ffmpeg_content->content_audio_frame_rate() - ) - ); - - silence->make_silent (); - audio (silence, _audio_position); - } - } - - int const data_size = av_samples_get_buffer_size ( - 0, audio_codec_context()->channels, _frame->nb_samples, audio_sample_format (), 1 - ); + if (decode_result < 0) { + shared_ptr film = _film.lock (); + assert (film); + film->log()->log (String::compose ("avcodec_decode_audio4 failed (%1)", decode_result)); + return; + } - audio (deinterleave_audio (_frame->data, data_size), _audio_position); + if (frame_finished) { + + if (_audio_position == 0) { + /* Where we are in the source, in seconds */ + double const pts = av_q2d (_format_context->streams[copy_packet.stream_index]->time_base) + * av_frame_get_best_effort_timestamp(_frame) + _audio_pts_offset; - copy_packet.data += decode_result; - copy_packet.size -= decode_result; + if (pts > 0) { + /* Emit some silence */ + shared_ptr silence ( + new AudioBuffers ( + _ffmpeg_content->audio_channels(), + pts * _ffmpeg_content->content_audio_frame_rate() + ) + ); + + silence->make_silent (); + audio (silence, _audio_position); + } } + + int const data_size = av_samples_get_buffer_size ( + 0, audio_codec_context()->channels, _frame->nb_samples, audio_sample_format (), 1 + ); + + audio (deinterleave_audio (_frame->data, data_size), _audio_position); } + + copy_packet.data += decode_result; + copy_packet.size -= decode_result; } }