diff options
| author | Carl Hetherington <cth@carlh.net> | 2016-11-20 22:08:11 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2016-11-20 22:08:11 +0000 |
| commit | 4337694dfd488e88f56b63898ad35ce8ce9bb3c3 (patch) | |
| tree | 8bba36173e1781eb18a81081e1ae27de4d4962ff /src/lib/ffmpeg_examiner.cc | |
| parent | 31724651675fc01a33ffa0818d4397858493dd56 (diff) | |
Fix subtitles (seen in DVB) which have a specified `to' time but
then are terminated earlier than that by a num_rects=0 subtitle.
Diffstat (limited to 'src/lib/ffmpeg_examiner.cc')
| -rw-r--r-- | src/lib/ffmpeg_examiner.cc | 38 |
1 files changed, 15 insertions, 23 deletions
diff --git a/src/lib/ffmpeg_examiner.cc b/src/lib/ffmpeg_examiner.cc index 4c2040f52..271180d5d 100644 --- a/src/lib/ffmpeg_examiner.cc +++ b/src/lib/ffmpeg_examiner.cc @@ -236,32 +236,24 @@ FFmpegExaminer::subtitle_packet (AVCodecContext* context, shared_ptr<FFmpegSubti FFmpegSubtitlePeriod const period = subtitle_period (sub); bool const starts_image = subtitle_starts_image (sub); + /* Some streams (notably DVB streams) have subtitles which have a specified end time + but which are then stopped earlier than this by a zero-num_rect subtitle. + */ + LastSubtitleMap::iterator last = _last_subtitle_start.find (stream); - if (last != _last_subtitle_start.end() && last->second) { - /* We have seen the start of a subtitle but not yet the end. Whatever this is - finishes the previous subtitle, so add it */ - if (last->second->image) { - stream->add_image_subtitle (last->second->id, ContentTimePeriod (last->second->time, period.from)); - } else { - stream->add_text_subtitle (last->second->id, ContentTimePeriod (last->second->time, period.from)); - } - if (sub.num_rects == 0) { - /* This is a `proper' end-of-subtitle */ - _last_subtitle_start[stream] = optional<SubtitleStart> (); + if (sub.num_rects == 0 && last != _last_subtitle_start.end() && last->second) { + /* Set (or fix) the `to' time for the last subtitle */ + stream->set_subtitle_to (last->second->id, period.from); + _last_subtitle_start[stream] = optional<SubtitleStart> (); + } else if (sub.num_rects > 0) { + /* Add a subtitle; if we don't know the `to' time we set it to the from time and fix it later */ + if (starts_image) { + stream->add_image_subtitle (id, ContentTimePeriod (period.from, period.to.get_value_or (period.from))); } else { - /* This is just another subtitle, so we start again */ - _last_subtitle_start[stream] = SubtitleStart (id, starts_image, period.from); - } - } else if (sub.num_rects >= 1) { - if (period.to) { - if (starts_image) { - stream->add_image_subtitle (id, ContentTimePeriod (period.from, period.to.get ())); - } else { - stream->add_text_subtitle (id, ContentTimePeriod (period.from, period.to.get ())); - } - } else { - _last_subtitle_start[stream] = SubtitleStart (id, starts_image, period.from); + stream->add_text_subtitle (id, ContentTimePeriod (period.from, period.to.get_value_or (period.from))); } + + _last_subtitle_start[stream] = SubtitleStart (id, starts_image, period.from); } for (unsigned int i = 0; i < sub.num_rects; ++i) { |
