]> git.sesse.net Git - casparcg/commitdiff
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 27 Oct 2011 11:30:12 +0000 (11:30 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 27 Oct 2011 11:30:12 +0000 (11:30 +0000)
modules/ffmpeg/producer/frame_muxer.cpp
modules/ffmpeg/producer/video/video_decoder.cpp

index 11f328458785887708661e3219cbb3f0060d9c24..d9d99170e9179a16633ec40556d07e8e58612e54 100644 (file)
@@ -74,7 +74,7 @@ struct frame_muxer2::implementation : public Concurrency::agent, boost::noncopya
                , format_desc_(frame_factory->get_video_format_desc())\r
                , auto_transcode_(env::properties().get("configuration.producers.auto-transcode", false))\r
                , frame_factory_(frame_factory)\r
-               , governor_(1)\r
+               , governor_(2)\r
        {               \r
                is_running_ = true;\r
                start();\r
index cc8a375fc18baadc18b12916197e6f8695d1b49c..8970f204bddb8eb37063bd75556248d6c042676b 100644 (file)
@@ -77,7 +77,7 @@ public:
                , is_progressive_(true)\r
                , source_([this](const video_decoder::source_element_t& packet){return packet->stream_index == index_;})\r
                , target_(target)\r
-               , governor_(2)\r
+               , governor_(1) // IMPORTANT: Must be 1 since avcodec_decode_video2 reuses memory.\r
        {               \r
                CASPAR_LOG(debug) << "[video_decoder] " << context.streams[index_]->codec->codec->long_name;\r
                \r
@@ -132,9 +132,8 @@ public:
                                                pkt.size = 0;\r
 \r
                                                for(auto decoded_frame = decode(pkt); decoded_frame; decoded_frame = decode(pkt))\r
-                                               {\r
-                                                       auto frame = dup_frame(make_safe_ptr(decoded_frame));                                                           \r
-                                                       send(target_, safe_ptr<AVFrame>(frame.get(), [frame, ticket](AVFrame*){}));\r
+                                               {                                               \r
+                                                       send(target_, safe_ptr<AVFrame>(decoded_frame.get(), [decoded_frame, ticket](AVFrame*){}));\r
                                                        Context::Yield();\r
                                                }\r
                                        }\r
@@ -155,8 +154,7 @@ public:
                                \r
                                // C-TODO: Avoid duplication.\r
                                // Need to dupliace frame data since avcodec_decode_video2 reuses it.\r
-                               auto frame = dup_frame(make_safe_ptr(decoded_frame));\r
-                               send(target_, safe_ptr<AVFrame>(frame.get(), [frame, ticket](AVFrame*){}));                             \r
+                               send(target_, safe_ptr<AVFrame>(decoded_frame.get(), [decoded_frame, ticket](AVFrame*){}));                             \r
                                Context::Yield();\r
                        }\r
                }\r
@@ -169,30 +167,7 @@ public:
 \r
                done();\r
        }\r
-\r
-       safe_ptr<AVFrame> dup_frame(const safe_ptr<AVFrame>& frame)\r
-       {\r
-               auto desc = get_pixel_format_desc(static_cast<PixelFormat>(frame->format), frame->width, frame->height);\r
-\r
-               auto count = desc.planes.size();\r
-               std::array<uint8_t*, 4> org_ptrs;\r
-               std::array<safe_ptr<uint8_t>, 4> new_ptrs;\r
-               parallel_for<size_t>(0, count, [&](size_t n)\r
-               {\r
-                       CASPAR_ASSERT(frame->data[n]);\r
-                       auto size               = frame->linesize[n]*desc.planes[n].height;\r
-                       new_ptrs[n]             = fast_memdup(frame->data[n], size);\r
-                       org_ptrs[n]             = frame->data[n];\r
-                       frame->data[n]  = new_ptrs[n].get();\r
-               });\r
-\r
-               return safe_ptr<AVFrame>(frame.get(), [frame, org_ptrs, new_ptrs, count](AVFrame*)\r
-               {\r
-                       for(size_t n = 0; n < count; ++n)\r
-                               frame->data[n] = org_ptrs[n];\r
-               });\r
-       }\r
-               \r
+                       \r
        double fps() const\r
        {\r
                return fps_;\r