]> git.sesse.net Git - casparcg/commitdiff
2.0. auto-mode: Will not deinterlace interlaced content while running in progressive...
authorRonag <Ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sat, 30 Jul 2011 10:17:04 +0000 (10:17 +0000)
committerRonag <Ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sat, 30 Jul 2011 10:17:04 +0000 (10:17 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@1020 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

15 files changed:
core/core.vcxproj
core/core.vcxproj.filters
core/mixer/audio/audio_mixer.cpp
core/mixer/image/image_mixer.cpp
core/mixer/write_frame.cpp
core/mixer/write_frame.h
core/producer/frame_muxer.h [deleted file]
modules/decklink/producer/decklink_producer.cpp
modules/ffmpeg/ffmpeg.vcxproj
modules/ffmpeg/ffmpeg.vcxproj.filters
modules/ffmpeg/producer/ffmpeg_producer.cpp
modules/ffmpeg/producer/frame_muxer.cpp [moved from core/producer/frame_muxer.cpp with 74% similarity]
modules/ffmpeg/producer/frame_muxer.h [new file with mode: 0644]
modules/ffmpeg/producer/util.h
modules/ffmpeg/producer/video/video_decoder.cpp

index 2876d14e77322cd0ebda8f6a4d115823521eba3b..2480eff5d1dc6bd79a54b5b9cc1fba0635c3d194 100644 (file)
   <ItemGroup>\r
     <ClInclude Include="mixer\gpu\shader.h" />\r
     <ClInclude Include="mixer\image\blending_glsl.h" />\r
-    <ClInclude Include="producer\frame_muxer.h" />\r
     <ClInclude Include="video_channel.h" />\r
     <ClInclude Include="video_channel_context.h" />\r
     <ClInclude Include="consumer\output.h" />\r
       <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Develop|Win32'">../../../StdAfx.h</PrecompiledHeaderFile>\r
       <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../../StdAfx.h</PrecompiledHeaderFile>\r
     </ClCompile>\r
-    <ClCompile Include="producer\frame_muxer.cpp">\r
-      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Profile|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
-      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
-      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Develop|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
-      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
-    </ClCompile>\r
     <ClCompile Include="video_channel.cpp" />\r
     <ClCompile Include="consumer\frame_consumer.cpp">\r
       <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Profile|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
index b627df1397a1cf654a5920200435c6ef6b8ca05d..ee585c6ad390b7dfb8b86ffc7c7e505e03d5f5a9 100644 (file)
     <ClInclude Include="mixer\gpu\shader.h">\r
       <Filter>source\mixer\gpu</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="producer\frame_muxer.h">\r
-      <Filter>source\producer</Filter>\r
-    </ClInclude>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ClCompile Include="producer\transition\transition_producer.cpp">\r
     <ClCompile Include="mixer\gpu\shader.cpp">\r
       <Filter>source\mixer\gpu</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="producer\frame_muxer.cpp">\r
-      <Filter>source\producer</Filter>\r
-    </ClCompile>\r
   </ItemGroup>\r
 </Project>
\ No newline at end of file
index b9e9b0b59224807723a9dd1671a9ab11ad72fe79..7c84bb197a71a589318aa4134365ba2b537e0c9e 100644 (file)
@@ -31,8 +31,8 @@ struct audio_mixer::implementation
        std::deque<std::vector<int16_t>> audio_data_;\r
        std::stack<core::audio_transform> transform_stack_;\r
 \r
-       std::map<int, core::audio_transform> prev_audio_transforms_;\r
-       std::map<int, core::audio_transform> next_audio_transforms_;\r
+       std::map<const void*, core::audio_transform> prev_audio_transforms_;\r
+       std::map<const void*, core::audio_transform> next_audio_transforms_;\r
 \r
        const core::video_format_desc format_desc_;\r
 \r
index ceb270cd756b795b01f664621dc71c3485fdbe03..aab74c5156b7d74b8d01043f2620b1965f4faee0 100644 (file)
@@ -50,7 +50,7 @@ struct render_item
        pixel_format_desc                                        desc;\r
        std::vector<safe_ptr<device_buffer>> textures;\r
        core::image_transform                            transform;\r
-       int                                                                      tag;\r
+       const void*                                                      tag;\r
 };\r
 \r
 bool operator==(const render_item& lhs, const render_item& rhs)\r
