From: Helge Norberg Date: Thu, 6 Oct 2016 14:48:00 +0000 (+0200) Subject: [ffmpeg_producer] Resolved problem where video decoders having CODEC_CAP_DELAY needs... X-Git-Tag: 2.1.0_Beta1~31 X-Git-Url: https://git.sesse.net/?p=casparcg;a=commitdiff_plain;h=dd0fc2703b330461b26e0a2935d72a5fcf3970c0 [ffmpeg_producer] Resolved problem where video decoders having CODEC_CAP_DELAY needs to be fed "null" packets at EOF until no more frames can be decoded. Possible related issue #473 --- diff --git a/core/producer/framerate/framerate_producer.cpp b/core/producer/framerate/framerate_producer.cpp index 367b5dde8..be7451078 100644 --- a/core/producer/framerate/framerate_producer.cpp +++ b/core/producer/framerate/framerate_producer.cpp @@ -237,7 +237,6 @@ public: if (destination_fieldmode_ == field_mode::progressive) { - return field1; } else diff --git a/modules/ffmpeg/producer/input/input.cpp b/modules/ffmpeg/producer/input/input.cpp index 83933c50a..ac772b8a9 100644 --- a/modules/ffmpeg/producer/input/input.cpp +++ b/modules/ffmpeg/producer/input/input.cpp @@ -196,7 +196,17 @@ struct input::implementation : boost::noncopyable CASPAR_LOG(trace) << print() << " Looping."; } else + { + // Needed by some decoders to decode remaining frames based on last packet. + auto flush_packet = create_packet(); + flush_packet->data = nullptr; + flush_packet->size = 0; + flush_packet->pos = -1; + + buffer_.push(flush_packet); + executor_.stop(); + } } else { diff --git a/modules/ffmpeg/producer/video/video_decoder.cpp b/modules/ffmpeg/producer/video/video_decoder.cpp index 10d7aee98..9322baad4 100644 --- a/modules/ffmpeg/producer/video/video_decoder.cpp +++ b/modules/ffmpeg/producer/video/video_decoder.cpp @@ -101,9 +101,15 @@ public: } packets_.pop(); - file_frame_number_ = static_cast(packet->pos); - avcodec_flush_buffers(codec_context_.get()); - return flush_video(); + + if (packet->pos != -1) + { + file_frame_number_ = static_cast(packet->pos); + avcodec_flush_buffers(codec_context_.get()); + return flush_video(); + } + else // Really EOF + return nullptr; } packets_.pop();