X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fffmpeg_decoder.cc;h=69ed7ac125f961828a748ce68d2886e5849eea36;hb=5a5324ed3a381a86dfe0a6e3932c1d58fdcd596f;hp=e3a42537535621e1f8cfb5e4543696a5a4d1d557;hpb=49a1e2a600bd7b9d2d4a926256378e6134704a1a;p=dcpomatic.git diff --git a/src/lib/ffmpeg_decoder.cc b/src/lib/ffmpeg_decoder.cc index e3a425375..69ed7ac12 100644 --- a/src/lib/ffmpeg_decoder.cc +++ b/src/lib/ffmpeg_decoder.cc @@ -1,19 +1,20 @@ /* Copyright (C) 2012-2016 Carl Hetherington - This program is free software; you can redistribute it and/or modify + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + DCP-o-matic is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with DCP-o-matic. If not, see . */ @@ -36,9 +37,9 @@ #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" #include #include #include @@ -49,6 +50,7 @@ extern "C" { } #include #include +#include #include #include #include @@ -70,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; @@ -174,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: @@ -228,7 +231,7 @@ FFmpegDecoder::deinterleave_audio (shared_ptr stream) const int sample = 0; int channel = 0; for (int i = 0; i < total_samples; ++i) { - audio->data(channel)[sample] = static_cast(*p++) / (1 << 31); + audio->data(channel)[sample] = static_cast(*p++) / 2147483648; ++channel; if (channel == stream->channels()) { @@ -244,7 +247,7 @@ FFmpegDecoder::deinterleave_audio (shared_ptr stream) const int32_t** p = reinterpret_cast (_frame->data); for (int i = 0; i < stream->channels(); ++i) { for (int j = 0; j < frames; ++j) { - audio->data(i)[j] = static_cast(p[i][j]) / (1 << 31); + audio->data(i)[j] = static_cast(p[i][j]) / 2147483648; } } } @@ -451,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 { @@ -531,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 */ @@ -612,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()); - } - } - 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, - dcp::Colour (255, 255, 255), - /* 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, - static_cast (0), - dcp::Colour (255, 255, 255), - dcp::Time (), - dcp::Time () - ) - ); - } - } + BOOST_FOREACH (sub::Subtitle const & i, sub::collect > (raw)) { + subtitle->give_text (period, i); } - - subtitle->give_text (period, ss); }