]> git.sesse.net Git - casparcg/commitdiff
2.1.0: -ffmpeg_producer: Fixed input eof.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 11 Mar 2012 22:59:44 +0000 (22:59 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 11 Mar 2012 22:59:44 +0000 (22:59 +0000)
       -draw_frame: Added push function in order to "save" transforms.
       -image_mixer: Fixed problem where still frame was not rendered in progressive mode.

git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.1.0@2608 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

accelerator/ogl/image/image_mixer.cpp
common/common.vcxproj
core/frame/draw_frame.cpp
core/frame/draw_frame.h
core/producer/stage.cpp
core/producer/transition/transition_producer.cpp
modules/ffmpeg/producer/ffmpeg_producer.cpp
modules/ffmpeg/producer/input/input.cpp

index 24342dac5b13bd2b593fc26afb91682499c03816..95f5044ca4ba0368be17a6b74426fa8d42e1522e 100644 (file)
@@ -173,10 +173,13 @@ private:
                });\r
                \r
                // Remove first field stills.\r
-               boost::range::remove_erase_if(layer.items, [&](const item& item)\r
+               if(format_desc.field_mode != core::field_mode::progressive)\r
                {\r
-                       return item.transform.is_still && item.transform.field_mode == format_desc.field_mode; // only use last field for stills.\r
-               });\r
+                       boost::range::remove_erase_if(layer.items, [&](const item& item)\r
+                       {\r
+                               return item.transform.is_still && item.transform.field_mode == format_desc.field_mode; // only use last field for stills.\r
+                       });\r
+               }\r
 \r
                if(layer.items.empty())\r
                        return;\r
index a74e46997a197e26c6d6b40c5744788bc343ed55..acda0634379ee333c6c3e2a168b188a7b54053ee 100644 (file)
@@ -81,7 +81,8 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>\r
     </Link>\r
     <PreBuildEvent>\r
-      <Command>"SubWCRev.exe" "$(SolutionDir)." "$(SolutionDir)\version.tmpl" "$(SolutionDir)\version.h"</Command>\r
+      <Command>\r
+      </Command>\r
     </PreBuildEvent>\r
     <Lib />\r
   </ItemDefinitionGroup>\r
       <OptimizeReferences>true</OptimizeReferences>\r
     </Link>\r
     <PreBuildEvent>\r
-      <Command>"SubWCRev.exe" "$(SolutionDir)." "$(SolutionDir)\version.tmpl" "$(SolutionDir)\version.h"</Command>\r
+      <Command>\r
+      </Command>\r
     </PreBuildEvent>\r
     <Lib>\r
       <LinkTimeCodeGeneration>true</LinkTimeCodeGeneration>\r
index 0b6d4957ff09818b7f89e8bb00983e7ae1b7d8f4..50d7719c17c90e490f7c49c6078cf30416d97ba8 100644 (file)
@@ -172,6 +172,13 @@ draw_frame draw_frame::mask(draw_frame fill, draw_frame key)
        return draw_frame(std::move(frames));\r
 }\r
 \r
+draw_frame draw_frame::push(draw_frame frame)\r
+{\r
+       std::vector<draw_frame> frames;\r
+       frames.push_back(std::move(frame));\r
+       return draw_frame(std::move(frames));\r
+}\r
+\r
 draw_frame eof_frame(const_frame(0));\r
 draw_frame empty_frame(const_frame(0));\r
 draw_frame late_frame(const_frame(0));\r
index 2f948ed01f8369a542c9dd76903f667ca95448e1..3672a6e121d9e347ae0ec4633a6ed5ded864ead9 100644 (file)
@@ -42,6 +42,7 @@ public:
        static draw_frame over(draw_frame frame1, draw_frame frame2);\r
        static draw_frame mask(draw_frame fill, draw_frame key);\r
        static draw_frame still(draw_frame frame);\r
+       static draw_frame push(draw_frame frame);\r
                \r
        static const draw_frame& eof();\r
        static const draw_frame& empty();\r
index 89966bd90b74489bfffb9dfd986b01586909f5b9..0c9cd25eb1f14240cd0de2f015226506094893ca 100644 (file)
@@ -103,12 +103,12 @@ public:
                auto transform  = tween.fetch_and_tick(1);\r
                                \r
                auto frame  = layer.receive(format_desc);                                       \r
