]> 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>
Wed, 12 Jan 2011 13:36:26 +0000 (13:36 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Wed, 12 Jan 2011 13:36:26 +0000 (13:36 +0000)
core/channel.cpp
core/producer/ffmpeg/ffmpeg_producer.cpp
core/producer/frame_producer.h
core/producer/layer.cpp

index 37199e3d7b42f2b0ab85943701e6fb2afaa395fc..d92e2fc262d44672ba93a21ff4b960d0424612c3 100644 (file)
@@ -24,7 +24,7 @@ struct channel::implementation : boost::noncopyable
 {      \r
        mutable executor executor_;\r
                                \r
-       safe_ptr<frame_processor_device> processor_device_;\r
+       const safe_ptr<frame_processor_device> processor_device_;\r
        frame_consumer_device consumer_device_;\r
                                                \r
        std::map<int, layer> layers_;           \r
index 0eeb238e6209bb236358a2cbcc09dc03169ca488..ca4b83b95837d7bfae428b2803615e4389d5caac 100644 (file)
@@ -37,24 +37,12 @@ struct ffmpeg_producer : public frame_producer
        video_format_desc                                       format_desc_;\r
 \r
 public:\r
-       explicit ffmpeg_producer(const std::wstring& filename, const  std::vector<std::wstring>& params\r
+       explicit ffmpeg_producer(const std::wstring& filename) \r
                : filename_(filename)\r
                , last_frame_(draw_frame(draw_frame::empty()))\r
                , input_(filename)\r
                , video_decoder_(input_.get_video_codec_context().get())                \r
-       {                       \r
-               input_.set_loop(std::find(params.begin(), params.end(), L"LOOP") != params.end());\r
-\r
-               if(input_.get_audio_codec_context().get())\r
-                       audio_decoder_.reset(new audio_decoder(input_.get_audio_codec_context().get(), input_.fps()));\r
-\r
-               auto seek = std::find(params.begin(), params.end(), L"SEEK");\r
-               if(seek != params.end() && ++seek != params.end())\r
-               {\r
-                       if(!input_.seek(boost::lexical_cast<unsigned long long>(*seek)))\r
-                               CASPAR_LOG(warning) << "Failed to seek file: " << filename_  << "to frame" << *seek;\r
-               }\r
-       }\r
+               , audio_decoder_(input_.get_audio_codec_context().get() ? new audio_decoder(input_.get_audio_codec_context().get(), input_.fps()) : nullptr){}\r
 \r
        virtual void initialize(const safe_ptr<frame_processor_device>& frame_processor)\r
        {\r
@@ -130,6 +118,17 @@ public:
                return result;\r
        }\r
 \r
+       void set_loop(bool value)\r
+       {\r
+               input_.set_loop(value);\r
+       }\r
+\r
+       void seek(unsigned long long value)\r
+       {\r
+               if(!input_.seek(value))\r
+                       BOOST_THROW_EXCEPTION(invalid_operation() << msg_info("Failed to seek file: )") << arg_value_info(narrow(filename_)));          \r
+       }\r
+\r
        virtual std::wstring print() const\r
        {\r
                return L"ffmpeg[" + boost::filesystem::wpath(filename_).filename() + L"]";\r
@@ -149,7 +148,15 @@ safe_ptr<frame_producer> create_ffmpeg_producer(const std::vector<std::wstring>&
        if(ext == extensions.end())\r
                return frame_producer::empty();\r
 \r
-       return make_safe<ffmpeg_producer>(filename + L"." + *ext, params);\r
+       auto producer = make_safe<ffmpeg_producer>(filename + L"." + *ext);\r
+\r
+       producer->set_loop(std::find(params.begin(), params.end(), L"LOOP") != params.end());\r
+       \r
+       auto seek = std::find(params.begin(), params.end(), L"SEEK");\r
+       if(seek != params.end() && ++seek != params.end())\r
+               producer->seek(boost::lexical_cast<unsigned long long>(*seek));\r
+\r
+       return producer;        \r
 }\r
 \r
 }}}
\ No newline at end of file
index e45b7ad29892d8add3266c58599d5c5437b6b036..bad2e30d00cb1380edec039b64b4a3729d336059 100644 (file)
@@ -78,7 +78,7 @@ public:
        {\r
                struct empty_frame_producer : public frame_producer\r
                {\r
-                       virtual safe_ptr<draw_frame> receive(){return draw_frame::eof();}\r
+                       virtual safe_ptr<draw_frame> receive(){return draw_frame::empty();}\r
                        virtual void initialize(const safe_ptr<frame_processor_device>&){}\r
                        virtual std::wstring print() const { return L"empty";}\r
                };\r
index 05754fae06fdef1e132e28c0b39443883bc21a53..8639677988d77ad63a0fb4480881877e62dcc632 100644 (file)
@@ -10,9 +10,7 @@
 namespace caspar { namespace core {\r
 \r
 struct layer::implementation : boost::noncopyable\r
-{      \r
-       std::wstring print() const { return L"layer[" + boost::lexical_cast<std::wstring>(index_) + L"]"; }\r
-                               \r
+{                                      \r
        tbb::atomic<bool>                       is_paused_;\r
        safe_ptr<draw_frame>            last_frame_;\r
        safe_ptr<frame_producer>        foreground_;\r
@@ -24,7 +22,10 @@ public:
                : foreground_(frame_producer::empty())\r
                , background_(frame_producer::empty())\r
                , last_frame_(draw_frame::empty())\r
-               , index_(index) {}\r
+               , index_(index) \r
+       {\r
+               is_paused_ = false;\r
+       }\r
        \r
        void load(const safe_ptr<frame_producer>& frame_producer, bool autoplay)\r
        {                       \r
@@ -66,47 +67,50 @@ public:
 \r
        void stop()\r
        {\r
-               foreground_ = frame_producer::empty();\r
+               is_paused_ = false;\r
                last_frame_ = draw_frame::empty();\r
+               foreground_ = frame_producer::empty();\r
        }\r
 \r
        void clear()\r
        {\r
+               is_paused_ = false;\r
+               last_frame_ = draw_frame::empty();\r
                foreground_ = frame_producer::empty();\r
                background_ = frame_producer::empty();\r
-               last_frame_ = draw_frame::empty();\r
        }\r
        \r
        safe_ptr<draw_frame> receive()\r
        {               \r
-               if(foreground_ == frame_producer::empty() || is_paused_)\r
+               if(is_paused_)\r
                        return last_frame_;\r
 \r
                try\r
                {\r
                        last_frame_ = foreground_->receive(); \r
-                       if(last_frame_ == draw_frame::eof())\r
+                       if(last_frame_ == draw_frame::eof() && foreground_ != frame_producer::empty())\r
                        {\r
                                auto following = foreground_->get_following_producer();\r
                                following->set_leading_producer(foreground_);\r
                                foreground_ = following;\r
-                               if(foreground_ != frame_producer::empty())\r
-                                       CASPAR_LOG(info) << print() << L" [EOF] " << foreground_->print() << " => foreground";\r
-                               else\r
-                                       CASPAR_LOG(info) << print() << L" [EOF] empty => foreground";\r
+\r
+                               CASPAR_LOG(info) << print() << L" [EOF] " << foreground_->print() << " => foreground";\r
+\r
                                last_frame_ = receive();\r
                        }\r
                }\r
                catch(...)\r
                {\r
                        CASPAR_LOG_CURRENT_EXCEPTION();\r
-                       CASPAR_LOG(warning) << print() << L" empty => foreground";\r
                        foreground_ = frame_producer::empty();\r
                        last_frame_ = draw_frame::empty();\r
+                       CASPAR_LOG(warning) << print() << L" empty => foreground";\r
                }\r
 \r
                return last_frame_;\r
        }\r
+\r
+       std::wstring print() const { return L"layer[" + boost::lexical_cast<std::wstring>(index_) + L"]"; }\r
 };\r
 \r
 layer::layer(int index) : impl_(new implementation(index)){}\r