X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fffmpeg_decoder.cc;h=69ed7ac125f961828a748ce68d2886e5849eea36;hb=5a5324ed3a381a86dfe0a6e3932c1d58fdcd596f;hp=57d300e18cf0b18e0c863df0aa26fc38ca5ea014;hpb=cd30cdbaf4188425ab0610b088dba81496144ccd;p=dcpomatic.git diff --git a/src/lib/ffmpeg_decoder.cc b/src/lib/ffmpeg_decoder.cc index 57d300e18..69ed7ac12 100644 --- a/src/lib/ffmpeg_decoder.cc +++ b/src/lib/ffmpeg_decoder.cc @@ -37,7 +37,6 @@ #include "raw_image_proxy.h" #include "video_decoder.h" #include "film.h" -#include "md5_digester.h" #include "audio_decoder.h" #include "compose.hpp" #include "subtitle_content.h" @@ -51,6 +50,7 @@ extern "C" { } #include #include +#include #include #include #include @@ -72,6 +72,7 @@ using std::pair; using std::max; using std::map; using boost::shared_ptr; +using boost::make_shared; using boost::is_any_of; using boost::split; using dcp::Size; @@ -176,7 +177,7 @@ FFmpegDecoder::deinterleave_audio (shared_ptr stream) const */ int const total_samples = size / bytes_per_audio_sample (stream); int const frames = total_samples / stream->channels(); - shared_ptr audio (new AudioBuffers (stream->channels(), frames)); + shared_ptr audio = make_shared (stream->channels(), frames); switch (audio_sample_format (stream)) { case AV_SAMPLE_FMT_U8: @@ -453,7 +454,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 ( - shared_ptr (new RawImageProxy (image)), + make_shared (image), llrint (pts * _ffmpeg_content->active_video_frame_rate ()) ); } else { @@ -533,7 +534,7 @@ FFmpegDecoder::decode_bitmap_subtitle (AVSubtitleRect const * rect, ContentTimeP /* Note RGBA is expressed little-endian, so the first byte in the word is R, second G, third B, fourth A. */ - shared_ptr image (new Image (AV_PIX_FMT_RGBA, dcp::Size (rect->w, rect->h), true)); + shared_ptr image = make_shared (AV_PIX_FMT_RGBA, dcp::Size (rect->w, rect->h), true); #ifdef DCPOMATIC_HAVE_AVSUBTITLERECT_PICT /* Start of the first line in the subtitle */ @@ -614,54 +615,8 @@ FFmpegDecoder::decode_ass_subtitle (string ass, ContentTimePeriod period) sub::RawSubtitle base; list raw = sub::SSAReader::parse_line (base, bits[9]); - list subs = sub::collect > (raw); - /* XXX: lots of this is copied from TextSubtitle; there should probably be some sharing */ - - /* Highest line index in this subtitle */ - int highest = 0; - BOOST_FOREACH (sub::Subtitle i, subs) { - BOOST_FOREACH (sub::Line j, i.lines) { - DCPOMATIC_ASSERT (j.vertical_position.reference && j.vertical_position.reference.get() == sub::TOP_OF_SUBTITLE); - DCPOMATIC_ASSERT (j.vertical_position.line); - highest = max (highest, j.vertical_position.line.get()); - } + BOOST_FOREACH (sub::Subtitle const & i, sub::collect > (raw)) { + subtitle->give_text (period, i); } - - list ss; - - BOOST_FOREACH (sub::Subtitle i, sub::collect > (sub::SSAReader::parse_line (base, bits[9]))) { - BOOST_FOREACH (sub::Line j, i.lines) { - BOOST_FOREACH (sub::Block k, j.blocks) { - ss.push_back ( - dcp::SubtitleString ( - boost::optional (), - k.italic, - k.bold, - subtitle->content()->colour(), - /* 48pt is 1/22nd of the screen height */ - 48, - 1, - dcp::Time (i.from.seconds(), 1000), - dcp::Time (i.to.seconds(), 1000), - 0, - dcp::HALIGN_CENTER, - /* This 1.015 is an arbitrary value to lift the bottom sub off the bottom - of the screen a bit to a pleasing degree. - */ - 1.015 - ((1 + highest - j.vertical_position.line.get()) * 1.5 / 22), - dcp::VALIGN_TOP, - dcp::DIRECTION_LTR, - k.text, - subtitle->content()->outline() ? dcp::BORDER : dcp::NONE, - subtitle->content()->outline_colour(), - dcp::Time (), - dcp::Time () - ) - ); - } - } - } - - subtitle->give_text (period, ss); }