]> git.sesse.net Git - casparcg/commitdiff
2.0.0.2: Started on ffmpeg_consumer. Known problems, sound is incorrect, color is...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sat, 15 Jan 2011 20:09:26 +0000 (20:09 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sat, 15 Jan 2011 20:09:26 +0000 (20:09 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@369 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

13 files changed:
common/utility/timer.h
core/consumer/bluefish/bluefish_consumer.cpp
core/consumer/decklink/decklink_consumer.cpp
core/consumer/frame_consumer_device.cpp
core/consumer/oal/oal_consumer.cpp
core/consumer/ogl/ogl_consumer.cpp
core/core.vcxproj
core/core.vcxproj.filters
core/producer/ffmpeg/audio/audio_decoder.cpp
core/producer/ffmpeg/ffmpeg_producer.cpp
core/producer/ffmpeg/video/video_decoder.cpp
core/producer/flash/flash_producer.cpp
shell/caspar.config

index fffed7c950c0835e53607ad880c1e726562c3489..b683d7dffbeecd235278af5b6be3840567970a15 100644 (file)
@@ -15,14 +15,14 @@ public:
 \r
        // Author: Ryan M. Geiss\r
        // http://www.geisswerks.com/ryan/FAQS/timing.html\r
-       void wait(double fps)\r
+       void tick(double interval)\r
        {       \r
                LARGE_INTEGER t;\r
                QueryPerformanceCounter(&t);\r
 \r
                if (time_.QuadPart != 0)\r
                {\r
-                       int ticks_to_wait = static_cast<int>(static_cast<double>(freq_.QuadPart) / fps);\r
+                       int ticks_to_wait = static_cast<int>(static_cast<double>(freq_.QuadPart) * interval);\r
                        int done = 0;\r
                        do\r
                        {\r
index 423b93826e2ba4cab28fec5f098ecdb9184eeb14..acfe21db8dc4dc6c9191a0a38ee2a3e69f4af267 100644 (file)
@@ -237,7 +237,7 @@ public:
                        CASPAR_LOG(error) << "BLUECARD ERROR: Failed to disable video output. (device " << device_index_ << TEXT(")");          \r
        }\r
 \r
-       void send(const safe_ptr<const read_frame>& frame)\r
+       virtual void send(const safe_ptr<const read_frame>& frame)\r
        {                       \r
                static std::vector<short> silence(MAX_HANC_BUFFER_SIZE, 0);\r
                \r
@@ -293,10 +293,7 @@ public:
                });\r
        }\r
 \r
-       size_t buffer_depth() const\r
-       {\r
-               return 1;\r
-       }\r
+       virtual size_t buffer_depth() const{return 1;}\r
 \r
        void encode_hanc(BLUE_UINT32* hanc_data, void* audio_data, size_t audio_samples, size_t audio_nchannels)\r
        {       \r
index 9cacadaa48d8a6e7fbde514ff3458d160c49b3b2..b7759834d4c4731612f09ac48c4d85e2c87c879a 100644 (file)
@@ -238,14 +238,14 @@ public:
                std::rotate(reserved_frames_.begin(), reserved_frames_.begin() + 1, reserved_frames_.end());\r
        }\r
 \r
-       void send(const safe_ptr<const read_frame>& frame)\r
+       virtual void send(const safe_ptr<const read_frame>& frame)\r
        {\r
                video_frame_buffer_.push(frame);\r
                if(embed_audio_)\r
                        audio_frame_buffer_.push(frame);\r
        }\r
 \r
-       size_t buffer_depth() const\r
+       virtual size_t buffer_depth() const\r
        {\r
                return 1;\r
        }\r
index 6f810331c1f93abbb3a3fa64179a09cf96882a9b..56050d008d0a794ad1563b3f3a0c07d3933bcef7 100644 (file)
@@ -68,7 +68,7 @@ public:
                                }\r
                        }\r
        \r
-                       clock_.wait(fmt_.fps);\r
+                       clock_.tick(1.0/fmt_.fps);\r
                });\r
        }\r
 };\r
index cf9268a05c9407947ceee1587c35ae854b59781c..a5852fc745cc2df41b5dcfef21ea7ffc03da3b8f 100644 (file)
@@ -45,7 +45,7 @@ public:
                Play();         \r
        }\r
        \r
