]> 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, 29 Jul 2011 10:34:01 +0000 (10:34 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Fri, 29 Jul 2011 10:34:01 +0000 (10:34 +0000)
core/producer/frame_muxer.cpp
modules/decklink/interop/DeckLinkAPI_h.h
modules/decklink/interop/DeckLinkAPI_i.c
modules/ffmpeg/producer/ffmpeg_producer.cpp
modules/ffmpeg/producer/video/video_decoder.cpp

index d8dee9c14ee43c692f3655d92a7176c66b39c7e1..9b8520c163173c23b2b365273e71e60e0d024270 100644 (file)
@@ -8,6 +8,7 @@
 #include "../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
@@ -98,19 +99,31 @@ struct frame_muxer::implementation
        const double                                            in_fps_;\r
        const video_format_desc                         format_desc_;\r
        bool                                                            auto_mode_;\r
-       \r
+\r
+       size_t                                                          audio_sample_count_;\r
+\r
+       size_t                                                          video_frame_count_;\r
+               \r
        implementation(double in_fps, const video_format_desc& format_desc)\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
        {\r
        }\r
 \r
        void push(const std::shared_ptr<write_frame>& video_frame)\r
        {               \r
                if(!video_frame)\r
+               {       \r
+                       CASPAR_LOG(debug) << L"video-frame-count: " << video_frame_count_;\r
+                       video_frame_count_ = 0;\r
                        return;\r
+               }\r
+\r
+               ++video_frame_count_;\r
 \r
                // Fix field-order if needed\r
                if(video_frame->get_type() == core::video_mode::lower && format_desc_.mode == core::video_mode::upper)\r
@@ -125,8 +138,21 @@ struct frame_muxer::implementation
 \r
        void push(const std::shared_ptr<std::vector<int16_t>>& audio_samples)\r
        {\r
-               if(!audio_samples)\r
+               if(!audio_samples)      \r
+               {\r
+                       auto truncate = audio_sample_count_ % format_desc_.audio_samples_per_frame;\r
+                       if(truncate > 0)\r
+                       {\r
+                               audio_samples_.erase(audio_samples_.end() - truncate, audio_samples_.end());\r
+                               CASPAR_LOG(info) << L"frame_muxer: Truncating " << truncate << L" audio samples.";\r
+                       }\r
+\r
+                       CASPAR_LOG(debug) << L"audio-chunk-count: " << audio_sample_count_;\r
+                       audio_sample_count_ = 0;\r
                        return;\r
+               }\r
+\r
+               audio_sample_count_ += audio_samples->size();\r
 \r
                boost::range::push_back(audio_samples_, *audio_samples);\r
                process();\r
@@ -159,7 +185,7 @@ struct frame_muxer::implementation
                auto end   = begin + format_desc_.audio_samples_per_frame;\r
 \r
                auto samples = std::vector<int16_t>(begin, end);\r
-               audio_samples_ = std::vector<int16_t>(end, audio_samples_.end());\r
+               audio_samples_.erase(begin, end);\r
 \r
                return samples;\r
        }\r
index 94e488af6c7296ddd1d8d9b3f85a20e7c1dfe365..c5c63cdae0add52ff52b753b7487650576e3f6a1 100644 (file)
@@ -4,7 +4,7 @@
 \r
 \r
  /* File created by MIDL compiler version 7.00.0555 */\r
-/* at Wed Jul 27 22:10:40 2011\r
+/* at Fri Jul 29 10:16:40 2011\r
  */\r
 /* Compiler settings for interop\DeckLinkAPI.idl:\r
     Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 \r
index ede7d812c3e3ee1ff712613201fbb0bdabd2ab70..e9a1eda90c20d61f92b13c891f97e9b8a2da6312 100644 (file)
@@ -6,7 +6,7 @@
 \r
 \r
  /* File created by MIDL compiler version 7.00.0555 */\r
-/* at Wed Jul 27 22:10:40 2011\r
+/* at Fri Jul 29 10:16:40 2011\r
  */\r
 /* Compiler settings for interop\DeckLinkAPI.idl:\r
     Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 \r
index f22f3f1e3d8f62299c339483b38a65e4a1ee9c56..3dd074ccbf3defa32cc62b09c16211911bb93920 100644 (file)
@@ -134,6 +134,8 @@ public:
 \r
        void decode_frame()\r
        {\r
+               bool flush = false;\r
+\r
                for(int n = 0; n < 32 && ((muxer_.video_frames() < 2 && !video_decoder_.ready()) ||     (muxer_.audio_chunks() < 2 && !audio_decoder_.ready())); ++n) \r
                {\r
                        std::shared_ptr<AVPacket> pkt;\r
@@ -141,6 +143,8 @@ public:
                        {\r
                                video_decoder_.push(pkt);\r
                                audio_decoder_.push(pkt);\r
+\r
+                               flush = !pkt;\r
                        }\r
                }\r
 \r
@@ -158,12 +162,12 @@ public:
                        if(muxer_.audio_chunks() < 2)\r
                                audio_samples = audio_decoder_.poll();\r
                });\r
-\r
-               BOOST_FOREACH(auto& video, video_frames)\r
-                       muxer_.push(video);     \r
-\r
+               \r
                BOOST_FOREACH(auto& audio, audio_samples)\r
                        muxer_.push(audio);\r
+\r
+               BOOST_FOREACH(auto& video, video_frames)\r
+                       muxer_.push(video);             \r
        }\r
                                \r
        virtual std::wstring print() const\r
index 2901bfef1a467cf8507ce513cb9804e212763804..e55de932ef875d338ebc70afea2086884e496bb2 100644 (file)
@@ -127,7 +127,7 @@ public:
                        auto packet = std::move(packet_buffer_.front());\r
                        packet_buffer_.pop();\r
                \r
-                       if(packet) // eof\r
+                       if(packet)\r
                                decode(*packet, av_frames);                     \r
                        else\r
                        {\r