-               auto frame1 = core::draw_frame(frame);\r
+               auto frame1 = draw_frame::push(frame);\r
                frame1.transform() = transform;\r
 \r
                if(format_desc.field_mode != core::field_mode::progressive)\r
                {                               \r
-                       auto frame2 = core::draw_frame(frame);\r
+                       auto frame2 = draw_frame::push(frame);\r
                        frame2.transform() = tween.fetch_and_tick(1);\r
                        frame1 = core::draw_frame::interlace(frame1, frame2, format_desc.field_mode);\r
                }\r
index 7358841309eb814c97d2e8811387d20a436f281e..0cc5cc10db6ea224826efccb793f38d095a170fa 100644 (file)
@@ -108,7 +108,7 @@ public:
                                                                                                                                        }\r
                                                                                                                                }();\r
 \r
-               return compose(dest, source);\r
+               return compose(draw_frame::push(dest), draw_frame::push(source));\r
        }\r
 \r
        draw_frame last_frame() const override\r
index 4810a1c0cd5d6215ff9030e76a7378148d3db840..084c32bf43ae5336e2225378cf0330ac080f1214 100644 (file)
@@ -178,6 +178,9 @@ public:
                                                << monitor::event("file/fps")                   % fps_\r
                                                << monitor::event("file/path")                  % filename_\r
                                                << monitor::event("loop")                               % input_.loop();\r
+               \r
+               if(frame == core::draw_frame::late() && input_.eof())\r
+                       return last_frame();\r
 \r
                return frame;\r
        }\r
index aae183681a92e1574664cff6f8f5ecc7fa6a13de..9cf6c590e33533637bbdd3f058cd55ae978d2676 100644 (file)
@@ -73,6 +73,7 @@ struct input::impl : boost::noncopyable
        tbb::atomic<uint32_t>                                                                           start_;         \r
        tbb::atomic<uint32_t>                                                                           length_;\r
        tbb::atomic<bool>                                                                                       loop_;\r
+       tbb::atomic<bool>                                                                                       eof_;\r
        uint32_t                                                                                                        frame_number_;\r
        \r
        tbb::concurrent_bounded_queue<std::shared_ptr<AVPacket>>        buffer_;\r
@@ -91,6 +92,7 @@ struct input::impl : boost::noncopyable
                start_                  = start;\r
                length_                 = length;\r
                loop_                   = loop;\r
+               eof_                    = false;\r
                buffer_size_    = 0;\r
 \r
                if(start_ > 0)                  \r
@@ -164,15 +166,19 @@ struct input::impl : boost::noncopyable
                                {\r
                                        frame_number_   = 0;\r
 \r
-                                       if(!loop_)\r
-                                               return;\r
-\r
-                                       queued_seek(start_);\r
-                                       graph_->set_tag("seek");                \r
-                                       CASPAR_LOG(trace) << print() << " Looping.";    \r
+                                       if(loop_)\r
+                                       {\r
+                                               queued_seek(start_);\r
+                                               graph_->set_tag("seek");                \r
+                                               CASPAR_LOG(trace) << print() << " Looping.";    \r
+                                       }\r
+                                       else\r
+                                               eof_ = true;\r
                                }\r
                                else\r
                                {               \r
+                                       eof_ = false;\r
+\r
                                        THROW_ON_ERROR(ret, "av_read_frame", print());\r
 \r
                                        if(packet->stream_index == default_stream_index_)\r
@@ -197,7 +203,8 @@ struct input::impl : boost::noncopyable
                                        graph_->set_value("buffer-count", (static_cast<double>(buffer_.size()+0.001)/MAX_BUFFER_COUNT));                \r
                                }       \r
 \r
-                               tick();         \r
+                               if(!eof_)\r
+                                       tick();         \r
                        }\r
                        catch(...)\r
                        {\r
@@ -253,7 +260,7 @@ struct input::impl : boost::noncopyable
 \r
 input::input(const spl::shared_ptr<diagnostics::graph>& graph, const std::wstring& filename, bool loop, uint32_t start, uint32_t length) \r
        : impl_(new impl(graph, filename, loop, start, length)){}\r
-bool input::eof() const {return !impl_->executor_.is_running();}\r
+bool input::eof() const {return impl_->eof_;}\r
 bool input::try_pop(std::shared_ptr<AVPacket>& packet){return impl_->try_pop(packet);}\r
 spl::shared_ptr<AVFormatContext> input::context(){return impl_->format_context_;}\r
 void input::loop(bool value){impl_->loop_ = value;}\r