convert(items, format_desc.width, format_desc.height);
- // Remove first field stills.
- boost::range::remove_erase_if(items, [&](const item& item)
- {
- return item.transform.is_still && item.transform.field_mode == format_desc.field_mode; // only us last field for stills.
- });
-
- // Stills are progressive
- for (auto& item : items)
- {
- if(item.transform.is_still)
- item.transform.field_mode = core::field_mode::progressive;
- }
-
auto result = spl::make_shared<buffer>(format_desc.size, 0);
if(format_desc.field_mode != core::field_mode::progressive)
{
return make_ready_future(array<const std::uint8_t>(buffer.data(), format_desc.size, true));
}
- if(format_desc.field_mode != core::field_mode::progressive)
- { // Remove jitter from still.
- for (auto& layer : layers)
- {
- // Remove first field stills.
- boost::range::remove_erase_if(layer.items, [&](const item& item)
- {
- return item.transform.is_still && item.transform.field_mode == format_desc.field_mode; // only us last field for stills.
- });
-
- // Stills are progressive
- for (auto& item : layer.items)
- {
- if(item.transform.is_still)
- item.transform.field_mode = core::field_mode::progressive;
- }
- }
- }
-
return flatten(ogl_->begin_invoke([=]() mutable -> std::shared_future<array<const std::uint8_t>>
{
auto target_texture = ogl_->create_texture(format_desc.width, format_desc.height, 4, false);
#include "frame_transform.h"
namespace caspar { namespace core {
-
+
enum class tags
{
frame_tag = 0,
};
struct draw_frame::impl
-{
+{
std::shared_ptr<const_frame> frame_;
std::vector<draw_frame> frames_;
core::frame_transform frame_transform_;
-public:
+public:
impl()
{
}
- impl(const_frame&& frame)
+ impl(const_frame&& frame)
: frame_(new const_frame(std::move(frame)))
{
}
-
- impl(mutable_frame&& frame)
+
+ impl(mutable_frame&& frame)
: frame_(new const_frame(std::move(frame)))
{
}
, frame_transform_(other.frame_transform_)
{
}
-
+
void accept(frame_visitor& visitor) const
{
visitor.push(frame_transform_);
frame.accept(visitor);
}
visitor.pop();
- }
-
+ }
+
bool operator==(const impl& other)
{
- return frames_ == other.frames_ &&
+ return frames_ == other.frames_ &&
frame_ == other.frame_ &&
frame_transform_ == other.frame_transform_;
}
return result;
}
};
-
+
draw_frame::draw_frame() : impl_(new impl()){}
draw_frame::draw_frame(const draw_frame& other) : impl_(new impl(*other.impl_)){}
draw_frame::draw_frame(draw_frame&& other) : impl_(std::move(other.impl_)){}
bool draw_frame::operator!=(const draw_frame& other)const{return !(*this == other);}
draw_frame draw_frame::interlace(draw_frame frame1, draw_frame frame2, core::field_mode mode)
-{
+{
if(frame1 == draw_frame::empty() && frame2 == draw_frame::empty())
return draw_frame::empty();
-
+
if(frame1 == frame2 || mode == field_mode::progressive)
return frame2;
if(mode == field_mode::upper)
{
- frame1.transform().image_transform.field_mode = field_mode::upper;
- frame2.transform().image_transform.field_mode = field_mode::lower;
- }
- else
- {
- frame1.transform().image_transform.field_mode = field_mode::lower;
- frame2.transform().image_transform.field_mode = field_mode::upper;
+ frame1.transform().image_transform.field_mode = field_mode::upper;
+ frame2.transform().image_transform.field_mode = field_mode::lower;
+ }
+ else
+ {
+ frame1.transform().image_transform.field_mode = field_mode::lower;
+ frame2.transform().image_transform.field_mode = field_mode::upper;
}
std::vector<draw_frame> frames;
}
draw_frame draw_frame::over(draw_frame frame1, draw_frame frame2)
-{
+{
if(frame1 == draw_frame::empty() && frame2 == draw_frame::empty())
return draw_frame::empty();
}
draw_frame draw_frame::mask(draw_frame fill, draw_frame key)
-{
+{
if(fill == draw_frame::empty() || key == draw_frame::empty())
return draw_frame::empty();
draw_frame draw_frame::still(draw_frame frame)
{
- frame.transform().image_transform.is_still = true;
- frame.transform().audio_transform.is_still = true;
+ frame.transform().audio_transform.is_still = true;
return frame;
}
{
return late_frame;
}
-
+
}}
field_mode = field_mode & other.field_mode;
is_key |= other.is_key;
is_mix |= other.is_mix;
- is_still |= other.is_still;
use_mipmap |= other.use_mipmap;
blend_mode = std::max(blend_mode, other.blend_mode);
layer_depth += other.layer_depth;
result.field_mode = source.field_mode & dest.field_mode;
result.is_key = source.is_key | dest.is_key;
result.is_mix = source.is_mix | dest.is_mix;
- result.is_still = source.is_still | dest.is_still;
result.use_mipmap = source.use_mipmap | dest.use_mipmap;
result.blend_mode = std::max(source.blend_mode, dest.blend_mode);
result.layer_depth = dest.layer_depth;
lhs.field_mode == rhs.field_mode &&
lhs.is_key == rhs.is_key &&
lhs.is_mix == rhs.is_mix &&
- lhs.is_still == rhs.is_still &&
lhs.use_mipmap == rhs.use_mipmap &&
lhs.blend_mode == rhs.blend_mode &&
lhs.layer_depth == rhs.layer_depth &&