return renderer_(std::move(items_), format_desc);\r
}\r
\r
- virtual spl::shared_ptr<core::data_frame> create_frame(const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode)\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::data_frame>(tag, desc, frame_rate, field_mode);\r
+ return spl::make_unique<cpu::data_frame>(tag, desc, frame_rate, field_mode);\r
}\r
};\r
\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::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
+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
// NOTE: Content of return future is only valid while future is valid.\r
virtual ::boost::shared_future<::boost::iterator_range<const uint8_t*>> operator()(const core::video_format_desc& format_desc) override;\r
\r
- virtual spl::shared_ptr<core::data_frame> create_frame(const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode) override;\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) override;\r
private:\r
struct impl;\r
spl::shared_ptr<impl> impl_;\r
return renderer_(std::move(layers_), format_desc);\r
}\r
\r
- virtual spl::shared_ptr<core::data_frame> create_frame(const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode)\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<ogl::data_frame>(ogl_, tag, desc, frame_rate, field_mode);\r
+ return spl::make_unique<ogl::data_frame>(ogl_, tag, desc, frame_rate, field_mode);\r
}\r
};\r
\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::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
+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
// NOTE: Content of return future is only valid while future is valid.\r
virtual boost::shared_future<boost::iterator_range<const uint8_t*>> operator()(const core::video_format_desc& format_desc) override;\r
\r
- virtual spl::shared_ptr<core::data_frame> create_frame(const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode) override;\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) override;\r
private:\r
struct impl;\r
spl::shared_ptr<impl> impl_;\r
\r
#include "draw_frame.h"\r
\r
+#include "data_frame.h"\r
+\r
#include "frame_transform.h"\r
\r
#include <boost/foreach.hpp>\r
struct draw_frame::impl\r
{ \r
std::vector<spl::shared_ptr<const draw_frame>> frames_;\r
- std::shared_ptr<const data_frame> data_frame_;\r
+ std::shared_ptr<spl::unique_ptr<const data_frame>> data_frame_;\r
\r
core::frame_transform frame_transform_; \r
public:\r
{\r
}\r
\r
- impl(spl::shared_ptr<const data_frame> frame) \r
- : data_frame_(frame)\r
+ impl(spl::unique_ptr<const data_frame> frame) \r
+ : data_frame_(new spl::unique_ptr<const data_frame>(std::move(frame)))\r
{\r
}\r
\r
visitor.push(frame_transform_);\r
if(data_frame_)\r
{\r
- visitor.visit(*data_frame_);\r
+ visitor.visit(**data_frame_);\r
}\r
else\r
{\r
draw_frame::draw_frame() : impl_(new impl()){}\r
draw_frame::draw_frame(const draw_frame& other) : impl_(new impl(*other.impl_)){}\r
draw_frame::draw_frame(draw_frame&& other) : impl_(std::move(other.impl_)){}\r
-draw_frame::draw_frame(spl::shared_ptr<const data_frame> frame) : impl_(new impl(std::move(frame))){}\r
+draw_frame::draw_frame(spl::unique_ptr<const data_frame> frame) : impl_(new impl(std::move(frame))){}\r
draw_frame::draw_frame(spl::shared_ptr<const draw_frame> frame) : impl_(new impl(std::move(frame))){}\r
draw_frame::draw_frame(std::vector<spl::shared_ptr<draw_frame>> frames) : impl_(new impl(frames)){}\r
draw_frame::draw_frame(std::vector<spl::shared_ptr<const draw_frame>> frames) : impl_(new impl(frames)){}\r
draw_frame& operator=(draw_frame other);\r
virtual ~draw_frame(){}\r
\r
- draw_frame(spl::shared_ptr<const data_frame> frame);\r
+ draw_frame(spl::unique_ptr<const data_frame> frame);\r
draw_frame(spl::shared_ptr<const draw_frame> frame);\r
draw_frame(std::vector<spl::shared_ptr<draw_frame>> frames);\r
draw_frame(std::vector<spl::shared_ptr<const draw_frame>> frames);\r
\r
#pragma once\r
\r
+#include "data_frame.h"\r
+\r
#include <common/spl/memory.h>\r
\r
#include <core/video_format.h>\r
public:\r
virtual ~frame_factory(){}\r
\r
- virtual spl::shared_ptr<class data_frame> create_frame(const void* video_stream_tag, const struct pixel_format_desc& desc, double frame_rate, core::field_mode field_mode) = 0; \r
- spl::shared_ptr<class data_frame> create_frame(const void* video_stream_tag, const struct pixel_format_desc& desc)\r
+ virtual spl::unique_ptr<class data_frame> create_frame(const void* video_stream_tag, const struct pixel_format_desc& desc, double frame_rate, core::field_mode field_mode) = 0; \r
+ spl::unique_ptr<class data_frame> create_frame(const void* video_stream_tag, const struct pixel_format_desc& desc)\r
{\r
auto format_desc = video_format_desc();\r
return create_frame(video_stream_tag, desc, format_desc.fps, format_desc.field_mode);\r
virtual void end_layer() = 0;\r
\r
virtual boost::shared_future<boost::iterator_range<const uint8_t*>> operator()(const struct video_format_desc& format_desc) = 0;\r
- virtual spl::shared_ptr<core::data_frame> create_frame(const void* tag, const struct pixel_format_desc& desc, double frame_rate, core::field_mode field_mode) = 0;\r
+ virtual spl::unique_ptr<core::data_frame> create_frame(const void* tag, const struct pixel_format_desc& desc, double frame_rate, core::field_mode field_mode) = 0;\r
};\r
\r
}}
\ No newline at end of file
void mixer::set_blend_mode(int index, blend_mode value){impl_->set_blend_mode(index, value);}\r
boost::unique_future<boost::property_tree::wptree> mixer::info() const{return impl_->info();}\r
spl::shared_ptr<const data_frame> mixer::operator()(std::map<int, spl::shared_ptr<draw_frame>> frames, const struct video_format_desc& format_desc){return (*impl_)(std::move(frames), format_desc);}\r
-spl::shared_ptr<data_frame> mixer::create_frame(const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode) {return impl_->image_mixer_->create_frame(tag, desc, frame_rate, field_mode);}\r
+spl::unique_ptr<data_frame> mixer::create_frame(const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode) {return impl_->image_mixer_->create_frame(tag, desc, frame_rate, field_mode);}\r
}}
\ No newline at end of file
\r
boost::unique_future<boost::property_tree::wptree> info() const;\r
\r
- spl::shared_ptr<class data_frame> create_frame(const void* tag, const struct pixel_format_desc& desc, double frame_rate, core::field_mode field_mode);\r
+ spl::unique_ptr<class data_frame> create_frame(const void* tag, const struct pixel_format_desc& desc, double frame_rate, core::field_mode field_mode);\r
private:\r
struct impl;\r
spl::shared_ptr<impl> impl_;\r
if(!(str >> std::hex >> value) || !str.eof())\r
BOOST_THROW_EXCEPTION(invalid_argument() << arg_name_info("color") << arg_value_info(color2) << msg_info("Invalid color."));\r
\r
- return spl::make_shared<draw_frame>(frame);\r
+ return spl::make_shared<draw_frame>(std::move(frame));\r
}\r
\r
}}
\ No newline at end of file
\r
// frame_factory\r
\r
- virtual spl::shared_ptr<data_frame> create_frame(const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode) override\r
+ virtual spl::unique_ptr<data_frame> create_frame(const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode) override\r
{ \r
return mixer_.create_frame(tag, desc, frame_rate, field_mode);\r
}\r
\r
struct frame_muxer::impl : boost::noncopyable\r
{ \r
- std::queue<std::queue<spl::shared_ptr<data_frame>>> video_streams_;\r
+ std::queue<std::queue<spl::unique_ptr<data_frame>>> video_streams_;\r
std::queue<core::audio_buffer> audio_streams_;\r
std::queue<spl::shared_ptr<draw_frame>> frame_buffer_;\r
display_mode display_mode_;\r
, filter_str_(filter_str)\r
, force_deinterlacing_(false)\r
{\r
- video_streams_.push(std::queue<spl::shared_ptr<data_frame>>());\r
+ video_streams_.push(std::queue<spl::unique_ptr<data_frame>>());\r
audio_streams_.push(core::audio_buffer());\r
\r
// Note: Uses 1 step rotated cadence for 1001 modes (1602, 1602, 1601, 1602, 1601)\r
\r
if(video_frame == flush_video())\r
{ \r
- video_streams_.push(std::queue<spl::shared_ptr<data_frame>>());\r
+ video_streams_.push(std::queue<spl::unique_ptr<data_frame>>());\r
}\r
else if(video_frame == empty_video())\r
{\r
auto empty_frame = frame_factory_->create_frame(this, core::pixel_format_desc(core::pixel_format::invalid));\r
- video_streams_.back().push(empty_frame);\r
+ video_streams_.back().push(std::move(empty_frame));\r
display_mode_ = display_mode::simple;\r
}\r
else\r
case display_mode::deinterlace_bob: \r
case display_mode::deinterlace: \r
{\r
- frame_buffer_.push(spl::make_shared<draw_frame>(frame1));\r
+ frame_buffer_.push(spl::make_shared<draw_frame>(std::move(frame1)));\r
break;\r
}\r
case display_mode::interlace: \r
{ \r
auto frame2 = pop_video();\r
\r
- frame_buffer_.push(core::draw_frame::interlace(spl::make_shared<draw_frame>(frame1), spl::make_shared<draw_frame>(frame2), format_desc_.field_mode)); \r
+ frame_buffer_.push(core::draw_frame::interlace(\r
+ spl::make_shared<core::draw_frame>(std::move(frame1)),\r
+ spl::make_shared<core::draw_frame>(std::move(frame2)),\r
+ format_desc_.field_mode)); \r
break;\r
}\r
case display_mode::duplicate: \r
{\r
boost::range::push_back(frame1->audio_data(), pop_audio());\r
\r
- frame_buffer_.push(spl::make_shared<draw_frame>(frame1));\r
- frame_buffer_.push(spl::make_shared<draw_frame>(frame1));\r
+ auto draw_frame = spl::make_shared<core::draw_frame>(std::move(frame1));\r
+ frame_buffer_.push(draw_frame);\r
+ frame_buffer_.push(draw_frame);\r
break;\r
}\r
case display_mode::half: \r
{ \r
pop_video(); // Throw away\r
\r
- frame_buffer_.push(spl::make_shared<draw_frame>(frame1));\r
+ frame_buffer_.push(spl::make_shared<draw_frame>(std::move(frame1)));\r
break;\r
}\r
default:\r
return try_pop(result);\r
}\r
\r
- spl::shared_ptr<core::data_frame> pop_video()\r
+ spl::unique_ptr<core::data_frame> pop_video()\r
{\r
- auto frame = video_streams_.front().front();\r
+ auto frame = std::move(video_streams_.front().front());\r
video_streams_.front().pop(); \r
- return frame;\r
+ return std::move(frame);\r
}\r
\r
core::audio_buffer pop_audio()\r
}\r
}\r
\r
-spl::shared_ptr<core::data_frame> make_data_frame(const void* tag, const spl::shared_ptr<AVFrame>& decoded_frame, double fps, const spl::shared_ptr<core::frame_factory>& frame_factory, int flags)\r
+spl::unique_ptr<core::data_frame> make_data_frame(const void* tag, const spl::shared_ptr<AVFrame>& decoded_frame, double fps, const spl::shared_ptr<core::frame_factory>& frame_factory, int flags)\r
{ \r
static tbb::concurrent_unordered_map<int, tbb::concurrent_queue<std::shared_ptr<SwsContext>>> sws_contexts_;\r
\r
\r
if(flags & core::frame_producer::flags::alpha_only)\r
desc = pixel_format_desc(static_cast<PixelFormat>(make_alpha_format(decoded_frame->format)), width, height);\r
-\r
- std::shared_ptr<core::data_frame> write;\r
-\r
+ \r
if(desc.format == core::pixel_format::invalid)\r
{\r
auto pix_fmt = static_cast<PixelFormat>(decoded_frame->format);\r
\r
auto target_desc = pixel_format_desc(target_pix_fmt, width, height);\r
\r
- write = frame_factory->create_frame(tag, target_desc, fps, get_mode(*decoded_frame));\r
+ auto write = frame_factory->create_frame(tag, target_desc, fps, get_mode(*decoded_frame));\r
\r
std::shared_ptr<SwsContext> sws_context;\r
\r
\r
sws_scale(sws_context.get(), decoded_frame->data, decoded_frame->linesize, 0, height, av_frame->data, av_frame->linesize); \r
pool.push(sws_context); \r
+\r
+ return std::move(write);\r
}\r
else\r
{\r
- write = frame_factory->create_frame(tag, desc, fps, get_mode(*decoded_frame));\r
+ auto write = frame_factory->create_frame(tag, desc, fps, get_mode(*decoded_frame));\r
\r
for(int n = 0; n < static_cast<int>(desc.planes.size()); ++n)\r
{\r
A_memcpy(result + y*plane.linesize, decoded + y*decoded_linesize, plane.linesize);\r
}, ap);\r
}\r
- }\r
\r
- return spl::make_shared_ptr(write);\r
+ return std::move(write);\r
+ }\r
}\r
\r
spl::shared_ptr<AVFrame> make_av_frame(caspar::core::data_frame& frame)\r
\r
core::field_mode get_mode(const AVFrame& frame);\r
int make_alpha_format(int format); // NOTE: Be careful about CASPAR_PIX_FMT_LUMA, change it to PIX_FMT_GRAY8 if you want to use the frame inside some ffmpeg function.\r
-spl::shared_ptr<core::data_frame> make_data_frame(const void* tag, const spl::shared_ptr<AVFrame>& decoded_frame, double fps, const spl::shared_ptr<core::frame_factory>& frame_factory, int flags);\r
+spl::unique_ptr<core::data_frame> make_data_frame(const void* tag, const spl::shared_ptr<AVFrame>& decoded_frame, double fps, const spl::shared_ptr<core::frame_factory>& frame_factory, int flags);\r
spl::shared_ptr<AVFrame> make_av_frame(caspar::core::data_frame& frame);\r
spl::shared_ptr<AVFrame> make_av_frame(std::array<void*, 4> data, const core::pixel_format_desc& pix_desc);\r
\r
auto frame = frame_factory_->create_frame(this, desc, fps(), core::field_mode::progressive);\r
\r
A_memcpy(frame->image_data(0).begin(), bmp_.data(), width_*height_*4);\r
- head_ = spl::make_shared<core::draw_frame>(frame); \r
+ head_ = spl::make_shared<core::draw_frame>(std::move(frame)); \r
} \r
\r
graph_->set_value("frame-time", static_cast<float>(frame_timer_.elapsed()/frame_time)*0.5f);\r
count = 0;\r
}\r
\r
- frames_.push_back(spl::make_shared<core::draw_frame>(frame));\r
+ frames_.push_back(spl::make_shared<core::draw_frame>(std::move(frame)));\r
}\r
\r
if(speed_ < 0.0)\r
count = 0;\r
}\r
\r
- frames_.push_back(spl::make_shared<core::draw_frame>(frame));\r
+ frames_.push_back(spl::make_shared<core::draw_frame>(std::move(frame)));\r
}\r
\r
std::reverse(frames_.begin(), frames_.end());\r
A_memcpy(frame->image_data(0).begin(), read_frame->image_data().begin(), read_frame->image_data().size());\r
boost::push_back(frame->audio_data(), read_frame->audio_data());\r
\r
- frame_buffer_.push(spl::make_shared<core::draw_frame>(frame));\r
+ auto draw_frame = spl::make_shared<core::draw_frame>(std::move(frame));\r
+\r
+ frame_buffer_.push(draw_frame);\r
\r
if(double_speed) \r
- frame_buffer_.push(spl::make_shared<core::draw_frame>(frame));\r
+ frame_buffer_.push(draw_frame);\r
\r
return receive(0);\r
} \r