\r
#include "image_mixer.h"\r
\r
-#include "../util/write_frame.h"\r
+#include "../util/data_frame.h"\r
#include "../util/xmm.h"\r
\r
#include <common/assert.h>\r
#include <common/concurrency/async.h>\r
#include <common/memory/memcpy.h>\r
\r
-#include <core/frame/write_frame.h>\r
+#include <core/frame/data_frame.h>\r
#include <core/frame/frame_transform.h>\r
#include <core/frame/pixel_format.h>\r
#include <core/video_format.h>\r
{\r
core::pixel_format_desc pix_desc;\r
std::vector<spl::shared_ptr<host_buffer>> buffers;\r
- core::frame_transform transform;\r
+ core::image_transform transform;\r
\r
item()\r
: pix_desc(core::pixel_format::invalid)\r
{ \r
BOOST_FOREACH(auto& item, items)\r
item.transform.field_mode &= field_mode;\r
-\r
- boost::remove_erase_if(items, [](item& item){return item.transform.field_mode == core::field_mode::empty;});\r
+ \r
+ // Remove empty items.\r
+ boost::range::remove_erase_if(items, [&](const item& item)\r
+ {\r
+ return item.transform.field_mode == core::field_mode::empty;\r
+ });\r
+ \r
+ // Remove first field stills.\r
+ boost::range::remove_erase_if(items, [&](const item& item)\r
+ {\r
+ return item.transform.is_still && item.transform.field_mode == field_mode; // only us last field for stills.\r
+ });\r
\r
if(items.empty())\r
return;\r
struct image_mixer::impl : boost::noncopyable\r
{ \r
image_renderer renderer_;\r
- std::vector<core::frame_transform> transform_stack_;\r
+ std::vector<core::image_transform> transform_stack_;\r
std::vector<item> items_; // layer/stream/items\r
public:\r
impl() \r
{\r
}\r
\r
- void push(core::frame_transform& transform)\r
+ void push(const core::frame_transform& transform)\r
{\r
- transform_stack_.push_back(transform_stack_.back()*transform);\r
+ transform_stack_.push_back(transform_stack_.back()*transform.image_transform);\r
}\r
\r
- void visit(core::data_frame& frame2)\r
+ void visit(const core::data_frame& frame2)\r
{ \r
- write_frame* frame = dynamic_cast<write_frame*>(&frame2);\r
+ auto frame = dynamic_cast<const cpu::data_frame*>(&frame2);\r
if(frame == nullptr)\r
return;\r
\r
- if(frame->get_pixel_format_desc().format == core::pixel_format::invalid)\r
+ if(frame->pixel_format_desc().format == core::pixel_format::invalid)\r
return;\r
\r
- if(frame->get_buffers().empty())\r
+ if(frame->buffers().empty())\r
return;\r
\r
if(transform_stack_.back().field_mode == core::field_mode::empty)\r
return;\r
\r
item item;\r
- item.pix_desc = frame->get_pixel_format_desc();\r
- item.buffers = frame->get_buffers(); \r
+ item.pix_desc = frame->pixel_format_desc();\r
+ item.buffers = frame->buffers(); \r
item.transform = transform_stack_.back();\r
- item.transform.volume = core::frame_transform().volume; // Set volume to default since we don't care about it here.\r
\r
items_.push_back(item);\r
}\r
return renderer_(std::move(items_), format_desc);\r
}\r
\r
- virtual spl::shared_ptr<cpu::write_frame> create_frame(const void* tag, const core::pixel_format_desc& desc)\r
+ virtual spl::unique_ptr<core::data_frame> create_frame(const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode)\r
{\r
- return spl::make_shared<cpu::write_frame>(tag, desc);\r
+ return spl::make_unique<cpu::data_frame>(tag, desc, frame_rate, field_mode);\r
}\r
};\r
\r
image_mixer::image_mixer() : impl_(new impl()){}\r
-void image_mixer::push(core::frame_transform& transform){impl_->push(transform);}\r
-void image_mixer::visit(core::data_frame& frame){impl_->visit(frame);}\r
+void image_mixer::push(const core::frame_transform& transform){impl_->push(transform);}\r
+void image_mixer::visit(const core::data_frame& frame){impl_->visit(frame);}\r
void image_mixer::pop(){impl_->pop();}\r
boost::shared_future<boost::iterator_range<const uint8_t*>> image_mixer::operator()(const core::video_format_desc& format_desc){return impl_->render(format_desc);}\r
void image_mixer::begin_layer(core::blend_mode blend_mode){impl_->begin_layer(blend_mode);}\r
void image_mixer::end_layer(){impl_->end_layer();}\r
-spl::shared_ptr<core::write_frame> image_mixer::create_frame(const void* tag, const core::pixel_format_desc& desc) {return impl_->create_frame(tag, desc);}\r
+spl::unique_ptr<core::data_frame> image_mixer::create_frame(const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode) {return impl_->create_frame(tag, desc, frame_rate, field_mode);}\r
\r
}}}
\ No newline at end of file