2 Copyright (C) 2013-2019 Carl Hetherington <cth@carlh.net>
4 This file is part of libdcp.
6 libdcp is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 libdcp is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with libdcp. If not, see <http://www.gnu.org/licenses/>.
19 In addition, as a special exception, the copyright holders give
20 permission to link the code of portions of this program with the
21 OpenSSL library under certain conditions as described in each
22 individual source file, and distribute linked combinations
25 You must obey the GNU General Public License in all respects
26 for all of the code used other than OpenSSL. If you modify
27 file(s) with this exception, you may extend this exception to your
28 version of the file(s), but you are not obligated to do so. If you
29 do not wish to do so, delete this exception statement from your
30 version. If you delete this exception statement from all source
31 files in the program, then also delete it here.
37 #include "mono_picture_asset.h"
38 #include "stereo_picture_asset.h"
39 #include "picture_asset_writer.h"
40 #include "sound_asset_writer.h"
41 #include "sound_asset.h"
42 #include "atmos_asset.h"
46 #include "reel_mono_picture_asset.h"
47 #include "reel_stereo_picture_asset.h"
48 #include "reel_sound_asset.h"
49 #include "reel_atmos_asset.h"
50 #include <asdcp/KM_util.h>
52 #include <boost/test/unit_test.hpp>
55 using boost::shared_ptr;
58 /** Test creation of a 2D SMPTE DCP from very simple inputs */
59 BOOST_AUTO_TEST_CASE (dcp_test1)
63 dcp::XMLMetadata xml_meta;
64 xml_meta.annotation_text = "Created by libdcp";
65 xml_meta.issuer = "OpenDCP 0.0.25";
66 xml_meta.creator = "OpenDCP 0.0.25";
67 xml_meta.issue_date = "2012-07-17T04:45:18+00:00";
68 make_simple("build/test/DCP/dcp_test1")->write_xml (dcp::SMPTE, xml_meta);
69 /* build/test/DCP/dcp_test1 is checked against test/ref/DCP/dcp_test1 by run/tests */
72 /** Test creation of a 3D DCP from very simple inputs */
73 BOOST_AUTO_TEST_CASE (dcp_test2)
77 /* Some known metadata */
78 dcp::XMLMetadata xml_meta;
79 xml_meta.annotation_text = "A Test DCP";
80 xml_meta.issuer = "OpenDCP 0.0.25";
81 xml_meta.creator = "OpenDCP 0.0.25";
82 xml_meta.issue_date = "2012-07-17T04:45:18+00:00";
83 dcp::MXFMetadata mxf_meta;
84 mxf_meta.company_name = "OpenDCP";
85 mxf_meta.product_name = "OpenDCP";
86 mxf_meta.product_version = "0.0.25";
88 /* We're making build/test/DCP/dcp_test2 */
89 boost::filesystem::remove_all ("build/test/DCP/dcp_test2");
90 boost::filesystem::create_directories ("build/test/DCP/dcp_test2");
91 dcp::DCP d ("build/test/DCP/dcp_test2");
92 shared_ptr<dcp::CPL> cpl (new dcp::CPL ("A Test DCP", dcp::FEATURE));
93 cpl->set_content_version_id ("urn:uri:81fb54df-e1bf-4647-8788-ea7ba154375b_2012-07-17T04:45:18+00:00");
94 cpl->set_content_version_label_text ("81fb54df-e1bf-4647-8788-ea7ba154375b_2012-07-17T04:45:18+00:00");
95 cpl->set_issuer (xml_meta.issuer);
96 cpl->set_creator (xml_meta.creator);
97 cpl->set_issue_date (xml_meta.issue_date);
98 cpl->set_annotation_text (xml_meta.annotation_text);
100 shared_ptr<dcp::StereoPictureAsset> mp (new dcp::StereoPictureAsset (dcp::Fraction (24, 1), dcp::SMPTE));
101 mp->set_metadata (mxf_meta);
102 shared_ptr<dcp::PictureAssetWriter> picture_writer = mp->start_write ("build/test/DCP/dcp_test2/video.mxf", false);
103 dcp::File j2c ("test/data/32x32_red_square.j2c");
104 for (int i = 0; i < 24; ++i) {
106 picture_writer->write (j2c.data (), j2c.size ());
108 picture_writer->write (j2c.data (), j2c.size ());
110 picture_writer->finalize ();
112 shared_ptr<dcp::SoundAsset> ms (new dcp::SoundAsset (dcp::Fraction (24, 1), 48000, 1, dcp::SMPTE));
113 ms->set_metadata (mxf_meta);
114 shared_ptr<dcp::SoundAssetWriter> sound_writer = ms->start_write ("build/test/DCP/dcp_test2/audio.mxf");
118 SNDFILE* sndfile = sf_open ("test/data/1s_24-bit_48k_silence.wav", SFM_READ, &info);
119 BOOST_CHECK (sndfile);
120 float buffer[4096*6];
122 channels[0] = buffer;
124 sf_count_t N = sf_readf_float (sndfile, buffer, 4096);
125 sound_writer->write (channels, N);
131 sound_writer->finalize ();
133 cpl->add (shared_ptr<dcp::Reel> (
135 shared_ptr<dcp::ReelStereoPictureAsset> (new dcp::ReelStereoPictureAsset (mp, 0)),
136 shared_ptr<dcp::ReelSoundAsset> (new dcp::ReelSoundAsset (ms, 0))
142 xml_meta.annotation_text = "Created by libdcp";
143 d.write_xml (dcp::SMPTE, xml_meta);
145 /* build/test/DCP/dcp_test2 is checked against test/ref/DCP/dcp_test2 by run/tests */
149 note (dcp::NoteType, string)
154 /** Test comparison of a DCP with itself */
155 BOOST_AUTO_TEST_CASE (dcp_test3)
157 dcp::DCP A ("test/ref/DCP/dcp_test1");
159 dcp::DCP B ("test/ref/DCP/dcp_test1");
162 BOOST_CHECK (A.equals (B, dcp::EqualityOptions(), boost::bind (¬e, _1, _2)));
165 /** Test comparison of a DCP with a different DCP */
166 BOOST_AUTO_TEST_CASE (dcp_test4)
168 dcp::DCP A ("test/ref/DCP/dcp_test1");
170 dcp::DCP B ("test/ref/DCP/dcp_test2");
173 BOOST_CHECK (!A.equals (B, dcp::EqualityOptions(), boost::bind (¬e, _1, _2)));
176 /** Test creation of a 2D DCP with an Atmos track */
177 BOOST_AUTO_TEST_CASE (dcp_test5)
181 /* Some known metadata */
182 dcp::XMLMetadata xml_meta;
183 xml_meta.annotation_text = "A Test DCP";
184 xml_meta.issuer = "OpenDCP 0.0.25";
185 xml_meta.creator = "OpenDCP 0.0.25";
186 xml_meta.issue_date = "2012-07-17T04:45:18+00:00";
187 dcp::MXFMetadata mxf_meta;
188 mxf_meta.company_name = "OpenDCP";
189 mxf_meta.product_name = "OpenDCP";
190 mxf_meta.product_version = "0.0.25";
192 /* We're making build/test/DCP/dcp_test5 */
193 boost::filesystem::remove_all ("build/test/DCP/dcp_test5");
194 boost::filesystem::create_directories ("build/test/DCP/dcp_test5");
195 dcp::DCP d ("build/test/DCP/dcp_test5");
196 shared_ptr<dcp::CPL> cpl (new dcp::CPL ("A Test DCP", dcp::FEATURE));
197 cpl->set_content_version_id ("urn:uri:81fb54df-e1bf-4647-8788-ea7ba154375b_2012-07-17T04:45:18+00:00");
198 cpl->set_content_version_label_text ("81fb54df-e1bf-4647-8788-ea7ba154375b_2012-07-17T04:45:18+00:00");
199 cpl->set_issuer (xml_meta.issuer);
200 cpl->set_creator (xml_meta.creator);
201 cpl->set_issue_date (xml_meta.issue_date);
202 cpl->set_annotation_text (xml_meta.annotation_text);
204 shared_ptr<dcp::MonoPictureAsset> mp (new dcp::MonoPictureAsset (dcp::Fraction (24, 1), dcp::SMPTE));
205 mp->set_metadata (mxf_meta);
206 shared_ptr<dcp::PictureAssetWriter> picture_writer = mp->start_write ("build/test/DCP/dcp_test5/video.mxf", false);
207 dcp::File j2c ("test/data/32x32_red_square.j2c");
208 for (int i = 0; i < 24; ++i) {
209 picture_writer->write (j2c.data (), j2c.size ());
211 picture_writer->finalize ();
213 shared_ptr<dcp::SoundAsset> ms (new dcp::SoundAsset (dcp::Fraction (24, 1), 48000, 1, dcp::SMPTE));
214 ms->set_metadata (mxf_meta);
215 shared_ptr<dcp::SoundAssetWriter> sound_writer = ms->start_write ("build/test/DCP/dcp_test5/audio.mxf");
219 SNDFILE* sndfile = sf_open ("test/data/1s_24-bit_48k_silence.wav", SFM_READ, &info);
220 BOOST_CHECK (sndfile);
221 float buffer[4096*6];
223 channels[0] = buffer;
225 sf_count_t N = sf_readf_float (sndfile, buffer, 4096);
226 sound_writer->write (channels, N);
232 sound_writer->finalize ();
234 shared_ptr<dcp::AtmosAsset> am (new dcp::AtmosAsset (private_test / "20160218_NameOfFilm_FTR_OV_EN_A_dcs_r01.mxf"));
236 cpl->add (shared_ptr<dcp::Reel> (
238 shared_ptr<dcp::ReelMonoPictureAsset> (new dcp::ReelMonoPictureAsset (mp, 0)),
239 shared_ptr<dcp::ReelSoundAsset> (new dcp::ReelSoundAsset (ms, 0)),
240 shared_ptr<dcp::ReelSubtitleAsset> (),
241 shared_ptr<dcp::ReelMarkersAsset> (),
242 shared_ptr<dcp::ReelAtmosAsset> (new dcp::ReelAtmosAsset (am, 0))
248 xml_meta.annotation_text = "Created by libdcp";
249 d.write_xml (dcp::SMPTE, xml_meta);
251 /* build/test/DCP/dcp_test5 is checked against test/ref/DCP/dcp_test5 by run/tests */
254 /** Basic tests of reading a 2D DCP with an Atmos track */
255 BOOST_AUTO_TEST_CASE (dcp_test6)
257 dcp::DCP dcp ("test/ref/DCP/dcp_test5");
260 BOOST_REQUIRE_EQUAL (dcp.cpls().size(), 1);
261 BOOST_REQUIRE_EQUAL (dcp.cpls().front()->reels().size(), 1);
262 BOOST_CHECK (dcp.cpls().front()->reels().front()->main_picture());
263 BOOST_CHECK (dcp.cpls().front()->reels().front()->main_sound());
264 BOOST_CHECK (!dcp.cpls().front()->reels().front()->main_subtitle());
265 BOOST_CHECK (dcp.cpls().front()->reels().front()->atmos());
268 /** Test creation of a 2D Interop DCP from very simple inputs */
269 BOOST_AUTO_TEST_CASE (dcp_test7)
273 dcp::XMLMetadata xml_meta;
274 xml_meta.annotation_text = "Created by libdcp";
275 xml_meta.issuer = "OpenDCP 0.0.25";
276 xml_meta.creator = "OpenDCP 0.0.25";
277 xml_meta.issue_date = "2012-07-17T04:45:18+00:00";
278 make_simple("build/test/DCP/dcp_test7")->write_xml (dcp::INTEROP, xml_meta);
279 /* build/test/DCP/dcp_test7 is checked against test/ref/DCP/dcp_test7 by run/tests */
282 /** Test reading of a DCP with multiple CPLs */
283 BOOST_AUTO_TEST_CASE (dcp_test8)
285 dcp::DCP dcp (private_test / "data/SMPTE_TST-B1PB2P_S_EN-EN-CCAP_5171-HI-VI_2K_ISDCF_20151123_DPPT_SMPTE_combo/");
288 BOOST_REQUIRE_EQUAL (dcp.cpls().size(), 2);