From 8c6e4c8e4f37450f44cb4ca9918406a6f2cc6055 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 10 Jul 2014 16:15:13 +0100 Subject: [PATCH] Various fixes for DCP subtitles, and a test or two. --- src/lib/dcp_subtitle_content.cc | 3 ++- src/lib/dcp_subtitle_decoder.cc | 3 ++- src/lib/transcoder.cc | 4 ++- src/lib/writer.cc | 12 +++++++-- test/burnt_subtitle_test.cc | 28 +++++++++++++++++--- test/dcp_subtitle_test.cc | 46 +++++++++++++++++++++++++++++++++ test/wscript | 1 + 7 files changed, 88 insertions(+), 9 deletions(-) create mode 100644 test/dcp_subtitle_test.cc diff --git a/src/lib/dcp_subtitle_content.cc b/src/lib/dcp_subtitle_content.cc index e9998dd2a..83b0d200c 100644 --- a/src/lib/dcp_subtitle_content.cc +++ b/src/lib/dcp_subtitle_content.cc @@ -24,6 +24,7 @@ #include "i18n.h" using std::string; +using std::list; using boost::shared_ptr; using dcp::raw_convert; @@ -47,7 +48,7 @@ DCPSubtitleContent::examine (shared_ptr job) { Content::examine (job); dcp::SubtitleContent sc (path (0), false); - _length = DCPTime::from_frames (sc.intrinsic_duration(), sc.edit_rate().as_float ()); + _length = DCPTime::from_seconds (sc.latest_subtitle_out().to_seconds ()); } DCPTime diff --git a/src/lib/dcp_subtitle_decoder.cc b/src/lib/dcp_subtitle_decoder.cc index c1f0ab500..20a9f32fe 100644 --- a/src/lib/dcp_subtitle_decoder.cc +++ b/src/lib/dcp_subtitle_decoder.cc @@ -22,6 +22,7 @@ #include "dcp_subtitle_content.h" using std::list; +using std::cout; using boost::shared_ptr; DCPSubtitleDecoder::DCPSubtitleDecoder (shared_ptr content) @@ -55,7 +56,7 @@ DCPSubtitleDecoder::pass () s.push_back (*_next); text_subtitle (s); ++_next; - + return false; } diff --git a/src/lib/transcoder.cc b/src/lib/transcoder.cc index 843524cce..1012c4544 100644 --- a/src/lib/transcoder.cc +++ b/src/lib/transcoder.cc @@ -68,7 +68,9 @@ Transcoder::go () _encoder->enqueue (*i); } _writer->write (_player->get_audio (t, frame, true)); - _writer->write (_player->get_subtitles (t, frame, true)); + if (!_film->burn_subtitles ()) { + _writer->write (_player->get_subtitles (t, frame, true)); + } } _finishing = true; diff --git a/src/lib/writer.cc b/src/lib/writer.cc index b1dbca0e0..09dd6322e 100644 --- a/src/lib/writer.cc +++ b/src/lib/writer.cc @@ -456,7 +456,15 @@ Writer::finish () if (_subtitle_content) { _subtitle_content->write_xml (_film->dir (_film->dcp_name ()) / _film->subtitle_xml_filename ()); - reel->add (shared_ptr (new dcp::ReelSubtitleAsset (_subtitle_content, 0))); + reel->add (shared_ptr ( + new dcp::ReelSubtitleAsset ( + _subtitle_content, + dcp::Fraction (_film->video_frame_rate(), 1), + _subtitle_content->latest_subtitle_out().to_seconds() * _film->video_frame_rate(), + 0 + ) + )); + dcp.add (_subtitle_content); } @@ -583,7 +591,7 @@ Writer::write (PlayerSubtitles subs) { if (!_subtitle_content) { _subtitle_content.reset ( - new dcp::SubtitleContent (dcp::Fraction (_film->video_frame_rate(), 1), _film->name(), _film->isdcf_metadata().subtitle_language) + new dcp::SubtitleContent (_film->name(), _film->isdcf_metadata().subtitle_language) ); } diff --git a/test/burnt_subtitle_test.cc b/test/burnt_subtitle_test.cc index acd30d030..dc2c62270 100644 --- a/test/burnt_subtitle_test.cc +++ b/test/burnt_subtitle_test.cc @@ -23,6 +23,7 @@ #include #include "lib/subrip_content.h" +#include "lib/dcp_subtitle_content.h" #include "lib/film.h" #include "lib/ratio.h" #include "lib/dcp_content_type.h" @@ -31,13 +32,14 @@ using std::cout; using boost::shared_ptr; -/** Build a small DCP with no picture and a single subtitle overlaid onto it */ -BOOST_AUTO_TEST_CASE (burnt_subtitle_test) +/** Build a small DCP with no picture and a single subtitle overlaid onto it from a SubRip file */ +BOOST_AUTO_TEST_CASE (burnt_subtitle_test_subrip) { - shared_ptr film = new_test_film ("burnt_subtitle_test"); + shared_ptr film = new_test_film ("burnt_subtitle_test_subrip"); film->set_container (Ratio::from_id ("185")); film->set_dcp_content_type (DCPContentType::from_isdcf_name ("TLR")); film->set_name ("frobozz"); + film->set_burn_subtitles (true); shared_ptr content (new SubRipContent (film, "test/data/subrip2.srt")); content->set_subtitle_use (true); film->examine_and_add_content (content); @@ -45,5 +47,23 @@ BOOST_AUTO_TEST_CASE (burnt_subtitle_test) film->make_dcp (); wait_for_jobs (); - check_dcp ("test/data/burnt_subtitle_test", film->dir (film->dcp_name ())); + check_dcp ("test/data/burnt_subtitle_test_subrip", film->dir (film->dcp_name ())); +} + +/** Build a small DCP with no picture and a single subtitle overlaid onto it from a DCP XML file */ +BOOST_AUTO_TEST_CASE (burnt_subtitle_test_dcp) +{ + shared_ptr film = new_test_film ("burnt_subtitle_test_dcp"); + film->set_container (Ratio::from_id ("185")); + film->set_dcp_content_type (DCPContentType::from_isdcf_name ("TLR")); + film->set_name ("frobozz"); + film->set_burn_subtitles (true); + shared_ptr content (new DCPSubtitleContent (film, "test/data/dcp_sub.xml")); + content->set_subtitle_use (true); + film->examine_and_add_content (content); + wait_for_jobs (); + film->make_dcp (); + wait_for_jobs (); + + check_dcp ("test/data/burnt_subtitle_test_dcp", film->dir (film->dcp_name ())); } diff --git a/test/dcp_subtitle_test.cc b/test/dcp_subtitle_test.cc new file mode 100644 index 000000000..95fa7d1ec --- /dev/null +++ b/test/dcp_subtitle_test.cc @@ -0,0 +1,46 @@ +/* + Copyright (C) 2014 Carl Hetherington + + This program 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, + 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. + +*/ + +/** @file test/dcp_subtitle_test.cc + * @brief Test DCP subtitle content in various ways. + */ + +#include +#include "lib/film.h" +#include "lib/dcp_subtitle_content.h" +#include "lib/ratio.h" +#include "lib/dcp_content_type.h" +#include "test.h" + +using std::cout; +using boost::shared_ptr; + +/** Test load of very simple DCP subtitle file */ +BOOST_AUTO_TEST_CASE (dcp_subtitle_test) +{ + shared_ptr film = new_test_film ("dcp_subtitle_test"); + film->set_container (Ratio::from_id ("185")); + film->set_dcp_content_type (DCPContentType::from_isdcf_name ("TLR")); + film->set_name ("frobozz"); + shared_ptr content (new DCPSubtitleContent (film, "test/data/dcp_sub.xml")); + film->examine_and_add_content (content); + wait_for_jobs (); + + BOOST_CHECK_EQUAL (content->full_length(), DCPTime::from_seconds (2)); +} diff --git a/test/wscript b/test/wscript index d968a5a8f..f123f844d 100644 --- a/test/wscript +++ b/test/wscript @@ -25,6 +25,7 @@ def build(bld): burnt_subtitle_test.cc client_server_test.cc colour_conversion_test.cc + dcp_subtitle_test.cc ffmpeg_audio_test.cc ffmpeg_dcp_test.cc ffmpeg_decoder_seek_test.cc -- 2.30.2