summaryrefslogtreecommitdiff
path: root/src/lib/ffmpeg_examiner.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2016-02-01 00:26:37 +0000
committerCarl Hetherington <cth@carlh.net>2016-02-01 00:26:37 +0000
commit22873931f874a87fcf6a0077eddbec0f97eb3423 (patch)
treecabf1595fd8814e62730e8d846ca4288682d5cdd /src/lib/ffmpeg_examiner.cc
parent030c74f085718ea276c6e55a7a7c7de267a9ebf3 (diff)
Subtitle "to" times used to be stored against their "from" times.
Sadly an example shows that from times are not unique. This patch uses a hash of stuff from the first AVSubtitle as the key.
Diffstat (limited to 'src/lib/ffmpeg_examiner.cc')
-rw-r--r--src/lib/ffmpeg_examiner.cc15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/lib/ffmpeg_examiner.cc b/src/lib/ffmpeg_examiner.cc
index 719e7a2b0..48738b917 100644
--- a/src/lib/ffmpeg_examiner.cc
+++ b/src/lib/ffmpeg_examiner.cc
@@ -142,11 +142,13 @@ FFmpegExaminer::FFmpegExaminer (shared_ptr<const FFmpegContent> c, shared_ptr<Jo
}
}
+ /* Finish off any hanging subtitles at the end */
for (LastSubtitleMap::const_iterator i = _last_subtitle_start.begin(); i != _last_subtitle_start.end(); ++i) {
if (i->second) {
i->first->add_subtitle (
+ i->second->id,
ContentTimePeriod (
- i->second.get (),
+ i->second->time,
ContentTime::from_frames (video_length(), video_frame_rate().get_value_or (24))
)
);
@@ -203,24 +205,25 @@ FFmpegExaminer::subtitle_packet (AVCodecContext* context, shared_ptr<FFmpegSubti
int frame_finished;
AVSubtitle sub;
if (avcodec_decode_subtitle2 (context, &sub, &frame_finished, &_packet) >= 0 && frame_finished) {
+ string id = subtitle_id (sub);
FFmpegSubtitlePeriod const period = subtitle_period (sub);
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 */
- stream->add_subtitle (ContentTimePeriod (last->second.get (), period.from));
+ stream->add_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<ContentTime> ();
+ _last_subtitle_start[stream] = optional<SubtitleStart> ();
} else {
/* This is just another subtitle, so we start again */
- _last_subtitle_start[stream] = period.from;
+ _last_subtitle_start[stream] = SubtitleStart (id, period.from);
}
} else if (sub.num_rects == 1) {
if (period.to) {
- stream->add_subtitle (ContentTimePeriod (period.from, period.to.get ()));
+ stream->add_subtitle (id, ContentTimePeriod (period.from, period.to.get ()));
} else {
- _last_subtitle_start[stream] = period.from;
+ _last_subtitle_start[stream] = SubtitleStart (id, period.from);
}
}
avsubtitle_free (&sub);