]> git.sesse.net Git - casparcg/commitdiff
2.1.0: -data_frame: Added field_mode and frame_rate meta-data.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 13 Feb 2012 10:37:47 +0000 (10:37 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 13 Feb 2012 10:37:47 +0000 (10:37 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.1.0@2387 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

20 files changed:
accelerator/cpu/image/image_mixer.cpp
accelerator/cpu/image/image_mixer.h
accelerator/cpu/util/write_frame.cpp
accelerator/cpu/util/write_frame.h
accelerator/ogl/image/image_mixer.cpp
accelerator/ogl/image/image_mixer.h
accelerator/ogl/util/write_frame.cpp
accelerator/ogl/util/write_frame.h
core/frame/data_frame.cpp
core/frame/data_frame.h
core/frame/frame_factory.h
core/mixer/image/image_mixer.h
core/mixer/mixer.cpp
core/mixer/mixer.h
core/video_channel.cpp
modules/ffmpeg/producer/muxer/frame_muxer.cpp
modules/ffmpeg/producer/util/util.cpp
modules/ffmpeg/producer/util/util.h
modules/flash/producer/flash_producer.cpp
modules/reroute/producer/reroute_producer.cpp

index 5142b0b89af424e976aabfa04df9919159bc2a9e..e1eb0caef515234d04a63079b02273eba4766735 100644 (file)
@@ -349,9 +349,9 @@ public:
                return renderer_(std::move(items_), format_desc);\r
        }\r
        \r
-       virtual spl::shared_ptr<cpu::write_frame> create_frame(const void* tag, const core::pixel_format_desc& desc)\r
+       virtual spl::shared_ptr<cpu::write_frame> create_frame(const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode)\r
        {\r
-               return spl::make_shared<cpu::write_frame>(tag, desc);\r
+               return spl::make_shared<cpu::write_frame>(tag, desc, frame_rate, field_mode);\r
        }\r
 };\r
 \r
@@ -362,6 +362,6 @@ void image_mixer::pop(){impl_->pop();}
 boost::shared_future<boost::iterator_range<const uint8_t*>> image_mixer::operator()(const core::video_format_desc& format_desc){return impl_->render(format_desc);}\r
 void image_mixer::begin_layer(core::blend_mode blend_mode){impl_->begin_layer(blend_mode);}\r
 void image_mixer::end_layer(){impl_->end_layer();}\r
-spl::shared_ptr<core::write_frame> image_mixer::create_frame(const void* tag, const core::pixel_format_desc& desc) {return impl_->create_frame(tag, desc);}\r
+spl::shared_ptr<core::write_frame> image_mixer::create_frame(const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode) {return impl_->create_frame(tag, desc, frame_rate, field_mode);}\r
 \r
 }}}
\ No newline at end of file
index d540b6eb802373cb768c3540a25ae77da6dc8762..434f789ded8ce2a661c9aa5a4a79656d643e1135 100644 (file)
@@ -7,6 +7,7 @@
 #include <core/mixer/image/image_mixer.h>\r
 \r
 #include <core/frame/frame_visitor.h>\r
+#include <core/video_format.h>\r
 \r
 FORWARD1(boost, template<typename> class shared_future);\r
 FORWARD1(boost, template<typename> class iterator_range);\r
@@ -33,7 +34,7 @@ public:
        // NOTE: Content of return future is only valid while future is valid.\r
        virtual ::boost::shared_future<::boost::iterator_range<const uint8_t*>> operator()(const core::video_format_desc& format_desc) override;\r
                \r
-       virtual spl::shared_ptr<core::write_frame> create_frame(const void* tag, const core::pixel_format_desc& desc) override;\r
+       virtual spl::shared_ptr<core::write_frame> create_frame(const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode) override;\r
 private:\r
        struct impl;\r
        spl::shared_ptr<impl> impl_;\r
