]> git.sesse.net Git - casparcg/commitdiff
2.0. Started with deinterlace framework.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Fri, 17 Jun 2011 09:19:49 +0000 (09:19 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Fri, 17 Jun 2011 09:19:49 +0000 (09:19 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@905 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

core/mixer/image/image_kernel.cpp
core/mixer/image/image_mixer.cpp
core/mixer/write_frame.cpp
core/mixer/write_frame.h
core/producer/frame/image_transform.cpp
core/producer/frame/image_transform.h
core/producer/transition/transition_producer.cpp
modules/decklink/producer/decklink_producer.cpp
modules/ffmpeg/producer/video/video_decoder.cpp
protocol/amcp/AMCPCommandsImpl.cpp

index 7fa19793ce12867a6db1022febf98af1b419f80c..63c815f1723b9cb33d47086e60525d1c122329ea 100644 (file)
@@ -340,8 +340,8 @@ void image_kernel::draw(size_t width, size_t height, const core::pixel_format_de
        GL(glColor4d(1.0, 1.0, 1.0, transform.get_opacity()));\r
        GL(glViewport(0, 0, width, height));\r
                                                \r
-       auto m_p = transform.get_key_translation();\r
-       auto m_s = transform.get_key_scale();\r
+       auto m_p = transform.get_clip_translation();\r
+       auto m_s = transform.get_clip_scale();\r
        double w = static_cast<double>(width);\r
        double h = static_cast<double>(height);\r
 \r
index 7cbd325490354cae2768495aa2f5edc9938d54a5..9ca9c12602d89dfda5dbc29adc7e1646b07f2a73 100644 (file)
@@ -163,8 +163,10 @@ public:
 \r
                                while(!layer.empty())\r
                                {\r
-                                       draw(layer.front());\r
+                                       auto frame = layer.front();\r
                                        layer.pop();\r
+\r
+                                       draw(frame);\r
                                        channel_.ogl().yield(); // Allow quick buffer allocation to execute.\r
                                }\r
 \r
index 57e04229f70646da62641862e3dac94088751100..afb9d6477595c16a775ace81af264b66cd3106d9 100644 (file)
@@ -38,12 +38,13 @@ struct write_frame::implementation : boost::noncopyable
        std::vector<int16_t>                                    audio_data_;\r
        const core::pixel_format_desc                   desc_;\r
        int                                                                             tag_;\r
+       bool                                                                    is_interlaced_;\r
 \r
-public:\r
        implementation(ogl_device& ogl, int tag, const core::pixel_format_desc& desc) \r
                : ogl_(ogl)\r
                , desc_(desc)\r
                , tag_(tag)\r
+               , is_interlaced_(false)\r
        {\r
                ogl_.invoke([&]\r
                {\r
@@ -121,4 +122,7 @@ const core::pixel_format_desc& write_frame::get_pixel_format_desc() const{return
 const std::vector<safe_ptr<device_buffer>>& write_frame::get_textures() const{return impl_->textures_;}\r
 void write_frame::commit(size_t plane_index){impl_->commit(plane_index);}\r
 void write_frame::commit(){impl_->commit();}\r
+void write_frame::set_is_interlaced(bool value){impl_->is_interlaced_ = true;}\r
+bool write_frame::get_is_interlaced() const{return impl_->is_interlaced_;}\r
+\r
 }}
\ No newline at end of file
index b741a57cbfdd60156eae838866164dbd732ed04f..58c707039c31f0532a9935b0b9295949cc663834 100644 (file)
@@ -50,6 +50,9 @@ public:
 \r
        void commit(uint32_t plane_index);\r
        void commit();\r
+       \r
+       void set_is_interlaced(bool value);\r
+       bool get_is_interlaced() const;\r
 \r
        virtual void accept(core::frame_visitor& visitor);\r
 \r
index a620a9d4df3c6345d28128cc72bdda5fd3aca9fe..fba4e5c281d4cb9b36b7b71b39dbd659e82274ef 100644 (file)
@@ -30,11 +30,12 @@ image_transform::image_transform()
        , gain_(1.0)\r
        , mode_(video_mode::invalid)\r
        , is_key_(false)\r
+       , deinterlace_(false)\r
 {\r
        std::fill(fill_translation_.begin(), fill_translation_.end(), 0.0);\r
        std::fill(fill_scale_.begin(), fill_scale_.end(), 1.0);\r
-       std::fill(key_translation_.begin(), key_translation_.end(), 0.0);\r
-       std::fill(key_scale_.begin(), key_scale_.end(), 1.0);\r
+       std::fill(clip_translation_.begin(), clip_translation_.end(), 0.0);\r
+       std::fill(clip_scale_.begin(), clip_scale_.end(), 1.0);\r
 }\r
 \r
 void image_transform::set_opacity(double value)\r
@@ -79,26 +80,26 @@ std::array<double, 2> image_transform::get_fill_scale() const
        return fill_scale_;\r
 }\r
 \r
-void image_transform::set_key_translation(double x, double y)\r
+void image_transform::set_clip_translation(double x, double y)\r
 {\r
-       key_translation_[0] = x;\r
-       key_translation_[1] = y;\r
+       clip_translation_[0] = x;\r
+       clip_translation_[1] = y;\r
 }\r
 \r
-void image_transform::set_key_scale(double x, double y)\r
+void image_transform::set_clip_scale(double x, double y)\r
 {\r
-       key_scale_[0] = x;\r
-       key_scale_[1] = y;      \r
+       clip_scale_[0] = x;\r
+       clip_scale_[1] = y;     \r
 }\r
 \r
-std::array<double, 2> image_transform::get_key_translation() const\r
+std::array<double, 2> image_transform::get_clip_translation() const\r
 {\r
-       return key_translation_;\r
+       return clip_translation_;\r
 }\r
 \r
-std::array<double, 2> image_transform::get_key_scale() const\r
+std::array<double, 2> image_transform::get_clip_scale() const\r
 {\r
-       return key_scale_;\r
+       return clip_scale_;\r
 }\r
 \r
 void image_transform::set_mode(video_mode::type mode)\r
@@ -111,21 +112,34 @@ video_mode::type image_transform::get_mode() const
        return mode_;\r
 }\r
 \r
+void image_transform::set_deinterlace(bool value)\r
+{\r
+       deinterlace_ = value;\r
+}\r
+\r
+bool image_transform::get_deinterlace() const\r
+{\r
+       return deinterlace_;\r
+}\r
+\r
 image_transform& image_transform::operator*=(const image_transform &other)\r
 {\r
-       opacity_ *= other.opacity_;\r
+       opacity_                                *= other.opacity_;\r
+       \r
        if(other.mode_ != video_mode::invalid)\r
                mode_ = other.mode_;\r
-       gain_ *= other.gain_;\r
-       is_key_ |= other.is_key_;\r
-       fill_translation_[0] += other.fill_translation_[0]*fill_scale_[0];\r
-       fill_translation_[1] += other.fill_translation_[1]*fill_scale_[1];\r
-       fill_scale_[0] *= other.fill_scale_[0];\r
-       fill_scale_[1] *= other.fill_scale_[1];\r
-       key_translation_[0] += other.key_translation_[0]*key_scale_[0];\r
-       key_translation_[1] += other.key_translation_[1]*key_scale_[1];\r
-       key_scale_[0] *= other.key_scale_[0];\r
-       key_scale_[1] *= other.key_scale_[1];\r
+\r
+       gain_                                   *= other.gain_;\r
+       deinterlace_                    |= other.deinterlace_;\r
+       is_key_                                 |= other.is_key_;\r
+       fill_translation_[0]    += other.fill_translation_[0]*fill_scale_[0];\r
+       fill_translation_[1]    += other.fill_translation_[1]*fill_scale_[1];\r
+       fill_scale_[0]                  *= other.fill_scale_[0];\r
+       fill_scale_[1]                  *= other.fill_scale_[1];\r
+       clip_translation_[0]    += other.clip_translation_[0]*clip_scale_[0];\r
+       clip_translation_[1]    += other.clip_translation_[1]*clip_scale_[1];\r
+       clip_scale_[0]                  *= other.clip_scale_[0];\r
+       clip_scale_[1]                  *= other.clip_scale_[1];\r
        return *this;\r
 }\r
 \r
@@ -147,14 +161,15 @@ image_transform tween(double time, const image_transform& source, const image_tr
        CASPAR_ASSERT(source.get_mode() == dest.get_mode() || source.get_mode() == video_mode::invalid || dest.get_mode() == video_mode::invalid);\r
 \r
        image_transform result; \r
-       result.set_mode(dest.get_mode() != video_mode::invalid ? dest.get_mode() : source.get_mode());\r
-       result.set_is_key(source.get_is_key() | dest.get_is_key());\r
-       result.set_gain(do_tween(time, source.get_gain(), dest.get_gain(), duration, tweener));\r
-       result.set_opacity(do_tween(time, source.get_opacity(), dest.get_opacity(), duration, tweener));\r
-       result.set_fill_translation(do_tween(time, source.get_fill_translation()[0], dest.get_fill_translation()[0], duration, tweener), do_tween(time, source.get_fill_translation()[1], dest.get_fill_translation()[1], duration, tweener));\r
-       result.set_fill_scale(do_tween(time, source.get_fill_scale()[0], dest.get_fill_scale()[0], duration, tweener), do_tween(time, source.get_fill_scale()[1], dest.get_fill_scale()[1], duration, tweener));\r
-       result.set_key_translation(do_tween(time, source.get_key_translation()[0], dest.get_key_translation()[0], duration, tweener), do_tween(time, source.get_key_translation()[1], dest.get_key_translation()[1], duration, tweener));\r
-       result.set_key_scale(do_tween(time, source.get_key_scale()[0], dest.get_key_scale()[0], duration, tweener), do_tween(time, source.get_key_scale()[1], dest.get_key_scale()[1], duration, tweener));\r
+       result.set_mode                         (dest.get_mode() != video_mode::invalid ? dest.get_mode() : source.get_mode());\r
+       result.set_is_key                       (source.get_is_key() | dest.get_is_key());\r
+       result.set_deinterlace          (source.get_deinterlace() | dest.get_deinterlace());\r
+       result.set_gain                         (do_tween(time, source.get_gain(), dest.get_gain(), duration, tweener));\r
+       result.set_opacity                      (do_tween(time, source.get_opacity(), dest.get_opacity(), duration, tweener));\r
+       result.set_fill_translation     (do_tween(time, source.get_fill_translation()[0], dest.get_fill_translation()[0], duration, tweener), do_tween(time, source.get_fill_translation()[1], dest.get_fill_translation()[1], duration, tweener));\r
+       result.set_fill_scale           (do_tween(time, source.get_fill_scale()[0], dest.get_fill_scale()[0], duration, tweener), do_tween(time, source.get_fill_scale()[1], dest.get_fill_scale()[1], duration, tweener));\r
+       result.set_clip_translation     (do_tween(time, source.get_clip_translation()[0], dest.get_clip_translation()[0], duration, tweener), do_tween(time, source.get_clip_translation()[1], dest.get_clip_translation()[1], duration, tweener));\r
+       result.set_clip_scale           (do_tween(time, source.get_clip_scale()[0], dest.get_clip_scale()[0], duration, tweener), do_tween(time, source.get_clip_scale()[1], dest.get_clip_scale()[1], duration, tweener));\r
        \r
        return result;\r
 }\r
index 7763a7b773b3caecd0f40ac07677a70866eeac6d..6a48bc6e3329630c440496d7b2f8de6b12eece57 100644 (file)
@@ -46,11 +46,11 @@ public:
        void set_fill_scale(double x, double y);\r
        std::array<double, 2> get_fill_scale() const;\r
        \r
-       void set_key_translation(double x, double y);\r
-       std::array<double, 2> get_key_translation() const;\r
+       void set_clip_translation(double x, double y);\r
+       std::array<double, 2> get_clip_translation() const;\r
 \r
-       void set_key_scale(double x, double y);\r
-       std::array<double, 2> get_key_scale() const;\r
+       void set_clip_scale(double x, double y);\r
+       std::array<double, 2> get_clip_scale() const;\r
 \r
        void set_mode(video_mode::type mode);\r
        video_mode::type get_mode() const;\r
@@ -60,15 +60,20 @@ public:
 \r
        void set_is_key(bool value);\r
        bool get_is_key() const;\r
+\r
+       void set_deinterlace(bool value);\r
+       bool get_deinterlace() const;\r
+\r
 private:\r
        double opacity_;\r
        double gain_;\r
        std::array<double, 2> fill_translation_; \r
        std::array<double, 2> fill_scale_; \r
-       std::array<double, 2> key_translation_; \r
-       std::array<double, 2> key_scale_; \r
+       std::array<double, 2> clip_translation_; \r
+       std::array<double, 2> clip_scale_; \r
        video_mode::type mode_;\r
        bool is_key_;\r
+       bool deinterlace_;\r
 };\r
 \r
 image_transform tween(double time, const image_transform& source, const image_transform& dest, double duration, const tweener_t& tweener);\r
index 28d8fbd81a2180c7345da5e01cb552110780a676..18a048e8b80562d85c81f643e901fcc4d55e7b30 100644 (file)
@@ -126,8 +126,8 @@ struct transition_producer : public frame_producer
                }\r
                else if(info_.type == transition::wipe)         \r
                {\r
-                       d_frame1->get_image_transform().set_key_scale(delta1, 1.0);     \r
-                       d_frame2->get_image_transform().set_key_scale(delta2, 1.0);                     \r
+                       d_frame1->get_image_transform().set_clip_scale(delta1, 1.0);    \r
+                       d_frame2->get_image_transform().set_clip_scale(delta2, 1.0);                    \r
                }\r
                                \r
                auto s_frame = s_frame1->get_image_transform() == s_frame2->get_image_transform() ? s_frame2 : basic_frame::interlace(s_frame1, s_frame2, mode_);\r
index 94613a887063508de8e7abb23f8e6842c0e3e05e..15bcc9d2ce69a3958e4943519bab798207419404 100644 (file)
@@ -174,6 +174,8 @@ public:
 \r
                        frame->commit();\r
 \r
+                       frame->set_is_interlaced(format_desc_.mode != core::video_mode::progressive);\r
+\r
                        // It is assumed that audio is always equal or ahead of video.\r
                        if(audio && SUCCEEDED(audio->GetBytes(&bytes)))\r
                        {\r
index 36850d0fcc5da0101407b7516b727113cd8878c9..967dad5495937b432238ab74a0e84f3ce79d17cf 100644 (file)
@@ -199,6 +199,8 @@ public:
        safe_ptr<core::write_frame> make_write_frame(safe_ptr<AVFrame> decoded_frame)\r
        {               \r
                auto write = frame_factory_->create_frame(this, desc_);\r
+               write->set_is_interlaced(decoded_frame->interlaced_frame != 0);\r
+\r
                if(sws_context_ == nullptr)\r
                {\r
                        tbb::parallel_for(0, static_cast<int>(desc_.planes.size()), 1, [&](int n)\r
index 04e431a206b5f842062ba061ee67de19fec9a6f5..e705123b59c0528dac183212b375dda0b3d399e3 100644 (file)
@@ -272,8 +272,8 @@ bool MixerCommand::DoExecute()
                                {\r
                                        transform.set_fill_translation(x, y);\r
                                        transform.set_fill_scale(x_s, y_s);\r
-                                       transform.set_key_translation(x, y);\r
-                                       transform.set_key_scale(x_s, y_s);\r
+                                       transform.set_clip_translation(x, y);\r
+                                       transform.set_clip_scale(x_s, y_s);\r
                                        return transform;\r
                                };\r
 \r
@@ -283,7 +283,7 @@ bool MixerCommand::DoExecute()
                                else\r
                                        GetChannel()->mixer()->apply_image_transform(transform, duration, tween);\r
                        }\r
-                       else if(_parameters[1] == L"KEY_RECT")\r
+                       else if(_parameters[1] == L"CLIP_RECT")\r
                        {\r
                                int duration = _parameters.size() > 6 ? lexical_cast_or_default(_parameters[6], 0) : 0;\r
                                std::wstring tween = _parameters.size() > 7 ? _parameters[7] : L"linear";\r
@@ -294,8 +294,8 @@ bool MixerCommand::DoExecute()
 \r
                                auto transform = [=](image_transform transform) -> image_transform\r
                                {\r
-                                       transform.set_key_translation(x, y);\r
-                                       transform.set_key_scale(x_s, y_s);\r
+                                       transform.set_clip_translation(x, y);\r
+                                       transform.set_clip_scale(x_s, y_s);\r
                                        return transform;\r
                                };\r
 \r
@@ -320,8 +320,8 @@ bool MixerCommand::DoExecute()
                                                {                               \r
                                                        transform.set_fill_translation(x*delta, y*delta);\r
                                                        transform.set_fill_scale(delta, delta);                 \r
-                                                       transform.set_key_translation(x*delta, y*delta);\r
-                                                       transform.set_key_scale(delta, delta);\r
+                                                       transform.set_clip_translation(x*delta, y*delta);\r
+                                                       transform.set_clip_scale(delta, delta);\r
                                                        return transform;\r
                                                };\r
                                                GetChannel()->mixer()->apply_image_transform(index, transform, duration, tween);\r