return p_.get();\r
}\r
\r
- void swap(shared_ptr& other) \r
+ void swap(unique_ptr& other) \r
{ \r
p_.swap(other.p_); \r
} \r
frames_.push_back(frame);\r
}\r
\r
- void accept(draw_frame& self, frame_visitor& visitor)\r
+ void accept(frame_visitor& visitor)\r
{\r
- visitor.begin(self);\r
+ visitor.push(frame_transform_);\r
BOOST_FOREACH(auto frame, frames_)\r
frame->accept(visitor);\r
- visitor.end();\r
+ visitor.pop();\r
} \r
};\r
\r
\r
const frame_transform& draw_frame::get_frame_transform() const { return impl_->frame_transform_;}\r
frame_transform& draw_frame::get_frame_transform() { return impl_->frame_transform_;}\r
-void draw_frame::accept(frame_visitor& visitor){impl_->accept(*this, visitor);}\r
+void draw_frame::accept(frame_visitor& visitor){impl_->accept(visitor);}\r
\r
spl::shared_ptr<draw_frame> draw_frame::interlace(const spl::shared_ptr<draw_frame>& frame1, const spl::shared_ptr<draw_frame>& frame2, field_mode mode)\r
{ \r
struct frame_visitor : boost::noncopyable\r
{\r
virtual ~frame_visitor(){}\r
- virtual void begin(class draw_frame& frame) = 0;\r
- virtual void end() = 0;\r
- virtual void visit(class write_frame& frame) = 0;\r
+ virtual void push(struct frame_transform& transform) = 0;\r
+ virtual void visit(struct data_frame& frame) = 0;\r
+ virtual void pop() = 0;\r
};\r
\r
}}
\ No newline at end of file
transform_stack_.push(core::frame_transform());\r
}\r
\r
- void begin(core::draw_frame& frame)\r
+ void push(frame_transform& transform)\r
{\r
- transform_stack_.push(transform_stack_.top()*frame.get_frame_transform());\r
+ transform_stack_.push(transform_stack_.top()*transform);\r
}\r
\r
- void visit(core::write_frame& frame)\r
+ void visit(data_frame& frame)\r
{\r
audio_item item;\r
item.tag = frame.tag();\r
transform_stack_.push(transform_stack_.top()*transform);\r
}\r
\r
- void end()\r
+ void pop()\r
{\r
transform_stack_.pop();\r
}\r
};\r
\r
audio_mixer::audio_mixer() : impl_(new impl()){}\r
-void audio_mixer::begin(core::draw_frame& frame){impl_->begin(frame);}\r
-void audio_mixer::visit(core::write_frame& frame){impl_->visit(frame);}\r
-void audio_mixer::end(){impl_->end();}\r
+void audio_mixer::push(frame_transform& transform){impl_->push(transform);}\r
+void audio_mixer::visit(data_frame& frame){impl_->visit(frame);}\r
+void audio_mixer::pop(){impl_->pop();}\r
audio_buffer audio_mixer::operator()(const video_format_desc& format_desc){return impl_->mix(format_desc);}\r
\r
}}
\ No newline at end of file
public:\r
audio_mixer();\r
\r
- virtual void begin(core::draw_frame& frame);\r
- virtual void visit(core::write_frame& frame);\r
- virtual void end();\r
+ virtual void push(struct frame_transform& transform);\r
+ virtual void visit(struct data_frame& frame);\r
+ virtual void pop();\r
\r
audio_buffer operator()(const struct video_format_desc& format_desc);\r
\r
layers_.push_back(std::make_pair(blend_mode, std::vector<item>()));\r
}\r
\r
- void begin(draw_frame& frame)\r
+ void push(frame_transform& transform)\r
{\r
- transform_stack_.push_back(transform_stack_.back()*frame.get_frame_transform());\r
+ transform_stack_.push_back(transform_stack_.back()*transform);\r
}\r
\r
- void visit(write_frame& frame)\r
+ void visit(data_frame& frame2)\r
{ \r
+ write_frame* frame = dynamic_cast<write_frame*>(&frame2);\r
+ if(frame == nullptr)\r
+ return;\r
+\r
item item;\r
- item.pix_desc = frame.get_pixel_format_desc();\r
+ item.pix_desc = frame->get_pixel_format_desc();\r
\r
- auto buffers = frame.get_buffers();\r
- auto planes = frame.get_pixel_format_desc().planes;\r
+ auto buffers = frame->get_buffers();\r
+ auto planes = frame->get_pixel_format_desc().planes;\r
for(size_t n = 0; n < planes.size(); ++n) \r
item.textures.push_back(ogl_->copy_async(buffers.at(n), planes[n].width, planes[n].height, planes[n].channels));\r
\r
layers_.back().second.push_back(item);\r
}\r
\r
- void end()\r
+ void pop()\r
{\r
transform_stack_.pop_back();\r
}\r
};\r
\r
image_mixer::image_mixer(const spl::shared_ptr<accelerator>& ogl) : impl_(new impl(ogl)){}\r
-void image_mixer::begin(draw_frame& frame){impl_->begin(frame);}\r
-void image_mixer::visit(write_frame& frame){impl_->visit(frame);}\r
-void image_mixer::end(){impl_->end();}\r
+void image_mixer::push(frame_transform& transform){impl_->push(transform);}\r
+void image_mixer::visit(data_frame& frame){impl_->visit(frame);}\r
+void image_mixer::pop(){impl_->pop();}\r
boost::unique_future<boost::iterator_range<const uint8_t*>> image_mixer::operator()(const video_format_desc& format_desc){return impl_->render(format_desc);}\r
void image_mixer::begin_layer(blend_mode blend_mode){impl_->begin_layer(blend_mode);}\r
void image_mixer::end_layer(){impl_->end_layer();}\r
public:\r
image_mixer(const spl::shared_ptr<class accelerator>& ogl);\r
\r
- virtual void begin(class draw_frame& frame);\r
- virtual void visit(class write_frame& frame);\r
- virtual void end();\r
+ virtual void push(struct frame_transform& frame);\r
+ virtual void visit(struct data_frame& frame);\r
+ virtual void pop();\r
\r
void begin_layer(blend_mode blend_mode);\r
void end_layer();\r
\r
void accept(write_frame& self, core::frame_visitor& visitor)\r
{\r
- visitor.begin(self);\r
+ visitor.push(self.get_frame_transform());\r
visitor.visit(self);\r
- visitor.end();\r
+ visitor.pop();\r
}\r
\r
boost::iterator_range<uint8_t*> image_data(int index)\r
{\r
virtual ~image_mixer(){}\r
\r
- virtual void begin(class draw_frame& frame) = 0;\r
- virtual void visit(class write_frame& frame) = 0;\r
- virtual void end() = 0;\r
+ virtual void push(struct frame_transform& frame) = 0;\r
+ virtual void visit(struct data_frame& frame) = 0;\r
+ virtual void pop() = 0;\r
\r
virtual void begin_layer(blend_mode blend_mode) = 0;\r
virtual void end_layer() = 0;\r