]> git.sesse.net Git - casparcg/commitdiff
2.0.0.2: ffmpeg_producer: Improved input buffering.
authorRonag <Ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Wed, 27 Jul 2011 17:54:10 +0000 (17:54 +0000)
committerRonag <Ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Wed, 27 Jul 2011 17:54:10 +0000 (17:54 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@991 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

core/mixer/audio/audio_mixer.cpp
core/producer/frame_muxer.cpp
modules/ffmpeg/producer/input.cpp
modules/ffmpeg/producer/util.h
shell/casparcg.config

index 7c4de79e1c6a3ad9ba17ef6bb0477a761ed03b95..806989d99c6ab0142e64124ec87556883f6d016a 100644 (file)
@@ -76,9 +76,10 @@ public:
                \r
                const int n_samples = audio_data_.back().size();\r
                \r
-               CASPAR_VERIFY(audio_data.empty() || static_cast<size_t>(audio_data.size()) ==  audio_data_.size());\r
+               const auto in_size = static_cast<size_t>(audio_data.size());\r
+               CASPAR_VERIFY(in_size == 0 || in_size == audio_data_.back().size());\r
 \r
-               if(static_cast<size_t>(audio_data.size()) > audio_data_.size())\r
+               if(in_size > audio_data_.size())\r
                        return;\r
 \r
                tbb::parallel_for\r
index 10e28d7db0a1b0d7cdbd2b8444c03df595106433..1948e2a4e7db33f6308bf0004ccec4064068252f 100644 (file)
@@ -3,6 +3,8 @@
 #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
 \r
 namespace caspar { namespace core {\r
@@ -102,8 +104,15 @@ struct frame_muxer::implementation
        }\r
 \r
        void push(const safe_ptr<write_frame>& video_frame)\r
-       {\r
+       {               \r
+               // Fix field-order if needed\r
+               if(video_frame->get_type() == core::video_mode::lower && out_mode_ == core::video_mode::upper)\r
+                       video_frame->get_image_transform().set_fill_translation(0.0f, 0.5/static_cast<double>(video_frame->get_pixel_format_desc().planes[0].height));\r
+               else if(video_frame->get_type() == core::video_mode::upper && out_mode_ == core::video_mode::lower)\r
+                       video_frame->get_image_transform().set_fill_translation(0.0f, -0.5/static_cast<double>(video_frame->get_pixel_format_desc().planes[0].height));\r
+\r
                video_frames_.push(video_frame);\r
+\r
                process();\r
        }\r
 \r
index 987e3ee8d100f0d1658c3ab55764f9dc26d292dc..a11b30527c280624a1dee626e97e3fdae6d08b98 100644 (file)
@@ -80,10 +80,8 @@ public:
        {                       \r
                int errn;\r
 \r
-               buffer_.set_capacity(MAX_BUFFER_COUNT);\r
-\r
                AVFormatContext* weak_format_context_ = nullptr;\r
-               errn = av_open_input_file(&weak_format_context_, narrow(filename).c_str(), nullptr, 0, nullptr);\r
+               errn = avformat_open_input(&weak_format_context_, narrow(filename).c_str(), nullptr, nullptr);\r
                if(errn < 0 || weak_format_context_ == nullptr)\r
                {       \r
                        BOOST_THROW_EXCEPTION(\r
@@ -110,6 +108,11 @@ public:
                \r
                if(start_ != 0)                 \r
                        seek_frame(start_);\r
+               \r
+               for(int n = 0; n < 16 && buffer_size_ < MAX_BUFFER_SIZE && buffer_.size() < MAX_BUFFER_COUNT; ++n)\r
+                       read_next_packet();\r
+\r
+               buffer_.set_capacity(MAX_BUFFER_COUNT);\r
                                \r
                graph_->set_color("seek", diagnostics::color(0.5f, 1.0f, 0.5f));        \r
                graph_->set_color("buffer-count", diagnostics::color(0.2f, 0.8f, 1.0f));\r
@@ -133,9 +136,10 @@ public:
        {\r
                bool result = buffer_.try_pop(packet);\r
                graph_->update_value("buffer-count", MAX_BUFFER_SIZE/static_cast<double>(buffer_.size()));\r
-               if(packet)\r
+               if(result)\r
                {\r
-                       buffer_size_ -= packet->size;\r
+                       if(packet)\r
+                               buffer_size_ -= packet->size;\r
                        graph_->update_value("buffer-size", MAX_BUFFER_SIZE/static_cast<double>(buffer_size_));\r
                        cond_.notify_all();\r
                }\r
@@ -195,14 +199,14 @@ private:
                        else\r
                        {\r
                                av_dup_packet(read_packet.get());\r
-                               buffer_.push(read_packet);\r
 \r
                                graph_->update_value("buffer-count", MAX_BUFFER_SIZE/static_cast<double>(buffer_.size()));\r
                                \r
                                boost::unique_lock<boost::mutex> lock(mutex_);\r
-                               while(buffer_size_ > MAX_BUFFER_SIZE && buffer_.size() > 2)\r
+                               while(buffer_size_ > MAX_BUFFER_SIZE && buffer_.size() > MAX_BUFFER_COUNT)\r
                                        cond_.wait(lock);\r
-\r
+                               \r
+                               buffer_.push(read_packet);\r
                                buffer_size_ += read_packet->size;\r
 \r
                                graph_->update_value("buffer-size", MAX_BUFFER_SIZE/static_cast<double>(buffer_size_));\r
index 501f7f8b72922a3fa90e79fa606291d34e1bad95..08de69699b5b29ee08c5bc8afa3bb7eba21fcd80 100644 (file)
@@ -214,22 +214,6 @@ static safe_ptr<core::write_frame> make_write_frame(const void* tag, const safe_
                        write->commit(n);\r
                });\r
        }\r
-               \r
-       // Fix field-order if needed\r
-       if(decoded_frame->interlaced_frame)\r
-       {\r
-               switch(frame_factory->get_video_format_desc().mode)\r
-               {\r
-               case core::video_mode::upper:\r
-                       if(!decoded_frame->top_field_first)\r
-                               write->get_image_transform().set_fill_translation(0.0f, 0.5/static_cast<double>(height));\r
-                       break;\r
-               case core::video_mode::lower:\r
-                       if(decoded_frame->top_field_first)\r
-                               write->get_image_transform().set_fill_translation(0.0f, -0.5/static_cast<double>(height));\r
-                       break;\r
-               }\r
-       }\r
 \r
        return write;\r
 }\r
index 443d54b5e7703ed04b43369e8033a50d0bd6353d..fe01af085ab8f55bf1ef2528b297ea5a52857d05 100644 (file)
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="utf-8"?>\r
 <configuration>\r
   <paths>\r
-    <media-path>L:\\casparcg\\_media\\</media-path>\r
-    <log-path>L:\\casparcg\\_log\\</log-path>\r
-    <data-path>L:\\casparcg\\_data\\</data-path>\r
-    <template-path>L:\\casparcg\\_templates\\</template-path>\r
+    <media-path>C:\Lokala Filer\server\branches\2.0.0.2\bin\\_media\\</media-path>\r
+    <log-path>C:\Lokala Filer\server\branches\2.0.0.2\bin\\_log\\</log-path>\r
+    <data-path>C:\Lokala Filer\server\branches\2.0.0.2\bin\\_data\\</data-path>\r
+    <template-path>C:\Lokala Filer\server\branches\2.0.0.2\bin\\_templates\\</template-path>\r
     <template-host>cg.fth.18</template-host>\r
   </paths>\r
   <diagnostics>\r
   </ffmpeg>\r
   <channels>\r
     <channel>\r
-      <video-mode>1080i5000</video-mode>\r
-      <consumers>\r
-        <decklink>\r
-          <device>1</device>\r
-          <embedded-audio>true</embedded-audio>\r
-        </decklink>\r
-      </consumers>\r
-    </channel>\r
-    <channel>\r
-      <video-mode>1080i5000</video-mode>\r
+      <video-mode>PAL</video-mode>\r
       <consumers>\r
         <screen></screen>\r
-        <audio></audio>\r
-        <!--<decklink>\r
-          <device>2</device>\r
-          <embedded-audio>true</embedded-audio>\r
-        </decklink>-->\r
       </consumers>\r
     </channel>\r
 </channels>\r