Various fixes for DCP subtitles, and a test or two.
authorCarl Hetherington <cth@carlh.net>
Thu, 10 Jul 2014 15:15:13 +0000 (16:15 +0100)
committerCarl Hetherington <cth@carlh.net>
Thu, 10 Jul 2014 15:15:13 +0000 (16:15 +0100)
src/lib/dcp_subtitle_content.cc
src/lib/dcp_subtitle_decoder.cc
src/lib/transcoder.cc
src/lib/writer.cc
test/burnt_subtitle_test.cc
test/dcp_subtitle_test.cc [new file with mode: 0644]
test/wscript

index e9998dd2a2eb10b1b6bd549169eddf80ed908fa6..83b0d200cee33146c6f92b33a1de1bd0b34df0da 100644 (file)
@@ -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> 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
index c1f0ab500bd54962a8780133181e04426462c0d2..20a9f32fee031ddd99fc03f19ab1d5182614e6f7 100644 (file)
@@ -22,6 +22,7 @@
 #include "dcp_subtitle_content.h"
 
 using std::list;
+using std::cout;
 using boost::shared_ptr;
 
 DCPSubtitleDecoder::DCPSubtitleDecoder (shared_ptr<const DCPSubtitleContent> content)
@@ -55,7 +56,7 @@ DCPSubtitleDecoder::pass ()
        s.push_back (*_next);
        text_subtitle (s);
        ++_next;
-       
+
        return false;
 }
 
index 843524cce91dff5411b7378cfc5adb43e62dd4c3..1012c45442b69320e9b4bd7aac14143167755065 100644 (file)
@@ -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;
index b1dbca0e0053f4fdda45881cba4db4e4aaaba1fc..09dd6322ec3035ac2dbbe114263d21d2ed806cc7 100644 (file)
@@ -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<dcp::ReelSubtitleAsset> (new dcp::ReelSubtitleAsset (_subtitle_content, 0)));
+               reel->add (shared_ptr<dcp::ReelSubtitleAsset> (
+                                  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)
                        );
        }
        
index acd30d030c492405227647251bb9f7e3a5a5e091..dc2c622704007b586ec73f94f4e0524304b3597f 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <boost/test/unit_test.hpp>
 #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"
 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> film = new_test_film ("burnt_subtitle_test");
+       shared_ptr<Film> 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<SubRipContent> 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> 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<DCPSubtitleContent> 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 (file)
index 0000000..95fa7d1
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+    Copyright (C) 2014 Carl Hetherington <cth@carlh.net>
+
+    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 <boost/test/unit_test.hpp>
+#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> 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<DCPSubtitleContent> 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));
+}
index d968a5a8f2ea66ceb0a95898cdee4881a38df354..f123f844d79e11ba04f6579932f66428aac11320 100644 (file)
@@ -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