@@ -240,7 +240,7 @@ public:
                                \r
        safe_ptr<write_frame> create_frame(const void* tag, const core::pixel_format_desc& desc)\r
        {\r
-               return make_safe<write_frame>(channel_.ogl(), reinterpret_cast<int>(tag), desc);\r
+               return make_safe<write_frame>(channel_.ogl(), tag, desc);\r
        }\r
 };\r
 \r
index e5b8efbae5dcab787646c6808b90b3a94eaa3d17..62339f8e1ea5f750bff06d467b436a6b37545f16 100644 (file)
@@ -37,15 +37,15 @@ struct write_frame::implementation
        std::vector<safe_ptr<device_buffer>>            textures_;\r
        std::vector<int16_t>                                            audio_data_;\r
        const core::pixel_format_desc                           desc_;\r
-       int                                                                                     tag_;\r
+       const void*                                                                     tag_;\r
        core::video_mode::type                                          mode_;\r
 \r
-       implementation(int tag)\r
+       implementation(const void* tag)\r
                : tag_(tag)\r
        {\r
        }\r
 \r
-       implementation(ogl_device& ogl, int tag, const core::pixel_format_desc& desc) \r
+       implementation(ogl_device& ogl, const void* tag, const core::pixel_format_desc& desc) \r
                : ogl_(&ogl)\r
                , desc_(desc)\r
                , tag_(tag)\r
@@ -112,8 +112,8 @@ struct write_frame::implementation
        }\r
 };\r
        \r
-write_frame::write_frame(int tag) : impl_(new implementation(tag)){}\r
-write_frame::write_frame(ogl_device& ogl, int32_t tag, const core::pixel_format_desc& desc) \r
+write_frame::write_frame(const void* tag) : impl_(new implementation(tag)){}\r
+write_frame::write_frame(ogl_device& ogl, const void* tag, const core::pixel_format_desc& desc) \r
        : impl_(new implementation(ogl, tag, desc)){}\r
 write_frame::write_frame(const write_frame& other) : impl_(new implementation(*other.impl_)){}\r
 void write_frame::accept(core::frame_visitor& visitor){impl_->accept(*this, visitor);}\r
@@ -128,7 +128,7 @@ const boost::iterator_range<const int16_t*> write_frame::audio_data() const
 {\r
        return boost::iterator_range<const int16_t*>(impl_->audio_data_.data(), impl_->audio_data_.data() + impl_->audio_data_.size());\r
 }\r
-int write_frame::tag() const {return impl_->tag_;}\r
+const void* write_frame::tag() const {return impl_->tag_;}\r
 const core::pixel_format_desc& write_frame::get_pixel_format_desc() const{return impl_->desc_;}\r
 const std::vector<safe_ptr<device_buffer>>& write_frame::get_textures() const{return impl_->textures_;}\r
 void write_frame::commit(size_t plane_index){impl_->commit(plane_index);}\r
