summaryrefslogtreecommitdiff
path: root/src/lib/player.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2015-06-25 11:58:12 +0100
committerCarl Hetherington <cth@carlh.net>2015-06-25 13:36:17 +0100
commit89ee4cc6019036fa4fc0a6e07e052ffdc3b136ac (patch)
tree5a1d1b3e1e6fc4d280f1ff0f1598a37e0fea3257 /src/lib/player.cc
parente08c1d30bb5e2d77339541eb7dbe7d1ca95485ab (diff)
Make player decide whether subtitles should be burnt based on
content settings rather than using the film's settings. Remove film property of burn-subtitles.
Diffstat (limited to 'src/lib/player.cc')
-rw-r--r--src/lib/player.cc76
1 files changed, 44 insertions, 32 deletions
diff --git a/src/lib/player.cc b/src/lib/player.cc
index be1268f48..361f41c92 100644
--- a/src/lib/player.cc
+++ b/src/lib/player.cc
@@ -72,7 +72,7 @@ Player::Player (shared_ptr<const Film> film)
: _film (film)
, _have_valid_pieces (false)
, _ignore_video (false)
- , _burn_subtitles (film->burn_subtitles ())
+ , _always_burn_subtitles (false)
{
_film_content_changed_connection = _film->ContentChanged.connect (bind (&Player::content_changed, this, _1, _2, _3));
_film_changed_connection = _film->Changed.connect (bind (&Player::film_changed, this, _1));
@@ -322,6 +322,29 @@ Player::get_video (DCPTime time, bool accurate)
setup_pieces ();
}
+ /* Find subtitles for possible burn-in */
+
+ PlayerSubtitles ps = get_subtitles (time, DCPTime::from_frames (1, _film->video_frame_rate ()), false, true);
+
+ list<PositionImage> sub_images;
+
+ /* Image subtitles */
+ list<PositionImage> c = transform_image_subtitles (ps.image);
+ copy (c.begin(), c.end(), back_inserter (sub_images));
+
+ /* Text subtitles (rendered to an image) */
+ if (!ps.text.empty ()) {
+ list<PositionImage> s = render_subtitles (ps.text, _video_container_size);
+ copy (s.begin (), s.end (), back_inserter (sub_images));
+ }
+
+ optional<PositionImage> subtitles;
+ if (!sub_images.empty ()) {
+ subtitles = merge (sub_images);
+ }
+
+ /* Find video */
+
list<shared_ptr<Piece> > ov = overlaps<VideoContent> (
time,
time + DCPTime::from_frames (1, _film->video_frame_rate ()) - DCPTime::delta()
@@ -338,8 +361,8 @@ Player::get_video (DCPTime time, bool accurate)
shared_ptr<Piece> piece = ov.back ();
shared_ptr<VideoDecoder> decoder = dynamic_pointer_cast<VideoDecoder> (piece->decoder);
DCPOMATIC_ASSERT (decoder);
- shared_ptr<VideoContent> content = dynamic_pointer_cast<VideoContent> (piece->content);
- DCPOMATIC_ASSERT (content);
+ shared_ptr<VideoContent> video_content = dynamic_pointer_cast<VideoContent> (piece->content);
+ DCPOMATIC_ASSERT (video_content);
list<ContentVideo> content_video = decoder->get_video (dcp_to_content_video (piece, time), accurate);
if (content_video.empty ()) {
@@ -347,7 +370,7 @@ Player::get_video (DCPTime time, bool accurate)
return pvf;
}
- dcp::Size image_size = content->scale().size (content, _video_container_size, _film->frame_size ());
+ dcp::Size image_size = video_content->scale().size (video_content, _video_container_size, _film->frame_size ());
for (list<ContentVideo>::const_iterator i = content_video.begin(); i != content_video.end(); ++i) {
pvf.push_back (
@@ -355,38 +378,22 @@ Player::get_video (DCPTime time, bool accurate)
new PlayerVideo (
i->image,
content_video_to_dcp (piece, i->frame),
- content->crop (),
- content->fade (i->frame),
+ video_content->crop (),
+ video_content->fade (i->frame),
image_size,
_video_container_size,
i->eyes,
i->part,
- content->colour_conversion ()
+ video_content->colour_conversion ()
)
)
);
}
}
- /* Add subtitles (for possible burn-in) to whatever PlayerVideos we got */
-
- PlayerSubtitles ps = get_subtitles (time, DCPTime::from_frames (1, _film->video_frame_rate ()), false);
-
- list<PositionImage> sub_images;
-
- /* Image subtitles */
- list<PositionImage> c = transform_image_subtitles (ps.image);
- copy (c.begin(), c.end(), back_inserter (sub_images));
-
- /* Text subtitles (rendered to an image) */
- if (_burn_subtitles && !ps.text.empty ()) {
- list<PositionImage> s = render_subtitles (ps.text, _video_container_size);
- copy (s.begin (), s.end (), back_inserter (sub_images));
- }
-
- if (!sub_images.empty ()) {
- for (list<shared_ptr<PlayerVideo> >::const_iterator i = pvf.begin(); i != pvf.end(); ++i) {
- (*i)->set_subtitle (merge (sub_images));
+ if (subtitles) {
+ BOOST_FOREACH (shared_ptr<PlayerVideo> p, pvf) {
+ p->set_subtitle (subtitles.get ());
}
}
@@ -541,8 +548,12 @@ Player::statistics () const
return _statistics;
}
+/** @param burnt true to return only subtitles to be burnt, false to return only
+ * subtitles that should not be burnt. This parameter will be ignored if
+ * _always_burn_subtitles is true; in this case, all subtitles will be returned.
+ */
PlayerSubtitles
-Player::get_subtitles (DCPTime time, DCPTime length, bool starting)
+Player::get_subtitles (DCPTime time, DCPTime length, bool starting, bool burnt)
{
list<shared_ptr<Piece> > subs = overlaps<SubtitleContent> (time, time + length);
@@ -550,7 +561,7 @@ Player::get_subtitles (DCPTime time, DCPTime length, bool starting)
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->use_subtitles ()) {
+ if (!subtitle_content->use_subtitles () || (!_always_burn_subtitles && (burnt != subtitle_content->burn_subtitles ()))) {
continue;
}
@@ -626,11 +637,12 @@ Player::set_ignore_video ()
_ignore_video = true;
}
-/** Set whether or not this player should burn text subtitles into the image.
- * @param burn true to burn subtitles, false to not.
+/** Set whether or not this player should always burn text subtitles into the image,
+ * regardless of the content settings.
+ * @param burn true to always burn subtitles, false to obey content settings.
*/
void
-Player::set_burn_subtitles (bool burn)
+Player::set_always_burn_subtitles (bool burn)
{
- _burn_subtitles = burn;
+ _always_burn_subtitles = burn;
}