]> git.sesse.net Git - casparcg/commitdiff
2.1.0: - Refactored frame and pixel_format_desc. - Fixed bug with missing virtual...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Tue, 31 Jan 2012 10:36:40 +0000 (10:36 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Tue, 31 Jan 2012 10:36:40 +0000 (10:36 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.1.0@2176 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

18 files changed:
core/frame/data_frame.cpp
core/frame/data_frame.h
core/frame/frame_factory.h
core/frame/pixel_format.h
core/mixer/gpu/image/image_kernel.cpp
core/mixer/gpu/image/image_kernel.h
core/mixer/gpu/image/image_mixer.cpp
core/mixer/read_frame.cpp
core/mixer/read_frame.h
core/mixer/write_frame.cpp
core/mixer/write_frame.h
core/producer/color/color_producer.cpp
core/video_channel.cpp
modules/ffmpeg/producer/util/util.cpp
modules/flash/producer/flash_producer.cpp
modules/image/producer/image_producer.cpp
modules/image/producer/image_scroll_producer.cpp
modules/reroute/producer/reroute_producer.cpp

index 0675953e0be25e577006b71f2e6f516699321526..bc7befa68a9d9ba7aa9903576e118410b30a1155 100644 (file)
@@ -14,45 +14,36 @@ safe_ptr<data_frame> data_frame::empty()
 {\r
        struct empty_frame : public data_frame\r
        {\r
-               virtual const struct  video_format_desc& get_video_format_desc() const\r
+               virtual const struct pixel_format_desc& get_pixel_format_desc() const override\r
                {\r
-                       static video_format_desc invalid;\r
+                       static pixel_format_desc invalid(pixel_format::invalid);\r
                        return invalid;\r
                }\r
-               virtual const struct  pixel_format_desc& get_pixel_format_desc() const \r
-               {\r
-                       static pixel_format_desc invalid;\r
-                       return invalid;\r
-               }\r
-               virtual const boost::iterator_range<const uint8_t*> image_data() const \r
+               virtual const boost::iterator_range<const uint8_t*> image_data() const override\r
                {\r
                        return boost::iterator_range<const uint8_t*>();\r
                }\r
-               virtual const boost::iterator_range<const int32_t*> audio_data() const \r
+               virtual const boost::iterator_range<const int32_t*> audio_data() const override\r
                {\r
                        return boost::iterator_range<const int32_t*>();\r
                }\r
-               const boost::iterator_range<uint8_t*> image_data()\r
+               const boost::iterator_range<uint8_t*> image_data() override\r
                {\r
                        return boost::iterator_range<uint8_t*>();\r
                }\r
-               const boost::iterator_range<int32_t*> audio_data()\r
+               const boost::iterator_range<int32_t*> audio_data() override\r
                {\r
                        return boost::iterator_range<int32_t*>();\r
                }\r
-               virtual double get_frame_rate() const\r
+               virtual double get_frame_rate() const override\r
                {\r
                        return 0.0;\r
                }\r
-               virtual field_mode get_field_mode() const\r
-               {\r
-                       return field_mode::empty;\r
-               }\r
-               virtual int width() const\r
+               virtual int width() const override\r
                {\r
                        return 0;\r
                }\r
-               virtual int height() const\r
+               virtual int height() const override\r
                {\r
                        return 0;\r
                }\r
index f8c9ed9677caef216b3a97c4527d6a7e68fe5b41..4ffd1a6e4483f67e98d341e942638185ea7eff0e 100644 (file)
@@ -17,7 +17,7 @@ struct data_frame : boost::noncopyable
 {\r
        virtual ~data_frame();\r
 \r
-       virtual const struct  pixel_format_desc& get_pixel_format_desc() const = 0;\r
+       virtual const struct pixel_format_desc& get_pixel_format_desc() const = 0;\r
 \r
        virtual const boost::iterator_range<const uint8_t*> image_data() const = 0;\r
        virtual const boost::iterator_range<const int32_t*> audio_data() const = 0;\r
@@ -26,7 +26,6 @@ struct data_frame : boost::noncopyable
        virtual const boost::iterator_range<int32_t*> audio_data() = 0;\r
 \r
        virtual double get_frame_rate() const = 0;\r
-       virtual field_mode get_field_mode() const = 0;\r
 \r
        virtual int width() const = 0;\r
        virtual int height() const = 0;\r
index 40f501d4a795167f8d81aedb7e5aa0069e7cec23..c17a271fea623e06f370b4500c8dd4177e27c3b2 100644 (file)
@@ -31,9 +31,9 @@ namespace caspar { namespace core {
                        \r
 struct frame_factory : boost::noncopyable\r
 {\r
-       frame_factory(){}\r
+       virtual ~frame_factory(){}\r
 \r
-       virtual safe_ptr<class write_frame> create_frame(const void* video_stream_tag, const struct pixel_format_desc& desc, field_mode mode = field_mode::progressive) = 0;            \r
+       virtual safe_ptr<class write_frame> create_frame(const void* video_stream_tag, const struct pixel_format_desc& desc) = 0;               \r
        virtual struct video_format_desc get_video_format_desc() const = 0; // nothrow\r
 };\r
 \r
index c15e0ef7d67e6fb98d8288939069502ac6b5ef69..cce6e910534300171ae837415d4d089066706f1b 100644 (file)
@@ -21,6 +21,8 @@
 \r
 #pragma once\r
 \r
+#include "../video_format.h"\r
+\r
 #include <common/enum_class.h>\r
 \r
 #include <vector>\r
@@ -74,12 +76,12 @@ struct pixel_format_desc sealed
                }\r
        };\r
 \r
-       pixel_format_desc() \r
-               : pix_fmt(pixel_format::invalid)\r
+       pixel_format_desc(pixel_format format\r
+               : format(format)\r
        {\r
        }\r
        \r
-       pixel_format            pix_fmt;\r
+       pixel_format            format;\r
        std::vector<plane>      planes;\r
 };\r
 \r
index 138e20faa121232a8f85712a676d5d257862d58b..39269f3e3f8041cd841c60ef1a431b035a9a55b6 100644 (file)
@@ -109,7 +109,7 @@ struct image_kernel::impl : boost::noncopyable
                shader_->set("is_hd",                   params.pix_desc.planes.at(0).height > 700 ? 1 : 0);\r
                shader_->set("has_local_key",   params.local_key);\r
                shader_->set("has_layer_key",   params.layer_key);\r
-               shader_->set("pixel_format",    params.pix_desc.pix_fmt.value());       \r
+               shader_->set("pixel_format",    params.pix_desc.format.value());        \r
                shader_->set("opacity",                 params.transform.is_key ? 1.0 : params.transform.opacity);      \r
                \r
                // Setup blend_func\r
index bf71a057828d5b81c3c82c6d04126a6aa9fa907b..33d0babc0631766a01a99479aa02e373a5a5d921 100644 (file)
@@ -55,7 +55,8 @@ struct draw_params sealed
        std::shared_ptr<class device_buffer>            layer_key;\r
 \r
        draw_params() \r
-               : blend_mode(blend_mode::normal)\r
+               : pix_desc(pixel_format::invalid)\r
+               , blend_mode(blend_mode::normal)\r
                , keyer(keyer::linear)\r
        {\r
        }\r
index bad7b504a745cfec680a22b7e0b260204027a5f6..689c8af082b002324850656bba57a204e0490a7c 100644 (file)
@@ -53,6 +53,11 @@ struct item
        pixel_format_desc                                                                                       pix_desc;\r
        std::vector<boost::shared_future<safe_ptr<device_buffer>>>      textures;\r
        frame_transform                                                                                         transform;\r
+\r
+       item()\r
+               : pix_desc(pixel_format::invalid)\r
+       {\r
+       }\r
 };\r
 \r
 typedef std::pair<blend_mode, std::vector<item>> layer;\r
@@ -206,7 +211,7 @@ private:
                        return;\r
 \r
                draw_params draw_params;\r
-               draw_params.pix_desc.pix_fmt    = pixel_format::bgra;\r
+               draw_params.pix_desc.format             = pixel_format::bgra;\r
                draw_params.pix_desc.planes             = list_of(pixel_format_desc::plane(source_buffer->width(), source_buffer->height(), 4));\r
                draw_params.textures                    = list_of(source_buffer);\r
                draw_params.transform                   = frame_transform();\r
index 0c74136c3a14f0d106f3b0b032bb3991dadea703..5768bec776ef57d00f2c53a6efcf7fe11c087454 100644 (file)
@@ -43,8 +43,8 @@ public:
                : image_data_(std::move(image_data))\r
                , audio_data_(std::move(audio_data))\r
                , video_desc_(format_desc)\r
+               , pixel_desc_(core::pixel_format::bgra)\r
        {\r
-               pixel_desc_.pix_fmt = core::pixel_format::bgra;\r
                pixel_desc_.planes.push_back(core::pixel_format_desc::plane(format_desc.width, format_desc.height, 4));\r
        }       \r
        \r
@@ -65,7 +65,6 @@ const boost::iterator_range<const uint8_t*> read_frame::image_data() const{   retu
 const boost::iterator_range<const int32_t*> read_frame::audio_data() const{    return impl_->audio_data();}\r
 const pixel_format_desc& read_frame::get_pixel_format_desc() const{    return impl_->pixel_desc_;}\r
 double read_frame::get_frame_rate() const {return impl_->video_desc_.fps;}\r
-field_mode read_frame::get_field_mode() const {return impl_->video_desc_.field_mode;}\r
 int read_frame::width() const {return impl_->video_desc_.width;}\r
 int read_frame::height() const {return impl_->video_desc_.height;}\r
 \r
index edb908da495735df8ecc9c4c4a75eb0c87f88b8f..3451a40b188dfff6264f17c065579651f5e1784c 100644 (file)
@@ -53,7 +53,6 @@ public:
        virtual const boost::iterator_range<const int32_t*> audio_data() const override;\r
        \r
        virtual double     get_frame_rate() const override;\r
-       virtual field_mode get_field_mode() const override;\r
 \r
        virtual int width() const override;\r
        virtual int height() const override;\r
index 4b89ebb0bc0046e6ddaa43ce3f11b24866a74c6f..136028ab7f6506b538d41492028addceee759e81 100644 (file)
@@ -43,19 +43,17 @@ struct write_frame::impl : boost::noncopyable
        audio_buffer                                                                    audio_data_;\r
        const core::pixel_format_desc                                   desc_;\r
        const void*                                                                             tag_;\r
-       core::field_mode                                                                mode_;\r
 \r
        impl(const void* tag)\r
-               : tag_(tag)\r
-               , mode_(core::field_mode::empty)\r
+               : desc_(core::pixel_format::invalid)\r
+               , tag_(tag)             \r
        {\r
        }\r
 \r
-       impl(const safe_ptr<gpu::accelerator>& ogl, const void* tag, const core::pixel_format_desc& desc, const field_mode& mode\r
+       impl(const safe_ptr<gpu::accelerator>& ogl, const void* tag, const core::pixel_format_desc& desc) \r
                : ogl_(ogl)\r
                , desc_(desc)\r
                , tag_(tag)\r
-               , mode_(mode)\r
        {\r
                std::transform(desc.planes.begin(), desc.planes.end(), std::back_inserter(buffers_), [&](const core::pixel_format_desc::plane& plane)\r
                {\r
@@ -101,8 +99,8 @@ struct write_frame::impl : boost::noncopyable
 };\r
        \r
 write_frame::write_frame(const void* tag) : impl_(new impl(tag)){}\r
-write_frame::write_frame(const safe_ptr<gpu::accelerator>& ogl, const void* tag, const core::pixel_format_desc& desc, const field_mode& mode\r
-       : impl_(new impl(ogl, tag, desc, mode)){}\r
+write_frame::write_frame(const safe_ptr<gpu::accelerator>& ogl, const void* tag, const core::pixel_format_desc& desc) \r
+       : impl_(new impl(ogl, tag, desc)){}\r
 write_frame::write_frame(write_frame&& other) : impl_(std::move(other.impl_)){}\r
 write_frame& write_frame::operator=(write_frame&& other)\r
 {\r
@@ -118,7 +116,6 @@ const core::pixel_format_desc& write_frame::get_pixel_format_desc() const{return
 const std::vector<boost::shared_future<safe_ptr<gpu::device_buffer>>>& write_frame::get_textures() const{return impl_->textures_;}\r
 void write_frame::commit(int plane_index){impl_->commit(plane_index);}\r
 void write_frame::commit(){impl_->commit();}\r
-core::field_mode write_frame::get_field_mode() const{return impl_->mode_;}\r
 void write_frame::accept(core::frame_visitor& visitor){impl_->accept(*this, visitor);}\r
 \r
 }}
\ No newline at end of file
index 26dde3774fb651dc57f2adc69ed653478370ed76..60fdc96e9c6428cd68f5ac04160aad5327173428 100644 (file)
@@ -43,7 +43,7 @@ class write_frame sealed : public core::draw_frame
 {\r
 public:        \r
        explicit write_frame(const void* tag);\r
-       explicit write_frame(const safe_ptr<gpu::accelerator>& ogl, const void* tag, const struct pixel_format_desc& desc, const field_mode& mode = field_mode::progressive);\r
+       explicit write_frame(const safe_ptr<gpu::accelerator>& ogl, const void* tag, const struct pixel_format_desc& desc);\r
 \r
        write_frame(write_frame&& other);\r
        write_frame& operator=(write_frame&& other);\r
@@ -61,9 +61,7 @@ public:
        \r
        void commit(int plane_index);\r
        void commit();\r
-       \r
-       field_mode get_field_mode() const;\r
-       \r
+               \r
        const void* tag() const;\r
 \r
        const struct pixel_format_desc& get_pixel_format_desc() const;\r
index 1ca2182d78de77aa351e5bfc4972954058fcf30c..a1234e14194494234f8662478d439ae035a1f98c 100644 (file)
@@ -133,8 +133,7 @@ safe_ptr<write_frame> create_color_frame(void* tag, const safe_ptr<frame_factory
        if(color2.length() != 9 || color2[0] != '#')\r
                BOOST_THROW_EXCEPTION(invalid_argument() << arg_name_info("color") << arg_value_info(color2) << msg_info("Invalid color."));\r
        \r
-       core::pixel_format_desc desc;\r
-       desc.pix_fmt = pixel_format::bgra;\r
+       core::pixel_format_desc desc(pixel_format::bgra);\r
        desc.planes.push_back(core::pixel_format_desc::plane(1, 1, 4));\r
        auto frame = frame_factory->create_frame(tag, desc);\r
                \r
index 5be25241e4f6e03db4e089bf3f0b82b5bcfc251e..ad5eeeb6791823d6d634e1e1ee7faa38633912d1 100644 (file)
@@ -90,9 +90,9 @@ public:
        \r
        // frame_factory\r
                                                \r
-       virtual safe_ptr<write_frame> create_frame(const void* tag, const core::pixel_format_desc& desc, field_mode mode) override\r
+       virtual safe_ptr<write_frame> create_frame(const void* tag, const core::pixel_format_desc& desc) override\r
        {               \r
-               return make_safe<write_frame>(ogl_, tag, desc, mode);\r
+               return make_safe<write_frame>(ogl_, tag, desc);\r
        }\r
        \r
        virtual core::video_format_desc get_video_format_desc() const override\r
index 092eeed0536cb3e9d9012649dc68618e6f87d8b7..aea493f43ee750576219bd486030c1bc5cae6393 100644 (file)
@@ -120,10 +120,9 @@ core::pixel_format_desc get_pixel_format_desc(PixelFormat pix_fmt, int width, in
        AVPicture dummy_pict;   \r
        avpicture_fill(&dummy_pict, nullptr, pix_fmt == CASPAR_PIX_FMT_LUMA ? PIX_FMT_GRAY8 : pix_fmt, width, height);\r
 \r
-       core::pixel_format_desc desc;\r
-       desc.pix_fmt = get_pixel_format(pix_fmt);\r
+       core::pixel_format_desc desc = get_pixel_format(pix_fmt);\r
                \r
-       switch(desc.pix_fmt.value())\r
+       switch(desc.format.value())\r
        {\r
        case core::pixel_format::gray:\r
        case core::pixel_format::luma:\r
@@ -150,12 +149,12 @@ core::pixel_format_desc get_pixel_format_desc(PixelFormat pix_fmt, int width, in
                        desc.planes.push_back(core::pixel_format_desc::plane(dummy_pict.linesize[1], h2, 1));\r
                        desc.planes.push_back(core::pixel_format_desc::plane(dummy_pict.linesize[2], h2, 1));\r
 \r
-                       if(desc.pix_fmt == core::pixel_format::ycbcra)                                          \r
+                       if(desc.format == core::pixel_format::ycbcra)                                           \r
                                desc.planes.push_back(core::pixel_format_desc::plane(dummy_pict.linesize[3], height, 1));       \r
                        return desc;\r
                }               \r
        default:                \r
-               desc.pix_fmt = core::pixel_format::invalid;\r
+               desc.format = core::pixel_format::invalid;\r
                return desc;\r
        }\r
 }\r
@@ -188,7 +187,7 @@ safe_ptr<core::write_frame> make_write_frame(const void* tag, const safe_ptr<AVF
 \r
        std::shared_ptr<core::write_frame> write;\r
 \r
-       if(desc.pix_fmt == core::pixel_format::invalid)\r
+       if(desc.format == core::pixel_format::invalid)\r
        {\r
                auto pix_fmt = static_cast<PixelFormat>(decoded_frame->format);\r
                auto target_pix_fmt = PIX_FMT_BGRA;\r
@@ -208,7 +207,7 @@ safe_ptr<core::write_frame> make_write_frame(const void* tag, const safe_ptr<AVF
                \r
                auto target_desc = get_pixel_format_desc(target_pix_fmt, width, height);\r
 \r
-               write = frame_factory->create_frame(tag, target_desc, get_mode(*decoded_frame));\r
+               write = frame_factory->create_frame(tag, target_desc);\r
 \r
                std::shared_ptr<SwsContext> sws_context;\r
 \r
@@ -255,7 +254,7 @@ safe_ptr<core::write_frame> make_write_frame(const void* tag, const safe_ptr<AVF
        }\r
        else\r
        {\r
-               write = frame_factory->create_frame(tag, desc, get_mode(*decoded_frame));\r
+               write = frame_factory->create_frame(tag, desc);\r
 \r
                for(int n = 0; n < static_cast<int>(desc.planes.size()); ++n)\r
                {\r
@@ -286,9 +285,9 @@ safe_ptr<core::write_frame> make_write_frame(const void* tag, const safe_ptr<AVF
        }\r
        \r
        // Fix field-order if needed\r
-       if(write->get_field_mode() == core::field_mode::lower && frame_factory->get_video_format_desc().field_mode == core::field_mode::upper)\r
+       if(get_mode(*decoded_frame) == core::field_mode::lower && frame_factory->get_video_format_desc().field_mode == core::field_mode::upper)\r
                write->get_frame_transform().fill_translation[1] += 1.0/static_cast<double>(frame_factory->get_video_format_desc().height);\r
-       else if(write->get_field_mode() == core::field_mode::upper && frame_factory->get_video_format_desc().field_mode == core::field_mode::lower)\r
+       else if(get_mode(*decoded_frame) == core::field_mode::upper && frame_factory->get_video_format_desc().field_mode == core::field_mode::lower)\r
                write->get_frame_transform().fill_translation[1] -= 1.0/static_cast<double>(frame_factory->get_video_format_desc().height);\r
 \r
        return make_safe_ptr(write);\r
index f9d80b5bca3f951cb6bc98a437fff24c6423de8f..f73659b967e9058a267284b364f81c287809b15b 100644 (file)
@@ -271,8 +271,7 @@ public:
                        A_memset(bmp_.data(), 0, width_*height_*4);\r
                        ax_->DrawControl(bmp_);\r
                \r
-                       core::pixel_format_desc desc;\r
-                       desc.pix_fmt = core::pixel_format::bgra;\r
+                       core::pixel_format_desc desc = core::pixel_format::bgra;\r
                        desc.planes.push_back(core::pixel_format_desc::plane(width_, height_, 4));\r
                        auto frame = frame_factory_->create_frame(this, desc);\r
 \r
index 734ed9d0784b57051f66bd8cd2b0074ade49f9f6..9e0758ce76242e9388834b96fecf5088c2d45c98 100644 (file)
@@ -55,8 +55,7 @@ struct image_producer : public core::frame_producer
                auto bitmap = load_image(filename_);\r
                FreeImage_FlipVertical(bitmap.get());\r
                \r
-               core::pixel_format_desc desc;\r
-               desc.pix_fmt = core::pixel_format::bgra;\r
+               core::pixel_format_desc desc = core::pixel_format::bgra;\r
                desc.planes.push_back(core::pixel_format_desc::plane(FreeImage_GetWidth(bitmap.get()), FreeImage_GetHeight(bitmap.get()), 4));\r
                auto frame = frame_factory->create_frame(this, desc);\r
 \r
index 9905cab968c901e0bca0b16f7a1b5bd750751005..3501661dce6dbcde5a11cbaa9785b523244735eb 100644 (file)
@@ -85,8 +85,7 @@ struct image_scroll_producer : public core::frame_producer
                {\r
                        while(count > 0)\r
                        {\r
-                               core::pixel_format_desc desc;\r
-                               desc.pix_fmt = core::pixel_format::bgra;\r
+                               core::pixel_format_desc desc = core::pixel_format::bgra;\r
                                desc.planes.push_back(core::pixel_format_desc::plane(width_, format_desc_.height, 4));\r
                                auto frame = frame_factory->create_frame(reinterpret_cast<void*>(rand()), desc);\r
 \r
@@ -118,8 +117,7 @@ struct image_scroll_producer : public core::frame_producer
                        int i = 0;\r
                        while(count > 0)\r
                        {\r
-                               core::pixel_format_desc desc;\r
-                               desc.pix_fmt = core::pixel_format::bgra;\r
+                               core::pixel_format_desc desc = core::pixel_format::bgra;\r
                                desc.planes.push_back(core::pixel_format_desc::plane(format_desc_.width, height_, 4));\r
                                auto frame = frame_factory->create_frame(reinterpret_cast<void*>(rand()), desc);\r
                                if(count >= frame->image_data().size())\r
index 803b3174290109f601d163f63a770345c6794e61..f289897ed354d0280990d68662cdbb9d9d37f409 100644 (file)
@@ -100,16 +100,13 @@ public:
                \r
                frame_number_++;\r
                \r
-               core::pixel_format_desc desc;\r
                bool double_speed       = std::abs(frame_factory_->get_video_format_desc().fps / 2.0 - read_frame->get_frame_rate()) < 0.01;            \r
                bool half_speed         = std::abs(read_frame->get_frame_rate() / 2.0 - frame_factory_->get_video_format_desc().fps) < 0.01;\r
 \r
                if(half_speed && frame_number_ % 2 == 0) // Skip frame\r
                        return receive(0);\r
 \r
-               desc.pix_fmt = core::pixel_format::bgra;\r
-               desc.planes.push_back(core::pixel_format_desc::plane(read_frame->width(), read_frame->height(), 4));\r
-               auto frame = frame_factory_->create_frame(this, desc);\r
+               auto frame = frame_factory_->create_frame(this, read_frame->get_pixel_format_desc());\r
 \r
                A_memcpy(frame->image_data().begin(), read_frame->image_data().begin(), read_frame->image_data().size());\r
                frame->commit();\r