Add support for reading non-MXF-wrapped SMPTE subtitle files.
authorCarl Hetherington <cth@carlh.net>
Sat, 3 Jan 2015 23:31:26 +0000 (23:31 +0000)
committerCarl Hetherington <cth@carlh.net>
Sat, 3 Jan 2015 23:31:26 +0000 (23:31 +0000)
src/dcp.cc
src/smpte_subtitle_content.cc
src/smpte_subtitle_content.h
test/smpte_subtitle_test.cc [new file with mode: 0644]
test/wscript

index ea55454a3ac282ac7160bff4cb3683190485a42f..589e3b3be70d54d3042b48f2cbd93e9e5427ea5d 100644 (file)
@@ -110,6 +110,9 @@ DCP::read (bool keep_going, ReadErrors* errors)
        }
 
        /* Read all the assets from the asset map */
+       /* XXX: I think we should be looking at the PKL here to decide type, not
+          the extension of the file.
+       */
        for (map<string, boost::filesystem::path>::const_iterator i = paths.begin(); i != paths.end(); ++i) {
                boost::filesystem::path path = _directory / i->second;
 
index 1fa94d1cecd16525c46f6821e1e9e68ccabdb3b8..d34c1dbe6b5f9702ae7f31625f913b55a66a466c 100644 (file)
@@ -31,29 +31,35 @@ using std::stringstream;
 using boost::shared_ptr;
 using namespace dcp;
 
-SMPTESubtitleContent::SMPTESubtitleContent (boost::filesystem::path file)
+SMPTESubtitleContent::SMPTESubtitleContent (boost::filesystem::path file, bool mxf)
        : SubtitleContent (file)
 {
-       ASDCP::TimedText::MXFReader reader;
-       Kumu::Result_t r = reader.OpenRead (file.string().c_str ());
-       if (ASDCP_FAILURE (r)) {
-               boost::throw_exception (MXFFileError ("could not open MXF file for reading", file, r));
-       }
-       
-       string s;
-       reader.ReadTimedTextResource (s, 0, 0);
        shared_ptr<cxml::Document> xml (new cxml::Document ("SubtitleReel"));
-       stringstream t;
-       t << s;
-       xml->read_stream (t);
        
-       ASDCP::WriterInfo info;
-       reader.FillWriterInfo (info);
+       if (mxf) {
+               ASDCP::TimedText::MXFReader reader;
+               Kumu::Result_t r = reader.OpenRead (file.string().c_str ());
+               if (ASDCP_FAILURE (r)) {
+                       boost::throw_exception (MXFFileError ("could not open MXF file for reading", file, r));
+               }
        
-       char buffer[64];
-       Kumu::bin2UUIDhex (info.AssetUUID, ASDCP::UUIDlen, buffer, sizeof (buffer));
-       _id = buffer;
+               string s;
+               reader.ReadTimedTextResource (s, 0, 0);
+               stringstream t;
+               t << s;
+               xml->read_stream (t);
 
+               ASDCP::WriterInfo info;
+               reader.FillWriterInfo (info);
+               
+               char buffer[64];
+               Kumu::bin2UUIDhex (info.AssetUUID, ASDCP::UUIDlen, buffer, sizeof (buffer));
+               _id = buffer;
+       } else {
+               xml->read_file (file);
+               _id = xml->string_child("Id").substr (9);
+       }
+       
        _load_font_nodes = type_children<dcp::SMPTELoadFont> (xml, "LoadFont");
 
        shared_ptr<cxml::Node> subtitle_list = xml->optional_node_child ("SubtitleList");
index b760f7279317939c1897d459894deea26497473b..70f6f2601009d83a14d27c631a7da068655cb41d 100644 (file)
@@ -26,8 +26,10 @@ class SMPTELoadFont;
 class SMPTESubtitleContent : public SubtitleContent
 {
 public:
-       /** @param file MXF file */
-       SMPTESubtitleContent (boost::filesystem::path file);
+       /** @param file File name
+        *  @param mxf true if `file' is a MXF, or false if it is an XML file.
+        */
+       SMPTESubtitleContent (boost::filesystem::path file, bool mxf = true);
 
 private:
        std::list<boost::shared_ptr<SMPTELoadFont> > _load_font_nodes;
diff --git a/test/smpte_subtitle_test.cc b/test/smpte_subtitle_test.cc
new file mode 100644 (file)
index 0000000..74bfa7a
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+    Copyright (C) 2015 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.
+
+*/
+
+#include "smpte_subtitle_content.h"
+#include "test.h"
+#include <boost/test/unit_test.hpp>
+
+/** Load a SMPTE XML subtitle file */
+BOOST_AUTO_TEST_CASE (smpte_subtitle_test)
+{
+       dcp::SMPTESubtitleContent sc (private_test / "8dfafe11-2bd1-4206-818b-afc109cfe7f6_reel1.xml", false);
+
+       BOOST_REQUIRE_EQUAL (sc.id(), "8dfafe11-2bd1-4206-818b-afc109cfe7f6");
+       BOOST_REQUIRE_EQUAL (sc.subtitles().size(), 159);
+       BOOST_REQUIRE_EQUAL (sc.subtitles().front().text(), "Jonas ?");
+       BOOST_REQUIRE_EQUAL (sc.subtitles().back().text(), "Come on.");
+}
index 1208dd0e5513bada5d3367fd74f011e15b286ae2..f669c3784ef77142d3afc3e3c0af555fe67c8367 100644 (file)
@@ -47,6 +47,7 @@ def build(bld):
                  rgb_xyz_test.cc
                  round_trip_test.cc
                  smpte_load_font_test.cc
+                 smpte_subtitle_test.cc
                  subtitle_test.cc
                  test.cc 
                  text_test.cc