X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fffmpeg_decoder.cc;h=58745598a9fae69969409e40d3777424ef18edf1;hb=264a268f7c1244b47d9fa54ad342d80b0f98e16d;hp=11cea8fb140dbcde881c23740a76bb2c3a41a72a;hpb=adf17c5e1992186c7f8d63d9cffd087311164ffa;p=dcpomatic.git diff --git a/src/lib/ffmpeg_decoder.cc b/src/lib/ffmpeg_decoder.cc index 11cea8fb1..58745598a 100644 --- a/src/lib/ffmpeg_decoder.cc +++ b/src/lib/ffmpeg_decoder.cc @@ -59,7 +59,7 @@ using libdcp::Size; FFmpegDecoder::FFmpegDecoder (shared_ptr f, shared_ptr c, bool video, bool audio) : Decoder (f) - , VideoDecoder (f) + , VideoDecoder (f, c) , AudioDecoder (f) , SubtitleDecoder (f) , FFmpeg (c) @@ -120,7 +120,30 @@ FFmpegDecoder::~FFmpegDecoder () if (_subtitle_codec_context) { avcodec_close (_subtitle_codec_context); } -} +} + +void +FFmpegDecoder::flush () +{ + /* Get any remaining frames */ + + _packet.data = 0; + _packet.size = 0; + + /* XXX: should we reset _packet.data and size after each *_decode_* call? */ + + if (_decode_video) { + while (decode_video_packet ()) {} + } + + if (_ffmpeg_content->audio_stream() && _decode_audio) { + decode_audio_packet (); + } + + /* Stop us being asked for any more data */ + _video_position = _ffmpeg_content->video_length (); + _audio_position = _ffmpeg_content->audio_length (); +} void FFmpegDecoder::pass () @@ -137,24 +160,7 @@ FFmpegDecoder::pass () film->log()->log (String::compose (N_("error on av_read_frame (%1) (%2)"), buf, r)); } - /* Get any remaining frames */ - - _packet.data = 0; - _packet.size = 0; - - /* XXX: should we reset _packet.data and size after each *_decode_* call? */ - - if (_decode_video) { - while (decode_video_packet ()) {} - } - - if (_ffmpeg_content->audio_stream() && _decode_audio) { - decode_audio_packet (); - } - - /* Stop us being asked for any more data */ - _video_position = _ffmpeg_content->video_length (); - _audio_position = _ffmpeg_content->audio_length (); + flush (); return; } @@ -383,7 +389,13 @@ FFmpegDecoder::decode_audio_packet () 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; }