From: ronag Date: Mon, 22 Aug 2011 12:05:39 +0000 (+0000) Subject: 2.0. parallel_yadif: Reduced overhead. X-Git-Tag: 2.0.1~74 X-Git-Url: https://git.sesse.net/?p=casparcg;a=commitdiff_plain;h=6f98c4b8b068f475edca3dc25a10fc35488c5ccf 2.0. parallel_yadif: Reduced overhead. ffmpeg: Updated version. git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@1266 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d --- diff --git a/dlls/avcodec-53.dll b/dlls/avcodec-53.dll index ad696782a..0f6257f49 100644 Binary files a/dlls/avcodec-53.dll and b/dlls/avcodec-53.dll differ diff --git a/dlls/avfilter-2.dll b/dlls/avfilter-2.dll index 2819f8347..94b0faf02 100644 Binary files a/dlls/avfilter-2.dll and b/dlls/avfilter-2.dll differ diff --git a/dlls/avformat-53.dll b/dlls/avformat-53.dll index 02d5bf3d4..f1450aaf3 100644 Binary files a/dlls/avformat-53.dll and b/dlls/avformat-53.dll differ diff --git a/dlls/avutil-51.dll b/dlls/avutil-51.dll index 528c80e57..a593dfc47 100644 Binary files a/dlls/avutil-51.dll and b/dlls/avutil-51.dll differ diff --git a/dlls/swscale-2.dll b/dlls/swscale-2.dll index 77e4d7ee6..71a68dc0a 100644 Binary files a/dlls/swscale-2.dll and b/dlls/swscale-2.dll differ diff --git a/modules/ffmpeg/producer/filter/filter.cpp b/modules/ffmpeg/producer/filter/filter.cpp index 58591093e..9478d523f 100644 --- a/modules/ffmpeg/producer/filter/filter.cpp +++ b/modules/ffmpeg/producer/filter/filter.cpp @@ -110,7 +110,7 @@ struct filter::implementation { auto filter_name = graph_->filters[n]->name; if(strstr(filter_name, "yadif") != 0) - parallel_yadif_ctx_ = make_parallel_yadif(graph_->filters[n], frame->height); + parallel_yadif_ctx_ = make_parallel_yadif(graph_->filters[n]); } } 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); } diff --git a/modules/ffmpeg/producer/filter/parallel_yadif.h b/modules/ffmpeg/producer/filter/parallel_yadif.h index 505ccc48f..44a0e8721 100644 --- a/modules/ffmpeg/producer/filter/parallel_yadif.h +++ b/modules/ffmpeg/producer/filter/parallel_yadif.h @@ -6,6 +6,6 @@ struct AVFilterContext; namespace caspar { -std::shared_ptr make_parallel_yadif(AVFilterContext* ctx, size_t height); +std::shared_ptr make_parallel_yadif(AVFilterContext* ctx); } \ No newline at end of file diff --git a/shell/casparcg.config b/shell/casparcg.config index 0b319e095..8e02dace4 100644 --- a/shell/casparcg.config +++ b/shell/casparcg.config @@ -49,11 +49,15 @@ - PAL + 720p5000 1 + true + + 1 +