/*
- Copyright (C) 2013-2015 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2013-2018 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
*/
#include "player_video.h"
+#include "content.h"
+#include "video_content.h"
#include "image.h"
#include "image_proxy.h"
#include "j2k_image_proxy.h"
using std::string;
using std::cout;
+using std::pair;
using boost::shared_ptr;
+using boost::weak_ptr;
using boost::dynamic_pointer_cast;
using boost::optional;
using boost::function;
dcp::Size out_size,
Eyes eyes,
Part part,
- optional<ColourConversion> colour_conversion
+ optional<ColourConversion> colour_conversion,
+ weak_ptr<Content> content,
+ optional<Frame> video_frame
)
: _in (in)
, _crop (crop)
, _eyes (eyes)
, _part (part)
, _colour_conversion (colour_conversion)
+ , _content (content)
+ , _video_frame (video_frame)
{
}
shared_ptr<Image>
PlayerVideo::image (dcp::NoteHandler note, function<AVPixelFormat (AVPixelFormat)> pixel_format, bool aligned, bool fast) const
{
- shared_ptr<Image> im = _in->image (optional<dcp::NoteHandler> (note), _inter_size);
+ pair<shared_ptr<Image>, int> prox = _in->image (optional<dcp::NoteHandler> (note), _inter_size);
+ shared_ptr<Image> im = prox.first;
+ int const reduce = prox.second;
Crop total_crop = _crop;
switch (_part) {
break;
}
+ if (reduce > 0) {
+ /* Scale the crop down to account for the scaling that has already happened in ImageProxy::image */
+ int const r = pow(2, reduce);
+ total_crop.left /= r;
+ total_crop.right /= r;
+ total_crop.top /= r;
+ total_crop.bottom /= r;
+ }
+
dcp::YUVToRGB yuv_to_rgb = dcp::YUV_TO_RGB_REC601;
if (_colour_conversion) {
yuv_to_rgb = _colour_conversion.get().yuv_to_rgb();
_out_size,
_eyes,
_part,
- _colour_conversion
+ _colour_conversion,
+ _content,
+ _video_frame
)
);
}
+
+/** Re-read crop, fade, inter/out size and colour conversion from our content.
+ * @return true if this was possible, false if not.
+ */
+bool
+PlayerVideo::reset_metadata (dcp::Size video_container_size, dcp::Size film_frame_size)
+{
+ shared_ptr<Content> content = _content.lock();
+ if (!content || !_video_frame) {
+ return false;
+ }
+
+ _crop = content->video->crop();
+ _fade = content->video->fade(_video_frame.get());
+ _inter_size = content->video->scale().size(content->video, video_container_size, film_frame_size);
+ _out_size = video_container_size;
+ _colour_conversion = content->video->colour_conversion();
+
+ return true;
+}