]> 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>
Fri, 28 Oct 2011 23:01:45 +0000 (23:01 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Fri, 28 Oct 2011 23:01:45 +0000 (23:01 +0000)
modules/ffmpeg/producer/muxer/frame_muxer.cpp

index dc497b8e3695e6b768563c0b49a1bd81f526f547..2f26870046d5dafc906e8684331ac1d8df47ffa3 100644 (file)
@@ -61,6 +61,9 @@ struct frame_muxer2::implementation : public Concurrency::agent, boost::noncopya
        governor                                                                                        governor_;\r
 \r
        tbb::atomic<bool>                                                                       is_running_;\r
+       \r
+       size_t                                                                                          video_loop_count_;\r
+       size_t                                                                                          audio_loop_count_;\r
                \r
        implementation(frame_muxer2::video_source_t* video_source,\r
                                   frame_muxer2::audio_source_t* audio_source,\r
@@ -76,6 +79,8 @@ struct frame_muxer2::implementation : public Concurrency::agent, boost::noncopya
                , auto_transcode_(env::properties().get("configuration.producers.auto-transcode", false))\r
                , frame_factory_(frame_factory)\r
                , governor_(2)\r
+               , video_loop_count_(0)\r
+               , audio_loop_count_(0)\r
        {               \r
                is_running_ = true;\r
                start();\r
@@ -94,13 +99,16 @@ struct frame_muxer2::implementation : public Concurrency::agent, boost::noncopya
                        return make_safe<core::write_frame>(this);      \r
 \r
                auto video = filter_.has_value() ? filter_.value()->poll() : nullptr;\r
-               if(video)               \r
+               if(video_loop_count_ >= audio_loop_count_ && video)             \r
                        return make_write_frame(this, make_safe_ptr(video), frame_factory_, 0);         \r
                \r
                video = receive(video_source_);\r
                \r
                if(video == flush_video())\r
+               {\r
+                       ++video_loop_count_;\r
                        return receive_video();\r
+               }\r
 \r
                if(video == eof_video())\r
                        return nullptr;         \r
@@ -119,7 +127,7 @@ struct frame_muxer2::implementation : public Concurrency::agent, boost::noncopya
                if(!audio_source_)\r
                        return make_safe<core::audio_buffer>(format_desc_.audio_samples_per_frame, 0);\r
                                        \r
-               if(audio_data_.size() >= format_desc_.audio_samples_per_frame)\r
+               if(audio_loop_count_ >= video_loop_count_ && audio_data_.size() >= format_desc_.audio_samples_per_frame)\r
                {\r
                        auto begin = audio_data_.begin(); \r
                        auto end   = begin + format_desc_.audio_samples_per_frame;\r
@@ -131,7 +139,12 @@ struct frame_muxer2::implementation : public Concurrency::agent, boost::noncopya
                std::shared_ptr<core::audio_buffer> audio = receive(audio_source_);\r
 \r
                if(audio == flush_audio())\r
-                       return receive_audio();\r
+               {\r
+                       CASPAR_LOG(trace) << L"Truncating: " << audio_data_.size() << L" audio-samples:";\r
+                       audio_data_.clear();\r
+                       ++audio_loop_count_;\r
+                       return receive_audio();         \r
+               }\r
 \r
                if(audio == eof_audio())\r
                        return nullptr;\r