]> git.sesse.net Git - casparcg/commitdiff
2.0. parallel_yadif: Reduced overhead.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 22 Aug 2011 12:05:39 +0000 (12:05 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 22 Aug 2011 12:05:39 +0000 (12:05 +0000)
     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

dlls/avcodec-53.dll
dlls/avfilter-2.dll
dlls/avformat-53.dll
dlls/avutil-51.dll
dlls/swscale-2.dll
modules/ffmpeg/producer/filter/filter.cpp
modules/ffmpeg/producer/filter/parallel_yadif.cpp
modules/ffmpeg/producer/filter/parallel_yadif.h
shell/casparcg.config

index ad696782a25f9b8ce9ce7d2030f304af4cc94663..0f6257f49fd682a30fe30be0b8db518219b65518 100644 (file)
Binary files a/dlls/avcodec-53.dll and b/dlls/avcodec-53.dll differ
index 2819f83479232416b8b4afcc09bc34083af3f35d..94b0faf02c4f24342f5b293e3ab9d811b56dcc64 100644 (file)
Binary files a/dlls/avfilter-2.dll and b/dlls/avfilter-2.dll differ
index 02d5bf3d4200d1b78b087ddcb38db98014bd7127..f1450aaf3506ddada0b0c2c9731ca647ef0d85ec 100644 (file)
Binary files a/dlls/avformat-53.dll and b/dlls/avformat-53.dll differ
index 528c80e575ccf862fbb2b8aca67ae3baa9b4322b..a593dfc47fe73db171164af881b769f76f0fe7f3 100644 (file)
Binary files a/dlls/avutil-51.dll and b/dlls/avutil-51.dll differ
index 77e4d7ee6d7f7de0e630ecf3245c814f44cfa646..71a68dc0a6ba660dd0c16a289dadbe7f20b6acfd 100644 (file)
Binary files a/dlls/swscale-2.dll and b/dlls/swscale-2.dll differ
index 58591093e31edeb1e9798e392eb620a7e89494e1..9478d523fafd7a96a0440c61d8291262e38bf380 100644 (file)
@@ -110,7 +110,7 @@ struct filter::implementation
                        {\r
                                auto filter_name = graph_->filters[n]->name;\r
                                if(strstr(filter_name, "yadif") != 0)\r
-                                       parallel_yadif_ctx_ = make_parallel_yadif(graph_->filters[n], frame->height);\r
+                                       parallel_yadif_ctx_ = make_parallel_yadif(graph_->filters[n]);\r
                        }\r
                }\r
        \r
index 919528ca0448907bba4c76f9d74bab43cbba64e9..237cf0f515589cff39daa731f50cc00779d45b4a 100644 (file)
@@ -51,8 +51,9 @@ struct parallel_yadif_context
                int mode;\r
        };\r
 \r
-       arg     args[64];\r
+       arg     args[1080];\r
        int     index;\r
+       int last_index;\r
 \r
        parallel_yadif_context() : index(0){}\r
 };\r
@@ -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};\r
        ctx.args[ctx.index++] = arg;\r
        \r
-       if(ctx.index == 64)\r
+       if(ctx.index == ctx.last_index)\r
        {               \r
                tbb::parallel_for(tbb::blocked_range<size_t>(0, ctx.index), [=](const tbb::blocked_range<size_t>& r)\r
                {\r
@@ -75,13 +76,17 @@ void parallel_yadif_filter_line(parallel_yadif_context& ctx, uint8_t *dst, uint8
        }\r
 }\r
 \r
+namespace caspar {\r
+       \r
+tbb::concurrent_bounded_queue<decltype(org_yadif_filter_line)> parallel_line_func_pool;\r
+std::array<parallel_yadif_context, 18> ctxs;\r
+\r
 #define RENAME(a) f ## a\r
 \r
 #define ff(x) \\r
 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) \\r
 {\\r
-       static parallel_yadif_context ctx;\\r
-       parallel_yadif_filter_line(ctx, dst, prev, cur, next, w, prefs, mrefs, parity, mode);\\r
+       parallel_yadif_filter_line(ctxs[x], dst, prev, cur, next, w, prefs, mrefs, parity, mode);\\r
 }\r
 \r
 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);\r
@@ -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) = \r
 {f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17};\r
 \r
-namespace caspar {\r
-       \r
-tbb::concurrent_bounded_queue<decltype(org_yadif_filter_line)> parallel_line_func_pool;\r
 \r
 void init_pool()\r
 {\r
@@ -105,11 +107,8 @@ void return_parallel_yadif(void* func)
                parallel_line_func_pool.push(reinterpret_cast<decltype(fs[0])>(func));\r
 }\r
 \r
-std::shared_ptr<void> make_parallel_yadif(AVFilterContext* ctx, size_t height)\r
+std::shared_ptr<void> make_parallel_yadif(AVFilterContext* ctx)\r
 {\r
-       if(height % 64 != 0)\r
-               return std::shared_ptr<void>(nullptr, return_parallel_yadif);\r
-\r
        static boost::once_flag flag = BOOST_ONCE_INIT;\r
        boost::call_once(&init_pool, flag);\r
 \r
@@ -120,8 +119,15 @@ std::shared_ptr<void> make_parallel_yadif(AVFilterContext* ctx, size_t height)
        if(!parallel_line_func_pool.try_pop(func))      \r
                CASPAR_LOG(warning) << "Not enough scalable-yadif context instances. Running non-scalable";\r
        else\r
+       {\r
+               int index = 0;\r
+               while(index < sizeof(fs)/sizeof(fs[0]) && fs[index] != func)\r
+                       ++index;\r
+\r
+               ctxs[index].last_index = ctx->inputs[0]->h;\r
                yadif->filter_line = func;\r
-       \r
+       }\r
+\r
        return std::shared_ptr<void>(func, return_parallel_yadif);\r
 }\r
 \r
index 505ccc48fbdc8da15f7417a4f07a937b369ed320..44a0e87211003c0776090847106e53689e476f35 100644 (file)
@@ -6,6 +6,6 @@ struct AVFilterContext;
 \r
 namespace caspar {\r
        \r
-std::shared_ptr<void> make_parallel_yadif(AVFilterContext* ctx, size_t height);\r
+std::shared_ptr<void> make_parallel_yadif(AVFilterContext* ctx);\r
 \r
 }
\ No newline at end of file
index 0b319e0958aa0854f103b33888d59d2cd788d305..8e02dace41a604f7236915fd9c58bbd8bb634006 100644 (file)
   </producers>\r
   <channels>\r
     <channel>\r
-      <video-mode>PAL</video-mode>\r
+      <video-mode>720p5000</video-mode>\r
       <consumers>\r
         <decklink>\r
           <device>1</device>\r
+          <embedded-audio>true</embedded-audio>\r
         </decklink>\r
+        <screen>\r
+          <device>1</device>\r
+        </screen>\r
       </consumers>\r
     </channel>\r
 </channels>\r