-public:\r
- implementation(video_channel_context& video_channel) \r
- : channel_(video_channel)\r
- , transform_stack_(1)\r
- , mode_stack_(1, video_mode::progressive)\r
- {\r
- initialize_buffers();\r
- }\r
-\r
- ~implementation()\r
- {\r
- channel_.ogl().gc();\r
- }\r
-\r
- void initialize_buffers()\r
- {\r
- write_buffer_ = channel_.ogl().create_device_buffer(channel_.get_format_desc().width, channel_.get_format_desc().height, 4);\r
- layer_key_buffer_ = channel_.ogl().create_device_buffer(channel_.get_format_desc().width, channel_.get_format_desc().height, 1);\r
- draw_buffer_[0] = channel_.ogl().create_device_buffer(channel_.get_format_desc().width, channel_.get_format_desc().height, 4);\r
- draw_buffer_[1] = channel_.ogl().create_device_buffer(channel_.get_format_desc().width, channel_.get_format_desc().height, 4);\r
- local_key_buffer_[0] = channel_.ogl().create_device_buffer(channel_.get_format_desc().width, channel_.get_format_desc().height, 1);\r
- local_key_buffer_[1] = channel_.ogl().create_device_buffer(channel_.get_format_desc().width, channel_.get_format_desc().height, 1);\r
- channel_.ogl().gc();\r
- }\r
-\r
- void begin(core::basic_frame& frame)\r
- {\r
- transform_stack_.push_back(transform_stack_.back()*frame.get_image_transform());\r
- mode_stack_.push_back(frame.get_mode() == video_mode::progressive ? mode_stack_.back() : frame.get_mode());\r
- }\r
- \r
- void visit(core::write_frame& frame)\r
- { \r
- CASPAR_ASSERT(!layers_.empty());\r
-\r
- // Check if frame has been discarded by interlacing\r
- if(boost::range::find(mode_stack_, video_mode::upper) != mode_stack_.end() && boost::range::find(mode_stack_, video_mode::lower) != mode_stack_.end())\r
- return;\r
- \r
- core::render_item item = {frame.get_pixel_format_desc(), frame.get_textures(), transform_stack_.back(), mode_stack_.back(), frame.tag()}; \r
-\r
- auto& layer = layers_.back();\r
-\r
- auto it = boost::range::find(layer, item);\r
- if(it == layer.end())\r
- layer.push_back(item);\r
- }\r
-\r
- void end()\r
- {\r
- transform_stack_.pop_back();\r
- mode_stack_.pop_back();\r
- }\r