*/
-#include <stdint.h>
-#include <algorithm>
#include "player.h"
#include "film.h"
#include "ffmpeg_decoder.h"
#include "subtitle_content.h"
#include "subrip_decoder.h"
#include "subrip_content.h"
+#include "dcp_content.h"
#include "playlist.h"
#include "job.h"
#include "image.h"
-#include "image_proxy.h"
+#include "raw_image_proxy.h"
#include "ratio.h"
#include "log.h"
#include "scaler.h"
#include "content_video.h"
#include "player_video.h"
#include "frame_rate_change.h"
+#include "dcp_content.h"
+#include "dcp_decoder.h"
+#include "dcp_subtitle_content.h"
+#include "dcp_subtitle_decoder.h"
+#include <boost/foreach.hpp>
+#include <stdint.h>
+#include <algorithm>
#define LOG_GENERAL(...) _film->log()->log (String::compose (__VA_ARGS__), Log::TYPE_GENERAL);
frc = FrameRateChange (fc->video_frame_rate(), _film->video_frame_rate());
}
+ shared_ptr<const DCPContent> dc = dynamic_pointer_cast<const DCPContent> (*i);
+ if (dc) {
+ decoder.reset (new DCPDecoder (dc, _film->log ()));
+ frc = FrameRateChange (dc->video_frame_rate(), _film->video_frame_rate());
+ }
+
/* ImageContent */
shared_ptr<const ImageContent> ic = dynamic_pointer_cast<const ImageContent> (*i);
if (ic) {
frc = best_overlap_frc;
}
+ /* DCPSubtitleContent */
+ shared_ptr<const DCPSubtitleContent> dsc = dynamic_pointer_cast<const DCPSubtitleContent> (*i);
+ if (dsc) {
+ decoder.reset (new DCPSubtitleDecoder (dsc));
+ frc = best_overlap_frc;
+ }
+
_pieces.push_back (shared_ptr<Piece> (new Piece (*i, decoder, frc.get ())));
}
property == ContentProperty::TRIM_START ||
property == ContentProperty::TRIM_END ||
property == ContentProperty::PATH ||
- property == VideoContentProperty::VIDEO_FRAME_TYPE
+ property == VideoContentProperty::VIDEO_FRAME_TYPE ||
+ property == DCPContentProperty::CAN_BE_PLAYED
) {
_have_valid_pieces = false;
Changed (frequent);
} else if (
- property == SubtitleContentProperty::SUBTITLE_USE ||
+ property == SubtitleContentProperty::USE_SUBTITLES ||
property == SubtitleContentProperty::SUBTITLE_X_OFFSET ||
property == SubtitleContentProperty::SUBTITLE_Y_OFFSET ||
- property == SubtitleContentProperty::SUBTITLE_SCALE ||
+ property == SubtitleContentProperty::SUBTITLE_X_SCALE ||
+ property == SubtitleContentProperty::SUBTITLE_Y_SCALE ||
property == VideoContentProperty::VIDEO_CROP ||
property == VideoContentProperty::VIDEO_SCALE ||
property == VideoContentProperty::VIDEO_FRAME_RATE
* rect.x * _video_container_size.width and rect.y * _video_container_size.height.
*
* 2. that to shift the origin of the scale by subtitle_scale to the centre of the subtitle; this will be
- * (width_before_subtitle_scale * (1 - subtitle_scale) / 2) and
- * (height_before_subtitle_scale * (1 - subtitle_scale) / 2).
+ * (width_before_subtitle_scale * (1 - subtitle_x_scale) / 2) and
+ * (height_before_subtitle_scale * (1 - subtitle_y_scale) / 2).
*
* Combining these two translations gives these expressions.
*/
shared_ptr<const ImageProxy> (new RawImageProxy (_black_image, _film->log ())),
time,
Crop (),
+ optional<float> (),
_video_container_size,
_video_container_size,
Scaler::from_id ("bicubic"),
return pvf;
}
- dcp::Size image_size = content->scale().size (content, _video_container_size, _film->frame_size ());
+ dcp::Size image_size = content->scale().size (content, _video_container_size, _film->frame_size (), _approximate_size ? 4 : 1);
if (_approximate_size) {
image_size.width &= ~3;
image_size.height &= ~3;
i->image,
content_video_to_dcp (piece, i->frame),
content->crop (),
+ content->fade (i->frame),
image_size,
_video_container_size,
_film->scaler(),
for (list<shared_ptr<Piece> >::const_iterator j = subs.begin(); j != subs.end(); ++j) {
shared_ptr<SubtitleContent> subtitle_content = dynamic_pointer_cast<SubtitleContent> ((*j)->content);
- if (!subtitle_content->subtitle_use ()) {
+ if (!subtitle_content->use_subtitles ()) {
continue;
}
i->sub.rectangle.y += subtitle_content->subtitle_y_offset ();
/* Apply content's subtitle scale */
- i->sub.rectangle.width *= subtitle_content->subtitle_scale ();
- i->sub.rectangle.height *= subtitle_content->subtitle_scale ();
+ i->sub.rectangle.width *= subtitle_content->subtitle_x_scale ();
+ i->sub.rectangle.height *= subtitle_content->subtitle_y_scale ();
/* Apply a corrective translation to keep the subtitle centred after that scale */
- i->sub.rectangle.x -= i->sub.rectangle.width * (subtitle_content->subtitle_scale() - 1);
- i->sub.rectangle.y -= i->sub.rectangle.height * (subtitle_content->subtitle_scale() - 1);
+ i->sub.rectangle.x -= i->sub.rectangle.width * (subtitle_content->subtitle_x_scale() - 1);
+ i->sub.rectangle.y -= i->sub.rectangle.height * (subtitle_content->subtitle_y_scale() - 1);
ps.image.push_back (i->sub);
}
list<ContentTextSubtitle> text = subtitle_decoder->get_text_subtitles (ContentTimePeriod (from, to), starting);
- for (list<ContentTextSubtitle>::const_iterator i = text.begin(); i != text.end(); ++i) {
- copy (i->subs.begin(), i->subs.end(), back_inserter (ps.text));
+ BOOST_FOREACH (ContentTextSubtitle& ts, text) {
+ BOOST_FOREACH (dcp::SubtitleString& s, ts.subs) {
+ s.set_v_position (s.v_position() + subtitle_content->subtitle_y_offset ());
+ s.set_size (s.size() * max (subtitle_content->subtitle_x_scale(), subtitle_content->subtitle_y_scale()));
+ ps.text.push_back (s);
+ }
}
}