]> git.sesse.net Git - casparcg/commitdiff
2.0. ffmoeg_producer: IMproved filter loop perofmrance.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 20 Jun 2011 15:01:09 +0000 (15:01 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 20 Jun 2011 15:01:09 +0000 (15:01 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@926 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

modules/decklink/interop/DeckLinkAPI_h.h
modules/decklink/interop/DeckLinkAPI_i.c
modules/ffmpeg/producer/filter/filter.cpp
modules/ffmpeg/producer/filter/filter.h
modules/ffmpeg/producer/video/video_decoder.cpp
shell/main.cpp

index a0231a41b092f6563f62cbf75f3fdbb221c0bffe..d1914873711d4203d078c61d9e99a76e088db58b 100644 (file)
@@ -4,7 +4,7 @@
 \r
 \r
  /* File created by MIDL compiler version 7.00.0555 */\r
-/* at Mon Jun 20 10:23:35 2011\r
+/* at Mon Jun 20 15:48:22 2011\r
  */\r
 /* Compiler settings for interop\DeckLinkAPI.idl:\r
     Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 \r
index 817db1f271360dc377c4147dd62efd6eb9fbee98..9aeeda8ae8212e20d2ff462bba1dd118fc4fe0f7 100644 (file)
@@ -6,7 +6,7 @@
 \r
 \r
  /* File created by MIDL compiler version 7.00.0555 */\r
-/* at Mon Jun 20 10:23:35 2011\r
+/* at Mon Jun 20 15:48:22 2011\r
  */\r
 /* Compiler settings for interop\DeckLinkAPI.idl:\r
     Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 \r
index 3c86868b12eb855890ff51df7533943a91ab2e85..9debb1d69b3b624feafd155f232f36d1fdb715c3 100644 (file)
@@ -160,10 +160,21 @@ struct filter::implementation
 \r
                return frame;\r
        }\r
+\r
+       void skip()\r
+       {\r
+               int errn = avfilter_poll_frame(video_out_filter_->inputs[0]);\r
+               if(errn < 0)\r
+               {\r
+                       BOOST_THROW_EXCEPTION(caspar_exception() <<     msg_info(av_error_str(errn)) <<\r
+                               boost::errinfo_api_function("avfilter_poll_frame") << boost::errinfo_errno(AVUNERROR(errn)));\r
+               }\r
+       }\r
 };\r
 \r
 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
 \r
 }
\ No newline at end of file
index cbfb8188d6db88e8137d2896398e2e0794317e7c..a520561e7891c8af8b9cd926818bb2aeefc12284 100644 (file)
@@ -15,6 +15,7 @@ public:
 \r
        void push(const safe_ptr<AVFrame>& frame);\r
        std::vector<safe_ptr<AVFrame>> poll();\r
+       void skip();\r
 \r
 private:\r
        struct implementation;\r
index 0acaf3b51266a962a79ddbce2df2fc3e2255b0e6..702a4690aa046fc84bcb4e02396d14948d09fd05 100644 (file)
@@ -66,6 +66,7 @@ struct video_decoder::implementation : boost::noncopyable
 \r
        std::shared_ptr<filter>                                         filter_;\r
        size_t                                                                          filter_delay_;\r
+       size_t                                                                          filter_skip_;\r
 \r
        std::shared_ptr<AVFrame>                                        last_frame_;\r
        std::shared_ptr<AVFrame>                                        decoded_frame_;\r
@@ -79,6 +80,7 @@ public:
                , 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_str_(filter_str)\r
        {\r
@@ -143,8 +145,10 @@ public:
                {\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
+                               boost::range::push_back(result, poll_filter_frames());\r
+                       }\r
 \r
                        for(size_t n = 0; n < filter_delay_; ++n)\r
                        {                                       \r
@@ -153,8 +157,7 @@ public:
                        }\r
 \r
                        // FIXME: Unnecessary reinitialization\r
-                       filter_.reset(filter_str_.empty() ? nullptr : new filter(filter_str_));\r
-                       filter_delay_ = 0;\r
+                       filter_skip_ = filter_delay_;\r
                        decoded_frame_ = nullptr;\r
                }\r
 \r
@@ -172,6 +175,13 @@ 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
+                       return result;\r
+               }\r
 \r
                auto frames = filter_->poll(); \r
 \r
@@ -179,12 +189,12 @@ public:
                {\r
                        return std::make_pair(frame_number_, make_write_frame(frame));\r
                });\r
-\r
+               \r
                if(!frames.empty())\r
                        ++frame_number_;\r
                else            \r
-                       ++filter_delay_;\r
-               \r
+                       ++filter_delay_;                \r
+\r
                return result;\r
        }\r
        \r
index 1f95ebb663ac3c39b58e18b10c15120e7f7bdd28..2d9897f5fae53dfdb1093a85469833ba0bbe128b 100644 (file)
@@ -140,6 +140,8 @@ int main(int argc, wchar_t* argv[])
 {      \r
        static_assert(sizeof(void*) == 4, "64-bit code generation is not supported.");\r
        \r
+       CASPAR_LOG(info) << L"Type \"q\" to close application";\r
+\r
        CASPAR_LOG(info) << L"THIS IS AN ALPHA BUILD";\r
 \r
        // Set debug mode.\r