]> git.sesse.net Git - casparcg/commitdiff
2.0. image_scroll_producer: Working.
authorRonag <Ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Tue, 2 Aug 2011 11:39:42 +0000 (11:39 +0000)
committerRonag <Ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Tue, 2 Aug 2011 11:39:42 +0000 (11:39 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@1038 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

core/producer/layer.cpp
modules/image/producer/image_scroll_producer.cpp

index 9ef35a0d00fe2721f398a5504304794a07dd52dc..89a6188edfa2de406cd82bdea976d2ab8b5f0aef 100644 (file)
@@ -48,16 +48,18 @@ public:
 \r
        void load(const safe_ptr<frame_producer>& producer, bool preview, int auto_play_delta)\r
        {               \r
+               background_              = producer;\r
                auto_play_delta_ = auto_play_delta;\r
 \r
-               background_ = producer;\r
-\r
                if(preview) // Play the first frame and pause.\r
                {                       \r
                        play();\r
                        receive();\r
                        pause();\r
                }\r
+\r
+               if(auto_play_delta >= 0 && foreground_ == frame_producer::empty())\r
+                       play();\r
        }\r
        \r
        void play()\r
@@ -67,6 +69,7 @@ public:
                        background_->set_leading_producer(foreground_);\r
                        foreground_ = background_;\r
                        frame_number_ = 0;\r
+                       auto_play_delta_ = -1;\r
                        background_ = frame_producer::empty();\r
                }\r
                resume();\r
@@ -98,11 +101,9 @@ public:
 \r
                                CASPAR_LOG(info) << L"Automatically playing next clip with " << auto_play_delta_ << " frames offset.";\r
                                \r
-                               auto_play_delta_ = -1;\r
                                play();\r
                                frame = receive();\r
                        }\r
-\r
                }\r
                                \r
                return frame;\r
index 2d3d743e0d30783ff064d6687f576cd2ce3ccc96..c3b441e0ce30c285e460775a3b30d6406754cb0e 100644 (file)
 using namespace boost::assign;\r
 \r
 namespace caspar {\r
-\r
-enum direction\r
-{\r
-       down,\r
-       right\r
-};\r
-       \r
+               \r
 struct image_scroll_producer : public core::frame_producer\r
 {      \r
        const std::wstring                                                      filename_;\r
@@ -124,7 +118,7 @@ struct image_scroll_producer : public core::frame_producer
                                        fast_memclr(frame->image_data().begin(), frame->image_data().size());   \r
                                        int width2 = width_ % format_desc_.width;\r
                                        for(size_t y = 0; y < height_; ++y)\r
-                                               std::copy_n(bytes + i * format_desc_.width*4 + y * width_*4,width2*4, frame->image_data().begin() + y * format_desc_.width*4);\r
+                                               std::copy_n(bytes + i * format_desc_.width*4 + y * width_*4, width2*4, frame->image_data().begin() + y * format_desc_.width*4);\r
 \r
                                        count = 0;\r
                                }\r
@@ -150,19 +144,25 @@ struct image_scroll_producer : public core::frame_producer
        // frame_producer\r
 \r
        virtual safe_ptr<core::basic_frame> receive()\r
-       {\r
-               delta_ += speed_;\r
+       {               \r
+               delta_ = 1;//+= speed_;\r
 \r
                if(frames_.empty())\r
                        return core::basic_frame::eof();\r
                \r
                if(height_ > format_desc_.height)\r
                {\r
+                       if(static_cast<size_t>(std::abs(delta_)) >= height_ - format_desc_.height)\r
+                               return core::basic_frame::eof();\r
+\r
                        for(size_t n = 0; n < frames_.size(); ++n)\r
                                frames_[n]->get_image_transform().set_fill_translation(start_offset_[0], start_offset_[1] -0.5*(n+1) + delta_ * 0.5/static_cast<double>(format_desc_.height));\r
                }\r
                else\r
                {\r
+                       if(static_cast<size_t>(std::abs(delta_)) >= width_ - format_desc_.width)\r
+                               return core::basic_frame::eof();\r
+\r
                        for(size_t n = 0; n < frames_.size(); ++n)\r
                                frames_[n]->get_image_transform().set_fill_translation(start_offset_[0] -0.5*(n+1) + delta_ * 0.5/static_cast<double>(format_desc_.height), start_offset_[1]);\r
                }\r
@@ -174,6 +174,21 @@ struct image_scroll_producer : public core::frame_producer
        {\r
                return L"image_scroll_producer[" + filename_ + L"]";\r
        }\r
+\r
+       virtual int64_t nb_frames() const \r
+       {\r
+               if(height_ > format_desc_.height)\r
+               {\r
+                       auto length = (height_ - format_desc_.height);\r
+                       return (length/std::abs(speed_) + length % std::abs(delta_));\r
+               }\r
+               else\r
+               {\r
+                       auto length = (width_ - format_desc_.width);\r
+                       auto result = (length/std::abs(speed_) + length % std::abs(delta_));\r
+                       return result;\r
+               }\r
+       }\r
 };\r
 \r
 safe_ptr<core::frame_producer> create_image_scroll_producer(const safe_ptr<core::frame_factory>& frame_factory, const std::vector<std::wstring>& params)\r