-       void send(const safe_ptr<const read_frame>& frame)\r
+       virtual void send(const safe_ptr<const read_frame>& frame)\r
        {                               \r
                if(frame->audio_data().empty())\r
                        return;\r
@@ -53,10 +53,7 @@ public:
                input_.push(std::vector<short>(frame->audio_data().begin(), frame->audio_data().end()));        \r
        }\r
 \r
-       size_t buffer_depth() const\r
-       {\r
-               return 3;\r
-       }\r
+       virtual size_t buffer_depth() const{return 3;}\r
 \r
        virtual bool OnGetData(sf::SoundStream::Chunk& data)\r
        {               \r
index e0c07ef6a09feddb426b80846ec6a2e4323d0846..6aa464851d10ae8809feeb9292f569a56354ac9b 100644 (file)
@@ -225,7 +225,7 @@ public:
                std::rotate(pbos_.begin(), pbos_.begin() + 1, pbos_.end());\r
        }\r
                \r
-       void send(const safe_ptr<const read_frame>& frame)\r
+       virtual void send(const safe_ptr<const read_frame>& frame)\r
        {\r
                active_.get();\r
                active_ = executor_.begin_invoke([=]\r
@@ -237,10 +237,7 @@ public:
                });\r
        }\r
 \r
-       size_t buffer_depth() const\r
-       {\r
-               return 2;\r
-       }\r
+       virtual size_t buffer_depth() const{return 2;}\r
 };\r
 \r
 consumer::consumer(consumer&& other) : impl_(std::move(other.impl_)){}\r
index 697ad2f5469c4afb7e3a89d7d6f891ad50cc5107..95c3b78aac389661651ea2eb7bcb408d09b8fcfe 100644 (file)
     <ClInclude Include="consumer\bluefish\util.h" />\r
     <ClInclude Include="consumer\decklink\decklink_consumer.h" />\r
     <ClInclude Include="consumer\decklink\util.h" />\r
+    <ClInclude Include="consumer\ffmpeg\ffmpeg_consumer.h" />\r
     <ClInclude Include="consumer\frame_consumer_device.h" />\r
     <ClInclude Include="consumer\decklink\DeckLinkAPI_h.h" />\r
     <ClInclude Include="consumer\frame_consumer.h" />\r
       <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
       <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
     </ClCompile>\r
+    <ClCompile Include="consumer\ffmpeg\ffmpeg_consumer.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>\r
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="consumer\frame_consumer_device.cpp">\r
       <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
       <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
index 13690d4c2cb4f1c02d8b4e61bfb63d88f26fbf84..b8bfe72f86e2d0d1015f611d98ced050f209e1ce 100644 (file)
@@ -76,6 +76,9 @@
     <Filter Include="Source\producer\flash\interop">\r
       <UniqueIdentifier>{f99e4727-2b1b-4009-a445-99b11b071e8e}</UniqueIdentifier>\r
     </Filter>\r
+    <Filter Include="Source\consumer\ffmpeg">\r
+      <UniqueIdentifier>{b651856c-ff7e-4f90-be8a-32aba6094dbd}</UniqueIdentifier>\r
+    </Filter>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ClInclude Include="consumer\decklink\DeckLinkAPI_h.h">\r
     <ClInclude Include="producer\decklink\decklink_producer.h">\r
       <Filter>Source\producer\decklink</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="consumer\ffmpeg\ffmpeg_consumer.h">\r
+      <Filter>Source\consumer\ffmpeg</Filter>\r
+    </ClInclude>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ClCompile Include="consumer\decklink\DeckLinkAPI_i.c">\r
     <ClCompile Include="producer\decklink\decklink_producer.cpp">\r
       <Filter>Source\producer\decklink</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="consumer\ffmpeg\ffmpeg_consumer.cpp">\r
+      <Filter>Source\consumer\ffmpeg</Filter>\r
+    </ClCompile>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <Midl Include="producer\flash\Flash9e.IDL">\r
index 1e14d81e28ddfd4217b53d3221c0215e103c60fb..e0451d93f54783e6eaa842e634d6506b5675f4a8 100644 (file)
@@ -28,7 +28,7 @@ struct audio_decoder::implementation : boost::noncopyable
        buffer audio_buffer_;   \r
        buffer current_chunk_;\r
 \r