index 80f4b3b00dcb2e1d3c43acf458b21878679c5839..a37ee5dd579e53011463503c9cf2f03f84c666c4 100644 (file)
@@ -37,16 +37,21 @@ struct write_frame::impl : boost::noncopyable
        core::audio_buffer                                                      audio_data_;\r
        const core::pixel_format_desc                           desc_;\r
        const void*                                                                     tag_;\r
+       double                                                                          frame_rate_;\r
+       core::field_mode                                                        field_mode_;\r
 \r
        impl(const void* tag)\r
                : desc_(core::pixel_format::invalid)\r
                , tag_(tag)             \r
+               , field_mode_(core::field_mode::empty)\r
        {\r
        }\r
 \r
-       impl(const void* tag, const core::pixel_format_desc& desc) \r
+       impl(const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode\r
                : desc_(desc)\r
                , tag_(tag)\r
+               , frame_rate_(frame_rate)\r
+               , field_mode_(field_mode)\r
        {\r
                std::transform(desc.planes.begin(), desc.planes.end(), std::back_inserter(buffers_), [&](const core::pixel_format_desc::plane& plane)\r
                {\r
@@ -71,8 +76,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 void* tag, const core::pixel_format_desc& desc) \r
-       : impl_(new impl(tag, desc)){}\r
+write_frame::write_frame(const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode\r
+       : impl_(new impl(tag, desc, frame_rate, field_mode)){}\r
 write_frame::write_frame(write_frame&& other) : impl_(std::move(other.impl_)){}\r
 write_frame& write_frame::operator=(write_frame&& other)\r
 {\r
@@ -86,7 +91,8 @@ const boost::iterator_range<const uint8_t*> write_frame::image_data(int index) c
 const core::audio_buffer& write_frame::audio_data() const{return impl_->audio_data_;}\r
 const boost::iterator_range<uint8_t*> write_frame::image_data(int index){return impl_->image_data(index);}\r
 core::audio_buffer& write_frame::audio_data(){return impl_->audio_data_;}\r
-double write_frame::get_frame_rate() const{return 0.0;} // TODO: what's this?\r
+double write_frame::frame_rate() const{return impl_->frame_rate_;}\r
+core::field_mode write_frame::field_mode()const{return impl_->field_mode_;}\r
 int write_frame::width() const{return impl_->desc_.planes.at(0).width;}\r
 int write_frame::height() const{return impl_->desc_.planes.at(0).height;}                                              \r
 const void* write_frame::tag() const{return impl_->tag_;}      \r
index 737a88a60e21389b11f5e1920bbb6bda53947481..e6f2bde24d304d696f1ca017e5bae6a8e2e702c6 100644 (file)
@@ -46,7 +46,7 @@ class write_frame sealed : public core::write_frame
        write_frame& operator=(const write_frame);\r
 public:        \r
        explicit write_frame(const void* tag);\r
-       explicit write_frame(const void* tag, const core::pixel_format_desc& desc);\r
+       explicit write_frame(const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode);\r
 \r
        write_frame(write_frame&& other);\r
        write_frame& operator=(write_frame&& other);\r
@@ -67,7 +67,8 @@ public:
        virtual const boost::iterator_range<uint8_t*> image_data(int index) override;\r
        virtual core::audio_buffer& audio_data() override;\r
        \r
-       virtual double get_frame_rate() const override;\r
+       virtual double frame_rate() const override;\r
+       virtual core::field_mode field_mode() const override;\r
 \r
        virtual int width() const override;\r
        virtual int height() const override;\r
index 8bd340f28b4424cb7731f1f6b4e88851e6d6a746..01c579b6b2f0c37f39a5c9d02e329e7d60b6a07f 100644 (file)
@@ -39,6 +39,8 @@
 #include <core/frame/pixel_format.h>\r
 #include <core/video_format.h>\r
 \r
+#include <modules/ffmpeg/producer/filter/filter.h>\r
+\r
 #include <asmlib.h>\r
 \r
 #include <gl/glew.h>\r
@@ -111,11 +113,13 @@ class image_renderer
 {\r
        spl::shared_ptr<context>                                                                                                                                                ogl_;\r
        image_kernel                                                                                                                                                                    kernel_;\r
-       std::pair<std::vector<layer>, boost::shared_future<boost::iterator_range<const uint8_t*>>>              last_image_;\r
+       std::pair<std::vector<layer>, boost::shared_future<boost::iterator_range<const uint8_t*>>>              last_image_;    \r
+       ffmpeg::filter                                                                                                                                                                  deinterlacer_;\r
 public:\r
        image_renderer(const spl::shared_ptr<context>& ogl)\r
                : ogl_(ogl)\r
                , kernel_(ogl_)\r
+               , deinterlacer_(L"YADIF=0:-1")\r
        {\r
        }\r
        \r
@@ -432,9 +436,9 @@ public:
                return renderer_(std::move(layers_), format_desc);\r
        }\r
        \r
-       virtual spl::shared_ptr<ogl::write_frame> create_frame(const void* tag, const core::pixel_format_desc& desc)\r
+       virtual spl::shared_ptr<ogl::write_frame> create_frame(const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode)\r
        {\r
-               return spl::make_shared<ogl::write_frame>(ogl_, tag, desc);\r
+               return spl::make_shared<ogl::write_frame>(ogl_, tag, desc, frame_rate, field_mode);\r
        }\r
 };\r
 \r
@@ -445,6 +449,6 @@ void image_mixer::pop(){impl_->pop();}
 boost::shared_future<boost::iterator_range<const uint8_t*>> image_mixer::operator()(const core::video_format_desc& format_desc){return impl_->render(format_desc);}\r
 void image_mixer::begin_layer(core::blend_mode blend_mode){impl_->begin_layer(blend_mode);}\r
 void image_mixer::end_layer(){impl_->end_layer();}\r
-spl::shared_ptr<core::write_frame> image_mixer::create_frame(const void* tag, const core::pixel_format_desc& desc) {return impl_->create_frame(tag, desc);}\r
+spl::shared_ptr<core::write_frame> image_mixer::create_frame(const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode) {return impl_->create_frame(tag, desc, frame_rate, field_mode);}\r
 \r
 }}}
\ No newline at end of file
index ef3b0210aaea5c06e0d9833f4a25a8d241f62453..1ef558d37b45248199c514fbcbbdc59217c22ea5 100644 (file)
@@ -28,6 +28,7 @@
 #include <core/mixer/image/image_mixer.h>\r
 \r
 #include <core/frame/frame_visitor.h>\r
+#include <core/video_format.h>\r
 \r
 FORWARD1(boost, template<typename> class unique_future);\r
 FORWARD2(caspar, core, class write_frame);\r
@@ -53,7 +54,7 @@ public:
        // NOTE: Content of return future is only valid while future is valid.\r
        virtual boost::shared_future<boost::iterator_range<const uint8_t*>> operator()(const core::video_format_desc& format_desc) override;\r
                \r
-       virtual spl::shared_ptr<core::write_frame> create_frame(const void* tag, const core::pixel_format_desc& desc) override;\r
+       virtual spl::shared_ptr<core::write_frame> create_frame(const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode) override;\r
 private:\r
        struct impl;\r
        spl::shared_ptr<impl> impl_;\r
index edd6c30a2ab838c5fa0485c7d05b6df9e7094512..456358969c85de44352e05dc77cee2ff10b850eb 100644 (file)
@@ -42,17 +42,22 @@ struct write_frame::impl : boost::noncopyable
        core::audio_buffer                                                              audio_data_;\r
        const core::pixel_format_desc                                   desc_;\r
        const void*                                                                             tag_;\r
+       double                                                                                  frame_rate_;\r
+       core::field_mode                                                                field_mode_;\r
 \r
        impl(const void* tag)\r
                : desc_(core::pixel_format::invalid)\r
                , tag_(tag)             \r
+               , field_mode_(core::field_mode::empty)\r
        {\r
        }\r
 \r
-       impl(const spl::shared_ptr<ogl::context>& ogl, const void* tag, const core::pixel_format_desc& desc) \r
+       impl(const spl::shared_ptr<ogl::context>& ogl, const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode\r
                : ogl_(ogl)\r
                , desc_(desc)\r
                , tag_(tag)\r
+               , frame_rate_(frame_rate)\r
+               , field_mode_(field_mode)\r
        {\r
                std::transform(desc.planes.begin(), desc.planes.end(), std::back_inserter(buffers_), [&](const core::pixel_format_desc::plane& plane)\r
                {\r
@@ -77,8 +82,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 spl::shared_ptr<ogl::context>& ogl, const void* tag, const core::pixel_format_desc& desc) \r
-       : impl_(new impl(ogl, tag, desc)){}\r
+write_frame::write_frame(const spl::shared_ptr<ogl::context>& ogl, const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode\r
+       : impl_(new impl(ogl, tag, desc, frame_rate, field_mode)){}\r
 write_frame::write_frame(write_frame&& other) : impl_(std::move(other.impl_)){}\r
 write_frame& write_frame::operator=(write_frame&& other)\r
 {\r
@@ -92,7 +97,8 @@ const boost::iterator_range<const uint8_t*> write_frame::image_data(int index) c
 const core::audio_buffer& write_frame::audio_data() const{return impl_->audio_data_;}\r
 const boost::iterator_range<uint8_t*> write_frame::image_data(int index){return impl_->image_data(index);}\r
 core::audio_buffer& write_frame::audio_data(){return impl_->audio_data_;}\r
-double write_frame::get_frame_rate() const{return 0.0;} // TODO: what's this?\r
+double write_frame::frame_rate() const{return impl_->frame_rate_;}\r
+core::field_mode write_frame::field_mode() const{return impl_->field_mode_;}\r
 int write_frame::width() const{return impl_->desc_.planes.at(0).width;}\r
 int write_frame::height() const{return impl_->desc_.planes.at(0).height;}                                              \r
 const void* write_frame::tag() const{return impl_->tag_;}      \r
index ea11af96f12b4c8143ac53dcb486d0f58d4fa90d..46527c2b6d051486a7b45c626ba3119b28acda5c 100644 (file)
@@ -43,7 +43,7 @@ class write_frame sealed : public core::write_frame
        write_frame& operator=(const write_frame);\r
 public:        \r
        explicit write_frame(const void* tag);\r
-       explicit write_frame(const spl::shared_ptr<class context>& ogl, const void* tag, const core::pixel_format_desc& desc);\r
+       explicit write_frame(const spl::shared_ptr<class context>& ogl, const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode);\r
 \r
        write_frame(write_frame&& other);\r
        write_frame& operator=(write_frame&& other);\r
@@ -64,7 +64,8 @@ public:
        virtual const boost::iterator_range<uint8_t*> image_data(int index) override;\r
        virtual core::audio_buffer& audio_data() override;\r
        \r
-       virtual double get_frame_rate() const override;\r
+       virtual double frame_rate() const override;\r
+       virtual core::field_mode field_mode() const override;\r
 \r
        virtual int width() const override;\r
        virtual int height() const override;\r
index 146941a384b9900c764801921f42986d46c90bb5..87e2bf66ec7d5823db7d22551e1dfe241c94a9be 100644 (file)
@@ -35,10 +35,14 @@ spl::shared_ptr<data_frame> data_frame::empty()
                        static audio_buffer buffer;\r
                        return buffer;\r
                }\r
-               virtual double get_frame_rate() const override\r
+               virtual double frame_rate() const override\r
                {\r
                        return 0.0;\r
                }\r
+               virtual core::field_mode field_mode() const override\r
+               {\r
+                       return core::field_mode::empty;\r
+               }\r
                virtual int width() const override\r
                {\r
                        return 0;\r
index 12dfdad7e3f309218c831503d66d0f502367c7f6..2ff3e5a4d05b407efb404835f3f15766b98df3a4 100644 (file)
@@ -29,7 +29,8 @@ public:
        virtual const boost::iterator_range<uint8_t*> image_data(int index) = 0;\r
        virtual audio_buffer& audio_data() = 0;\r
 \r
-       virtual double get_frame_rate() const = 0;\r
+       virtual double frame_rate() const = 0;\r
+       virtual field_mode field_mode() const = 0;\r
 \r
        virtual int width() const = 0;\r
        virtual int height() const = 0;\r
index 98c096d5eb7d6cf4e0e6e35f28a207f9ba597ed0..78795fb45ead85d805f6b4e1886963c29f031177 100644 (file)
@@ -34,7 +34,12 @@ class frame_factory : boost::noncopyable
 public:\r
        virtual ~frame_factory(){}\r
 \r
-       virtual spl::shared_ptr<class write_frame> create_frame(const void* video_stream_tag, const struct pixel_format_desc& desc) = 0;                \r
+       virtual spl::shared_ptr<class write_frame> create_frame(const void* video_stream_tag, const struct pixel_format_desc& desc, double frame_rate, core::field_mode field_mode) = 0;        \r
+       spl::shared_ptr<class write_frame> create_frame(const void* video_stream_tag, const struct pixel_format_desc& desc)\r
+       {\r
+               auto format_desc = video_format_desc();\r
+               return create_frame(video_stream_tag, desc, format_desc.fps, format_desc.field_mode);\r
+       }\r
        virtual struct video_format_desc video_format_desc() const = 0; // nothrow\r
 };\r
 \r
index 15b5806d742bf1101d4f0117d0a8875a4653fcd9..2537b42a7e6585064508a8078ad1dd7ae74f6f6f 100644 (file)
@@ -26,6 +26,7 @@
 #include <common/forward.h>\r
 #include <common/spl/memory.h>\r
 \r
+#include <core/video_format.h>\r
 #include <core/frame/frame_visitor.h>\r
 \r
 #include <boost/range.hpp>\r
@@ -51,7 +52,7 @@ public:
        virtual void end_layer() = 0;\r
                \r
        virtual boost::shared_future<boost::iterator_range<const uint8_t*>> operator()(const struct video_format_desc& format_desc) = 0;\r
-       virtual spl::shared_ptr<core::write_frame> create_frame(const void* tag, const struct pixel_format_desc& desc) = 0;\r
+       virtual spl::shared_ptr<core::write_frame> create_frame(const void* tag, const struct pixel_format_desc& desc, double frame_rate, core::field_mode field_mode) = 0;\r
 };\r
 \r
 }}
\ No newline at end of file
index 6ae0a6381630fef600b129d5959b4459926299f6..71bfc2c205895e73f5dd18b743dc553438db6d13 100644 (file)
@@ -96,12 +96,17 @@ public:
        {\r
                BOOST_THROW_EXCEPTION(invalid_operation());\r
        }\r
-\r
-       virtual double get_frame_rate() const override\r
+                       \r
+       virtual double frame_rate() const override\r
        {\r
                return video_desc_.fps;\r
        }\r
 \r
+       virtual core::field_mode field_mode() const\r
+       {\r
+               return video_desc_.field_mode;\r
+       }\r
+       \r
        virtual int width() const override\r
        {\r
                return video_desc_.width;\r
@@ -197,5 +202,5 @@ mixer::mixer(spl::shared_ptr<diagnostics::graph> graph, spl::unique_ptr<image_mi
 void mixer::set_blend_mode(int index, blend_mode value){impl_->set_blend_mode(index, value);}\r
 boost::unique_future<boost::property_tree::wptree> mixer::info() const{return impl_->info();}\r
 spl::shared_ptr<const data_frame> mixer::operator()(std::map<int, spl::shared_ptr<draw_frame>> frames, const struct video_format_desc& format_desc){return (*impl_)(std::move(frames), format_desc);}\r
-spl::shared_ptr<write_frame> mixer::create_frame(const void* tag, const core::pixel_format_desc& desc) {return impl_->image_mixer_->create_frame(tag, desc);}\r
+spl::shared_ptr<write_frame> mixer::create_frame(const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode) {return impl_->image_mixer_->create_frame(tag, desc, frame_rate, field_mode);}\r
 }}
\ No newline at end of file
index b47ce4ed186ab8de897e161e61bd2f0a7bf7344a..6d471db4bf8ff96c0919180ffa2eed5c1f76fe5a 100644 (file)
@@ -27,6 +27,8 @@
 #include <common/spl/memory.h>\r
 #include <common/reactive.h>\r
 \r
+#include <core/video_format.h>\r
+\r
 #include <boost/noncopyable.hpp>\r
 #include <boost/property_tree/ptree_fwd.hpp>\r
 \r
@@ -48,7 +50,7 @@ public:
 \r
        boost::unique_future<boost::property_tree::wptree> info() const;\r
 \r
-       spl::shared_ptr<class write_frame> create_frame(const void* tag, const struct pixel_format_desc& desc);\r
+       spl::shared_ptr<class write_frame> create_frame(const void* tag, const struct pixel_format_desc& desc, double frame_rate, core::field_mode field_mode);\r
 private:\r
        struct impl;\r
        spl::shared_ptr<impl> impl_;\r
index c30166092c58f63c7676c4a57f47b4f1bbe81919..7a1f1d8ee5dfa8da7f2e0ef8222a5cfc0cfa62ab 100644 (file)
@@ -86,9 +86,9 @@ public:
        \r
        // frame_factory\r
                                                \r
-       virtual spl::shared_ptr<write_frame> create_frame(const void* tag, const core::pixel_format_desc& desc) override\r
+       virtual spl::shared_ptr<write_frame> create_frame(const void* tag, const core::pixel_format_desc& desc, double frame_rate, core::field_mode field_mode) override\r
        {               \r
-               return mixer_.create_frame(tag, desc);\r
+               return mixer_.create_frame(tag, desc, frame_rate, field_mode);\r
        }\r
        \r
        virtual core::video_format_desc video_format_desc() const\r
index 00d82a11f40018621c001f762546930668681fa9..ed3e88dc76c7b3767bceff559b1b43253494e13f 100644 (file)
@@ -144,7 +144,7 @@ struct frame_muxer::impl : boost::noncopyable
                                if(video_frame->format == PIX_FMT_GRAY8 && format == CASPAR_PIX_FMT_LUMA)\r
                                        av_frame->format = format;\r
 \r
-                               video_streams_.back().push(make_write_frame(this, av_frame, frame_factory_, flags));\r
+                               video_streams_.back().push(make_write_frame(this, av_frame, frame_factory_->video_format_desc().fps, frame_factory_, flags));\r
                        }\r
                }\r
 \r
