summaryrefslogtreecommitdiff
path: root/src/lib/player.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2018-07-23 01:21:07 +0100
committerCarl Hetherington <cth@carlh.net>2018-07-23 01:21:07 +0100
commitded71cffd18962ebb6b9611a5eb6dfafe9e8e4ec (patch)
tree6da7f5da15b7b4cdeb82f7099b549abf537bf4fa /src/lib/player.cc
parent07d75f41aed77e340d927cc092dc4e7d74d03897 (diff)
Get ccaps by asking the Player, rather than by listening to its emissions,
which is slightly cleaner and works when subtitles are emitted with an unknown end time. Also add CCAPs to the player.
Diffstat (limited to 'src/lib/player.cc')
-rw-r--r--src/lib/player.cc43
1 files changed, 24 insertions, 19 deletions
diff --git a/src/lib/player.cc b/src/lib/player.cc
index dfd309774..4635233ff 100644
--- a/src/lib/player.cc
+++ b/src/lib/player.cc
@@ -676,29 +676,34 @@ Player::pass ()
return done;
}
+list<PlayerCaption>
+Player::closed_captions_for_frame (DCPTime time) const
+{
+ return _active_captions[CAPTION_CLOSED].get (
+ DCPTimePeriod(time, time + DCPTime::from_frames(1, _film->video_frame_rate()))
+ );
+}
+
+/** @return Open captions for the frame at the given time, converted to images */
optional<PositionImage>
-Player::captions_for_frame (DCPTime time) const
+Player::open_captions_for_frame (DCPTime time) const
{
list<PositionImage> captions;
-
int const vfr = _film->video_frame_rate();
- for (int i = 0; i < CAPTION_COUNT; ++i) {
- bool const always = i == CAPTION_OPEN && _always_burn_open_captions;
- BOOST_FOREACH (
- PlayerCaption j,
- _active_captions[i].get_burnt(DCPTimePeriod(time, time + DCPTime::from_frames(1, vfr)), always)
- ) {
-
- /* Image subtitles */
- list<PositionImage> c = transform_bitmap_captions (j.image);
- copy (c.begin(), c.end(), back_inserter (captions));
-
- /* Text subtitles (rendered to an image) */
- if (!j.text.empty ()) {
- list<PositionImage> s = render_text (j.text, j.fonts, _video_container_size, time, vfr);
- copy (s.begin(), s.end(), back_inserter (captions));
- }
+ BOOST_FOREACH (
+ PlayerCaption j,
+ _active_captions[CAPTION_OPEN].get_burnt(DCPTimePeriod(time, time + DCPTime::from_frames(1, vfr)), _always_burn_open_captions)
+ ) {
+
+ /* Image subtitles */
+ list<PositionImage> c = transform_bitmap_captions (j.image);
+ copy (c.begin(), c.end(), back_inserter (captions));
+
+ /* Text subtitles (rendered to an image) */
+ if (!j.text.empty ()) {
+ list<PositionImage> s = render_text (j.text, j.fonts, _video_container_size, time, vfr);
+ copy (s.begin(), s.end(), back_inserter (captions));
}
}
@@ -1047,7 +1052,7 @@ Player::do_emit_video (shared_ptr<PlayerVideo> pv, DCPTime time)
}
}
- optional<PositionImage> captions = captions_for_frame (time);
+ optional<PositionImage> captions = open_captions_for_frame (time);
if (captions) {
pv->set_caption (captions.get ());
}