X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fffmpeg_decoder.cc;h=9076464ac73aaa318566a1d1cb8f089be8b1173b;hb=92f024ea58c7279b8096e5e9f60f9cb2613e8a91;hp=6a8f4d4136dab4322b4b7713536b4e6019b09852;hpb=8ca6fd6d97e6d42492afddb655fa85130946853c;p=dcpomatic.git diff --git a/src/lib/ffmpeg_decoder.cc b/src/lib/ffmpeg_decoder.cc index 6a8f4d413..9076464ac 100644 --- a/src/lib/ffmpeg_decoder.cc +++ b/src/lib/ffmpeg_decoder.cc @@ -28,7 +28,7 @@ #include "util.h" #include "log.h" #include "ffmpeg_decoder.h" -#include "subtitle_decoder.h" +#include "text_decoder.h" #include "ffmpeg_audio_stream.h" #include "ffmpeg_subtitle_stream.h" #include "video_filter_graph.h" @@ -39,7 +39,7 @@ #include "film.h" #include "audio_decoder.h" #include "compose.hpp" -#include "subtitle_content.h" +#include "text_content.h" #include "audio_content.h" #include #include @@ -97,9 +97,9 @@ FFmpegDecoder::FFmpegDecoder (shared_ptr c, shared_ptr audio.reset (new AudioDecoder (this, c->audio, log, fast)); } - if (c->subtitle) { + if (c->only_text()) { /* XXX: this time here should be the time of the first subtitle, not 0 */ - subtitle.reset (new SubtitleDecoder (this, c->subtitle, log, ContentTime())); + text.push_back (shared_ptr (new TextDecoder (this, c->only_text(), log, ContentTime()))); } _next_time.resize (_format_context->nb_streams); @@ -184,7 +184,7 @@ FFmpegDecoder::pass () if (_video_stream && si == _video_stream.get() && !video->ignore()) { decode_video_packet (); - } else if (fc->subtitle_stream() && fc->subtitle_stream()->uses_index(_format_context, si) && !subtitle->ignore()) { + } else if (fc->subtitle_stream() && fc->subtitle_stream()->uses_index(_format_context, si) && !only_text()->ignore()) { decode_subtitle_packet (); } else { decode_audio_packet (); @@ -525,9 +525,10 @@ FFmpegDecoder::decode_video_packet () if (i->second != AV_NOPTS_VALUE) { double const pts = i->second * av_q2d (_format_context->streams[_video_stream.get()]->time_base) + _pts_offset.seconds (); + video->emit ( shared_ptr (new RawImageProxy (image)), - llrint (pts * _ffmpeg_content->active_video_frame_rate ()) + llrint(pts * _ffmpeg_content->active_video_frame_rate()) ); } else { LOG_WARNING_NC ("Dropping frame without PTS"); @@ -549,9 +550,9 @@ FFmpegDecoder::decode_subtitle_packet () /* Stop any current subtitle, either at the time it was supposed to stop, or now if now is sooner */ if (_have_current_subtitle) { if (_current_subtitle_to) { - subtitle->emit_stop (min(*_current_subtitle_to, subtitle_period(sub).from + _pts_offset)); + only_text()->emit_stop (min(*_current_subtitle_to, subtitle_period(sub).from + _pts_offset)); } else { - subtitle->emit_stop (subtitle_period(sub).from + _pts_offset); + only_text()->emit_stop (subtitle_period(sub).from + _pts_offset); } _have_current_subtitle = false; } @@ -593,7 +594,7 @@ FFmpegDecoder::decode_subtitle_packet () } if (_current_subtitle_to) { - subtitle->emit_stop (*_current_subtitle_to); + only_text()->emit_stop (*_current_subtitle_to); } avsubtitle_free (&sub); @@ -669,7 +670,7 @@ FFmpegDecoder::decode_bitmap_subtitle (AVSubtitleRect const * rect, ContentTime static_cast (rect->h) / target_height ); - subtitle->emit_image_start (from, image, scaled_rect); + only_text()->emit_bitmap_start (from, image, scaled_rect); } void @@ -679,21 +680,29 @@ FFmpegDecoder::decode_ass_subtitle (string ass, ContentTime from) produces a single format of Dialogue: lines... */ - vector bits; - split (bits, ass, is_any_of (",")); - if (bits.size() < 10) { + int commas = 0; + string text; + for (size_t i = 0; i < ass.length(); ++i) { + if (commas < 9 && ass[i] == ',') { + ++commas; + } else if (commas == 9) { + text += ass[i]; + } + } + + if (text.empty ()) { return; } sub::RawSubtitle base; list raw = sub::SSAReader::parse_line ( base, - bits[9], + text, _ffmpeg_content->video->size().width, _ffmpeg_content->video->size().height ); BOOST_FOREACH (sub::Subtitle const & i, sub::collect > (raw)) { - subtitle->emit_text_start (from, i); + only_text()->emit_plain_start (from, i); } }