X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fffmpeg_examiner.cc;h=eb02ba17be9a2eb5a6abc48b814d90dae8b19836;hb=1460bda6f80b6529e31a1a63029dc0ec5f7d0ae8;hp=18a87f40e591ab0e27d66b88d2677ea75043bae4;hpb=a8a0dfd1b21de6c0facf965ab119833ff6f790bf;p=dcpomatic.git diff --git a/src/lib/ffmpeg_examiner.cc b/src/lib/ffmpeg_examiner.cc index 18a87f40e..eb02ba17b 100644 --- a/src/lib/ffmpeg_examiner.cc +++ b/src/lib/ffmpeg_examiner.cc @@ -30,7 +30,6 @@ extern "C" { #include "ffmpeg_audio_stream.h" #include "ffmpeg_subtitle_stream.h" #include "util.h" -#include "safe_stringstream.h" #include #include @@ -161,21 +160,10 @@ FFmpegExaminer::FFmpegExaminer (shared_ptr c, shared_ptrsecond) { - if (i->second->image) { - i->first->add_image_subtitle ( + if (i->first->unknown_to (i->second->id)) { + i->first->set_subtitle_to ( 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)) - ) + ContentTime::from_frames (video_length(), video_frame_rate().get_value_or (24)) ); } } @@ -237,32 +225,24 @@ FFmpegExaminer::subtitle_packet (AVCodecContext* context, shared_ptrsecond) { - /* 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)); + 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 (); + } 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 { - 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 (); - } 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) { @@ -351,38 +331,36 @@ FFmpegExaminer::sample_aspect_ratio () const string FFmpegExaminer::subtitle_stream_name (AVStream* s) const { - SafeStringStream n; - - n << stream_name (s); + string n = stream_name (s); - if (n.str().empty()) { - n << _("unknown"); + if (n.empty()) { + n = _("unknown"); } - return n.str (); + return n; } string FFmpegExaminer::stream_name (AVStream* s) const { - SafeStringStream n; + string n; if (s->metadata) { AVDictionaryEntry const * lang = av_dict_get (s->metadata, "language", 0, 0); if (lang) { - n << lang->value; + n = lang->value; } AVDictionaryEntry const * title = av_dict_get (s->metadata, "title", 0, 0); if (title) { - if (!n.str().empty()) { - n << " "; + if (!n.empty()) { + n += " "; } - n << title->value; + n += title->value; } } - return n.str (); + return n; } int