\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
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
\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
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
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
// 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
{\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