index 0b2b2090ed0812a9b2acd3d4612c01fe02f73409..43879554c2955efe5c7e70ee67bc768472c8ca69 100644 (file)
@@ -41,8 +41,8 @@ class ogl_device;
 class write_frame : public core::basic_frame, boost::noncopyable\r
 {\r
 public:        \r
-       write_frame(int tag);\r
-       explicit write_frame(ogl_device& ogl, int tag, const core::pixel_format_desc& desc);\r
+       write_frame(const void* tag);\r
+       explicit write_frame(ogl_device& ogl, const void* tag, const core::pixel_format_desc& desc);\r
        write_frame(const write_frame& other);\r
                        \r
        virtual boost::iterator_range<uint8_t*> image_data(size_t plane_index = 0);     \r
@@ -59,7 +59,7 @@ public:
        \r
        virtual void accept(core::frame_visitor& visitor);\r
 \r
-       virtual int tag() const;\r
+       virtual const void* tag() const;\r
 \r
        const core::pixel_format_desc& get_pixel_format_desc() const;\r
        \r
diff --git a/core/producer/frame_muxer.h b/core/producer/frame_muxer.h
deleted file mode 100644 (file)
index 0d24010..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-#pragma once\r
-\r
-#include "../video_format.h"\r
-\r
-#include <common/memory/safe_ptr.h>\r
-\r
-#include <vector>\r
-\r
-namespace caspar { namespace core {\r
-\r
-class write_frame;\r
-class basic_frame;\r
-\r
-class frame_muxer\r
-{\r
-public:\r
-       frame_muxer(double in_fps, const video_format_desc& format_desc);\r
-       \r
-       void push(const std::shared_ptr<write_frame>& video_frame);\r
-       void push(const std::shared_ptr<std::vector<int16_t>>& audio_samples);\r
-       \r
-       size_t video_frames() const;\r
-       size_t audio_chunks() const;\r
-\r
-       size_t size() const;\r
-       bool empty() const;\r
-\r
-       safe_ptr<basic_frame> pop();\r
-private:\r
-       struct implementation;\r
-       safe_ptr<implementation> impl_;\r
-};\r
-\r
-}}
\ No newline at end of file
index d914aacdeb8e7c68a8e0ea64da1ec4173ecaedc2..59bfbae1af021a7ae9dcb2bbb32c385ba611a4f2 100644 (file)
@@ -27,6 +27,7 @@
 \r
 #include "../../ffmpeg/producer/filter/filter.h"\r
 #include "../../ffmpeg/producer/util.h"\r
+#include "../../ffmpeg/producer/frame_muxer.h"\r
 \r
 #include <common/diagnostics/graph.h>\r
 #include <common/concurrency/com_context.h>\r
@@ -36,7 +37,6 @@
 #include <core/mixer/write_frame.h>\r
 #include <core/producer/frame/audio_transform.h>\r
 #include <core/producer/frame/frame_factory.h>\r
-#include <core/producer/frame_muxer.h>\r
 \r
 #include <tbb/concurrent_queue.h>\r
 #include <tbb/atomic.h>\r
@@ -72,7 +72,7 @@ extern "C"
 \r
 namespace caspar { \r
                \r
-class decklink_producer : public IDeckLinkInputCallback\r
+class decklink_producer : boost::noncopyable, public IDeckLinkInputCallback\r
 {      \r
        CComPtr<IDeckLink>                                                                                      decklink_;\r
        CComQIPtr<IDeckLinkInput>                                                                       input_;\r
@@ -93,7 +93,7 @@ class decklink_producer : public IDeckLinkInputCallback
        std::exception_ptr                                                                                      exception_;\r
        filter                                                                                                          filter_;\r
                \r
-       core::frame_muxer                                                                                       muxer_;\r
+       frame_muxer                                                                                                     muxer_;\r
 \r
 public:\r
        decklink_producer(const core::video_format_desc& format_desc, size_t device_index, const safe_ptr<core::frame_factory>& frame_factory, const std::wstring& filter)\r
@@ -105,7 +105,7 @@ public:
                , frame_factory_(frame_factory)\r
                , tail_(core::basic_frame::empty())\r
                , filter_(filter)\r
-               , muxer_(double_rate(filter) ? format_desc.fps * 2.0 : format_desc.fps, frame_factory->get_video_format_desc())\r
+               , muxer_(double_rate(filter) ? format_desc.fps * 2.0 : format_desc.fps, frame_factory->get_video_format_desc(), frame_factory)\r
        {\r
                frame_buffer_.set_capacity(2);\r
                \r
index a9ae02fb0331d4f532d03e82515440385d2a4847..824c331463ddd14af4e4aff102325719e4f8871a 100644 (file)
       <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Develop|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
       <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
     </ClCompile>\r
+    <ClCompile Include="producer\frame_muxer.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Profile|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Develop|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
     <ClCompile Include="producer\input.cpp">\r
       <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Profile|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
       <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
     <ClInclude Include="producer\audio\audio_decoder.h" />\r
     <ClInclude Include="producer\ffmpeg_producer.h" />\r
     <ClInclude Include="producer\filter\filter.h" />\r
+    <ClInclude Include="producer\frame_muxer.h" />\r
     <ClInclude Include="producer\input.h" />\r
     <ClInclude Include="producer\util.h" />\r
     <ClInclude Include="producer\video\video_decoder.h" />\r
index 7956c29c030d3af108b53f19f112c0feb587e655..1714bf5e681f8aae4aedb3209c06d0307f8ab5b6 100644 (file)
@@ -46,6 +46,9 @@
     <ClCompile Include="producer\filter\filter.cpp">\r
       <Filter>source\producer\filter</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="producer\frame_muxer.cpp">\r
+      <Filter>source\producer</Filter>\r
+    </ClCompile>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ClInclude Include="producer\ffmpeg_producer.h">\r
@@ -79,5 +82,8 @@
     <ClInclude Include="producer\util.h">\r
       <Filter>source\producer</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="producer\frame_muxer.h">\r
+      <Filter>source\producer</Filter>\r
+    </ClInclude>\r
   </ItemGroup>\r
 </Project>
\ No newline at end of file
index 251803132b3f2fdd2ae32d78f213c3efc9b68e86..9e32f95f66aa40cd235db8971146509144bac522 100644 (file)
@@ -21,6 +21,7 @@
 \r
 #include "ffmpeg_producer.h"\r
 \r
+#include "frame_muxer.h"\r
 #include "input.h"\r
 #include "audio/audio_decoder.h"\r
 #include "video/video_decoder.h"\r
@@ -34,7 +35,6 @@
 #include <core/producer/frame/audio_transform.h>\r
 #include <core/producer/frame/basic_frame.h>\r
 #include <core/producer/color/color_producer.h>\r
-#include <core/producer/frame_muxer.h>\r
 \r
 #include <common/env.h>\r
 \r
@@ -65,7 +65,7 @@ struct ffmpeg_producer : public core::frame_producer
 \r
        std::queue<safe_ptr<core::basic_frame>>                 output_buffer_;\r
 \r
-       core::frame_muxer                                                               muxer_;\r
+       frame_muxer                                                                             muxer_;\r
        \r
        tbb::task_group                                                                 tasks_;\r
 \r
@@ -78,7 +78,7 @@ public:
                , input_(safe_ptr<diagnostics::graph>(graph_), filename_, loop, start, length)\r
                , video_decoder_(input_.context(), frame_factory, filter)\r
                , audio_decoder_(input_.context(), frame_factory->get_video_format_desc())\r
-               , muxer_(video_decoder_.fps(), format_desc_)\r
+               , muxer_(video_decoder_.fps(), format_desc_, frame_factory)\r
        {\r
                graph_->add_guide("frame-time", 0.5);\r
                graph_->set_color("frame-time", diagnostics::color(1.0f, 0.0f, 0.0f));\r
similarity index 74%
rename from core/producer/frame_muxer.cpp
rename to modules/ffmpeg/producer/frame_muxer.cpp
index 7b05a4aa7315a7f9c9dfada2af0165f3568e3adf..235306e878b4692905392530f67125ae8f37a2aa 100644 (file)
@@ -2,18 +2,25 @@
 \r
 #include "frame_muxer.h"\r
 \r
-#include "frame/basic_frame.h"\r
-#include "frame/image_transform.h"\r
-#include "frame/pixel_format.h"\r
-#include "../mixer/write_frame.h"\r
+#include "filter/filter.h"\r
+\r
+#include "util.h"\r
+\r
+#include <core/producer/frame/basic_frame.h>\r
+#include <core/producer/frame/image_transform.h>\r
+#include <core/producer/frame/pixel_format.h>\r
+#include <core/producer/frame/frame_factory.h>\r
+#include <core/mixer/write_frame.h>\r
 \r
 #include <common/env.h>\r
 #include <common/log/log.h>\r
 \r
 #include <boost/range/algorithm_ext/push_back.hpp>\r
 \r
-namespace caspar { namespace core {\r
-       \r
+using namespace caspar::core;\r
+\r
+namespace caspar {\r
+\r
 struct display_mode\r
 {\r
        enum type\r
@@ -90,7 +97,7 @@ display_mode::type get_display_mode(const core::video_mode::type in_mode, double
        return display_mode::invalid;\r
 }\r
 \r
-struct frame_muxer::implementation\r
+struct frame_muxer::implementation : boost::noncopyable\r
 {      \r
        std::queue<safe_ptr<write_frame>>       video_frames_;\r
        std::vector<int16_t>                            audio_samples_;\r
@@ -102,14 +109,18 @@ struct frame_muxer::implementation
 \r
        size_t                                                          audio_sample_count_;\r
        size_t                                                          video_frame_count_;\r
+\r
+       std::unique_ptr<filter>                         filter_;\r
+       safe_ptr<core::frame_factory>           frame_factory_;\r
                \r
-       implementation(double in_fps, const video_format_desc& format_desc)\r
+       implementation(double in_fps, const video_format_desc& format_desc, const safe_ptr<core::frame_factory>& frame_factory)\r
                : display_mode_(display_mode::invalid)\r
                , in_fps_(in_fps)\r
                , format_desc_(format_desc)\r
                , auto_mode_(env::properties().get("configuration.auto-mode", false))\r
                , audio_sample_count_(0)\r
                , video_frame_count_(0)\r
+               , frame_factory_(frame_factory)\r
        {\r
        }\r
 \r
@@ -121,6 +132,12 @@ struct frame_muxer::implementation
                        video_frame_count_ = 0;\r
                        return;\r
                }\r
+               \r
+               if(display_mode_ == display_mode::invalid)\r
+                       display_mode_ = auto_mode_ ? get_display_mode(video_frame->get_type(), in_fps_, format_desc_.mode, format_desc_.fps) : display_mode::simple;\r
+\r
+               if(display_mode_ != display_mode::deinterlace && display_mode_ != display_mode::deinterlace_bob) \r
+                       video_frame->commit();\r
 \r
                ++video_frame_count_;\r
 \r
@@ -188,15 +205,12 @@ struct frame_muxer::implementation
 \r
                return samples;\r
        }\r
-\r
+       \r
        void process()\r
        {\r
                if(video_frames_.empty() || audio_samples_.size() < format_desc_.audio_samples_per_frame)\r
                        return;\r
-\r
-               if(display_mode_ == display_mode::invalid)\r
-                       display_mode_ = auto_mode_ ? get_display_mode(video_frames_.front()->get_type(), in_fps_, format_desc_.mode, format_desc_.fps) : display_mode::simple;\r
-\r
+               \r
                switch(display_mode_)\r
                {\r
                case display_mode::simple:\r
@@ -273,17 +287,58 @@ struct frame_muxer::implementation
        \r
        void deinterlace_bob()\r
        {\r
-               BOOST_THROW_EXCEPTION(not_implemented() << msg_info("deinterlace_bob"));\r
+               if(video_frames_.empty() || audio_samples_.size()/2 < format_desc_.audio_samples_per_frame)\r
+                       return;\r
+\r
+               if(!filter_)\r
+                       filter_.reset(new filter(L"YADIF=1:-1"));\r
+               \r
+               auto frame = pop_video();\r
+\r
+               filter_->push(as_av_frame(frame));\r
+               auto av_frames = filter_->poll();\r
+\r
+               if(av_frames.size() < 2)\r
+                       return;\r
+\r
+               auto frame1 = make_write_frame(frame->tag(), av_frames.at(0), frame_factory_);\r
+               frame1->commit();\r
+               frame1->audio_data() = pop_audio();\r
+               \r
+               auto frame2 = make_write_frame(frame->tag(), av_frames.at(1), frame_factory_);\r
+               frame2->commit();\r
+               frame2->audio_data() = pop_audio();\r
+               \r
+               frame_buffer_.push(frame1);\r
+               frame_buffer_.push(frame2);\r
        }\r
 \r
        void deinterlace()\r
        {\r
-               BOOST_THROW_EXCEPTION(not_implemented() << msg_info("deinterlace"));\r
+               if(video_frames_.empty() || audio_samples_.size() < format_desc_.audio_samples_per_frame)\r
+                       return;\r
+\r
+               if(!filter_)\r
+                       filter_.reset(new filter(L"YADIF=0:-1"));\r
+               \r
+               auto frame = pop_video();\r
+\r
+               filter_->push(as_av_frame(frame));\r
+               auto av_frames = filter_->poll();\r
+\r
+               if(av_frames.empty())\r
+                       return;\r
+\r
+               auto frame1 = make_write_frame(frame->tag(), av_frames.at(0), frame_factory_);\r
+               frame1->commit();\r
+               frame1->audio_data() = pop_audio();\r
+                               \r
+               frame_buffer_.push(frame1);\r
        }\r
 };\r
 \r
-frame_muxer::frame_muxer(double in_fps, const video_format_desc& format_desc)\r
-       : impl_(implementation(in_fps, format_desc)){}\r
+frame_muxer::frame_muxer(double in_fps, const video_format_desc& format_desc, const safe_ptr<core::frame_factory>& frame_factory)\r
+       : impl_(new implementation(in_fps, format_desc, frame_factory)){}\r
 void frame_muxer::push(const std::shared_ptr<write_frame>& video_frame){impl_->push(video_frame);}\r
 void frame_muxer::push(const std::shared_ptr<std::vector<int16_t>>& audio_samples){return impl_->push(audio_samples);}\r
 safe_ptr<basic_frame> frame_muxer::pop(){return impl_->pop();}\r
@@ -292,4 +347,4 @@ bool frame_muxer::empty() const {return impl_->size() == 0;}
 size_t frame_muxer::video_frames() const{return impl_->video_frames_.size();}\r
 size_t frame_muxer::audio_chunks() const{return impl_->audio_samples_.size() / impl_->format_desc_.audio_samples_per_frame;}\r
 \r
-}}
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/modules/ffmpeg/producer/frame_muxer.h b/modules/ffmpeg/producer/frame_muxer.h
new file mode 100644 (file)
index 0000000..d5640c4
--- /dev/null
@@ -0,0 +1,41 @@
+#pragma once\r
+\r
+#include <common/memory/safe_ptr.h>\r
+\r
+#include <core/video_format.h>\r
+\r
+#include <boost/noncopyable.hpp>\r
+\r
+#include <vector>\r
+\r
+namespace caspar { \r
+       \r
+namespace core {\r
+\r
+class write_frame;\r
+class basic_frame;\r
+struct frame_factory;\r
+\r
+}\r
+\r
+class frame_muxer : boost::noncopyable\r
+{\r
+public:\r
+       frame_muxer(double in_fps, const core::video_format_desc& format_desc, const safe_ptr<core::frame_factory>& frame_factory);\r
+       \r
+       void push(const std::shared_ptr<core::write_frame>& video_frame);\r
+       void push(const std::shared_ptr<std::vector<int16_t>>& audio_samples);\r
+       \r
+       size_t video_frames() const;\r
+       size_t audio_chunks() const;\r
+\r
+       size_t size() const;\r
+       bool empty() const;\r
+\r
+       safe_ptr<core::basic_frame> pop();\r
+private:\r
+       struct implementation;\r
+       safe_ptr<implementation> impl_;\r
+};\r
+\r
+}
\ No newline at end of file
index 77cddc41ab274a3c7333c62aaaa3b1d218908f6a..f55a73dda4d6108b77721aaa84a2cd23df8ebf6a 100644 (file)
@@ -194,8 +194,6 @@ static safe_ptr<core::write_frame> make_write_frame(const void* tag, const safe_
                 \r
                sws_scale(sws_context.get(), decoded_frame->data, decoded_frame->linesize, 0, height, av_frame->data, av_frame->linesize);      \r
                pool.push(sws_context);\r
-\r
-               write->commit();\r
        }\r
        else\r
        {\r
@@ -212,8 +210,6 @@ static safe_ptr<core::write_frame> make_write_frame(const void* tag, const safe_
                                for(size_t y = r.begin(); y != r.end(); ++y)\r
                                        fast_memcpy(result + y*plane.linesize, decoded + y*decoded_linesize, plane.linesize);\r
                        });\r
-\r
-                       write->commit(n);\r
                });\r
        }\r
 \r
index b44f62f495c9ceae96ae9f0eb7a12e0faeec6f9b..532381ab44396107ad67dc26164cfd1474b9b594 100644 (file)
@@ -66,7 +66,6 @@ struct video_decoder::implementation : boost::noncopyable
        std::queue<std::shared_ptr<AVPacket>>   packet_buffer_;\r
 \r
        std::unique_ptr<filter>                                 filter_;\r
-       tbb::task_group                                                 filter_tasks_;\r
 \r
        double                                                                  fps_;\r
 public:\r
@@ -97,12 +96,6 @@ public:
                        fps_ *= 2;\r
        }\r
 \r
-       ~implementation()\r
-       {\r
-               filter_tasks_.cancel();\r
-               filter_tasks_.wait();\r
-       }\r
-               \r
        void push(const std::shared_ptr<AVPacket>& packet)\r
        {\r
                if(!codec_context_)\r
@@ -119,7 +112,7 @@ public:
                std::vector<std::shared_ptr<core::write_frame>> result;\r
 \r
                if(!codec_context_)\r
-                       result.push_back(make_safe<core::write_frame>(reinterpret_cast<int>(this)));\r
+                       result.push_back(make_safe<core::write_frame>(this));\r
                else if(!packet_buffer_.empty())\r
                {\r
                        std::vector<safe_ptr<AVFrame>> av_frames;\r
@@ -150,17 +143,10 @@ public:
 \r
                        if(filter_)\r
                        {\r
-                               auto av_frames2 = std::move(av_frames);\r
-\r
-                               filter_tasks_.wait();\r
-\r
+                               BOOST_FOREACH(auto& frame, av_frames)                           \r
+                                       filter_->push(frame);\r
+                               \r
                                av_frames = filter_->poll();\r
-\r
-                               filter_tasks_.run([=]\r
-                               {\r
-                                       BOOST_FOREACH(auto& frame, av_frames2)                          \r
-                                               filter_->push(frame);\r
-                               });\r
                        }\r
                                                \r
                        BOOST_FOREACH(auto& frame, av_frames)\r