]> git.sesse.net Git - casparcg/commitdiff
2.0. ffmpeg_producer: Further optimized filter looping.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 20 Jun 2011 16:23:46 +0000 (16:23 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 20 Jun 2011 16:23:46 +0000 (16:23 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@927 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

modules/ffmpeg/producer/filter/filter.cpp
modules/ffmpeg/producer/filter/filter.h
modules/ffmpeg/producer/video/video_decoder.cpp
shell/casparcg.config
shell/main.cpp

index 9debb1d69b3b624feafd155f232f36d1fdb715c3..39303c5140f6c27df146b753cf5ca61d8f3d0fcc 100644 (file)
@@ -175,6 +175,6 @@ struct filter::implementation
 filter::filter(const std::string& filters) : impl_(new implementation(filters)){}\r
 void filter::push(const safe_ptr<AVFrame>& frame) {impl_->push(frame);}\r
 std::vector<safe_ptr<AVFrame>> filter::poll() {return impl_->poll();}\r
-void filter::skip() {impl_->skip();}\r
+bool filter::is_ready() const{return impl_->graph_ != nullptr;}\r
 \r
 }
\ No newline at end of file
index a520561e7891c8af8b9cd926818bb2aeefc12284..d2084fcf45b6cf044871c84cc42de4432783e5f7 100644 (file)
@@ -15,7 +15,7 @@ public:
 \r
        void push(const safe_ptr<AVFrame>& frame);\r
        std::vector<safe_ptr<AVFrame>> poll();\r
-       void skip();\r
+       bool is_ready() const;\r
 \r
 private:\r
        struct implementation;\r
index 702a4690aa046fc84bcb4e02396d14948d09fd05..b47ea52b95e41589d387904351b4c2b2f544bb54 100644 (file)
@@ -66,10 +66,8 @@ struct video_decoder::implementation : boost::noncopyable
 \r
        std::shared_ptr<filter>                                         filter_;\r
        size_t                                                                          filter_delay_;\r
-       size_t                                                                          filter_skip_;\r
+       int                                                                                     eof_count_;\r
 \r
-       std::shared_ptr<AVFrame>                                        last_frame_;\r
-       std::shared_ptr<AVFrame>                                        decoded_frame_;\r
        std::string                                                                     filter_str_;\r
 \r
 public:\r
@@ -79,10 +77,9 @@ public:
                , codec_context_(*input_.get_video_codec_context())\r
                , frame_number_(0)\r
                , filter_(filter_str.empty() ? nullptr : new filter(filter_str))\r
-               , filter_delay_(0)\r
-               , filter_skip_(0)\r
-               , last_frame_(avcodec_alloc_frame(), av_free)\r
+               , filter_delay_(1)\r
                , filter_str_(filter_str)\r
+               , eof_count_(std::numeric_limits<int>::max())\r
        {\r
        }\r
 \r
@@ -99,16 +96,15 @@ public:
 \r
        std::deque<std::pair<int, safe_ptr<core::write_frame>>> decode(const std::shared_ptr<AVPacket>& video_packet)\r
        {                       \r
-               std::deque<std::pair<int, safe_ptr<core::write_frame>>> result;\r
-               \r
                if(!video_packet) // eof\r
                        return flush();\r
-\r
+               \r
+               std::deque<std::pair<int, safe_ptr<core::write_frame>>> result;\r
+               \r
+               frame_number_ = frame_number_ % eof_count_;\r
+               \r
                if(filter_)\r
-               {\r
-                       if(decoded_frame_)\r
-                               push_filter_frames(make_safe(decoded_frame_));  \r
-                       \r
+               {                                                       \r
                        std::shared_ptr<AVFrame> frame;\r
 \r
                        tbb::parallel_invoke(\r
@@ -118,13 +114,10 @@ public:
                        },\r
                        [&]\r
                        {\r
-                               if(decoded_frame_)\r
-                                       result = poll_filter_frames();\r
+                               result = poll_filter_frames();\r
                        });             \r
 \r
-                       decoded_frame_ = frame;\r
-                       if(frame)\r
-                               last_frame_ = frame;                    \r
+                       push_filter_frames(make_safe(frame));   \r
                }\r
                else\r
                {\r
@@ -141,27 +134,11 @@ public:
        {\r
                std::deque<std::pair<int, safe_ptr<core::write_frame>>> result;\r
 \r
-               if(filter_)\r
-               {\r
-                       // Get all buffered frames\r
-                       if(decoded_frame_)\r
-                       {       \r
-                               push_filter_frames(make_safe(decoded_frame_));  \r
-                               boost::range::push_back(result, poll_filter_frames());\r
-                       }\r
-\r
-                       for(size_t n = 0; n < filter_delay_; ++n)\r
-                       {                                       \r
-                               push_filter_frames(make_safe(last_frame_));     \r
-                               boost::range::push_back(result, poll_filter_frames());\r
-                       }\r
+               eof_count_ = frame_number_;\r
 \r
-                       // FIXME: Unnecessary reinitialization\r
-                       filter_skip_ = filter_delay_;\r
-                       decoded_frame_ = nullptr;\r
-               }\r
+               if(filter_)\r
+                       eof_count_ += filter_delay_;            \r
 \r
-               frame_number_ = 0;\r
                avcodec_flush_buffers(&codec_context_);\r
 \r
                return result;\r
@@ -175,14 +152,10 @@ public:
        std::deque<std::pair<int, safe_ptr<core::write_frame>>> poll_filter_frames()\r
        {\r
                std::deque<std::pair<int, safe_ptr<core::write_frame>>> result;\r
-                               \r
-               if(filter_skip_ > 0)\r
-               {\r
-                       --filter_skip_;\r
-                       filter_->skip();\r
+               \r
+               if(!filter_->is_ready())\r
                        return result;\r
-               }\r
-\r
+                               \r
                auto frames = filter_->poll(); \r
 \r
                boost::range::transform(frames, std::back_inserter(result), [&](const safe_ptr<AVFrame>& frame)\r
index c160edc921afb879ce9c3fd9e59269b2f99cd680..8438d3a96fa24e99f3f903f6f0066d39ea9127ae 100644 (file)
@@ -16,7 +16,6 @@
       <consumers>\r
         <screen>                      \r
         </screen>\r
-        <audio></audio>\r
       </consumers>\r
     </channel>\r
 </channels>\r
index 2d9897f5fae53dfdb1093a85469833ba0bbe128b..b2129b0abdf35c41eb32bb23d4c8a460749dab36 100644 (file)
@@ -214,7 +214,7 @@ int main(int argc, wchar_t* argv[])
                        else if(wcmd.substr(0, 1) == L"3")\r
                                wcmd = L"CG 1-2 ADD 1 BBTELEFONARE 1";\r
                        else if(wcmd.substr(0, 1) == L"4")\r
-                               wcmd = L"PLAY 1-1 DV SEEK 350 FILTER yadif=1:-1 LOOP";\r
+                               wcmd = L"PLAY 1-1 DV FILTER yadif=1:-1 LOOP";\r
                        else if(wcmd.substr(0, 1) == L"X")\r
                        {\r
                                int num = 0;\r