]> git.sesse.net Git - casparcg/commitdiff
[ffmpeg_producer] Resolved problem where video decoders having CODEC_CAP_DELAY needs...
authorHelge Norberg <helge.norberg@svt.se>
Thu, 6 Oct 2016 14:48:00 +0000 (16:48 +0200)
committerHelge Norberg <helge.norberg@svt.se>
Thu, 6 Oct 2016 14:48:00 +0000 (16:48 +0200)
core/producer/framerate/framerate_producer.cpp
modules/ffmpeg/producer/input/input.cpp
modules/ffmpeg/producer/video/video_decoder.cpp

index 367b5dde8352b67a0c8464d19771359b28081b33..be7451078ae06f0460219c381ffbea1e3a56a6c7 100644 (file)
@@ -237,7 +237,6 @@ public:
 
                if (destination_fieldmode_ == field_mode::progressive)
                {
-
                        return field1;
                }
                else
index 83933c50a1b6bc06a0c5afe154123e257d059704..ac772b8a9cdb50077234ea59b03c9ef25ae735b0 100644 (file)
@@ -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
                                {
index 10d7aee98829a6886b0b4055de5f544ab40554f0..9322baad4ba1db6a67669e8df3c184ace5eaef85 100644 (file)
@@ -101,9 +101,15 @@ public:
                        }
 
                        packets_.pop();
-                       file_frame_number_ = static_cast<uint32_t>(packet->pos);
-                       avcodec_flush_buffers(codec_context_.get());
-                       return flush_video();
+
+                       if (packet->pos != -1)
+                       {
+                               file_frame_number_ = static_cast<uint32_t>(packet->pos);
+                               avcodec_flush_buffers(codec_context_.get());
+                               return flush_video();
+                       }
+                       else // Really EOF
+                               return nullptr;
                }
 
                packets_.pop();