int const VideoContentProperty::SIZE = 1;
int const VideoContentProperty::FRAME_TYPE = 2;
int const VideoContentProperty::CROP = 3;
-int const VideoContentProperty::SCALE = 4;
-int const VideoContentProperty::COLOUR_CONVERSION = 5;
-int const VideoContentProperty::FADE_IN = 6;
-int const VideoContentProperty::FADE_OUT = 7;
-int const VideoContentProperty::RANGE = 8;
-int const VideoContentProperty::CUSTOM_RATIO = 9;
-int const VideoContentProperty::CUSTOM_SIZE = 10;
-int const VideoContentProperty::BURNT_SUBTITLE_LANGUAGE = 11;
+int const VideoContentProperty::COLOUR_CONVERSION = 4;
+int const VideoContentProperty::FADE_IN = 5;
+int const VideoContentProperty::FADE_OUT = 6;
+int const VideoContentProperty::RANGE = 7;
+int const VideoContentProperty::CUSTOM_RATIO = 8;
+int const VideoContentProperty::CUSTOM_SIZE = 9;
+int const VideoContentProperty::BURNT_SUBTITLE_LANGUAGE = 10;
using std::string;
using std::setprecision;
_range = VideoRange::VIDEO;
}
+ if (auto pixel_quanta = node->optional_node_child("PixelQuanta")) {
+ _pixel_quanta = PixelQuanta(pixel_quanta);
+ }
+
auto burnt = node->optional_string_child("BurntSubtitleLanguage");
if (burnt) {
_burnt_subtitle_language = dcp::LanguageTag (*burnt);
throw JoinError (_("Content to be joined must have the same video frame type."));
}
- if (c[i]->video->crop() != ref->crop()) {
+ if (c[i]->video->requested_crop() != ref->requested_crop()) {
throw JoinError (_("Content to be joined must have the same crop."));
}
if (c[i]->video->yuv ()) {
_yuv = true;
}
+
+ _pixel_quanta = max(_pixel_quanta, c[i]->video->_pixel_quanta);
}
_use = ref->use ();
_size = ref->size ();
_frame_type = ref->frame_type ();
- _crop = ref->crop ();
+ _crop = ref->requested_crop ();
_custom_ratio = ref->custom_ratio ();
_colour_conversion = ref->colour_conversion ();
_fade_in = ref->fade_in ();
node->add_child("FadeIn")->add_child_text (raw_convert<string> (_fade_in));
node->add_child("FadeOut")->add_child_text (raw_convert<string> (_fade_out));
node->add_child("Range")->add_child_text(_range == VideoRange::FULL ? "full" : "video");
+ _pixel_quanta.as_xml(node->add_child("PixelQuanta"));
if (_burnt_subtitle_language) {
node->add_child("BurntSubtitleLanguage")->add_child_text(_burnt_subtitle_language->to_string());
}
auto const ar = d->sample_aspect_ratio ();
auto const yuv = d->yuv ();
auto const range = d->range ();
+ auto const pixel_quanta = d->pixel_quanta ();
ContentChangeSignaller cc1 (_parent, VideoContentProperty::SIZE);
- ContentChangeSignaller cc2 (_parent, VideoContentProperty::SCALE);
- ContentChangeSignaller cc3 (_parent, ContentProperty::LENGTH);
- ContentChangeSignaller cc4 (_parent, VideoContentProperty::RANGE);
+ ContentChangeSignaller cc2 (_parent, ContentProperty::LENGTH);
+ ContentChangeSignaller cc3 (_parent, VideoContentProperty::RANGE);
{
boost::mutex::scoped_lock lm (_mutex);
_sample_aspect_ratio = ar;
_yuv = yuv;
_range = range;
+ _pixel_quanta = pixel_quanta;
}
LOG_GENERAL ("Video length obtained from header as %1 frames", _length);
VideoContent::identifier () const
{
char buffer[256];
+ auto const crop = actual_crop();
snprintf (
buffer, sizeof(buffer), "%d_%d_%d_%d_%d_%f_%d_%d%" PRId64 "_%" PRId64 "_%d",
(_use ? 1 : 0),
- crop().left,
- crop().right,
- crop().top,
- crop().bottom,
+ crop.left,
+ crop.right,
+ crop.top,
+ crop.bottom,
_custom_ratio.get_value_or(0),
_custom_size ? _custom_size->width : 0,
_custom_size ? _custom_size->height : 0,
dcp::Size
VideoContent::size_after_crop () const
{
- return crop().apply (size_after_3d_split ());
+ return actual_crop().apply(size_after_3d_split());
}
d += buffer;
}
- if ((crop().left || crop().right || crop().top || crop().bottom) && size() != dcp::Size (0, 0)) {
- dcp::Size cropped = size_after_crop ();
+ auto const crop = actual_crop();
+
+ if ((crop.left || crop.right || crop.top || crop.bottom) && size() != dcp::Size(0, 0)) {
+ auto const cropped = size_after_crop ();
d += String::compose (
_("\nCropped to %1x%2"),
cropped.width, cropped.height
_legacy_ratio = boost::optional<float>();
}
- return auto_size;
+ return _pixel_quanta.round (auto_size);
}
{
maybe_set (_custom_size, size, VideoContentProperty::CUSTOM_SIZE);
}
+
+
+Crop
+VideoContent::actual_crop () const
+{
+ return Crop(
+ _pixel_quanta.round_x(_crop.left),
+ _pixel_quanta.round_x(_crop.right),
+ _pixel_quanta.round_y(_crop.top),
+ _pixel_quanta.round_y(_crop.bottom)
+ );
+}
+