-       size_t audio_frame_size_;\r
+       const size_t audio_frame_size_;\r
 \r
        static const size_t SAMPLE_RATE = 48000;\r
        static const size_t N_CHANNELS = 2;\r
index c5149a4b0110d66e5a59e3df25bcb902f6b6821a..81128118e02bffa1128056cf24ba8b200ce4024f 100644 (file)
@@ -21,7 +21,7 @@ struct ffmpeg_producer : public frame_producer
 {\r
        input                                                           input_;                 \r
        std::unique_ptr<audio_decoder>          audio_decoder_;\r
-       std::unique_ptr<video_decoder>          video_decoder_;\r
+       video_decoder                                           video_decoder_;\r
 \r
        std::deque<safe_ptr<write_frame>>       video_frame_channel_;   \r
        std::deque<std::vector<short>>          audio_chunk_channel_;\r
@@ -39,13 +39,13 @@ public:
                : filename_(filename)\r
                , last_frame_(draw_frame(draw_frame::empty()))\r
                , input_(filename, loop)\r
-               , video_decoder_(new video_decoder(input_.get_video_codec_context().get()))             \r
+               , video_decoder_(input_.get_video_codec_context().get())                \r
                , audio_decoder_(input_.get_audio_codec_context().get() ? new audio_decoder(input_.get_audio_codec_context().get(), input_.fps()) : nullptr){}\r
 \r
        virtual void initialize(const safe_ptr<frame_processor_device>& frame_processor)\r
        {\r
                format_desc_ = frame_processor->get_video_format_desc();\r
-               video_decoder_->initialize(frame_processor);\r
+               video_decoder_.initialize(frame_processor);\r
        }\r
                \r
        virtual safe_ptr<draw_frame> receive()\r
@@ -63,9 +63,9 @@ public:
                        tbb::parallel_invoke(\r
                        [&]\r
                        { // Video Decoding and Scaling\r
-                               if(!video_packet.empty() && video_decoder_)\r
+                               if(!video_packet.empty())\r
                                {\r
-                                       auto frame = video_decoder_->execute(video_packet);\r
+                                       auto frame = video_decoder_.execute(video_packet);\r
                                        video_frame_channel_.push_back(std::move(frame));\r
                                }\r
                        }, \r
@@ -94,7 +94,7 @@ public:
                                        audio_chunk_channel_.pop_front();\r
                                }\r
                                                        \r
-                               ouput_channel_.push(video_frame_channel_.front());\r
+                               ouput_channel_.push(std::move(video_frame_channel_.front()));\r
                                video_frame_channel_.pop_front();\r
                        }                               \r
 \r
index ee6018c30247d53115fd854c9842750c74024af4..6ae539465bd0a67d2ee9a661820e21835374f4f1 100644 (file)
@@ -94,10 +94,10 @@ struct video_decoder::implementation : boost::noncopyable
 \r
        AVCodecContext* codec_context_;\r
 \r
-       int width_;\r
-       int height_;\r
-       PixelFormat pix_fmt_;\r
-       pixel_format_desc desc_;\r
+       const int width_;\r
+       const int height_;\r
+       const PixelFormat pix_fmt_;\r
+       const pixel_format_desc desc_;\r
 \r
 public:\r
        explicit implementation(AVCodecContext* codec_context) \r
index db9d7b015918f3a05a6835056c255f85dabb09cb..77b0195ffef7f1523eb2e3bc934ffdf162960689 100644 (file)
@@ -145,7 +145,7 @@ private:
 \r
        safe_ptr<draw_frame> render_simple_frame()\r
        {\r
-               timer_.wait(ax_->GetFPS()); // Tick doesnt work on nested timelines, force an actual sync\r
+               timer_.tick(1.0/ax_->GetFPS()); // Tick doesnt work on nested timelines, force an actual sync\r
 \r
                ax_->Tick();\r
 \r
index 1c40e2ce260ab8dc2edd1678da1859206331799c..c762927a660db21e04a9593c2f8c537ca22a80a5 100644 (file)
           <device>1</device>\r
           <embedded-audio>true</embedded-audio>\r
         </decklink-->\r
-        <bluefish>\r
+        <!--bluefish>\r
           <device>1</device> \r
           <embedded-audio>true</embedded-audio>\r
-        </bluefish>\r
+        </bluefish-->\r
       </consumers>\r
     </channel>\r
   </channels>\r