From: Ronag Date: Sat, 20 Aug 2011 21:27:09 +0000 (+0000) Subject: 2.0. video_format: Renamed video_mode to field_mode. image_mixer: Refactored field... X-Git-Tag: 2.0.1~98 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=1c1d1f8ace8c4128d192390afb2dc5f489b98d01;p=casparcg 2.0. video_format: Renamed video_mode to field_mode. image_mixer: Refactored field handling. git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@1242 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d --- diff --git a/core/mixer/image/image_kernel.cpp b/core/mixer/image/image_kernel.cpp index 4a837172d..b4505d065 100644 --- a/core/mixer/image/image_kernel.cpp +++ b/core/mixer/image/image_kernel.cpp @@ -63,7 +63,7 @@ struct image_kernel::implementation : boost::noncopyable void draw(ogl_device& ogl, render_item&& item, - const safe_ptr& background, + device_buffer& background, const std::shared_ptr& local_key, const std::shared_ptr& layer_key) { @@ -120,7 +120,7 @@ struct image_kernel::implementation : boost::noncopyable if(blend_modes_) { - background->bind(6); + background.bind(6); shader_->set("background", texture_id::background); shader_->set("blend_mode", item.blend_mode); @@ -174,21 +174,21 @@ struct image_kernel::implementation : boost::noncopyable // Setup interlacing - if(item.mode == core::video_mode::progressive) + if(item.transform.get_field_mode() == core::field_mode::progressive) ogl.disable(GL_POLYGON_STIPPLE); else { ogl.enable(GL_POLYGON_STIPPLE); - if(item.mode == core::video_mode::upper) + if(item.transform.get_field_mode() == core::field_mode::upper) ogl.stipple_pattern(upper_pattern); - else if(item.mode == core::video_mode::lower) + else if(item.transform.get_field_mode() == core::field_mode::lower) ogl.stipple_pattern(lower_pattern); } // Setup drawing area - ogl.viewport(0, 0, background->width(), background->height()); + ogl.viewport(0, 0, background.width(), background.height()); auto m_p = item.transform.get_clip_translation(); auto m_s = item.transform.get_clip_scale(); @@ -198,8 +198,8 @@ struct image_kernel::implementation : boost::noncopyable if(scissor) { - double w = static_cast(background->width()); - double h = static_cast(background->height()); + double w = static_cast(background.width()); + double h = static_cast(background.height()); ogl.enable(GL_SCISSOR_TEST); ogl.scissor(static_cast(m_p[0]*w), static_cast(m_p[1]*h), static_cast(m_s[0]*w), static_cast(m_s[1]*h)); @@ -210,7 +210,7 @@ struct image_kernel::implementation : boost::noncopyable // Set render target - ogl.attach(*background); + ogl.attach(background); // Draw @@ -240,7 +240,7 @@ struct image_kernel::implementation : boost::noncopyable image_kernel::image_kernel() : impl_(new implementation()){} void image_kernel::draw(ogl_device& ogl, render_item&& item, - const safe_ptr& background, + device_buffer& background, const std::shared_ptr& local_key, const std::shared_ptr& layer_key) { @@ -249,7 +249,7 @@ void image_kernel::draw(ogl_device& ogl, bool operator==(const render_item& lhs, const render_item& rhs) { - return lhs.textures == rhs.textures && lhs.transform == rhs.transform && lhs.tag == rhs.tag && lhs.mode == rhs.mode; + return lhs.textures == rhs.textures && lhs.transform == rhs.transform && lhs.tag == rhs.tag; } }} \ No newline at end of file diff --git a/core/mixer/image/image_kernel.h b/core/mixer/image/image_kernel.h index 6ef4d3307..6b0fd32ef 100644 --- a/core/mixer/image/image_kernel.h +++ b/core/mixer/image/image_kernel.h @@ -38,7 +38,6 @@ struct render_item pixel_format_desc pix_desc; std::vector> textures; image_transform transform; - video_mode::type mode; const void* tag; blend_mode::type blend_mode; }; @@ -51,7 +50,7 @@ public: image_kernel(); void draw(ogl_device& ogl, render_item&& item, - const safe_ptr& background, + device_buffer& background, const std::shared_ptr& local_key = nullptr, const std::shared_ptr& layer_key = nullptr); private: diff --git a/core/mixer/image/image_mixer.cpp b/core/mixer/image/image_mixer.cpp index cc4da64ba..906ceea5a 100644 --- a/core/mixer/image/image_mixer.cpp +++ b/core/mixer/image/image_mixer.cpp @@ -57,7 +57,6 @@ struct image_mixer::implementation : boost::noncopyable video_channel_context& channel_; std::vector transform_stack_; - std::vector video_mode_stack_; std::stack blend_mode_stack_; std::deque> layers_; // layer/stream/items @@ -69,7 +68,6 @@ public: implementation(video_channel_context& video_channel) : channel_(video_channel) , transform_stack_(1) - , video_mode_stack_(1, video_mode::progressive) { } @@ -81,22 +79,17 @@ public: void begin(core::basic_frame& frame) { transform_stack_.push_back(transform_stack_.back()*frame.get_image_transform()); - video_mode_stack_.push_back(frame.get_mode() == video_mode::progressive ? video_mode_stack_.back() : frame.get_mode()); } void visit(core::write_frame& frame) { - CASPAR_ASSERT(!layers_.empty()); - - // Check if frame has been discarded by interlacing - if(boost::range::find(video_mode_stack_, video_mode::upper) != video_mode_stack_.end() && boost::range::find(video_mode_stack_, video_mode::lower) != video_mode_stack_.end()) + if(transform_stack_.back().get_field_mode() == field_mode::empty) return; core::render_item item; item.pix_desc = frame.get_pixel_format_desc(); item.textures = frame.get_textures(); item.transform = transform_stack_.back(); - item.mode = video_mode_stack_.back(); item.tag = frame.tag(); item.blend_mode = blend_mode_stack_.top(); @@ -108,7 +101,6 @@ public: void end() { transform_stack_.pop_back(); - video_mode_stack_.pop_back(); } void begin_layer(blend_mode::type blend_mode) @@ -168,15 +160,15 @@ public: int fields = 0; BOOST_FOREACH(auto& item, layer) { - if(fields & item.mode) + if(fields & item.transform.get_field_mode()) item.blend_mode = blend_mode::normal; // Disable blending, it will be used when merging back into render stack. else { item.blend_mode = blend_mode::replace; // Target field is empty, no blending, just copy - fields |= item.mode; + fields |= item.transform.get_field_mode(); } - draw_item(std::move(item), local_draw_buffer, local_key_buffer, layer_key_buffer); + draw_item(std::move(item), *local_draw_buffer, local_key_buffer, layer_key_buffer); } render_item item; @@ -185,21 +177,21 @@ public: item.textures.push_back(local_draw_buffer); item.blend_mode = local_blend_mode; - kernel_.draw(channel_.ogl(), std::move(item), draw_buffer, nullptr, nullptr); + kernel_.draw(channel_.ogl(), std::move(item), *draw_buffer, nullptr, nullptr); } else // fast path { BOOST_FOREACH(auto& item, layer) - draw_item(std::move(item), draw_buffer, local_key_buffer, layer_key_buffer); + draw_item(std::move(item), *draw_buffer, local_key_buffer, layer_key_buffer); } - CASPAR_ASSERT(local_key_buffer.first == 0 || local_key_buffer.first == core::video_mode::progressive); + CASPAR_ASSERT(local_key_buffer.first == 0 || local_key_buffer.first == core::field_mode::progressive); std::swap(local_key_buffer.second, layer_key_buffer); } void draw_item(render_item&& item, - const safe_ptr& draw_buffer, + device_buffer& draw_buffer, std::pair>& local_key_buffer, std::shared_ptr& layer_key_buffer) { @@ -211,13 +203,13 @@ public: local_key_buffer.second = create_device_buffer(1); } - local_key_buffer.first |= item.mode; // Add field to flag. - kernel_.draw(channel_.ogl(), std::move(item), make_safe(local_key_buffer.second), nullptr, nullptr); + local_key_buffer.first |= item.transform.get_field_mode(); // Add field to flag. + kernel_.draw(channel_.ogl(), std::move(item), *local_key_buffer.second, nullptr, nullptr); } else { kernel_.draw(channel_.ogl(), std::move(item), draw_buffer, local_key_buffer.second, layer_key_buffer); - local_key_buffer.first ^= item.mode; // Remove field from flag. + local_key_buffer.first ^= item.transform.get_field_mode(); // Remove field from flag. if(local_key_buffer.first == 0) // If all fields from key has been used, reset it { diff --git a/core/mixer/mixer.cpp b/core/mixer/mixer.cpp index e06bd2df1..c663d7d22 100644 --- a/core/mixer/mixer.cpp +++ b/core/mixer/mixer.cpp @@ -210,7 +210,7 @@ private: auto frame1 = make_safe(frame.second); frame1->get_image_transform() = image_transforms[frame.first].fetch_and_tick(1); - if(channel_.get_format_desc().mode != core::video_mode::progressive) + if(channel_.get_format_desc().mode != core::field_mode::progressive) { auto frame2 = make_safe(frame.second); frame2->get_image_transform() = image_transforms[frame.first].fetch_and_tick(1); @@ -232,7 +232,7 @@ private: BOOST_FOREACH(auto& frame, frames) { - const unsigned int num = channel_.get_format_desc().mode == core::video_mode::progressive ? 1 : 2; + const unsigned int num = channel_.get_format_desc().mode == core::field_mode::progressive ? 1 : 2; auto frame1 = make_safe(frame.second); frame1->get_audio_transform() = audio_transforms[frame.first].fetch_and_tick(num); diff --git a/core/mixer/write_frame.cpp b/core/mixer/write_frame.cpp index 1bb3a8a5d..9bd533b09 100644 --- a/core/mixer/write_frame.cpp +++ b/core/mixer/write_frame.cpp @@ -40,7 +40,7 @@ struct write_frame::implementation std::vector audio_data_; const core::pixel_format_desc desc_; const void* tag_; - core::video_mode::type mode_; + core::field_mode::type mode_; implementation(const void* tag) : tag_(tag) @@ -51,7 +51,7 @@ struct write_frame::implementation : ogl_(&ogl) , desc_(desc) , tag_(tag) - , mode_(core::video_mode::progressive) + , mode_(core::field_mode::progressive) { ogl_->invoke([&] { @@ -156,8 +156,8 @@ const core::pixel_format_desc& write_frame::get_pixel_format_desc() const{return const std::vector>& write_frame::get_textures() const{return impl_->textures_;} void write_frame::commit(size_t plane_index){impl_->commit(plane_index);} void write_frame::commit(){impl_->commit();} -void write_frame::set_type(const video_mode::type& mode){impl_->mode_ = mode;} -core::video_mode::type write_frame::get_type() const{return impl_->mode_;} +void write_frame::set_type(const field_mode::type& mode){impl_->mode_ = mode;} +core::field_mode::type write_frame::get_type() const{return impl_->mode_;} std::wstring write_frame::print() const{return impl_->print();} void write_frame::accept(core::frame_visitor& visitor){impl_->accept(*this, visitor);} diff --git a/core/mixer/write_frame.h b/core/mixer/write_frame.h index 083e636ce..6566fe838 100644 --- a/core/mixer/write_frame.h +++ b/core/mixer/write_frame.h @@ -60,8 +60,8 @@ public: void commit(uint32_t plane_index); void commit(); - void set_type(const core::video_mode::type& mode); - core::video_mode::type get_type() const; + void set_type(const core::field_mode::type& mode); + core::field_mode::type get_type() const; const void* tag() const; diff --git a/core/producer/frame/basic_frame.cpp b/core/producer/frame/basic_frame.cpp index 1eed000ac..c2669c0f9 100644 --- a/core/producer/frame/basic_frame.cpp +++ b/core/producer/frame/basic_frame.cpp @@ -35,25 +35,19 @@ struct basic_frame::implementation image_transform image_transform_; audio_transform audio_transform_; - - core::video_mode::type mode_; public: - implementation(const std::vector>& frames) - : mode_(core::video_mode::progressive), frames_(frames) + implementation(const std::vector>& frames) : frames_(frames) { } - implementation(std::vector>&& frames) - : mode_(core::video_mode::progressive), frames_(std::move(frames)) + implementation(std::vector>&& frames) : frames_(std::move(frames)) { } implementation(safe_ptr&& frame) - : mode_(core::video_mode::progressive) { frames_.push_back(std::move(frame)); } - implementation(const safe_ptr& frame) - : mode_(core::video_mode::progressive) + implementation(const safe_ptr& frame) { frames_.push_back(frame); } @@ -97,7 +91,6 @@ basic_frame& basic_frame::operator=(basic_frame&& other) } void basic_frame::swap(basic_frame& other){impl_.swap(other.impl_);} -core::video_mode::type basic_frame::get_mode() const{return impl_->mode_;} const image_transform& basic_frame::get_image_transform() const { return impl_->image_transform_;} image_transform& basic_frame::get_image_transform() { return impl_->image_transform_;} const audio_transform& basic_frame::get_audio_transform() const { return impl_->audio_transform_;} @@ -106,7 +99,7 @@ audio_transform& basic_frame::get_audio_transform() { return impl_->audio_transf std::wstring basic_frame::print() const{return impl_->print();} void basic_frame::accept(frame_visitor& visitor){impl_->accept(*this, visitor);} -safe_ptr basic_frame::interlace(const safe_ptr& frame1, const safe_ptr& frame2, video_mode::type mode) +safe_ptr basic_frame::interlace(const safe_ptr& frame1, const safe_ptr& frame2, field_mode::type mode) { if(frame1 == basic_frame::eof() || frame2 == basic_frame::eof()) return basic_frame::eof(); @@ -114,20 +107,20 @@ safe_ptr basic_frame::interlace(const safe_ptr& frame1 if(frame1 == basic_frame::empty() && frame2 == basic_frame::empty()) return basic_frame::empty(); - if(frame1 == frame2 || mode == video_mode::progressive) + if(frame1 == frame2 || mode == field_mode::progressive) return frame2; auto my_frame1 = make_safe(frame1); auto my_frame2 = make_safe(frame2); - if(mode == video_mode::upper) + if(mode == field_mode::upper) { - my_frame1->impl_->mode_ = video_mode::upper; - my_frame2->impl_->mode_ = video_mode::lower; + my_frame1->get_image_transform().set_field_mode(field_mode::upper); + my_frame2->get_image_transform().set_field_mode(field_mode::lower); } else { - my_frame1->impl_->mode_ = video_mode::lower; - my_frame2->impl_->mode_ = video_mode::upper; + my_frame1->get_image_transform().set_field_mode(field_mode::lower); + my_frame2->get_image_transform().set_field_mode(field_mode::upper); } std::vector> frames; diff --git a/core/producer/frame/basic_frame.h b/core/producer/frame/basic_frame.h index 9f326f2d4..d68d8e4f6 100644 --- a/core/producer/frame/basic_frame.h +++ b/core/producer/frame/basic_frame.h @@ -55,10 +55,8 @@ public: const audio_transform& get_audio_transform() const; audio_transform& get_audio_transform(); - - core::video_mode::type get_mode() const; - - static safe_ptr interlace(const safe_ptr& frame1, const safe_ptr& frame2, video_mode::type mode); + + static safe_ptr interlace(const safe_ptr& frame1, const safe_ptr& frame2, field_mode::type mode); static safe_ptr combine(const safe_ptr& frame1, const safe_ptr& frame2); static safe_ptr fill_and_key(const safe_ptr& fill, const safe_ptr& key); diff --git a/core/producer/frame/image_transform.cpp b/core/producer/frame/image_transform.cpp index 369da5891..9d78faa7b 100644 --- a/core/producer/frame/image_transform.cpp +++ b/core/producer/frame/image_transform.cpp @@ -32,6 +32,7 @@ image_transform::image_transform() , contrast_(1.0) , saturation_(1.0) , is_key_(false) + , field_mode_(field_mode::progressive) { std::fill(fill_translation_.begin(), fill_translation_.end(), 0.0); std::fill(fill_scale_.begin(), fill_scale_.end(), 1.0); @@ -134,6 +135,16 @@ std::array image_transform::get_clip_scale() const return clip_scale_; } +void image_transform::set_field_mode(field_mode::type field_mode) +{ + field_mode_ = field_mode; +} + +field_mode::type image_transform::get_field_mode() const +{ + return field_mode_; +} + image_transform& image_transform::operator*=(const image_transform &other) { opacity_ *= other.opacity_; @@ -149,6 +160,7 @@ image_transform& image_transform::operator*=(const image_transform &other) levels_.gamma *= other.levels_.gamma; + field_mode_ = static_cast(field_mode_ & other.field_mode_); is_key_ |= other.is_key_; fill_translation_[0] += other.fill_translation_[0]*fill_scale_[0]; fill_translation_[1] += other.fill_translation_[1]*fill_scale_[1]; @@ -178,6 +190,7 @@ image_transform tween(double time, const image_transform& source, const image_tr image_transform result; result.set_is_key (source.get_is_key() | dest.get_is_key()); + result.set_field_mode (static_cast(source.get_field_mode() & dest.get_field_mode())); result.set_brightness (do_tween(time, source.get_brightness(), dest.get_brightness(), duration, tweener)); result.set_contrast (do_tween(time, source.get_contrast(), dest.get_contrast(), duration, tweener)); result.set_saturation (do_tween(time, source.get_saturation(), dest.get_saturation(), duration, tweener)); diff --git a/core/producer/frame/image_transform.h b/core/producer/frame/image_transform.h index f116d383e..385aeb094 100644 --- a/core/producer/frame/image_transform.h +++ b/core/producer/frame/image_transform.h @@ -84,6 +84,9 @@ public: void set_is_key(bool value); bool get_is_key() const; + + void set_field_mode(field_mode::type field_mode); + field_mode::type get_field_mode() const; private: double opacity_; @@ -97,7 +100,7 @@ private: std::array fill_scale_; std::array clip_translation_; std::array clip_scale_; - video_mode::type mode_; + field_mode::type field_mode_; bool is_key_; }; diff --git a/core/producer/transition/transition_producer.cpp b/core/producer/transition/transition_producer.cpp index 6fe58ec62..f0ad622ef 100644 --- a/core/producer/transition/transition_producer.cpp +++ b/core/producer/transition/transition_producer.cpp @@ -33,7 +33,7 @@ namespace caspar { namespace core { struct transition_producer : public frame_producer { - const video_mode::type mode_; + const field_mode::type mode_; unsigned int current_frame_; const transition_info info_; @@ -43,7 +43,7 @@ struct transition_producer : public frame_producer safe_ptr last_frame_; - explicit transition_producer(const video_mode::type& mode, const safe_ptr& dest, const transition_info& info) + explicit transition_producer(const field_mode::type& mode, const safe_ptr& dest, const transition_info& info) : mode_(mode) , current_frame_(0) , info_(info) @@ -165,7 +165,7 @@ struct transition_producer : public frame_producer } }; -safe_ptr create_transition_producer(const video_mode::type& mode, const safe_ptr& destination, const transition_info& info) +safe_ptr create_transition_producer(const field_mode::type& mode, const safe_ptr& destination, const transition_info& info) { return make_safe(mode, destination, info); } diff --git a/core/producer/transition/transition_producer.h b/core/producer/transition/transition_producer.h index 56d9fd6e5..19ec9248d 100644 --- a/core/producer/transition/transition_producer.h +++ b/core/producer/transition/transition_producer.h @@ -65,6 +65,6 @@ struct transition_info tweener_t tweener; }; -safe_ptr create_transition_producer(const video_mode::type& mode, const safe_ptr& destination, const transition_info& info); +safe_ptr create_transition_producer(const field_mode::type& mode, const safe_ptr& destination, const transition_info& info); }} \ No newline at end of file diff --git a/core/video_format.cpp b/core/video_format.cpp index 56e7502cb..c7ed5ccaf 100644 --- a/core/video_format.cpp +++ b/core/video_format.cpp @@ -33,7 +33,7 @@ ((double)scale/(double)duration),\ (scale),\ (duration),\ - (m == video_mode::progressive ? 1 : 2),\ + (m == field_mode::progressive ? 1 : 2),\ ((w)*(h)*4),\ (name),\ (2),\ @@ -46,23 +46,23 @@ namespace caspar { namespace core { const video_format_desc format_descs[video_format::count] = { - DEFINE_VIDEOFORMATDESC(video_format::pal ,720, 576, video_mode::upper, 25, 1, L"PAL"), - DEFINE_VIDEOFORMATDESC(video_format::ntsc ,720, 486, video_mode::lower, 30000, 1001, L"NTSC"), - DEFINE_VIDEOFORMATDESC(video_format::x576p2500 ,720, 576, video_mode::progressive, 25, 1, L"576p2500"), - DEFINE_VIDEOFORMATDESC(video_format::x720p2500 ,1280, 720, video_mode::progressive, 25, 1, L"720p2500"), - DEFINE_VIDEOFORMATDESC(video_format::x720p5000 ,1280, 720, video_mode::progressive, 50, 1, L"720p5000"), - DEFINE_VIDEOFORMATDESC(video_format::x720p5994 ,1280, 720, video_mode::progressive, 60000, 1001, L"720p5994"), - DEFINE_VIDEOFORMATDESC(video_format::x720p6000 ,1280, 720, video_mode::progressive, 60, 1, L"720p6000"), - DEFINE_VIDEOFORMATDESC(video_format::x1080p2397 ,1920, 1080, video_mode::progressive, 24000, 1001, L"1080p2398"), - DEFINE_VIDEOFORMATDESC(video_format::x1080p2400 ,1920, 1080, video_mode::progressive, 24, 1, L"1080p2400"), - DEFINE_VIDEOFORMATDESC(video_format::x1080i5000 ,1920, 1080, video_mode::upper, 25, 1, L"1080i5000"), - DEFINE_VIDEOFORMATDESC(video_format::x1080i5994 ,1920, 1080, video_mode::upper, 30000, 1001, L"1080i5994"), - DEFINE_VIDEOFORMATDESC(video_format::x1080i6000 ,1920, 1080, video_mode::upper, 30, 1, L"1080i6000"), - DEFINE_VIDEOFORMATDESC(video_format::x1080p2500 ,1920, 1080, video_mode::progressive, 25, 1, L"1080p2500"), - DEFINE_VIDEOFORMATDESC(video_format::x1080p2997 ,1920, 1080, video_mode::progressive, 30000, 1001, L"1080p2997"), - DEFINE_VIDEOFORMATDESC(video_format::x1080p3000 ,1920, 1080, video_mode::progressive, 30, 1, L"1080p3000"), - DEFINE_VIDEOFORMATDESC(video_format::x1080p5000 ,1920, 1080, video_mode::progressive, 50, 1, L"1080p5000"), - DEFINE_VIDEOFORMATDESC(video_format::invalid ,0, 0, video_mode::progressive, 1, 1, L"invalid") + DEFINE_VIDEOFORMATDESC(video_format::pal ,720, 576, field_mode::upper, 25, 1, L"PAL"), + DEFINE_VIDEOFORMATDESC(video_format::ntsc ,720, 486, field_mode::lower, 30000, 1001, L"NTSC"), + DEFINE_VIDEOFORMATDESC(video_format::x576p2500 ,720, 576, field_mode::progressive, 25, 1, L"576p2500"), + DEFINE_VIDEOFORMATDESC(video_format::x720p2500 ,1280, 720, field_mode::progressive, 25, 1, L"720p2500"), + DEFINE_VIDEOFORMATDESC(video_format::x720p5000 ,1280, 720, field_mode::progressive, 50, 1, L"720p5000"), + DEFINE_VIDEOFORMATDESC(video_format::x720p5994 ,1280, 720, field_mode::progressive, 60000, 1001, L"720p5994"), + DEFINE_VIDEOFORMATDESC(video_format::x720p6000 ,1280, 720, field_mode::progressive, 60, 1, L"720p6000"), + DEFINE_VIDEOFORMATDESC(video_format::x1080p2397 ,1920, 1080, field_mode::progressive, 24000, 1001, L"1080p2398"), + DEFINE_VIDEOFORMATDESC(video_format::x1080p2400 ,1920, 1080, field_mode::progressive, 24, 1, L"1080p2400"), + DEFINE_VIDEOFORMATDESC(video_format::x1080i5000 ,1920, 1080, field_mode::upper, 25, 1, L"1080i5000"), + DEFINE_VIDEOFORMATDESC(video_format::x1080i5994 ,1920, 1080, field_mode::upper, 30000, 1001, L"1080i5994"), + DEFINE_VIDEOFORMATDESC(video_format::x1080i6000 ,1920, 1080, field_mode::upper, 30, 1, L"1080i6000"), + DEFINE_VIDEOFORMATDESC(video_format::x1080p2500 ,1920, 1080, field_mode::progressive, 25, 1, L"1080p2500"), + DEFINE_VIDEOFORMATDESC(video_format::x1080p2997 ,1920, 1080, field_mode::progressive, 30000, 1001, L"1080p2997"), + DEFINE_VIDEOFORMATDESC(video_format::x1080p3000 ,1920, 1080, field_mode::progressive, 30, 1, L"1080p3000"), + DEFINE_VIDEOFORMATDESC(video_format::x1080p5000 ,1920, 1080, field_mode::progressive, 50, 1, L"1080p5000"), + DEFINE_VIDEOFORMATDESC(video_format::invalid ,0, 0, field_mode::progressive, 1, 1, L"invalid") }; const video_format_desc& video_format_desc::get(video_format::type format) diff --git a/core/video_format.h b/core/video_format.h index ee510e2f6..da8a6565a 100644 --- a/core/video_format.h +++ b/core/video_format.h @@ -51,16 +51,17 @@ struct video_format }; }; -struct video_mode +struct field_mode { enum type { + empty = 0, lower = 1, upper = 2, progressive = 3 // NOTE: progressive == lower | upper; }; - static std::wstring print(video_mode::type value) + static std::wstring print(field_mode::type value) { switch(value) { @@ -82,7 +83,7 @@ struct video_format_desc size_t width; // output frame width size_t height; // output frame height - video_mode::type mode; // progressive, interlaced upper field first, interlaced lower field first + field_mode::type mode; // progressive, interlaced upper field first, interlaced lower field first double fps; // actual framerate, e.g. i50 = 25 fps, p50 = 50 fps size_t time_scale; size_t duration; diff --git a/modules/decklink/producer/decklink_producer.cpp b/modules/decklink/producer/decklink_producer.cpp index 54c84152b..c8304bddf 100644 --- a/modules/decklink/producer/decklink_producer.cpp +++ b/modules/decklink/producer/decklink_producer.cpp @@ -184,8 +184,8 @@ public: av_frame->format = PIX_FMT_UYVY422; av_frame->width = video->GetWidth(); av_frame->height = video->GetHeight(); - av_frame->interlaced_frame = format_desc_.mode != core::video_mode::progressive; - av_frame->top_field_first = format_desc_.mode == core::video_mode::upper ? 1 : 0; + av_frame->interlaced_frame = format_desc_.mode != core::field_mode::progressive; + av_frame->top_field_first = format_desc_.mode == core::field_mode::upper ? 1 : 0; BOOST_FOREACH(auto& av_frame2, filter_.execute(av_frame)) muxer_.push(av_frame2); diff --git a/modules/ffmpeg/producer/frame_muxer.cpp b/modules/ffmpeg/producer/frame_muxer.cpp index 89c51a68b..ff32adb44 100644 --- a/modules/ffmpeg/producer/frame_muxer.cpp +++ b/modules/ffmpeg/producer/frame_muxer.cpp @@ -82,16 +82,16 @@ struct display_mode } }; -display_mode::type get_display_mode(const core::video_mode::type in_mode, double in_fps, const core::video_mode::type out_mode, double out_fps) +display_mode::type get_display_mode(const core::field_mode::type in_mode, double in_fps, const core::field_mode::type out_mode, double out_fps) { static const auto epsilon = 2.0; if(in_fps < 20.0 || in_fps > 80.0) { - //if(out_mode != core::video_mode::progressive && in_mode == core::video_mode::progressive) + //if(out_mode != core::field_mode::progressive && in_mode == core::field_mode::progressive) // return display_mode::interlace; - if(out_mode == core::video_mode::progressive && in_mode != core::video_mode::progressive) + if(out_mode == core::field_mode::progressive && in_mode != core::field_mode::progressive) { if(in_fps < 35.0) return display_mode::deinterlace; @@ -102,29 +102,29 @@ display_mode::type get_display_mode(const core::video_mode::type in_mode, double if(std::abs(in_fps - out_fps) < epsilon) { - if(in_mode != core::video_mode::progressive && out_mode == core::video_mode::progressive) + if(in_mode != core::field_mode::progressive && out_mode == core::field_mode::progressive) return display_mode::deinterlace; - //else if(in_mode == core::video_mode::progressive && out_mode != core::video_mode::progressive) + //else if(in_mode == core::field_mode::progressive && out_mode != core::field_mode::progressive) // simple(); // interlace_duplicate(); else return display_mode::simple; } else if(std::abs(in_fps/2.0 - out_fps) < epsilon) { - if(in_mode != core::video_mode::progressive) + if(in_mode != core::field_mode::progressive) return display_mode::invalid; - if(out_mode != core::video_mode::progressive) + if(out_mode != core::field_mode::progressive) return display_mode::interlace; else return display_mode::half; } else if(std::abs(in_fps - out_fps/2.0) < epsilon) { - if(out_mode != core::video_mode::progressive) + if(out_mode != core::field_mode::progressive) return display_mode::invalid; - if(in_mode != core::video_mode::progressive) + if(in_mode != core::field_mode::progressive) return display_mode::deinterlace_bob; else return display_mode::duplicate; @@ -190,7 +190,7 @@ struct frame_muxer::implementation : boost::noncopyable auto in_mode = get_mode(*video_frame); display_mode_ = get_display_mode(in_mode, in_fps_, format_desc_.mode, format_desc_.fps); - if(display_mode_ == display_mode::simple && in_mode != core::video_mode::progressive && format_desc_.mode != core::video_mode::progressive && video_frame->height != static_cast(format_desc_.height)) + if(display_mode_ == display_mode::simple && in_mode != core::field_mode::progressive && format_desc_.mode != core::field_mode::progressive && video_frame->height != static_cast(format_desc_.height)) display_mode_ = display_mode::deinterlace_bob_reinterlace; // The frame will most likely be scaled, we need to deinterlace->reinterlace if(display_mode_ == display_mode::deinterlace) @@ -225,9 +225,9 @@ struct frame_muxer::implementation : boost::noncopyable auto frame = make_write_frame(this, av_frame, frame_factory_, hints); // Fix field-order if needed - if(frame->get_type() == core::video_mode::lower && format_desc_.mode == core::video_mode::upper) + if(frame->get_type() == core::field_mode::lower && format_desc_.mode == core::field_mode::upper) frame->get_image_transform().set_fill_translation(0.0f, 0.5/static_cast(frame->get_pixel_format_desc().planes[0].height)); - else if(frame->get_type() == core::video_mode::upper && format_desc_.mode == core::video_mode::lower) + else if(frame->get_type() == core::field_mode::upper && format_desc_.mode == core::field_mode::lower) frame->get_image_transform().set_fill_translation(0.0f, -0.5/static_cast(frame->get_pixel_format_desc().planes[0].height)); video_streams_.back().push(frame); diff --git a/modules/ffmpeg/producer/util.cpp b/modules/ffmpeg/producer/util.cpp index 8e1d26c48..5336aca50 100644 --- a/modules/ffmpeg/producer/util.cpp +++ b/modules/ffmpeg/producer/util.cpp @@ -35,12 +35,12 @@ extern "C" namespace caspar { -core::video_mode::type get_mode(AVFrame& frame) +core::field_mode::type get_mode(AVFrame& frame) { if(!frame.interlaced_frame) - return core::video_mode::progressive; + return core::field_mode::progressive; - return frame.top_field_first ? core::video_mode::upper : core::video_mode::lower; + return frame.top_field_first ? core::field_mode::upper : core::field_mode::lower; } core::pixel_format::type get_pixel_format(PixelFormat pix_fmt) diff --git a/modules/ffmpeg/producer/util.h b/modules/ffmpeg/producer/util.h index 70b7f2b81..67560676c 100644 --- a/modules/ffmpeg/producer/util.h +++ b/modules/ffmpeg/producer/util.h @@ -25,7 +25,7 @@ struct frame_factory; static const PixelFormat CASPAR_PIX_FMT_LUMA = PIX_FMT_MONOBLACK; // Just hijack some unual pixel format. -core::video_mode::type get_mode(AVFrame& frame); +core::field_mode::type get_mode(AVFrame& frame); core::pixel_format::type get_pixel_format(PixelFormat pix_fmt); core::pixel_format_desc get_pixel_format_desc(PixelFormat pix_fmt, size_t width, size_t height); 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. diff --git a/modules/flash/producer/flash_producer.cpp b/modules/flash/producer/flash_producer.cpp index e9338c340..2eac9084f 100644 --- a/modules/flash/producer/flash_producer.cpp +++ b/modules/flash/producer/flash_producer.cpp @@ -85,7 +85,7 @@ private: struct template_host { - std::string video_mode; + std::string field_mode; std::string filename; size_t width; size_t height; @@ -99,7 +99,7 @@ template_host get_template_host(const core::video_format_desc& desc) try { template_host template_host; - template_host.video_mode = xml_mapping.second.get("video-mode", narrow(desc.name)); + template_host.field_mode = xml_mapping.second.get("video-mode", narrow(desc.name)); template_host.filename = xml_mapping.second.get("filename", "cg.fth"); template_host.width = xml_mapping.second.get("width", desc.width); template_host.height = xml_mapping.second.get("height", desc.height); @@ -108,9 +108,9 @@ template_host get_template_host(const core::video_format_desc& desc) catch(...){} } - auto template_host_it = boost::find_if(template_hosts, [&](template_host template_host){return template_host.video_mode == narrow(desc.name);}); + auto template_host_it = boost::find_if(template_hosts, [&](template_host template_host){return template_host.field_mode == narrow(desc.name);}); if(template_host_it == template_hosts.end()) - template_host_it = boost::find_if(template_hosts, [&](template_host template_host){return template_host.video_mode == "";}); + template_host_it = boost::find_if(template_hosts, [&](template_host template_host){return template_host.field_mode == "";}); if(template_host_it != template_hosts.end()) return *template_host_it; diff --git a/shell/casparcg.config b/shell/casparcg.config index 5b6f1bd91..0b6b9a6ca 100644 --- a/shell/casparcg.config +++ b/shell/casparcg.config @@ -49,7 +49,7 @@ - 720p5000 + PAL false