X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=core%2Fproducer%2Ftransition%2Ftransition_producer.cpp;h=e3056c75f668e6d18106ded08c8628d7ac354eb7;hb=2af2c4bb98e0d68d7128cc3df51dc447fe4ab280;hp=eaac208da91f0484f49de773c55843f30d0704b2;hpb=c10279387895a1a0e18ea1d089ccd9f2a4bbd44c;p=casparcg diff --git a/core/producer/transition/transition_producer.cpp b/core/producer/transition/transition_producer.cpp index eaac208da..e3056c75f 100644 --- a/core/producer/transition/transition_producer.cpp +++ b/core/producer/transition/transition_producer.cpp @@ -32,21 +32,25 @@ namespace caspar { namespace core { -struct transition_producer : public frame_producer +class transition_producer : public frame_producer { monitor::basic_subject event_subject_; const field_mode mode_; int current_frame_; const transition_info info_; + + spl::shared_ptr last_frame_; spl::shared_ptr dest_producer_; spl::shared_ptr source_producer_; +public: explicit transition_producer(const field_mode& mode, const spl::shared_ptr& dest, const transition_info& info) : mode_(mode) , current_frame_(0) , info_(info) + , last_frame_(draw_frame::empty()) , dest_producer_(dest) , source_producer_(frame_producer::empty()) { @@ -100,6 +104,11 @@ struct transition_producer : public frame_producer return compose(dest, source); } + + virtual spl::shared_ptr last_frame() const override + { + return dest_producer_->last_frame(); + } virtual uint32_t nb_frames() const override { @@ -135,47 +144,47 @@ struct transition_producer : public frame_producer // For interlaced transitions. Seperate fields into seperate frames which are transitioned accordingly. - src_frame->get_frame_transform().volume = 1.0-delta2; + src_frame->frame_transform().audio_transform.volume = 1.0-delta2; auto s_frame1 = spl::make_shared(src_frame); auto s_frame2 = spl::make_shared(src_frame); - dest_frame->get_frame_transform().volume = delta2; + dest_frame->frame_transform().audio_transform.volume = delta2; auto d_frame1 = spl::make_shared(dest_frame); auto d_frame2 = spl::make_shared(dest_frame); if(info_.type == transition_type::mix) { - d_frame1->get_frame_transform().opacity = delta1; - d_frame1->get_frame_transform().is_mix = true; - d_frame2->get_frame_transform().opacity = delta2; - d_frame2->get_frame_transform().is_mix = true; - - s_frame1->get_frame_transform().opacity = 1.0-delta1; - s_frame1->get_frame_transform().is_mix = true; - s_frame2->get_frame_transform().opacity = 1.0-delta2; - s_frame2->get_frame_transform().is_mix = true; + d_frame1->frame_transform().image_transform.opacity = delta1; + d_frame1->frame_transform().image_transform.is_mix = true; + d_frame2->frame_transform().image_transform.opacity = delta2; + d_frame2->frame_transform().image_transform.is_mix = true; + + s_frame1->frame_transform().image_transform.opacity = 1.0-delta1; + s_frame1->frame_transform().image_transform.is_mix = true; + s_frame2->frame_transform().image_transform.opacity = 1.0-delta2; + s_frame2->frame_transform().image_transform.is_mix = true; } if(info_.type == transition_type::slide) { - d_frame1->get_frame_transform().fill_translation[0] = (-1.0+delta1)*dir; - d_frame2->get_frame_transform().fill_translation[0] = (-1.0+delta2)*dir; + d_frame1->frame_transform().image_transform.fill_translation[0] = (-1.0+delta1)*dir; + d_frame2->frame_transform().image_transform.fill_translation[0] = (-1.0+delta2)*dir; } else if(info_.type == transition_type::push) { - d_frame1->get_frame_transform().fill_translation[0] = (-1.0+delta1)*dir; - d_frame2->get_frame_transform().fill_translation[0] = (-1.0+delta2)*dir; + d_frame1->frame_transform().image_transform.fill_translation[0] = (-1.0+delta1)*dir; + d_frame2->frame_transform().image_transform.fill_translation[0] = (-1.0+delta2)*dir; - s_frame1->get_frame_transform().fill_translation[0] = (0.0+delta1)*dir; - s_frame2->get_frame_transform().fill_translation[0] = (0.0+delta2)*dir; + s_frame1->frame_transform().image_transform.fill_translation[0] = (0.0+delta1)*dir; + s_frame2->frame_transform().image_transform.fill_translation[0] = (0.0+delta2)*dir; } else if(info_.type == transition_type::wipe) { - d_frame1->get_frame_transform().clip_scale[0] = delta1; - d_frame2->get_frame_transform().clip_scale[0] = delta2; + d_frame1->frame_transform().image_transform.clip_scale[0] = delta1; + d_frame2->frame_transform().image_transform.clip_scale[0] = delta2; } - const auto s_frame = s_frame1->get_frame_transform() == s_frame2->get_frame_transform() ? s_frame2 : draw_frame::interlace(s_frame1, s_frame2, mode_); - const auto d_frame = d_frame1->get_frame_transform() == d_frame2->get_frame_transform() ? d_frame2 : draw_frame::interlace(d_frame1, d_frame2, mode_); + const auto s_frame = s_frame1->frame_transform() == s_frame2->frame_transform() ? s_frame2 : draw_frame::interlace(s_frame1, s_frame2, mode_); + const auto d_frame = d_frame1->frame_transform() == d_frame2->frame_transform() ? d_frame2 : draw_frame::interlace(d_frame1, d_frame2, mode_); return draw_frame::over(s_frame, d_frame); }