summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2014-01-14 10:39:07 +0000
committerCarl Hetherington <cth@carlh.net>2014-01-14 10:39:07 +0000
commit057400eb1718e8769592e34e07d90405eb95605f (patch)
tree282a856feca494b1571d0ee67e22763a2db122e6 /src/lib
parentee4362c939b5fe6bab598b59916478513b9d6779 (diff)
Scale subtitle times with frame rate change if they are part of a piece of video content.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/ffmpeg_decoder.cc2
-rw-r--r--src/lib/player.cc15
2 files changed, 14 insertions, 3 deletions
diff --git a/src/lib/ffmpeg_decoder.cc b/src/lib/ffmpeg_decoder.cc
index b672b2c1f..a6f9a17c3 100644
--- a/src/lib/ffmpeg_decoder.cc
+++ b/src/lib/ffmpeg_decoder.cc
@@ -556,7 +556,7 @@ FFmpegDecoder::decode_subtitle_packet ()
source that we may have chopped off for the DCP)
*/
double const packet_time = (static_cast<double> (sub.pts ) / AV_TIME_BASE) + _video_pts_offset;
-
+
/* hence start time for this sub */
Time const from = (packet_time + (double (sub.start_display_time) / 1e3)) * TIME_HZ;
Time const to = (packet_time + (double (sub.end_display_time) / 1e3)) * TIME_HZ;
diff --git a/src/lib/player.cc b/src/lib/player.cc
index 9f8599693..56145f5bd 100644
--- a/src/lib/player.cc
+++ b/src/lib/player.cc
@@ -292,6 +292,7 @@ Player::process_video (weak_ptr<Piece> weak_piece, shared_ptr<const Image> image
pi->set_subtitle (_out_subtitle.image, _out_subtitle.position + container_offset);
}
+
#ifdef DCPOMATIC_DEBUG
_last_video = piece->content;
@@ -683,8 +684,18 @@ Player::update_subtitle ()
_in_subtitle.image->pixel_format (),
true
);
- _out_subtitle.from = _in_subtitle.from + piece->content->position ();
- _out_subtitle.to = _in_subtitle.to + piece->content->position ();
+
+ /* XXX: hack */
+ Time from = _in_subtitle.from;
+ Time to = _in_subtitle.to;
+ shared_ptr<VideoContent> vc = dynamic_pointer_cast<VideoContent> (piece->content);
+ if (vc) {
+ from = rint (from * vc->video_frame_rate() / _film->video_frame_rate());
+ to = rint (to * vc->video_frame_rate() / _film->video_frame_rate());
+ }
+
+ _out_subtitle.from = from * piece->content->position ();
+ _out_subtitle.to = to + piece->content->position ();
}
/** Re-emit the last frame that was emitted, using current settings for crop, ratio, scaler and subtitles.