]> git.sesse.net Git - casparcg/commitdiff
Fixed audio-cadence problem with decklink-producer.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Wed, 7 Dec 2011 11:39:40 +0000 (11:39 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Wed, 7 Dec 2011 11:39:40 +0000 (11:39 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/trunk@1822 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

core/mixer/audio/audio_mixer.cpp
core/producer/separated/separated_producer.cpp
core/producer/transition/transition_producer.cpp
modules/decklink/producer/decklink_producer.cpp
shell/casparcg.config

index 7b997d5f107cae19ddc7f6e8fa2c4fffa6eb3e30..714e0001e8be8426a4c77cdfb3bddbb195d8c85f 100644 (file)
@@ -171,6 +171,14 @@ public:
                std::vector<float> result_ps(audio_cadence_.front(), 0.0f);\r
                BOOST_FOREACH(auto& stream, audio_streams_ | boost::adaptors::map_values)\r
                {\r
+                       //CASPAR_LOG(debug) << stream.audio_data.size() << L" : " << result_ps.size();\r
+\r
+                       if(stream.audio_data.size() < result_ps.size())\r
+                       {\r
+                               stream.audio_data.resize(result_ps.size(), 0.0f);\r
+                               CASPAR_LOG(trace) << L"[audio_mixer] Appended zero samples";\r
+                       }\r
+\r
                        auto out = boost::range::transform(result_ps, stream.audio_data, std::begin(result_ps), std::plus<float>());\r
                        stream.audio_data.erase(std::begin(stream.audio_data), std::begin(stream.audio_data) + std::distance(std::begin(result_ps), out));\r
                }               \r
index e3d22b3e38a6417a6516e47b69ebfb8acb302a8d..f52789f11bd266efd34d8e5366243b9262d35431 100644 (file)
@@ -88,7 +88,7 @@ struct separated_producer : public frame_producer
 \r
        virtual std::wstring print() const override\r
        {\r
-               return L"separated[fill:" + fill_producer_->print() + L"|key:" + key_producer_->print() + L"]";\r
+               return L"separated[fill:" + fill_producer_->print() + L"|key[" + key_producer_->print() + L"]]";\r
        }       \r
 \r
        boost::property_tree::wptree info() const override\r
index 7c32d094f3d2c7bc6189f244c9abec52e3748678..a7e4daa4d95c4ab66ad6eefda259e4243498279c 100644 (file)
@@ -105,7 +105,7 @@ struct transition_producer : public frame_producer
 \r
        virtual std::wstring print() const override\r
        {\r
-               return L"transition[" + source_producer_->print() + L"|" + dest_producer_->print() + L"]";\r
+               return L"transition[" + source_producer_->print() + L"->" + dest_producer_->print() + L"]";\r
        }\r
        \r
        boost::property_tree::wptree info() const override\r
index b04b025519c939e6e16016531a7bf59f406fc9ef..078e7b63942a36683b37ab0f8e98bf3a6f8c4e1f 100644 (file)
@@ -100,6 +100,8 @@ class decklink_producer : boost::noncopyable, public IDeckLinkInputCallback
                \r
        ffmpeg::frame_muxer                                                                                     muxer_;\r
 \r
+       boost::circular_buffer<size_t>                                                          sync_buffer_;\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
                : decklink_(get_device(device_index))\r
@@ -110,7 +112,8 @@ public:
                , frame_factory_(frame_factory)\r
                , audio_cadence_(frame_factory->get_video_format_desc().audio_cadence)\r
                , muxer_(format_desc.fps, frame_factory, filter, ffmpeg::display_mode::deinterlace)\r
-       {\r
+               , sync_buffer_(format_desc.audio_cadence.size())\r
+       {               \r
                hints_ = 0;\r
                frame_buffer_.set_capacity(2);\r
                \r
@@ -179,6 +182,8 @@ public:
 \r
                        frame_timer_.restart();\r
 \r
+                       // PUSH\r
+\r
                        void* bytes = nullptr;\r
                        if(FAILED(video->GetBytes(&bytes)) || !bytes)\r
                                return S_OK;\r
@@ -193,22 +198,41 @@ public:
                        av_frame->height                        = video->GetHeight();\r
                        av_frame->interlaced_frame      = format_desc_.field_mode != core::field_mode::progressive;\r
                        av_frame->top_field_first       = format_desc_.field_mode == core::field_mode::upper ? 1 : 0;\r
-                                       \r
-                       muxer_.push(av_frame, hints_);          \r
-                                                                       \r
+                               \r
+                       std::shared_ptr<core::audio_buffer> audio_buffer;\r
+\r
                        // It is assumed that audio is always equal or ahead of video.\r
-                       if(audio && SUCCEEDED(audio->GetBytes(&bytes)))\r
+                       if(audio && SUCCEEDED(audio->GetBytes(&bytes)) && bytes)\r
                        {\r
                                auto sample_frame_count = audio->GetSampleFrameCount();\r
                                auto audio_data = reinterpret_cast<int32_t*>(bytes);\r
-                               muxer_.push(std::make_shared<core::audio_buffer>(audio_data, audio_data + sample_frame_count*format_desc_.audio_channels));\r
+                               audio_buffer = std::make_shared<core::audio_buffer>(audio_data, audio_data + sample_frame_count*format_desc_.audio_channels);\r
                        }\r
-                       else\r
+                       else                    \r
+                               audio_buffer = std::make_shared<core::audio_buffer>(audio_cadence_.front(), 0);\r
+                       \r
+                       sync_buffer_.push_back(audio_buffer->size());\r
+               \r
+                       if(!boost::range::equal(sync_buffer_, audio_cadence_))\r
                        {\r
-                               muxer_.push(std::make_shared<core::audio_buffer>(audio_cadence_.front(), 0));\r
-                               std::rotate(std::begin(audio_cadence_), std::begin(audio_cadence_)+1, std::end(audio_cadence_));\r
+                               CASPAR_LOG(trace) << print() << L" Syncing audio.";\r
+                               return S_OK;\r
                        }\r
 \r
+                       muxer_.push(audio_buffer);\r
+                       muxer_.push(av_frame, hints_);  \r
+                                       \r
+                       // Note: We don't fully sync with cadence, we send last and first (1602, 1602) to have as many samples as possible when inserting into mixer\r
+                       if(!boost::range::equal(sync_buffer_, audio_cadence_)) \r
+                       {\r
+                               CASPAR_LOG(trace) << L"[cadence_guard] Audio cadence unsynced. Skipping frame.";\r
+                               return S_OK;\r
+                       }\r
+                                               \r
+                       boost::range::rotate(audio_cadence_, std::begin(audio_cadence_)+1);\r
+                       \r
+                       // POLL\r
+                       \r
                        for(auto frame = muxer_.poll(); frame; frame = muxer_.poll())\r
                        {\r
                                if(!frame_buffer_.try_push(make_safe_ptr(frame)))\r
index 2d2d2f8a7b93cc09608f665772df4c932a5ec9f8..d9ca09bf16e2ea1a65a79075ed72dfe559baf590 100644 (file)
@@ -8,12 +8,11 @@
   </paths>\r
   <channels>\r
     <channel>\r
-      <video-mode>PAL</video-mode>\r
+      <video-mode>NTSC</video-mode>\r
       <consumers>\r
         <screen>\r
           <device>2</device>\r
         </screen>\r
-        <system-audio></system-audio>\r
       </consumers>\r
     </channel>\r
   </channels>\r