X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Fffmpeg_decoder.cc;h=32903a20eb8995d4a2c2847f3b8b2d10e037afc5;hp=b6b6e594d9f41055843220706c960dcb6f5756fd;hb=de2af791bdfdcd653752cba970e59efc7bf810c7;hpb=06152300e69e8faca44ff8d7f12a6fd354848b9a diff --git a/src/lib/ffmpeg_decoder.cc b/src/lib/ffmpeg_decoder.cc index b6b6e594d..32903a20e 100644 --- a/src/lib/ffmpeg_decoder.cc +++ b/src/lib/ffmpeg_decoder.cc @@ -94,15 +94,7 @@ FFmpegDecoder::FFmpegDecoder (shared_ptr c, shared_ptr } if (c->subtitle) { - subtitle.reset ( - new SubtitleDecoder ( - this, - c->subtitle, - log, - bind (&FFmpegDecoder::image_subtitles_during, this, _1, _2), - bind (&FFmpegDecoder::text_subtitles_during, this, _1, _2) - ) - ); + subtitle.reset (new SubtitleDecoder (this, c->subtitle, log)); } } @@ -124,8 +116,8 @@ FFmpegDecoder::flush () } } -bool -FFmpegDecoder::pass (PassReason reason, bool accurate) +void +FFmpegDecoder::pass () { int r = av_read_frame (_format_context, &_packet); @@ -142,22 +134,21 @@ FFmpegDecoder::pass (PassReason reason, bool accurate) } flush (); - return true; + return; } int const si = _packet.stream_index; shared_ptr fc = _ffmpeg_content; - if (_video_stream && si == _video_stream.get() && !video->ignore() && (accurate || reason != PASS_REASON_SUBTITLE)) { + 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)) { decode_subtitle_packet (); - } else if (accurate || reason != PASS_REASON_SUBTITLE) { + } else { decode_audio_packet (); } av_packet_unref (&_packet); - return false; } /** @param data pointer to array of pointers to buffers. @@ -307,18 +298,6 @@ FFmpegDecoder::bytes_per_audio_sample (shared_ptr stream) con void FFmpegDecoder::seek (ContentTime time, bool accurate) { - if (video) { - video->seek (time, accurate); - } - - if (audio) { - audio->seek (time, accurate); - } - - if (subtitle) { - subtitle->seek (time, accurate); - } - /* If we are doing an `accurate' seek, we need to use pre-roll, as we don't really know what the seek will give us. */ @@ -428,7 +407,7 @@ FFmpegDecoder::decode_audio_packet () /* Give this data provided there is some, and its time is sane */ if (ct >= ContentTime() && data->frames() > 0) { - audio->give (*stream, data, ct); + audio->emit (*stream, data, ct); } } @@ -473,7 +452,7 @@ 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->give ( + video->emit ( shared_ptr (new RawImageProxy (image)), llrint (pts * _ffmpeg_content->active_video_frame_rate ()) ); @@ -534,18 +513,6 @@ FFmpegDecoder::decode_subtitle_packet () avsubtitle_free (&sub); } -list -FFmpegDecoder::image_subtitles_during (ContentTimePeriod p, bool starting) const -{ - return _ffmpeg_content->image_subtitles_during (p, starting); -} - -list -FFmpegDecoder::text_subtitles_during (ContentTimePeriod p, bool starting) const -{ - return _ffmpeg_content->text_subtitles_during (p, starting); -} - void FFmpegDecoder::decode_bitmap_subtitle (AVSubtitleRect const * rect, ContentTimePeriod period) { @@ -616,7 +583,7 @@ FFmpegDecoder::decode_bitmap_subtitle (AVSubtitleRect const * rect, ContentTimeP static_cast (rect->h) / target_height ); - subtitle->give_image (period, image, scaled_rect); + subtitle->emit_image (period, image, scaled_rect); } void @@ -636,6 +603,6 @@ FFmpegDecoder::decode_ass_subtitle (string ass, ContentTimePeriod period) list raw = sub::SSAReader::parse_line (base, bits[9]); BOOST_FOREACH (sub::Subtitle const & i, sub::collect > (raw)) { - subtitle->give_text (period, i); + subtitle->emit_text (period, i); } }