Remove the code, on seeking, to seek to the requested timestamp
[dcpomatic.git] / src / lib / ffmpeg_decoder.cc
index a16799e741c24186f62bc52c1fccd4880eec77b2..bd01b280b65bc223101aac0282ef4c4bc5f71b40 100644 (file)
@@ -136,21 +136,25 @@ FFmpegDecoder::pass ()
 {
        int r = av_read_frame (_format_context, &_packet);
 
-       if (r < 0) {
+       /* AVERROR_INVALIDDATA can apparently be returned sometimes even when av_read_frame
+          has pretty-much succeeded (and hence generated data which should be processed).
+          Hence it makes sense to continue here in that case.
+       */
+       if (r < 0 && r != AVERROR_INVALIDDATA) {
                if (r != AVERROR_EOF) {
                        /* Maybe we should fail here, but for now we'll just finish off instead */
                        char buf[256];
                        av_strerror (r, buf, sizeof(buf));
                        LOG_ERROR (N_("error on av_read_frame (%1) (%2)"), buf, r);
                }
-
+               
                flush ();
                return true;
        }
 
        int const si = _packet.stream_index;
 
-       if (si == _video_stream) {
+       if (si == _video_stream && !_ignore_video) {
                decode_video_packet ();
        } else if (_ffmpeg_content->audio_stream() && _ffmpeg_content->audio_stream()->uses_index (_format_context, si)) {
                decode_audio_packet ();
@@ -173,8 +177,9 @@ FFmpegDecoder::deinterleave_audio (uint8_t** data, int size)
 
        /* Deinterleave and convert to float */
 
-       DCPOMATIC_ASSERT ((size % (bytes_per_audio_sample() * _ffmpeg_content->audio_channels())) == 0);
-
+       /* total_samples and frames will be rounded down here, so if there are stray samples at the end
+          of the block that do not form a complete sample or frame they will be dropped.
+       */
        int const total_samples = size / bytes_per_audio_sample();
        int const frames = total_samples / _ffmpeg_content->audio_channels();
        shared_ptr<AudioBuffers> audio (new AudioBuffers (_ffmpeg_content->audio_channels(), frames));
@@ -296,7 +301,7 @@ FFmpegDecoder::seek (ContentTime time, bool accurate)
 {
        VideoDecoder::seek (time, accurate);
        AudioDecoder::seek (time, accurate);
-       
+
        /* If we are doing an `accurate' seek, we need to use pre-roll, as
           we don't really know what the seek will give us.
        */
@@ -309,15 +314,7 @@ FFmpegDecoder::seek (ContentTime time, bool accurate)
        */
        
        ContentTime const u = time - _pts_offset;
-       int64_t s = u.seconds() / av_q2d (_format_context->streams[_video_stream]->time_base);
-
-       if (_ffmpeg_content->audio_stream ()) {
-               s = min (
-                       s, int64_t (u.seconds() / av_q2d (_ffmpeg_content->audio_stream()->stream(_format_context)->time_base))
-                       );
-       }
-
-       av_seek_frame (_format_context, _video_stream, s, 0);
+       av_seek_frame (_format_context, _video_stream, u.seconds() / av_q2d (_format_context->streams[_video_stream]->time_base), 0);
 
        avcodec_flush_buffers (video_codec_context());
        if (audio_codec_context ()) {