]> git.sesse.net Git - casparcg/commitdiff
2.1.0: -frame_muxer: Refactored frame_muxer interface.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Tue, 14 Feb 2012 00:02:39 +0000 (00:02 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Tue, 14 Feb 2012 00:02:39 +0000 (00:02 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.1.0@2398 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

modules/decklink/producer/decklink_producer.cpp
modules/ffmpeg/producer/ffmpeg_producer.cpp
modules/ffmpeg/producer/muxer/frame_muxer.cpp
modules/ffmpeg/producer/muxer/frame_muxer.h

index c59639e074ddd28d9994934dfdacceee88d54443..36c824f9e9f78217b646fe259b85fc6fa02dd992 100644 (file)
@@ -228,13 +228,14 @@ public:
                        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
+                       auto frame = core::draw_frame::late();\r
+                       if(muxer_.try_pop(frame))\r
                        {\r
-                               if(!frame_buffer_.try_push(spl::make_shared_ptr(frame)))\r
+                               if(!frame_buffer_.try_push(frame))\r
                                        graph_->set_tag("dropped-frame");\r
                        }\r
-\r
+                       \r
                        graph_->set_value("frame-time", frame_timer_.elapsed()*format_desc_.fps*0.5);\r
 \r
                        graph_->set_value("output-buffer", static_cast<float>(frame_buffer_.size())/static_cast<float>(frame_buffer_.capacity()));      \r
index 68e358b562069793dcf29996af140d6641f02d0e..0b1dd28e5f38d7bed03357f093a203ee9d81505f 100644 (file)
@@ -146,7 +146,12 @@ public:
        {               \r
                boost::timer frame_timer;\r
                                \r
-               std::shared_ptr<core::draw_frame> frame = try_decode_frame(flags);\r
+               auto frame = core::draw_frame::late();          \r
+               if(!try_decode_frame(frame, flags))\r
+               {\r
+                       if(!input_.eof())               \r
+                               graph_->set_tag("underflow");   \r
+               }\r
                                                        \r
                graph_->set_value("frame-time", frame_timer.elapsed()*format_desc_.fps*0.5);\r
                \r
@@ -158,22 +163,16 @@ public:
                                                << monitor::event("file/fps")                   % fps_\r
                                                << monitor::event("filename")                   % u8(filename_)\r
                                                << monitor::event("loop")                               % input_.loop();\r
-                               \r
-               if(!frame)\r
+                                       \r
+               graph_->set_text(print());\r
+\r
+               if(frame != core::draw_frame::late())\r
                {\r
-                       if(!input_.eof())               \r
-                               graph_->set_tag("underflow");   \r
-                       return core::draw_frame::late();\r
+                       ++frame_number_;\r
+                       last_frame_ = frame;\r
                }\r
                                \r
-               ++frame_number_;\r
-\r
-               graph_->set_text(print());\r
-               \r
-               if(frame != core::draw_frame::late())\r
-                       last_frame_ = spl::make_shared_ptr(frame);\r
-\r
-               return spl::make_shared_ptr(frame);\r
+               return frame;\r
        }\r
 \r
        virtual spl::shared_ptr<core::draw_frame> last_frame() const override\r
@@ -282,12 +281,13 @@ public:
                BOOST_THROW_EXCEPTION(invalid_argument());\r
        }\r
 \r
-       std::shared_ptr<core::draw_frame> try_decode_frame(int flags)\r
+       bool try_decode_frame(spl::shared_ptr<core::draw_frame>& result, int flags)\r
        {\r
-               std::shared_ptr<core::draw_frame> result = muxer_->poll();\r
-\r
-               for(int n = 0; n < 32 && !result; ++n, result = muxer_->poll())\r
+               for(int n = 0; n < 32; ++n)\r
                {\r
+                       if(muxer_->try_pop(result))                     \r
+                               return true;                    \r
+\r
                        std::shared_ptr<AVPacket> pkt;\r
 \r
                        for(int n = 0; n < 32 && ((video_decoder_ && !video_decoder_->ready()) || (audio_decoder_ && !audio_decoder_->ready())) && input_.try_pop(pkt); ++n)\r
@@ -333,7 +333,7 @@ public:
                        }\r
                }\r
 \r
-               return result;\r
+               return false;\r
        }\r
 };\r
 \r
index 5e03852c50264511f998cdf82941074ca39b7483..80bad4918a0ae9fda71686fc11412ad5536c7a69 100644 (file)
@@ -208,13 +208,13 @@ struct frame_muxer::impl : boost::noncopyable
                }\r
        }\r
                \r
-       std::shared_ptr<draw_frame> poll()\r
+       bool try_pop(spl::shared_ptr<core::draw_frame>& result)\r
        {\r
                if(!frame_buffer_.empty())\r
                {\r
-                       auto frame = frame_buffer_.front();\r
+                       result = std::move(frame_buffer_.front());\r
                        frame_buffer_.pop();    \r
-                       return frame;\r
+                       return true;\r
                }\r
 \r
                if(video_streams_.size() > 1 && audio_streams_.size() > 1 && (!video_ready2() || !audio_ready2()))\r
@@ -227,7 +227,7 @@ struct frame_muxer::impl : boost::noncopyable
                }\r
 \r
                if(!video_ready2() || !audio_ready2() || display_mode_ == display_mode::invalid)\r
-                       return nullptr;\r
+                       return false;\r
                                \r
                auto frame1                             = pop_video();\r
                frame1->audio_data()    = pop_audio();\r
@@ -266,7 +266,10 @@ struct frame_muxer::impl : boost::noncopyable
                        }\r
                }\r
                \r
-               return frame_buffer_.empty() ? nullptr : poll();\r
+               if(frame_buffer_.empty())\r
+                       return false;\r
+\r
+               return try_pop(result);\r
        }\r
        \r
        spl::shared_ptr<core::data_frame> pop_video()\r
@@ -378,7 +381,7 @@ frame_muxer::frame_muxer(double in_fps, const spl::shared_ptr<core::frame_factor
        : impl_(new impl(in_fps, frame_factory, filter)){}\r
 void frame_muxer::push(const std::shared_ptr<AVFrame>& video_frame, int flags){impl_->push(video_frame, flags);}\r
 void frame_muxer::push(const std::shared_ptr<core::audio_buffer>& audio_samples){return impl_->push(audio_samples);}\r
-std::shared_ptr<draw_frame> frame_muxer::poll(){return impl_->poll();}\r
+bool frame_muxer::try_pop(spl::shared_ptr<core::draw_frame>& result){return impl_->try_pop(result);}\r
 uint32_t frame_muxer::calc_nb_frames(uint32_t nb_frames) const {return impl_->calc_nb_frames(nb_frames);}\r
 bool frame_muxer::video_ready() const{return impl_->video_ready();}\r
 bool frame_muxer::audio_ready() const{return impl_->audio_ready();}\r
index 6e0d83dfd37cfc94b2ebe690aad5686b5d689fbc..36e7d32ed00477085afbf5e14709525798c200a8 100644 (file)
@@ -52,7 +52,7 @@ public:
        bool video_ready() const;\r
        bool audio_ready() const;\r
 \r
-       std::shared_ptr<core::draw_frame> poll();\r
+       bool try_pop(spl::shared_ptr<core::draw_frame>& result);\r
 \r
        uint32_t calc_nb_frames(uint32_t nb_frames) const;\r
 private:\r