diff options
| author | Carl Hetherington <cth@carlh.net> | 2016-02-15 08:40:14 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2016-02-15 22:34:57 +0000 |
| commit | 54d17e98a597334bf1ba2615e3eb6191088f606f (patch) | |
| tree | 83a4f0c1acb2aab41a9cf279bc949474a214951a /src/lib/ffmpeg_examiner.cc | |
| parent | 57c49675889c0e0ad8cebece7a60bba08ba782d2 (diff) | |
Support SSA subtitles embedded within FFmpeg files.
Diffstat (limited to 'src/lib/ffmpeg_examiner.cc')
| -rw-r--r-- | src/lib/ffmpeg_examiner.cc | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/src/lib/ffmpeg_examiner.cc b/src/lib/ffmpeg_examiner.cc index 48738b917..dacc652bb 100644 --- a/src/lib/ffmpeg_examiner.cc +++ b/src/lib/ffmpeg_examiner.cc @@ -145,13 +145,23 @@ 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->time, - ContentTime::from_frames (video_length(), video_frame_rate().get_value_or (24)) - ) - ); + if (i->second->image) { + i->first->add_image_subtitle ( + i->second->id, + ContentTimePeriod ( + i->second->time, + ContentTime::from_frames (video_length(), video_frame_rate().get_value_or (24)) + ) + ); + } else { + i->first->add_text_subtitle ( + i->second->id, + ContentTimePeriod ( + i->second->time, + ContentTime::from_frames (video_length(), video_frame_rate().get_value_or (24)) + ) + ); + } } } @@ -207,23 +217,33 @@ FFmpegExaminer::subtitle_packet (AVCodecContext* context, shared_ptr<FFmpegSubti if (avcodec_decode_subtitle2 (context, &sub, &frame_finished, &_packet) >= 0 && frame_finished) { string id = subtitle_id (sub); FFmpegSubtitlePeriod const period = subtitle_period (sub); + bool const image = subtitle_is_image (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 (last->second->id, ContentTimePeriod (last->second->time, period.from)); + if (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> (); } else { /* This is just another subtitle, so we start again */ - _last_subtitle_start[stream] = SubtitleStart (id, period.from); + _last_subtitle_start[stream] = SubtitleStart (id, image, period.from); } } else if (sub.num_rects == 1) { if (period.to) { - stream->add_subtitle (id, ContentTimePeriod (period.from, period.to.get ())); + if (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, period.from); + _last_subtitle_start[stream] = SubtitleStart (id, image, period.from); } } avsubtitle_free (&sub); |
