summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2026-03-22 21:49:51 +0100
committerCarl Hetherington <cth@carlh.net>2026-03-22 23:51:00 +0100
commitf5d9e1e12f0fd3c25ca921e60126443b3a2cd240 (patch)
tree16d16a38cca642419bb8b0153123f1d57d532b73
parent2fca6ad9716429660e7162807582db00c3ca6865 (diff)
Use a dcp::Fraction for verification note frame rate.
-rw-r--r--src/verify.cc10
-rw-r--r--src/verify.h7
-rw-r--r--src/verify_j2k.cc4
-rw-r--r--test/verify_test.cc28
4 files changed, 31 insertions, 18 deletions
diff --git a/src/verify.cc b/src/verify.cc
index 59208779..23d05633 100644
--- a/src/verify.cc
+++ b/src/verify.cc
@@ -480,14 +480,14 @@ verify_picture_details(
context.add_note(
VerificationNote(
VerificationNote::Code::INVALID_PICTURE_FRAME_SIZE_IN_BYTES, file
- ).set_frame(start_frame + index).set_frame_rate(frame_rate).set_reel_index(0)
+ ).set_frame(start_frame + index).set_frame_rate(dcp::Fraction(frame_rate, 1)).set_reel_index(0)
);
any_bad_frames_seen = true;
} else if (size > risky_frame) {
context.add_note(
VerificationNote(
VerificationNote::Code::NEARLY_INVALID_PICTURE_FRAME_SIZE_IN_BYTES, file
- ).set_frame(start_frame + index).set_frame_rate(frame_rate).set_reel_index(0)
+ ).set_frame(start_frame + index).set_frame_rate(dcp::Fraction(frame_rate, 1)).set_reel_index(0)
);
any_bad_frames_seen = true;
}
@@ -1981,14 +1981,14 @@ dcp::note_to_string(VerificationNote note, function<string (string)> process_str
return compose(
"Frame %1 (timecode %2) in asset %3 has an instantaneous bit rate that is larger than the limit of 250Mbit/s.",
note.frame().get(),
- dcp::Time(note.frame().get(), note.frame_rate().get(), note.frame_rate().get()).as_string(dcp::Standard::SMPTE),
+ dcp::Time(note.frame().get(), note.frame_rate()->as_float(), note.frame_rate()->numerator).as_string(dcp::Standard::SMPTE),
filename()
);
case VerificationNote::Code::NEARLY_INVALID_PICTURE_FRAME_SIZE_IN_BYTES:
return compose(
"Frame %1 (timecode %2) in asset %3 has an instantaneous bit rate that is close to the limit of 250Mbit/s.",
note.frame().get(),
- dcp::Time(note.frame().get(), note.frame_rate().get(), note.frame_rate().get()).as_string(dcp::Standard::SMPTE),
+ dcp::Time(note.frame().get(), note.frame_rate()->as_float(), note.frame_rate()->numerator).as_string(dcp::Standard::SMPTE),
filename()
);
case VerificationNote::Code::EXTERNAL_ASSET:
@@ -2107,7 +2107,7 @@ dcp::note_to_string(VerificationNote note, function<string (string)> process_str
return compose(
"Frame %1 (timecode %2) has an invalid JPEG2000 codestream (%3).",
note.frame().get(),
- dcp::Time(note.frame().get(), note.frame_rate().get(), note.frame_rate().get()).as_string(dcp::Standard::SMPTE),
+ dcp::Time(note.frame().get(), note.frame_rate()->as_float(), note.frame_rate()->numerator).as_string(dcp::Standard::SMPTE),
note.note().get()
);
case VerificationNote::Code::INVALID_JPEG2000_GUARD_BITS_FOR_2K:
diff --git a/src/verify.h b/src/verify.h
index af84a77f..ad74f1f2 100644
--- a/src/verify.h
+++ b/src/verify.h
@@ -42,6 +42,7 @@
#include "decrypted_kdm.h"
+#include "types.h"
#include <boost/any.hpp>
#include <boost/filesystem.hpp>
#include <boost/function.hpp>
@@ -711,13 +712,13 @@ public:
return data<std::string>(Data::OTHER_ASSET_ID);
}
- VerificationNote& set_frame_rate(int frame_rate) {
+ VerificationNote& set_frame_rate(dcp::Fraction frame_rate) {
_data[Data::FRAME_RATE] = frame_rate;
return *this;
}
- boost::optional<int> frame_rate() const {
- return data<int>(Data::FRAME_RATE);
+ boost::optional<dcp::Fraction> frame_rate() const {
+ return data<dcp::Fraction>(Data::FRAME_RATE);
}
VerificationNote& set_calculated_hash(std::string hash) {
diff --git a/src/verify_j2k.cc b/src/verify_j2k.cc
index dcea6f60..c53a1af0 100644
--- a/src/verify_j2k.cc
+++ b/src/verify_j2k.cc
@@ -225,7 +225,7 @@ dcp::verify_j2k(shared_ptr<const Data> j2k, int start_index, int frame_index, in
if (tile_part_length > max_tile_part_size) {
VerificationNote note{VerificationNote::Code::INVALID_JPEG2000_TILE_PART_SIZE};
note.set_frame(frame_index);
- note.set_frame_rate(frame_rate);
+ note.set_frame_rate(dcp::Fraction(frame_rate, 1));
note.set_component(tile_part_index);
note.set_size(tile_part_length);
notes.push_back(note);
@@ -368,7 +368,7 @@ dcp::verify_j2k(shared_ptr<const Data> j2k, int start_index, int frame_index, in
{
VerificationNote note({VerificationNote::Code::INVALID_JPEG2000_CODESTREAM, string(e.what())});
note.set_frame(start_index + frame_index);
- note.set_frame_rate(frame_rate);
+ note.set_frame_rate(dcp::Fraction(frame_rate, 1));
notes.push_back(note);
}
}
diff --git a/test/verify_test.cc b/test/verify_test.cc
index 5472f38e..3d7da1b5 100644
--- a/test/verify_test.cc
+++ b/test/verify_test.cc
@@ -1114,13 +1114,19 @@ BOOST_AUTO_TEST_CASE (verify_invalid_picture_frame_size_in_bytes)
for (auto i = 0; i < 24; ++i) {
expected.push_back(
- VN(VC::INVALID_JPEG2000_CODESTREAM, string("missing marker start byte")).set_frame(i).set_frame_rate(24).set_cpl_id(cpl->id()).set_reel_index(0)
+ VN(
+ VC::INVALID_JPEG2000_CODESTREAM,
+ string("missing marker start byte")
+ ).set_frame(i).set_frame_rate(dcp::Fraction(24, 1)).set_cpl_id(cpl->id()).set_reel_index(0)
);
}
for (auto i = 0; i < 24; ++i) {
expected.push_back(
- VN(VC::INVALID_PICTURE_FRAME_SIZE_IN_BYTES, canonical(dir / "pic.mxf")).set_frame(i).set_frame_rate(24).set_cpl_id(cpl->id()).set_reel_index(0)
+ VN(
+ VC::INVALID_PICTURE_FRAME_SIZE_IN_BYTES,
+ canonical(dir / "pic.mxf")
+ ).set_frame(i).set_frame_rate(dcp::Fraction(24, 1)).set_cpl_id(cpl->id()).set_reel_index(0)
);
}
@@ -1164,13 +1170,19 @@ BOOST_AUTO_TEST_CASE (verify_nearly_invalid_picture_frame_size_in_bytes)
for (auto i = 0; i < 24; ++i) {
expected.push_back(
- VN(VC::INVALID_JPEG2000_CODESTREAM, string("missing marker start byte")).set_frame(i).set_frame_rate(24).set_cpl_id(cpl->id()).set_reel_index(0)
+ VN(
+ VC::INVALID_JPEG2000_CODESTREAM,
+ string("missing marker start byte")
+ ).set_frame(i).set_frame_rate(dcp::Fraction(24, 1)).set_cpl_id(cpl->id()).set_reel_index(0)
);
}
for (auto i = 0; i < 24; ++i) {
expected.push_back(
- VN(VC::NEARLY_INVALID_PICTURE_FRAME_SIZE_IN_BYTES, canonical(dir / "pic.mxf")).set_frame(i).set_frame_rate(24).set_cpl_id(cpl->id()).set_reel_index(0)
+ VN(
+ VC::NEARLY_INVALID_PICTURE_FRAME_SIZE_IN_BYTES,
+ canonical(dir / "pic.mxf")
+ ).set_frame(i).set_frame_rate(dcp::Fraction(24, 1)).set_cpl_id(cpl->id()).set_reel_index(0)
);
}
@@ -5522,7 +5534,7 @@ BOOST_AUTO_TEST_CASE(verify_invalid_tile_part_size)
for (auto frame = 0; frame < 24; frame++) {
expected.push_back(
VN(VC::INVALID_PICTURE_FRAME_SIZE_IN_BYTES, canonical(path / "video.mxf")
- ).set_frame(frame).set_frame_rate(24).set_cpl_id(cpl->id()).set_reel_index(0)
+ ).set_frame(frame).set_frame_rate(dcp::Fraction(24, 1)).set_cpl_id(cpl->id()).set_reel_index(0)
);
}
@@ -5535,9 +5547,9 @@ BOOST_AUTO_TEST_CASE(verify_invalid_tile_part_size)
for (auto frame = 0; frame < 24; frame++) {
for (auto component = 0; component < 3; component++) {
expected.push_back(
- VN(
- VC::INVALID_JPEG2000_TILE_PART_SIZE
- ).set_frame(frame).set_frame_rate(24).set_component(component).set_size(component_sizes[component]).set_cpl_id(cpl->id()).set_reel_index(0)
+ VN(VC::INVALID_JPEG2000_TILE_PART_SIZE)
+ .set_frame(frame).set_frame_rate(dcp::Fraction(24, 1)).set_component(component)
+ .set_size(component_sizes[component]).set_cpl_id(cpl->id()).set_reel_index(0)
);
}
}