@@ -344,7 +344,7 @@ struct frame_muxer::impl : boost::noncopyable
                                filter_.push(frame);\r
                                auto av_frame = filter_.poll();\r
                                if(av_frame)                                                    \r
-                                       video_streams_.back().push(make_write_frame(this, spl::make_shared_ptr(av_frame), frame_factory_, 0));\r
+                                       video_streams_.back().push(make_write_frame(this, spl::make_shared_ptr(av_frame), frame_factory_->video_format_desc().fps, frame_factory_, 0));\r
                        }\r
                        filter_ = filter(filter_str);\r
                        CASPAR_LOG(info) << L"[frame_muxer] " << display_mode_ << L" " << print_mode(frame->width, frame->height, in_fps_, frame->interlaced_frame > 0);\r
index 2542eb873df7053b72158d8650528b5f44ce4df5..034e324d3435c67ad899a55195b3a7216e6a6d57 100644 (file)
@@ -171,7 +171,7 @@ int make_alpha_format(int format)
        }\r
 }\r
 \r
-spl::shared_ptr<core::write_frame> make_write_frame(const void* tag, const spl::shared_ptr<AVFrame>& decoded_frame, const spl::shared_ptr<core::frame_factory>& frame_factory, int flags)\r
+spl::shared_ptr<core::write_frame> make_write_frame(const void* tag, const spl::shared_ptr<AVFrame>& decoded_frame, double fps, const spl::shared_ptr<core::frame_factory>& frame_factory, int flags)\r
 {                      \r
        static tbb::concurrent_unordered_map<int, tbb::concurrent_queue<std::shared_ptr<SwsContext>>> sws_contexts_;\r
        \r
@@ -207,7 +207,7 @@ spl::shared_ptr<core::write_frame> make_write_frame(const void* tag, const spl::
                \r
                auto target_desc = get_pixel_format_desc(target_pix_fmt, width, height);\r
 \r
-               write = frame_factory->create_frame(tag, target_desc);\r
+               write = frame_factory->create_frame(tag, target_desc, fps, get_mode(*decoded_frame));\r
 \r
                std::shared_ptr<SwsContext> sws_context;\r
 \r
@@ -252,8 +252,8 @@ spl::shared_ptr<core::write_frame> make_write_frame(const void* tag, const spl::
        }\r
        else\r
        {\r
-               write = frame_factory->create_frame(tag, desc);\r
-\r
+               write = frame_factory->create_frame(tag, desc, fps, get_mode(*decoded_frame));\r
+               \r
                for(int n = 0; n < static_cast<int>(desc.planes.size()); ++n)\r
                {\r
                        auto plane            = desc.planes[n];\r
index 98525aab13aede7e7cf5bf7bc3f9d44d1becd90e..13573965dc731aa979e32939f3713af3e339cdaa 100644 (file)
@@ -55,7 +55,7 @@ static const int CASPAR_PIX_FMT_LUMA = 10; // Just hijack some unual pixel forma
 \r
 core::field_mode                                       get_mode(const AVFrame& frame);\r
 int                                                                    make_alpha_format(int format); // NOTE: Be careful about CASPAR_PIX_FMT_LUMA, change it to PIX_FMT_GRAY8 if you want to use the frame inside some ffmpeg function.\r
-spl::shared_ptr<core::write_frame>     make_write_frame(const void* tag, const spl::shared_ptr<AVFrame>& decoded_frame, const spl::shared_ptr<core::frame_factory>& frame_factory, int flags);\r
+spl::shared_ptr<core::write_frame>     make_write_frame(const void* tag, const spl::shared_ptr<AVFrame>& decoded_frame, double fps, const spl::shared_ptr<core::frame_factory>& frame_factory, int flags);\r
 spl::shared_ptr<AVFrame>                       make_av_frame(caspar::core::data_frame& frame);\r
 spl::shared_ptr<AVFrame>                       make_av_frame(std::array<void*, 4> data, const core::pixel_format_desc& pix_desc);\r
 \r
index af3bf4cbb1cb44ce7e3760ec57dadfb12832752a..c07cdbd79749ebb51d46a925dbcc5b2ef6da5866 100644 (file)
@@ -277,7 +277,7 @@ public:
        \r
        spl::shared_ptr<core::draw_frame> render()\r
        {                       \r
-               const float frame_time = 1.0f/ax_->GetFPS();\r
+               const float frame_time = 1.0f/fps();\r
 \r
                frame_timer_.restart();\r
 \r
@@ -288,7 +288,7 @@ public:
                \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
+                       auto frame = frame_factory_->create_frame(this, desc, fps(), core::field_mode::progressive);\r
 \r
                        A_memcpy(frame->image_data(0).begin(), bmp_.data(), width_*height_*4);\r
                        head_ = frame;  \r
index 35d151de259fac97eefb6321c08513af6b2ce487..9c2e4952a9b0f229f372c445b2155111f416952d 100644 (file)
@@ -100,8 +100,8 @@ public:
                \r
                frame_number_++;\r
                \r
-               bool double_speed       = std::abs(frame_factory_->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_->video_format_desc().fps) < 0.01;\r
+               bool double_speed       = std::abs(frame_factory_->video_format_desc().fps / 2.0 - read_frame->frame_rate()) < 0.01;            \r
+               bool half_speed         = std::abs(read_frame->frame_rate() / 2.0 - frame_factory_->video_format_desc().fps) < 0.01;\r
 \r
                if(half_speed && frame_number_ % 2 == 0) // Skip frame\r
                        return receive(0);\r