summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2025-12-17 18:23:45 +0100
committerCarl Hetherington <cth@carlh.net>2025-12-18 12:54:28 +0100
commit360a935d7422c0fae0c85f32447e751f26fc37d5 (patch)
tree71012097ba0425ede0a16d48dbaa98aaceb9ccc2
parent3a001037ec1131c236b253d16bfc2c3bc8f36212 (diff)
Add CPL::picture_encoding().
-rw-r--r--src/cpl.cc28
-rw-r--r--src/cpl.h4
-rw-r--r--test/cpl_test.cc26
3 files changed, 58 insertions, 0 deletions
diff --git a/src/cpl.cc b/src/cpl.cc
index ea49eb34..46d73c47 100644
--- a/src/cpl.cc
+++ b/src/cpl.cc
@@ -850,3 +850,31 @@ CPL::can_be_read() const
return std::all_of(r.begin(), r.end(), [](shared_ptr<const Reel> reel) { return reel->can_be_read(); });
}
+
+PictureEncoding
+CPL::picture_encoding() const
+{
+ PictureEncoding encoding = PictureEncoding::NO_VIDEO;
+
+ for (auto reel: reels()) {
+ auto const reel_encoding = reel->picture_encoding();
+ switch (reel_encoding) {
+ case PictureEncoding::NO_VIDEO:
+ break;
+ case PictureEncoding::JPEG2000:
+ case PictureEncoding::MPEG2:
+ if (encoding == PictureEncoding::NO_VIDEO) {
+ encoding = reel_encoding;
+ } else if (encoding != reel_encoding) {
+ encoding = PictureEncoding::MIXED;
+ }
+ break;
+ case PictureEncoding::MIXED:
+ encoding = PictureEncoding::MIXED;
+ break;
+ }
+ }
+
+ return encoding;
+}
+
diff --git a/src/cpl.h b/src/cpl.h
index f13bb9c6..c7e41353 100644
--- a/src/cpl.h
+++ b/src/cpl.h
@@ -47,6 +47,7 @@
#include "key.h"
#include "language_tag.h"
#include "main_sound_configuration.h"
+#include "picture_encoding.h"
#include "profile.h"
#include "rating.h"
#include "verify.h"
@@ -352,6 +353,9 @@ public:
return _read_composition_metadata;
}
+ /** @return picture encoding scheme used by assets in this CPL */
+ PictureEncoding picture_encoding() const;
+
static std::string static_pkl_type(Standard standard);
protected:
diff --git a/test/cpl_test.cc b/test/cpl_test.cc
index 25b3306b..105f30fe 100644
--- a/test/cpl_test.cc
+++ b/test/cpl_test.cc
@@ -76,3 +76,29 @@ BOOST_AUTO_TEST_CASE(interop_cpl_with_metadata_test)
BOOST_CHECK_EQUAL(cpl.annotation_text().get_value_or(""), "EyeLeader2sec_XSN_F-133_XX-XX_MOS_4K_20230124_EYE_IOP_OV");
}
+
+BOOST_AUTO_TEST_CASE(cpl_picture_encoding_test1)
+{
+ dcp::DCP dcp(private_test / "TONEPLATES-SMPTE-PLAINTEXT_TST_F_XX-XX_ITL-TD_51-XX_2K_WOE_20111001_WOE_OV");
+ dcp.read();
+ BOOST_REQUIRE_EQUAL(dcp.cpls().size(), 1U);
+ BOOST_CHECK(dcp.cpls()[0]->picture_encoding() == dcp::PictureEncoding::JPEG2000);
+}
+
+
+BOOST_AUTO_TEST_CASE(cpl_picture_encoding_test2)
+{
+ dcp::DCP dcp(private_test / "data" / "mas");
+ dcp.read();
+ BOOST_REQUIRE_EQUAL(dcp.cpls().size(), 1U);
+ BOOST_CHECK(dcp.cpls()[0]->picture_encoding() == dcp::PictureEncoding::MPEG2);
+}
+
+
+BOOST_AUTO_TEST_CASE(cpl_picture_encoding_test3)
+{
+ dcp::DCP dcp(private_test / "data" / "SMPTE_TST-1-Bv21_S_EN-EN-CCAP_US_51-HI-VI_2K_ISDCF_20170110_DTB_SMPTE_OV");
+ dcp.read();
+ BOOST_REQUIRE_EQUAL(dcp.cpls().size(), 1U);
+ BOOST_CHECK(dcp.cpls()[0]->picture_encoding() == dcp::PictureEncoding::JPEG2000);
+}