]> git.sesse.net Git - casparcg/commitdiff
2.0. parallel_yadif: Refactored.
authorRonag <Ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 31 Jul 2011 16:28:10 +0000 (16:28 +0000)
committerRonag <Ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 31 Jul 2011 16:28:10 +0000 (16:28 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@1032 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

modules/ffmpeg/producer/filter/filter.cpp
modules/ffmpeg/producer/filter/parallel_yadif.cpp
modules/ffmpeg/producer/filter/parallel_yadif.h

index 57fa4885f36a548e78be5244dbbf320cae4e053b..67688428736e5da9a8a7d7e5c73596ace7d25767 100644 (file)
@@ -39,20 +39,15 @@ struct filter::implementation
        std::shared_ptr<AVFilterGraph>  graph_; \r
        AVFilterContext*                                buffersink_ctx_;\r
        AVFilterContext*                                buffersrc_ctx_;\r
-       int                                                             parallel_yadif_tag_;\r
+       std::shared_ptr<void>                   parallel_yadif_ctx_;\r
                \r
        implementation(const std::wstring& filters) \r
                : filters_(filters.empty() ? "null" : narrow(filters))\r
-               , parallel_yadif_tag_(-1)\r
+               , parallel_yadif_ctx_(nullptr)\r
        {\r
                std::transform(filters_.begin(), filters_.end(), filters_.begin(), ::tolower);\r
        }\r
-\r
-       ~implementation()\r
-       {\r
-               uninit_parallel_yadif(parallel_yadif_tag_);\r
-       }\r
-\r
+       \r
        std::vector<safe_ptr<AVFrame>> execute(const std::shared_ptr<AVFrame>& frame)\r
        {\r
                push(frame);\r
@@ -136,7 +131,7 @@ struct filter::implementation
                        {\r
                                auto filter_name = graph_->filters[n]->name;\r
                                if(strstr(filter_name, "yadif") != 0)\r
-                                       parallel_yadif_tag_ = init_parallel_yadif(graph_->filters[n]);\r
+                                       parallel_yadif_ctx_ = make_parallel_yadif(graph_->filters[n]);\r
                        }\r
                }\r
        \r
index 4b2483ba95bd06bd5a70c3d3281c8dea9c568cc9..3983641e02eb561e4f5db9ec0c3660e044cbc888 100644 (file)
@@ -80,15 +80,21 @@ void (*fs[])(uint8_t *dst, uint8_t *prev, uint8_t *cur, uint8_t *next, int w, in
 \r
 namespace caspar {\r
        \r
-tbb::concurrent_bounded_queue<int> tags;\r
+tbb::concurrent_bounded_queue<decltype(org_yadif_filter_line)> parallel_line_func_pool;\r
 \r
 void init_pool()\r
 {\r
-       for(int n = 0; n < 18; ++n)\r
-               tags.push(n);\r
+       for(int n = 0; n < sizeof(fs)/sizeof(decltype(org_yadif_filter_line)); ++n)\r
+               parallel_line_func_pool.push(fs[n]);\r
 }\r
 \r
-int init(AVFilterContext* ctx)\r
+void return_parallel_yadif(void* func)\r
+{\r
+       if(func != nullptr)\r
+               parallel_line_func_pool.push(reinterpret_cast<decltype(org_yadif_filter_line)>(func));\r
+}\r
+\r
+std::shared_ptr<void> make_parallel_yadif(AVFilterContext* ctx)\r
 {\r
        static boost::once_flag flag = BOOST_ONCE_INIT;\r
        boost::call_once(&init_pool, flag);\r
@@ -96,21 +102,13 @@ int init(AVFilterContext* ctx)
        YADIFContext* yadif = (YADIFContext*)ctx->priv;\r
        org_yadif_filter_line = yadif->filter_line; // Data race is not a problem.\r
 \r
-       int tag;\r
-       if(!tags.try_pop(tag))\r
-       {\r
+       decltype(org_yadif_filter_line) func = nullptr;\r
+       if(!parallel_line_func_pool.try_pop(func))      \r
                CASPAR_LOG(warning) << "Not enough scalable-yadif instances. Running non-scalable";\r
-               return -1;\r
-       }\r
-\r
-       yadif->filter_line = fs[tag];\r
-       return tag;\r
-}\r
-\r
-void uninit(int tag)\r
-{\r
-       if(tag != -1)\r
-               tags.push(tag);\r
+       else\r
+               yadif->filter_line = func;\r
+       \r
+       return std::shared_ptr<void>(func, return_parallel_yadif);\r
 }\r
 \r
 }
\ No newline at end of file
index 8c93a2261e54f693193000cd5b1be58b7489dd33..3146d472fd8be9a5a3426952341ca79913a2b73b 100644 (file)
@@ -4,7 +4,6 @@ struct AVFilterContext;
 \r
 namespace caspar {\r
        \r
-int init_parallel_yadif(AVFilterContext* ctx);\r
-void uninit_parallel_yadif(int tag);\r
+std::shared_ptr<void> make_parallel_yadif(AVFilterContext* ctx);\r
 \r
 }
\ No newline at end of file