X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fffmpeg%2Fproducer%2Ffilter%2Fparallel_yadif.cpp;h=237cf0f515589cff39daa731f50cc00779d45b4a;hb=6f98c4b8b068f475edca3dc25a10fc35488c5ccf;hp=919528ca0448907bba4c76f9d74bab43cbba64e9;hpb=a9c35446e99247a3445e7c9f1633adcb30f22546;p=casparcg diff --git a/modules/ffmpeg/producer/filter/parallel_yadif.cpp b/modules/ffmpeg/producer/filter/parallel_yadif.cpp index 919528ca0..237cf0f51 100644 --- a/modules/ffmpeg/producer/filter/parallel_yadif.cpp +++ b/modules/ffmpeg/producer/filter/parallel_yadif.cpp @@ -51,8 +51,9 @@ struct parallel_yadif_context int mode; }; - arg args[64]; + arg args[1080]; int index; + int last_index; parallel_yadif_context() : index(0){} }; @@ -64,7 +65,7 @@ void parallel_yadif_filter_line(parallel_yadif_context& ctx, uint8_t *dst, uint8 parallel_yadif_context::arg arg = {dst, prev, cur, next, w, prefs, mrefs, parity, mode}; ctx.args[ctx.index++] = arg; - if(ctx.index == 64) + if(ctx.index == ctx.last_index) { tbb::parallel_for(tbb::blocked_range(0, ctx.index), [=](const tbb::blocked_range& r) { @@ -75,13 +76,17 @@ void parallel_yadif_filter_line(parallel_yadif_context& ctx, uint8_t *dst, uint8 } } +namespace caspar { + +tbb::concurrent_bounded_queue parallel_line_func_pool; +std::array ctxs; + #define RENAME(a) f ## a #define ff(x) \ void RENAME(x)(uint8_t *dst, uint8_t *prev, uint8_t *cur, uint8_t *next, int w, int prefs, int mrefs, int parity, int mode) \ {\ - static parallel_yadif_context ctx;\ - parallel_yadif_filter_line(ctx, dst, prev, cur, next, w, prefs, mrefs, parity, mode);\ + parallel_yadif_filter_line(ctxs[x], dst, prev, cur, next, w, prefs, mrefs, parity, mode);\ } ff(0); ff(1); ff(2); ff(3); ff(4); ff(5); ff(6); ff(7); ff(8); ff(9); ff(10); ff(11); ff(12); ff(13); ff(14); ff(15); ff(16); ff(17); @@ -89,9 +94,6 @@ ff(0); ff(1); ff(2); ff(3); ff(4); ff(5); ff(6); ff(7); ff(8); ff(9); ff(10); ff void (*fs[])(uint8_t *dst, uint8_t *prev, uint8_t *cur, uint8_t *next, int w, int prefs, int mrefs, int parity, int mode) = {f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17}; -namespace caspar { - -tbb::concurrent_bounded_queue parallel_line_func_pool; void init_pool() { @@ -105,11 +107,8 @@ void return_parallel_yadif(void* func) parallel_line_func_pool.push(reinterpret_cast(func)); } -std::shared_ptr make_parallel_yadif(AVFilterContext* ctx, size_t height) +std::shared_ptr make_parallel_yadif(AVFilterContext* ctx) { - if(height % 64 != 0) - return std::shared_ptr(nullptr, return_parallel_yadif); - static boost::once_flag flag = BOOST_ONCE_INIT; boost::call_once(&init_pool, flag); @@ -120,8 +119,15 @@ std::shared_ptr make_parallel_yadif(AVFilterContext* ctx, size_t height) if(!parallel_line_func_pool.try_pop(func)) CASPAR_LOG(warning) << "Not enough scalable-yadif context instances. Running non-scalable"; else + { + int index = 0; + while(index < sizeof(fs)/sizeof(fs[0]) && fs[index] != func) + ++index; + + ctxs[index].last_index = ctx->inputs[0]->h; yadif->filter_line = func; - + } + return std::shared_ptr(func, return_parallel_yadif); }