channel::channel(channel&& other) : impl_(std::move(other.impl_)){}\r
channel::channel(const video_format_desc& format_desc) : impl_(new implementation(format_desc)){}\r
frame_producer_device& channel::producer() { return *impl_->producer_;} \r
+frame_mixer_device& channel::mixer() { return *impl_->mixer_;} \r
frame_consumer_device& channel::consumer() { return *impl_->consumer_;} \r
const video_format_desc& channel::get_video_format_desc() const{return impl_->format_desc_;}\r
\r
#pragma once\r
\r
#include "consumer/frame_consumer_device.h"\r
+#include "mixer/frame_mixer_device.h"\r
#include "producer/frame_producer_device.h"\r
\r
#include <common/memory/safe_ptr.h>\r
channel(channel&& other);\r
\r
frame_producer_device& producer();\r
+ frame_mixer_device& mixer();\r
frame_consumer_device& consumer();\r
\r
const video_format_desc& get_video_format_desc() const;\r
\r
namespace caspar { namespace core {\r
\r
+audio_transform::audio_transform()\r
+ : gain_(1.0){}\r
+\r
+void audio_transform::set_gain(double value)\r
+{\r
+ tbb::spin_mutex::scoped_lock lock(mutex_);\r
+ gain_ = value;\r
+}\r
+\r
+double audio_transform::get_gain() const\r
+{\r
+ tbb::spin_mutex::scoped_lock lock(mutex_);\r
+ return gain_;\r
+}\r
+\r
audio_transform& audio_transform::operator*=(const audio_transform &other) \r
{\r
- gain *= other.gain;\r
+ tbb::spin_mutex::scoped_lock lock(mutex_);\r
+ gain_ *= other.gain_;\r
return *this;\r
}\r
\r
if(audio_data_.empty())\r
audio_data_.resize(audio_data.size(), 0);\r
\r
+ double gain = transform_stack_.top().get_gain();\r
tbb::parallel_for\r
(\r
tbb::blocked_range<size_t>(0, audio_data.size()),\r
for(size_t n = r.begin(); n < r.end(); ++n)\r
{\r
int sample = static_cast<int>(audio_data[n]);\r
- sample = (static_cast<int>(transform_stack_.top().gain*8192.0)*sample)/8192;\r
+ sample = (static_cast<int>(gain*8192.0)*sample)/8192;\r
audio_data_[n] = static_cast<short>((static_cast<int>(audio_data_[n]) + sample) & 0xFFFF);\r
}\r
}\r
#pragma once\r
\r
+#include <tbb/spin_mutex.h>\r
+\r
namespace caspar { namespace core {\r
\r
-struct audio_transform\r
+class audio_transform\r
{\r
- audio_transform() : gain(1.0){}\r
- double gain;\r
+public:\r
+ audio_transform();\r
+\r
+ void set_gain(double value);\r
+ double get_gain() const;\r
\r
audio_transform& operator*=(const audio_transform &other);\r
const audio_transform operator*(const audio_transform &other) const;\r
+private:\r
+ double gain_;\r
+ mutable tbb::spin_mutex mutex_;\r
};\r
\r
class audio_mixer\r
image_transform image_transform_; \r
audio_transform audio_transform_;\r
\r
+ int index_;\r
public:\r
implementation(const std::vector<safe_ptr<draw_frame>>& frames) \r
- : frames_(frames){}\r
+ : frames_(frames)\r
+ , index_(std::numeric_limits<int>::min()) {}\r
implementation(std::vector<safe_ptr<draw_frame>>&& frames) \r
- : frames_(std::move(frames)){}\r
+ : frames_(std::move(frames))\r
+ , index_(std::numeric_limits<int>::min()) {}\r
\r
void process_image(image_mixer& mixer)\r
{\r
auto my_frame2 = make_safe<draw_frame>(frame2);\r
if(mode == video_mode::upper)\r
{\r
- my_frame1->get_image_transform().mode = video_mode::upper; \r
- my_frame2->get_image_transform().mode = video_mode::lower; \r
- }\r
- else\r
- {\r
- my_frame1->get_image_transform().mode = video_mode::lower; \r
- my_frame2->get_image_transform().mode = video_mode::upper; \r
+ my_frame1->get_image_transform().set_mode(video_mode::upper); \r
+ my_frame2->get_image_transform().set_mode(video_mode::lower); \r
+ } \r
+ else \r
+ { \r
+ my_frame1->get_image_transform().set_mode(video_mode::lower); \r
+ my_frame2->get_image_transform().set_mode(video_mode::upper); \r
}\r
\r
std::vector<safe_ptr<draw_frame>> frames;\r
return make_safe<draw_frame>(frames);\r
}\r
\r
+void draw_frame::set_layer_index(int index) { impl_->index_ = index; }\r
+int draw_frame::get_layer_index() const { return impl_->index_; }\r
+\r
}}
\ No newline at end of file
\r
namespace caspar { namespace core {\r
\r
-struct image_transform;\r
-struct audio_transform;\r
+class image_transform;\r
+class audio_transform;\r
\r
class draw_frame\r
{\r
\r
virtual void process_image(image_mixer& mixer);\r
virtual void process_audio(audio_mixer& mixer);\r
+\r
+ void set_layer_index(int index);\r
+ int get_layer_index() const;\r
\r
private:\r
struct implementation;\r
\r
#include <boost/range/algorithm.hpp>\r
\r
+#include <unordered_map>\r
+\r
namespace caspar { namespace core {\r
\r
struct frame_mixer_device::implementation : boost::noncopyable\r
\r
executor executor_;\r
\r
+ std::unordered_map<int, image_transform> image_transforms_;\r
+ std::unordered_map<int, audio_transform> audio_transforms_;\r
+\r
public:\r
implementation(const video_format_desc& format_desc, const output_func& output) \r
: format_desc_(format_desc)\r
CASPAR_LOG(info) << "Shutting down mixer-device.";\r
}\r
\r
- void send(const safe_ptr<draw_frame>& frame)\r
+ void send(const std::vector<safe_ptr<draw_frame>>& frames)\r
{ \r
executor_.begin_invoke([=]\r
{\r
auto image = image_mixer_.begin_pass();\r
- frame->process_image(image_mixer_);\r
+ BOOST_FOREACH(auto& frame, frames)\r
+ {\r
+ image_mixer_.begin(image_transforms_[frame->get_layer_index()]);\r
+ frame->process_image(image_mixer_);\r
+ image_mixer_.end();\r
+ }\r
image_mixer_.end_pass();\r
\r
auto audio = audio_mixer_.begin_pass();\r
- frame->process_audio(audio_mixer_);\r
+ BOOST_FOREACH(auto& frame, frames)\r
+ {\r
+ audio_mixer_.begin(audio_transforms_[frame->get_layer_index()]);\r
+ frame->process_audio(audio_mixer_);\r
+ audio_mixer_.end();\r
+ }\r
audio_mixer_.end_pass();\r
\r
output_(make_safe<const read_frame>(std::move(image.get()), std::move(audio)));\r
{\r
return make_safe<write_frame>(desc, image_mixer_.create_buffers(desc));\r
}\r
+\r
+ image_transform& image(int index) \r
+ {\r
+ return image_transforms_[index];\r
+ }\r
+\r
+ audio_transform& audio(int index) \r
+ {\r
+ return audio_transforms_[index];\r
+ }\r
};\r
\r
frame_mixer_device::frame_mixer_device(const video_format_desc& format_desc, const output_func& output) : impl_(new implementation(format_desc, output)){}\r
frame_mixer_device::frame_mixer_device(frame_mixer_device&& other) : impl_(std::move(other.impl_)){}\r
-void frame_mixer_device::send(const safe_ptr<draw_frame>& frame){impl_->send(frame);}\r
+void frame_mixer_device::send(const std::vector<safe_ptr<draw_frame>>& frames){impl_->send(frames);}\r
const video_format_desc& frame_mixer_device::get_video_format_desc() const { return impl_->format_desc_; }\r
safe_ptr<write_frame> frame_mixer_device::create_frame(const pixel_format_desc& desc){ return impl_->create_frame(desc); } \r
safe_ptr<write_frame> frame_mixer_device::create_frame(size_t width, size_t height, pixel_format::type pix_fmt)\r
return create_frame(desc);\r
}\r
\r
+image_transform& frame_mixer_device::image(int index) { return impl_->image(index);}\r
+audio_transform& frame_mixer_device::audio(int index) { return impl_->audio(index);}\r
+\r
}}
\ No newline at end of file
\r
#include <functional>\r
\r
+#include "image/image_mixer.h"\r
+#include "audio/audio_mixer.h"\r
+\r
namespace caspar { namespace core {\r
\r
struct video_format;\r
frame_mixer_device(const video_format_desc& format_desc, const output_func& output);\r
frame_mixer_device(frame_mixer_device&& other); // nothrow\r
\r
- void send(const safe_ptr<draw_frame>& frame); // nothrow\r
+ void send(const std::vector<safe_ptr<draw_frame>>& frames); // nothrow\r
\r
safe_ptr<write_frame> create_frame(const pixel_format_desc& desc); \r
safe_ptr<write_frame> create_frame(size_t width, size_t height, pixel_format::type pix_fmt = pixel_format::bgra); \r
safe_ptr<write_frame> create_frame(pixel_format::type pix_fmt = pixel_format::bgra);\r
\r
const video_format_desc& get_video_format_desc() const; // nothrow\r
+\r
+ image_transform& image(int index);\r
+ audio_transform& audio(int index);\r
+\r
private:\r
struct implementation;\r
safe_ptr<implementation> impl_;\r
{\r
impl_->shaders()[pix_fmt].use();\r
\r
- GL(glUniform1f(impl_->shaders()[pix_fmt].get_location("color_gain"), static_cast<GLfloat>(transform.gain)));\r
+ GL(glUniform1f(impl_->shaders()[pix_fmt].get_location("color_gain"), static_cast<GLfloat>(transform.get_gain())));\r
\r
- if(transform.mode == video_mode::upper)\r
+ if(transform.get_mode() == video_mode::upper)\r
glPolygonStipple(upper_pattern);\r
- else if(transform.mode == video_mode::lower)\r
+ else if(transform.get_mode() == video_mode::lower)\r
glPolygonStipple(lower_pattern);\r
else\r
glPolygonStipple(progressive_pattern);\r
\r
namespace caspar { namespace core {\r
\r
-struct image_transform;\r
+class image_transform;\r
\r
class image_kernel\r
{\r
\r
namespace caspar { namespace core {\r
\r
+image_transform::image_transform() \r
+ : opacity_(1.0)\r
+ , gain_(1.0)\r
+ , mode_(video_mode::invalid)\r
+{\r
+ std::fill(pos_.begin(), pos_.end(), 0.0);\r
+ std::fill(uv_.begin(), uv_.end(), 0.0);\r
+}\r
+\r
+void image_transform::set_opacity(double value)\r
+{\r
+ tbb::spin_mutex::scoped_lock(mutex_); \r
+ opacity_ = value;\r
+}\r
+\r
+double image_transform::get_opacity() const\r
+{\r
+ tbb::spin_mutex::scoped_lock(mutex_);\r
+ return opacity_;\r
+}\r
+\r
+void image_transform::set_gain(double value)\r
+{\r
+ tbb::spin_mutex::scoped_lock(mutex_);\r
+ gain_ = value;\r
+}\r
+\r
+double image_transform::get_gain() const\r
+{\r
+ tbb::spin_mutex::scoped_lock(mutex_);\r
+ return gain_;\r
+}\r
+\r
+void image_transform::set_position(double x, double y)\r
+{\r
+ std::array<double, 2> value = {x, y};\r
+ tbb::spin_mutex::scoped_lock(mutex_);\r
+ pos_ = value;\r
+}\r
+\r
+std::array<double, 2> image_transform::get_position() const\r
+{\r
+ tbb::spin_mutex::scoped_lock(mutex_);\r
+ return pos_;\r
+}\r
+\r
+void image_transform::set_uv(double left, double top, double right, double bottom)\r
+{\r
+ std::array<double, 4> value = {left, top, right, bottom};\r
+ tbb::spin_mutex::scoped_lock(mutex_);\r
+ uv_ = value;\r
+}\r
+\r
+std::array<double, 4> image_transform::get_uv() const\r
+{\r
+ tbb::spin_mutex::scoped_lock(mutex_);\r
+ return uv_;\r
+}\r
+\r
+void image_transform::set_mode(video_mode::type mode)\r
+{\r
+ tbb::spin_mutex::scoped_lock(mutex_);\r
+ mode_ = mode;\r
+}\r
+\r
+video_mode::type image_transform::get_mode() const\r
+{\r
+ tbb::spin_mutex::scoped_lock(mutex_);\r
+ return mode_;\r
+}\r
+\r
+\r
image_transform& image_transform::operator*=(const image_transform &other)\r
{\r
- alpha *= other.alpha;\r
- mode = other.mode;\r
- gain *= other.gain;\r
- uv.get<0>() += other.uv.get<0>();\r
- uv.get<1>() += other.uv.get<1>();\r
- uv.get<2>() += other.uv.get<2>();\r
- uv.get<3>() += other.uv.get<3>();\r
- pos.get<0>() += other.pos.get<0>();\r
- pos.get<1>() += other.pos.get<1>();\r
+ tbb::spin_mutex::scoped_lock(mutex_);\r
+ opacity_ *= other.opacity_;\r
+ mode_ = other.mode_;\r
+ gain_ *= other.gain_;\r
+ uv_[0] += other.uv_[0];\r
+ uv_[1] += other.uv_[1];\r
+ uv_[2] += other.uv_[2];\r
+ uv_[3] += other.uv_[3];\r
+ pos_[0] += other.pos_[0];\r
+ pos_[1] += other.pos_[1];\r
return *this;\r
}\r
\r
context_.begin_invoke([=]\r
{\r
transform_stack_.push(image_transform());\r
- transform_stack_.top().mode = video_mode::progressive;\r
- transform_stack_.top().uv = boost::make_tuple(0.0, 1.0, 1.0, 0.0);\r
+ transform_stack_.top().set_mode(video_mode::progressive);\r
+ transform_stack_.top().set_uv(0.0, 1.0, 1.0, 0.0);\r
\r
GL(glEnable(GL_TEXTURE_2D));\r
GL(glDisable(GL_DEPTH_TEST)); \r
context_.begin_invoke([=]\r
{\r
GL(glLoadIdentity());\r
- GL(glTranslated(transform.pos.get<0>()*2.0, transform.pos.get<1>()*2.0, 0.0));\r
- GL(glColor4d(1.0, 1.0, 1.0, transform.alpha));\r
+ GL(glTranslated(transform.get_position()[0]*2.0, transform.get_position()[1]*2.0, 0.0));\r
+ GL(glColor4d(1.0, 1.0, 1.0, transform.get_opacity()));\r
GL(glViewport(0, 0, format_desc_.width, format_desc_.height));\r
kernel_.apply(desc.pix_fmt, transform);\r
\r
\r
auto t = transform;\r
glBegin(GL_QUADS);\r
- glTexCoord2d(t.uv.get<0>(), t.uv.get<3>()); glVertex2d(-1.0, -1.0);\r
- glTexCoord2d(t.uv.get<2>(), t.uv.get<3>()); glVertex2d( 1.0, -1.0);\r
- glTexCoord2d(t.uv.get<2>(), t.uv.get<1>()); glVertex2d( 1.0, 1.0);\r
- glTexCoord2d(t.uv.get<0>(), t.uv.get<1>()); glVertex2d(-1.0, 1.0);\r
+ glTexCoord2d(t.get_uv()[0], t.get_uv()[3]); glVertex2d(-1.0, -1.0);\r
+ glTexCoord2d(t.get_uv()[2], t.get_uv()[3]); glVertex2d( 1.0, -1.0);\r
+ glTexCoord2d(t.get_uv()[2], t.get_uv()[1]); glVertex2d( 1.0, 1.0);\r
+ glTexCoord2d(t.get_uv()[0], t.get_uv()[1]); glVertex2d(-1.0, 1.0);\r
glEnd();\r
});\r
}\r
\r
struct pixel_format_desc;\r
\r
-struct image_transform \r
+class image_transform \r
{\r
- image_transform() : alpha(1.0), pos(boost::make_tuple(0.0, 0.0)), gain(1.0), uv(boost::make_tuple(0.0, 0.0, 0.0, 0.0)), mode(video_mode::invalid){}\r
- double alpha;\r
- double gain;\r
- boost::tuple<double, double> pos;\r
- boost::tuple<double, double, double, double> uv;\r
- video_mode::type mode; \r
+public:\r
+ image_transform();\r
+\r
+ void set_opacity(double value);\r
+ double get_opacity() const;\r
+\r
+ void set_gain(double value);\r
+ double get_gain() const;\r
+\r
+ void set_position(double x, double y);\r
+ std::array<double, 2> get_position() const;\r
+\r
+ void set_uv(double left, double top, double right, double bottom);\r
+ std::array<double, 4> get_uv() const;\r
+\r
+ void set_mode(video_mode::type mode);\r
+ video_mode::type get_mode() const;\r
\r
image_transform& operator*=(const image_transform &other);\r
const image_transform operator*(const image_transform &other) const;\r
+private:\r
+ double opacity_;\r
+ double gain_;\r
+ std::array<double, 2> pos_;\r
+ std::array<double, 4> uv_;\r
+ video_mode::type mode_;\r
};\r
\r
class image_mixer : boost::noncopyable\r
{\r
result = std::move(ouput_channel_.front());\r
last_frame_ = draw_frame(result);\r
- last_frame_->get_audio_transform().gain = 0.0; // last_frame should not have audio\r
+ last_frame_->get_audio_transform().set_gain(0.0); // last_frame should not have audio\r
ouput_channel_.pop();\r
}\r
else if(input_.is_eof())\r
});\r
\r
if(codec_context_->codec_id == CODEC_ID_DVVIDEO) // Move up one field frame_factory_->get_video_format_desc().mode == video_mode::upper && \r
- write->get_image_transform().pos = boost::make_tuple(0.0f, 1.0/static_cast<double>(height_));\r
+ write->get_image_transform().set_position(0.0f, 1.0/static_cast<double>(height_));\r
\r
return write;\r
}\r
executor_.begin_invoke([=]{tick();});\r
}\r
\r
- safe_ptr<draw_frame> draw()\r
+ std::vector<safe_ptr<draw_frame>> draw()\r
{ \r
std::vector<safe_ptr<draw_frame>> frames(layers_.size(), draw_frame::empty());\r
tbb::parallel_for(tbb::blocked_range<size_t>(0, frames.size()), \r
}); \r
boost::range::remove_erase(frames, draw_frame::eof());\r
boost::range::remove_erase(frames, draw_frame::empty());\r
- return draw_frame(frames);\r
- }\r
-\r
- // Layers and Producers\r
- void set_video_gain(int index, double value)\r
- {\r
- begin_invoke_layer(index, std::bind(&layer::set_video_gain, std::placeholders::_1, value));\r
- }\r
-\r
- void set_video_opacity(int index, double value)\r
- {\r
- begin_invoke_layer(index, std::bind(&layer::set_video_opacity, std::placeholders::_1, value));\r
- }\r
-\r
- void set_audio_gain(int index, double value)\r
- {\r
- begin_invoke_layer(index, std::bind(&layer::set_audio_gain, std::placeholders::_1, value));\r
+ return frames;\r
}\r
\r
void load(int index, const safe_ptr<frame_producer>& producer, bool play_on_load)\r
frame_producer_device::frame_producer_device(frame_producer_device&& other) : impl_(std::move(other.impl_)){}\r
frame_producer_device::frame_producer_device(const video_format_desc& format_desc, const safe_ptr<frame_factory>& factory, const output_func& output) \r
: impl_(new implementation(format_desc, factory, output)){}\r
-void frame_producer_device::set_video_gain(int index, double value){impl_->set_video_gain(index, value);}\r
-void frame_producer_device::set_video_opacity(int index, double value){impl_->set_video_opacity(index, value);}\r
-void frame_producer_device::set_audio_gain(int index, double value){impl_->set_audio_gain(index, value);}\r
void frame_producer_device::load(int index, const safe_ptr<frame_producer>& producer, bool play_on_load){impl_->load(index, producer, play_on_load);}\r
void frame_producer_device::preview(int index, const safe_ptr<frame_producer>& producer){impl_->preview(index, producer);}\r
void frame_producer_device::pause(int index){impl_->pause(index);}\r
class frame_producer_device : boost::noncopyable\r
{\r
public:\r
- typedef std::function<void(const safe_ptr<draw_frame>&)> output_func;\r
+ typedef std::function<void(const std::vector<safe_ptr<draw_frame>>&)> output_func;\r
\r
explicit frame_producer_device(const video_format_desc& format_desc, const safe_ptr<frame_factory>& factory, const output_func& output);\r
frame_producer_device(frame_producer_device&& other);\r
\r
- // Layers and Producers\r
- void set_video_gain(int index, double value);\r
- void set_video_opacity(int index, double value);\r
-\r
- void set_audio_gain(int index, double value);\r
-\r
void load(int index, const safe_ptr<frame_producer>& producer, bool play_on_load = false);\r
void preview(int index, const safe_ptr<frame_producer>& producer);\r
void pause(int index);\r
const int index_;\r
bool is_paused_;\r
\r
- double video_gain_;\r
- double video_opacity_;\r
- \r
- double audio_gain_;\r
-\r
public:\r
implementation(int index) \r
: foreground_(frame_producer::empty())\r
, background_(frame_producer::empty())\r
, last_frame_(draw_frame::empty())\r
, index_(index) \r
- , is_paused_(false)\r
- , video_gain_(1.0)\r
- , video_opacity_(1.0)\r
- , audio_gain_(1.0){}\r
+ , is_paused_(false){}\r
\r
void load(const safe_ptr<frame_producer>& frame_producer, bool play_on_load)\r
{ \r
try\r
{\r
last_frame_ = foreground_->receive(); \r
+ last_frame_->set_layer_index(index_);\r
if(last_frame_ == draw_frame::eof())\r
{\r
CASPAR_ASSERT(foreground_ != frame_producer::empty());\r
\r
last_frame_ = receive();\r
}\r
- else\r
- {\r
- last_frame_ = draw_frame(last_frame_);\r
- last_frame_->get_image_transform().gain *= video_gain_;\r
- last_frame_->get_image_transform().alpha *= video_opacity_;\r
- last_frame_->get_audio_transform().gain *= audio_gain_;\r
- }\r
}\r
catch(...)\r
{\r
}\r
void layer::load(const safe_ptr<frame_producer>& frame_producer, bool play_on_load){return impl_->load(frame_producer, play_on_load);} \r
void layer::preview(const safe_ptr<frame_producer>& frame_producer){return impl_->preview(frame_producer);} \r
-void layer::set_video_gain(double value) { impl_->video_gain_ = value;}\r
-void layer::set_video_opacity(double value) { impl_->video_opacity_ = value;}\r
-void layer::set_audio_gain(double value) { impl_->audio_gain_ = value;}\r
void layer::play(){impl_->play();}\r
void layer::pause(){impl_->pause();}\r
void layer::stop(){impl_->stop();}\r
layer(int index = -1); // nothrow\r
layer(layer&& other); // nothrow\r
layer& operator=(layer&& other); // nothrow\r
-\r
- void set_video_gain(double value);\r
- void set_video_opacity(double value);\r
-\r
- void set_audio_gain(double value);\r
- \r
+ \r
void load(const safe_ptr<frame_producer>& producer, bool play_on_load = false); // nothrow\r
void preview(const safe_ptr<frame_producer>& producer); // nothrow\r
void play(); // nothrow\r
auto my_src_frame = draw_frame(src_frame);\r
auto my_dest_frame = draw_frame(dest_frame);\r
\r
- my_src_frame.get_audio_transform().gain = 1.0-alpha;\r
- my_dest_frame.get_audio_transform().gain = alpha;\r
+ my_src_frame.get_audio_transform().set_gain(1.0-alpha);\r
+ my_dest_frame.get_audio_transform().set_gain(alpha);\r
\r
double dir = info_.direction == transition_direction::from_left ? 1.0 : -1.0; \r
\r
if(info_.type == transition::mix)\r
- my_dest_frame.get_image_transform().alpha = alpha; \r
+ my_dest_frame.get_image_transform().set_opacity(alpha); \r
else if(info_.type == transition::slide) \r
- my_dest_frame.get_image_transform().pos = boost::make_tuple((-1.0+alpha)*dir, 0.0); \r
+ my_dest_frame.get_image_transform().set_position((-1.0+alpha)*dir, 0.0); \r
else if(info_.type == transition::push)\r
{\r
- my_dest_frame.get_image_transform().pos = boost::make_tuple((-1.0+alpha)*dir, 0.0);\r
- my_src_frame.get_image_transform().pos = boost::make_tuple((0.0+alpha)*dir, 0.0);\r
+ my_dest_frame.get_image_transform().set_position((-1.0+alpha)*dir, 0.0);\r
+ my_src_frame.get_image_transform().set_position((0.0+alpha)*dir, 0.0);\r
}\r
else if(info_.type == transition::wipe)\r
{\r
- my_dest_frame.get_image_transform().pos = boost::make_tuple((-1.0+alpha)*dir, 0.0); \r
- my_dest_frame.get_image_transform().uv = boost::make_tuple((-1.0+alpha)*dir, 0.0, 0.0-(1.0-alpha)*dir, 0.0); \r
+ my_dest_frame.get_image_transform().set_position((-1.0+alpha)*dir, 0.0); \r
+ my_dest_frame.get_image_transform().set_uv((-1.0+alpha)*dir, 0.0, 0.0-(1.0-alpha)*dir, 0.0); \r
}\r
\r
return draw_frame(std::move(my_src_frame), std::move(my_dest_frame));\r
if(_parameters[1] == L"OPACITY")\r
{\r
double value = boost::lexical_cast<double>(_parameters[2]);\r
- GetChannel()->producer().set_video_opacity(GetLayerIndex(), value);\r
+ GetChannel()->mixer().image(GetLayerIndex()).set_opacity(value);\r
}\r
else if(_parameters[1] == L"GAIN")\r
{\r
double value = boost::lexical_cast<double>(_parameters[2]);\r
- GetChannel()->producer().set_video_gain(GetLayerIndex(), value);\r
+ GetChannel()->mixer().image(GetLayerIndex()).set_gain(value);\r
}\r
else if(_parameters[1] == L"RESET")\r
{\r
- GetChannel()->producer().set_video_opacity(GetLayerIndex(), 1.0);\r
- GetChannel()->producer().set_video_gain(GetLayerIndex(), 1.0);\r
+ GetChannel()->mixer().image(GetLayerIndex()) = image_transform();\r
}\r
}\r
else if(_parameters[0] == L"AUDIO")\r
if(_parameters[1] == L"GAIN")\r
{\r
double value = boost::lexical_cast<double>(_parameters[2]);\r
- GetChannel()->producer().set_audio_gain(GetLayerIndex(), value);\r
+ GetChannel()->mixer().audio(GetLayerIndex()).set_gain(value);\r
}\r
else if(_parameters[1] == L"RESET")\r
{\r
- GetChannel()->producer().set_audio_gain(GetLayerIndex(), 1.0);\r
+ GetChannel()->mixer().audio(GetLayerIndex()) = audio_transform();\r
}\r
}\r
else if(_parameters[0] == L"RESET")\r
{\r
- GetChannel()->producer().set_video_opacity(GetLayerIndex(), 1.0);\r
- GetChannel()->producer().set_video_gain(GetLayerIndex(), 1.0);\r
- GetChannel()->producer().set_audio_gain(GetLayerIndex(), 1.0);\r
+ GetChannel()->mixer().image(GetLayerIndex()) = image_transform();\r
+ GetChannel()->mixer().audio(GetLayerIndex()) = audio_transform();\r
}\r
\r
SetReplyString(TEXT("202 MIXER OK\r\n"));\r