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
{\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
\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
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