From e427f7e2661d120c1152eaa7868cc18a3b8cdd7e Mon Sep 17 00:00:00 2001 From: ronag Date: Fri, 26 Aug 2011 09:09:14 +0000 Subject: [PATCH] git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@1291 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d --- core/mixer/image/image_mixer.cpp | 50 +++++++++++++++++--------------- core/mixer/image/image_mixer.h | 7 +++-- core/mixer/mixer.cpp | 2 +- shell/casparcg.config | 2 +- 4 files changed, 32 insertions(+), 29 deletions(-) diff --git a/core/mixer/image/image_mixer.cpp b/core/mixer/image/image_mixer.cpp index fa242c56b..b754e28e8 100644 --- a/core/mixer/image/image_mixer.cpp +++ b/core/mixer/image/image_mixer.cpp @@ -59,19 +59,21 @@ typedef std::pair> layer; class image_renderer { - video_channel_context& channel_; + ogl_device& ogl_; + video_format_desc format_desc_; image_kernel kernel_; std::shared_ptr active_buffer_; public: - image_renderer(video_channel_context& channel) - : channel_(channel) + image_renderer(ogl_device& ogl, const video_format_desc& format_desc) + : ogl_(ogl) + , format_desc_(format_desc) { } boost::unique_future> render(std::vector&& layers) { auto layers2 = make_move_on_copy(std::move(layers)); - return channel_.ogl().begin_invoke([=] + return ogl_.begin_invoke([=] { return do_render(std::move(layers2.value)); }); @@ -82,7 +84,7 @@ private: { auto draw_buffer = create_mixer_buffer(4); - if(channel_.get_format_desc().field_mode != field_mode::progressive) + if(format_desc_.field_mode != field_mode::progressive) { auto upper = layers; auto lower = std::move(layers); @@ -107,13 +109,13 @@ private: draw(std::move(layers), draw_buffer); } - auto host_buffer = channel_.ogl().create_host_buffer(channel_.get_format_desc().size, host_buffer::read_only); - channel_.ogl().attach(*draw_buffer); + auto host_buffer = ogl_.create_host_buffer(format_desc_.size, host_buffer::read_only); + ogl_.attach(*draw_buffer); host_buffer->begin_read(draw_buffer->width(), draw_buffer->height(), format(draw_buffer->stride())); active_buffer_ = std::move(draw_buffer); - channel_.ogl().flush(); // NOTE: This is important, otherwise fences will deadlock. + ogl_.flush(); // NOTE: This is important, otherwise fences will deadlock. return host_buffer; } @@ -179,7 +181,7 @@ private: draw_params.local_key = nullptr; draw_params.layer_key = nullptr; - kernel_.draw(channel_.ogl(), std::move(draw_params)); + kernel_.draw(ogl_, std::move(draw_params)); } else if(item.transform.is_mix) { @@ -191,7 +193,7 @@ private: draw_params.keyer = keyer::additive; - kernel_.draw(channel_.ogl(), std::move(draw_params)); + kernel_.draw(ogl_, std::move(draw_params)); } else { @@ -201,7 +203,7 @@ private: draw_params.local_key = std::move(local_key_buffer); draw_params.layer_key = layer_key_buffer; - kernel_.draw(channel_.ogl(), std::move(draw_params)); + kernel_.draw(ogl_, std::move(draw_params)); } } @@ -220,13 +222,13 @@ private: draw_params.blend_mode = blend_mode; draw_params.background = draw_buffer; - kernel_.draw(channel_.ogl(), std::move(draw_params)); + kernel_.draw(ogl_, std::move(draw_params)); } safe_ptr create_mixer_buffer(size_t stride) { - auto buffer = channel_.ogl().create_device_buffer(channel_.get_format_desc().width, channel_.get_format_desc().height, stride); - channel_.ogl().clear(*buffer); + auto buffer = ogl_.create_device_buffer(format_desc_.width, format_desc_.height, stride); + ogl_.clear(*buffer); return buffer; } }; @@ -238,9 +240,9 @@ struct image_mixer::implementation : boost::noncopyable std::vector transform_stack_; std::vector layers_; // layer/stream/items public: - implementation(video_channel_context& video_channel) - : ogl_(video_channel.ogl()) - , renderer_(video_channel) + implementation(ogl_device& ogl, const video_format_desc& format_desc) + : ogl_(ogl) + , renderer_(ogl, format_desc) , transform_stack_(1) { } @@ -250,12 +252,12 @@ public: layers_.push_back(std::make_pair(blend_mode, std::vector())); } - void begin(core::basic_frame& frame) + void begin(basic_frame& frame) { transform_stack_.push_back(transform_stack_.back()*frame.get_frame_transform()); } - void visit(core::write_frame& frame) + void visit(write_frame& frame) { item item; item.pix_desc = frame.get_pixel_format_desc(); @@ -279,18 +281,18 @@ public: return renderer_.render(std::move(layers_)); } - safe_ptr create_frame(const void* tag, const core::pixel_format_desc& desc) + safe_ptr create_frame(const void* tag, const pixel_format_desc& desc) { return make_safe(ogl_, tag, desc); } }; -image_mixer::image_mixer(video_channel_context& video_channel) : impl_(new implementation(video_channel)){} -void image_mixer::begin(core::basic_frame& frame){impl_->begin(frame);} -void image_mixer::visit(core::write_frame& frame){impl_->visit(frame);} +image_mixer::image_mixer(ogl_device& ogl, const video_format_desc& format_desc) : impl_(new implementation(ogl, format_desc)){} +void image_mixer::begin(basic_frame& frame){impl_->begin(frame);} +void image_mixer::visit(write_frame& frame){impl_->visit(frame);} void image_mixer::end(){impl_->end();} boost::unique_future> image_mixer::render(){return impl_->render();} -safe_ptr image_mixer::create_frame(const void* tag, const core::pixel_format_desc& desc){return impl_->create_frame(tag, desc);} +safe_ptr image_mixer::create_frame(const void* tag, const pixel_format_desc& desc){return impl_->create_frame(tag, desc);} void image_mixer::begin_layer(blend_mode::type blend_mode){impl_->begin_layer(blend_mode);} void image_mixer::end_layer(){impl_->end_layer();} image_mixer& image_mixer::operator=(image_mixer&& other) diff --git a/core/mixer/image/image_mixer.h b/core/mixer/image/image_mixer.h index 15beb66c0..266c3d43b 100644 --- a/core/mixer/image/image_mixer.h +++ b/core/mixer/image/image_mixer.h @@ -33,13 +33,14 @@ namespace caspar { namespace core { class write_frame; class host_buffer; -class video_channel_context; +class ogl_device; +struct video_format_desc; struct pixel_format_desc; class image_mixer : public core::frame_visitor, boost::noncopyable { public: - image_mixer(video_channel_context& context); + image_mixer(ogl_device& ogl, const video_format_desc& format_desc); virtual void begin(core::basic_frame& frame); virtual void visit(core::write_frame& frame); @@ -52,7 +53,7 @@ public: boost::unique_future> render(); - safe_ptr create_frame(const void* tag, const core::pixel_format_desc& format); + safe_ptr create_frame(const void* tag, const pixel_format_desc& format); private: struct implementation; diff --git a/core/mixer/mixer.cpp b/core/mixer/mixer.cpp index 4fbf8d8a5..0f0e1ad56 100644 --- a/core/mixer/mixer.cpp +++ b/core/mixer/mixer.cpp @@ -104,7 +104,7 @@ public: implementation(video_channel_context& video_channel) : channel_(video_channel) , audio_mixer_(channel_.get_format_desc()) - , image_mixer_(channel_) + , image_mixer_(channel_.ogl(), channel_.get_format_desc()) , buffer_size_(env::properties().get("configuration.producers.buffer-depth", 1)) { CASPAR_LOG(info) << print() << L" Successfully initialized . Buffer-depth: " << buffer_size_; diff --git a/shell/casparcg.config b/shell/casparcg.config index a24afe745..ecff4f7af 100644 --- a/shell/casparcg.config +++ b/shell/casparcg.config @@ -33,7 +33,7 @@ - 1080i5000 + PAL 1 -- 2.39.2