diff options
| author | Carl Hetherington <cth@carlh.net> | 2018-10-16 16:02:39 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2018-10-16 16:02:39 +0100 |
| commit | c75484af73d38b00a4f27143f8e434b6f25bf355 (patch) | |
| tree | 1d008cec8b143e0b787885e99765d1015470a9d2 /src/lib/dcp_decoder.cc | |
| parent | 723b49e77951d0981b8165f724acd49d9a44660d (diff) | |
Collect subtitles at the same time before emitting them from
DCPDecoder. Prevents overlaid text in, for example, lines with
partial italic.
Diffstat (limited to 'src/lib/dcp_decoder.cc')
| -rw-r--r-- | src/lib/dcp_decoder.cc | 36 |
1 files changed, 27 insertions, 9 deletions
diff --git a/src/lib/dcp_decoder.cc b/src/lib/dcp_decoder.cc index 72db5369c..71a7e42d0 100644 --- a/src/lib/dcp_decoder.cc +++ b/src/lib/dcp_decoder.cc @@ -228,18 +228,24 @@ DCPDecoder::pass_texts (ContentTime next, shared_ptr<dcp::SubtitleAsset> asset, true ); + list<dcp::SubtitleString> strings; + BOOST_FOREACH (shared_ptr<dcp::Subtitle> i, subs) { shared_ptr<dcp::SubtitleString> is = dynamic_pointer_cast<dcp::SubtitleString> (i); if (is) { - list<dcp::SubtitleString> s; - s.push_back (*is); - decoder->emit_plain ( - ContentTimePeriod ( - ContentTime::from_frames (_offset - entry_point, vfr) + ContentTime::from_seconds (i->in().as_seconds ()), - ContentTime::from_frames (_offset - entry_point, vfr) + ContentTime::from_seconds (i->out().as_seconds ()) - ), - s - ); + if (!strings.empty() && (strings.back().in() != is->in() || strings.back().out() != is->out())) { + dcp::SubtitleString b = strings.back(); + decoder->emit_plain ( + ContentTimePeriod ( + ContentTime::from_frames(_offset - entry_point, vfr) + ContentTime::from_seconds(b.in().as_seconds()), + ContentTime::from_frames(_offset - entry_point, vfr) + ContentTime::from_seconds(b.out().as_seconds()) + ), + strings + ); + strings.clear (); + } + + strings.push_back (*is); } shared_ptr<dcp::SubtitleImage> ii = dynamic_pointer_cast<dcp::SubtitleImage> (i); @@ -284,6 +290,18 @@ DCPDecoder::pass_texts (ContentTime next, shared_ptr<dcp::SubtitleAsset> asset, ); } } + + if (!strings.empty()) { + dcp::SubtitleString b = strings.back(); + decoder->emit_plain ( + ContentTimePeriod ( + ContentTime::from_frames(_offset - entry_point, vfr) + ContentTime::from_seconds(b.in().as_seconds()), + ContentTime::from_frames(_offset - entry_point, vfr) + ContentTime::from_seconds(b.out().as_seconds()) + ), + strings + ); + strings.clear (); + } } } |
