summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2024-08-02 18:23:36 +0200
committerCarl Hetherington <cth@carlh.net>2024-08-02 18:23:36 +0200
commit7d9e108ba3629b2e9120bc1da3354935c41aca37 (patch)
treec8ffdb2bca75d62bfe9fa2262e9fc4cd19c45027 /src
parent6f98afd8021f9475bbd342bdcb39162b3167fa9e (diff)
WIP: more hacks.shared-ptr
Diffstat (limited to 'src')
-rw-r--r--src/asset_reader.h5
-rw-r--r--src/data.h13
-rw-r--r--src/frame.h10
-rw-r--r--src/mono_j2k_picture_asset.cc4
-rw-r--r--src/mono_j2k_picture_frame.cc21
-rw-r--r--src/mono_j2k_picture_frame.h8
-rw-r--r--src/mono_mpeg2_picture_frame.cc14
-rw-r--r--src/mono_mpeg2_picture_frame.h3
-rw-r--r--src/mpeg2_transcode.cc8
-rw-r--r--src/mpeg2_transcode.h2
-rw-r--r--src/sound_asset.cc10
-rw-r--r--src/stereo_j2k_picture_asset.cc48
-rw-r--r--src/stereo_j2k_picture_frame.cc40
-rw-r--r--src/stereo_j2k_picture_frame.h18
-rw-r--r--src/verify.cc10
-rw-r--r--src/verify_j2k.cc6
-rw-r--r--src/verify_j2k.h4
17 files changed, 134 insertions, 90 deletions
diff --git a/src/asset_reader.h b/src/asset_reader.h
index 091ac915..89f6c699 100644
--- a/src/asset_reader.h
+++ b/src/asset_reader.h
@@ -70,10 +70,9 @@ public:
delete _reader;
}
- std::shared_ptr<const F> get_frame (int n) const
+ F get_frame(int n) const
{
- /* Can't use make_shared here as the constructor is private */
- return std::shared_ptr<const F> (new F(_reader, n, _crypto_context, _check_hmac));
+ return F(_reader, n, _crypto_context, _check_hmac);
}
R* reader () const {
diff --git a/src/data.h b/src/data.h
index 063187a6..d8cd1fe6 100644
--- a/src/data.h
+++ b/src/data.h
@@ -48,6 +48,19 @@
namespace dcp {
+class ConstantData
+{
+public:
+ virtual ~ConstantData() {}
+
+ void write (boost::filesystem::path file) const;
+ void write_via_temp (boost::filesystem::path temp, boost::filesystem::path final) const;
+
+ virtual uint8_t const * data () const = 0;
+ virtual int size () const = 0;
+};
+
+
class Data
{
public:
diff --git a/src/frame.h b/src/frame.h
index d49be8f1..8a8a7814 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -65,6 +65,16 @@ public:
Frame (Frame const&) = delete;
Frame& operator= (Frame const&) = delete;
+ Frame(Frame&& other)
+ : _buffer(std::move(other._buffer))
+ {}
+
+ Frame& operator=(Frame&& other)
+ {
+ _buffer = std::move(other._buffer);
+ return *this;
+ }
+
uint8_t const * data () const
{
return _buffer.RoData();
diff --git a/src/mono_j2k_picture_asset.cc b/src/mono_j2k_picture_asset.cc
index f718525d..55c06b6a 100644
--- a/src/mono_j2k_picture_asset.cc
+++ b/src/mono_j2k_picture_asset.cc
@@ -164,8 +164,8 @@ MonoJ2KPictureAsset::equals(shared_ptr<const Asset> other, EqualityOptions const
if (!frame_buffer_equals (
i, opt, bind (&storing_note_handler, boost::ref(notes), _1, _2),
- frame_A->data(), frame_A->size(),
- frame_B->data(), frame_B->size()
+ frame_A.data(), frame_A.size(),
+ frame_B.data(), frame_B.size()
)) {
result = false;
}
diff --git a/src/mono_j2k_picture_frame.cc b/src/mono_j2k_picture_frame.cc
index c2b3cfd2..c7af0e2e 100644
--- a/src/mono_j2k_picture_frame.cc
+++ b/src/mono_j2k_picture_frame.cc
@@ -66,7 +66,7 @@ MonoJ2KPictureFrame::MonoJ2KPictureFrame (boost::filesystem::path path)
boost::throw_exception (FileError("could not open JPEG2000 file", path, errno));
}
- if (f.read(data(), 1, _buffer.Capacity()) != _buffer.Capacity()) {
+ if (f.read(_buffer.Data(), 1, _buffer.Capacity()) != _buffer.Capacity()) {
boost::throw_exception (FileError("could not read from JPEG2000 file", path, errno));
}
@@ -99,17 +99,24 @@ MonoJ2KPictureFrame::MonoJ2KPictureFrame (uint8_t const * data, int size)
}
-uint8_t const *
-MonoJ2KPictureFrame::data () const
+MonoJ2KPictureFrame::MonoJ2KPictureFrame(MonoJ2KPictureFrame&& other)
+ : _buffer(std::move(other._buffer))
{
- return _buffer.RoData();
+
}
-uint8_t *
-MonoJ2KPictureFrame::data ()
+MonoJ2KPictureFrame& MonoJ2KPictureFrame::operator=(MonoJ2KPictureFrame&& other)
{
- return _buffer.Data();
+ _buffer = std::move(other._buffer);
+ return *this;
+}
+
+
+uint8_t const *
+MonoJ2KPictureFrame::data () const
+{
+ return _buffer.RoData();
}
diff --git a/src/mono_j2k_picture_frame.h b/src/mono_j2k_picture_frame.h
index af2002a1..e5864c89 100644
--- a/src/mono_j2k_picture_frame.h
+++ b/src/mono_j2k_picture_frame.h
@@ -67,7 +67,7 @@ class OpenJPEGImage;
/** @class MonoJ2KPictureFrame
* @brief A single frame of a 2D (monoscopic) picture asset
*/
-class MonoJ2KPictureFrame : public Data
+class MonoJ2KPictureFrame : public ConstantData
{
public:
/** Make a picture frame from a JPEG2000 file.
@@ -79,6 +79,9 @@ public:
MonoJ2KPictureFrame (MonoJ2KPictureFrame const&) = delete;
MonoJ2KPictureFrame& operator= (MonoJ2KPictureFrame const&) = delete;
+ MonoJ2KPictureFrame(MonoJ2KPictureFrame&&);
+ MonoJ2KPictureFrame& operator=(MonoJ2KPictureFrame&&);
+
/** @param reduce a factor by which to reduce the resolution
* of the image, expressed as a power of two (pass 0 for no
* reduction).
@@ -88,9 +91,6 @@ public:
/** @return Pointer to JPEG2000 data */
uint8_t const * data () const override;
- /** @return Pointer to JPEG2000 data */
- uint8_t* data () override;
-
/** @return Size of JPEG2000 data in bytes */
int size () const override;
diff --git a/src/mono_mpeg2_picture_frame.cc b/src/mono_mpeg2_picture_frame.cc
index 6341ae4a..09942080 100644
--- a/src/mono_mpeg2_picture_frame.cc
+++ b/src/mono_mpeg2_picture_frame.cc
@@ -67,6 +67,20 @@ MonoMPEG2PictureFrame::MonoMPEG2PictureFrame(ASDCP::MPEG2::MXFReader* reader, in
}
+MonoMPEG2PictureFrame::MonoMPEG2PictureFrame(MonoMPEG2PictureFrame&& other)
+ : _buffer(std::move(other._buffer))
+{
+
+}
+
+
+MonoMPEG2PictureFrame& MonoMPEG2PictureFrame::operator=(MonoMPEG2PictureFrame&& other)
+{
+ _buffer = std::move(other._buffer);
+ return *this;
+}
+
+
uint8_t const *
MonoMPEG2PictureFrame::data() const
{
diff --git a/src/mono_mpeg2_picture_frame.h b/src/mono_mpeg2_picture_frame.h
index d0ec7bfc..aac2f007 100644
--- a/src/mono_mpeg2_picture_frame.h
+++ b/src/mono_mpeg2_picture_frame.h
@@ -51,6 +51,9 @@ public:
MonoMPEG2PictureFrame(MonoMPEG2PictureFrame const&) = delete;
MonoMPEG2PictureFrame& operator=(MonoMPEG2PictureFrame const&) = delete;
+ MonoMPEG2PictureFrame(MonoMPEG2PictureFrame&&);
+ MonoMPEG2PictureFrame& operator=(MonoMPEG2PictureFrame&&);
+
/* XXX: couldn't we just return the frame buffer */
/** @return Pointer to MPEG2 data */
diff --git a/src/mpeg2_transcode.cc b/src/mpeg2_transcode.cc
index 0ac2c1af..4e96dbe9 100644
--- a/src/mpeg2_transcode.cc
+++ b/src/mpeg2_transcode.cc
@@ -88,18 +88,18 @@ MPEG2Decompressor::~MPEG2Decompressor()
vector<FFmpegImage>
-MPEG2Decompressor::decompress_frame(shared_ptr<const MonoMPEG2PictureFrame> frame)
+MPEG2Decompressor::decompress_frame(MonoMPEG2PictureFrame const& frame)
{
/* XXX: can we avoid this? */
- auto copy = av_malloc(frame->size() + AV_INPUT_BUFFER_PADDING_SIZE);
+ auto copy = av_malloc(frame.size() + AV_INPUT_BUFFER_PADDING_SIZE);
if (!copy) {
throw std::bad_alloc();
}
- memcpy(copy, frame->data(), frame->size());
+ memcpy(copy, frame.data(), frame.size());
AVPacket packet;
av_init_packet(&packet);
- av_packet_from_data(&packet, reinterpret_cast<uint8_t*>(copy), frame->size());
+ av_packet_from_data(&packet, reinterpret_cast<uint8_t*>(copy), frame.size());
auto images = decompress_packet(&packet);
diff --git a/src/mpeg2_transcode.h b/src/mpeg2_transcode.h
index 1f13cfc3..80eb5237 100644
--- a/src/mpeg2_transcode.h
+++ b/src/mpeg2_transcode.h
@@ -73,7 +73,7 @@ public:
MPEG2Decompressor();
~MPEG2Decompressor();
- std::vector<FFmpegImage> decompress_frame(std::shared_ptr<const MonoMPEG2PictureFrame> frame);
+ std::vector<FFmpegImage> decompress_frame(MonoMPEG2PictureFrame const& frame);
std::vector<FFmpegImage> flush();
private:
diff --git a/src/sound_asset.cc b/src/sound_asset.cc
index c73255b8..d36db241 100644
--- a/src/sound_asset.cc
+++ b/src/sound_asset.cc
@@ -217,15 +217,15 @@ SoundAsset::equals(shared_ptr<const Asset> other, EqualityOptions const& opt, No
auto frame_A = reader->get_frame (i);
auto frame_B = other_reader->get_frame (i);
- if (frame_A->size() != frame_B->size()) {
+ if (frame_A.size() != frame_B.size()) {
note (NoteType::ERROR, String::compose ("sizes of audio data for frame %1 differ", i));
return false;
}
- if (memcmp (frame_A->data(), frame_B->data(), frame_A->size()) != 0) {
- for (int sample = 0; sample < frame_A->samples(); ++sample) {
- for (int channel = 0; channel < frame_A->channels(); ++channel) {
- int32_t const d = abs(frame_A->get(channel, sample) - frame_B->get(channel, sample));
+ if (memcmp(frame_A.data(), frame_B.data(), frame_A.size()) != 0) {
+ for (int sample = 0; sample < frame_A.samples(); ++sample) {
+ for (int channel = 0; channel < frame_A.channels(); ++channel) {
+ int32_t const d = abs(frame_A.get(channel, sample) - frame_B.get(channel, sample));
if (d > opt.max_audio_sample_error) {
note (NoteType::ERROR, String::compose("PCM data difference of %1 in frame %2, channel %3, sample %4", d, i, channel, sample));
return false;
diff --git a/src/stereo_j2k_picture_asset.cc b/src/stereo_j2k_picture_asset.cc
index 6a5e7d79..9c39f84c 100644
--- a/src/stereo_j2k_picture_asset.cc
+++ b/src/stereo_j2k_picture_asset.cc
@@ -143,11 +143,30 @@ StereoJ2KPictureAsset::equals(shared_ptr<const Asset> other, EqualityOptions con
bool result = true;
for (int i = 0; i < _intrinsic_duration; ++i) {
- shared_ptr<const StereoJ2KPictureFrame> frame_A;
- shared_ptr<const StereoJ2KPictureFrame> frame_B;
try {
- frame_A = reader->get_frame (i);
- frame_B = other_reader->get_frame (i);
+ auto frame_A = reader->get_frame(i);
+ auto frame_B = other_reader->get_frame(i);
+ if (!frame_buffer_equals (
+ i, opt, note,
+ frame_A.left().data(), frame_A.left().size(),
+ frame_B.left().data(), frame_B.left().size()
+ )) {
+ result = false;
+ if (!opt.keep_going) {
+ return result;
+ }
+ }
+
+ if (!frame_buffer_equals (
+ i, opt, note,
+ frame_A.right().data(), frame_A.right().size(),
+ frame_B.right().data(), frame_B.right().size()
+ )) {
+ result = false;
+ if (!opt.keep_going) {
+ return result;
+ }
+ }
} catch (ReadError& e) {
/* If there was a problem reading the frame data we'll just assume
the two frames are not equal.
@@ -156,27 +175,6 @@ StereoJ2KPictureAsset::equals(shared_ptr<const Asset> other, EqualityOptions con
return false;
}
- if (!frame_buffer_equals (
- i, opt, note,
- frame_A->left()->data(), frame_A->left()->size(),
- frame_B->left()->data(), frame_B->left()->size()
- )) {
- result = false;
- if (!opt.keep_going) {
- return result;
- }
- }
-
- if (!frame_buffer_equals (
- i, opt, note,
- frame_A->right()->data(), frame_A->right()->size(),
- frame_B->right()->data(), frame_B->right()->size()
- )) {
- result = false;
- if (!opt.keep_going) {
- return result;
- }
- }
}
return result;
diff --git a/src/stereo_j2k_picture_frame.cc b/src/stereo_j2k_picture_frame.cc
index 8e09888a..fccd9983 100644
--- a/src/stereo_j2k_picture_frame.cc
+++ b/src/stereo_j2k_picture_frame.cc
@@ -55,7 +55,7 @@ using std::make_shared;
using namespace dcp;
-StereoJ2KPictureFrame::Part::Part (shared_ptr<ASDCP::JP2K::SFrameBuffer> buffer, Eye eye)
+StereoJ2KPictureFrame::Part::Part(ASDCP::JP2K::SFrameBuffer const& buffer, Eye eye)
: _buffer (buffer)
, _eye (eye)
{
@@ -63,10 +63,10 @@ StereoJ2KPictureFrame::Part::Part (shared_ptr<ASDCP::JP2K::SFrameBuffer> buffer,
}
-ASDCP::JP2K::FrameBuffer &
+ASDCP::JP2K::FrameBuffer const&
StereoJ2KPictureFrame::Part::mono () const
{
- return _eye == Eye::LEFT ? _buffer->Left : _buffer->Right;
+ return _eye == Eye::LEFT ? _buffer.Left : _buffer.Right;
}
@@ -77,13 +77,6 @@ StereoJ2KPictureFrame::Part::data () const
}
-uint8_t *
-StereoJ2KPictureFrame::Part::data ()
-{
- return mono().Data();
-}
-
-
int
StereoJ2KPictureFrame::Part::size () const
{
@@ -97,19 +90,24 @@ StereoJ2KPictureFrame::Part::size () const
* @param check_hmac true to check the HMAC and give an error if it is not as expected.
*/
StereoJ2KPictureFrame::StereoJ2KPictureFrame (ASDCP::JP2K::MXFSReader* reader, int n, shared_ptr<DecryptionContext> c, bool check_hmac)
+ : _buffer(4 * Kumu::Megabyte)
{
- /* XXX: unfortunate guesswork on this buffer size */
- _buffer = make_shared<ASDCP::JP2K::SFrameBuffer>(4 * Kumu::Megabyte);
-
- if (ASDCP_FAILURE (reader->ReadFrame (n, *_buffer, c->context(), check_hmac ? c->hmac() : nullptr))) {
+ if (ASDCP_FAILURE(reader->ReadFrame(n, _buffer, c->context(), check_hmac ? c->hmac() : nullptr))) {
boost::throw_exception (ReadError (String::compose ("could not read video frame %1 of %2", n)));
}
}
StereoJ2KPictureFrame::StereoJ2KPictureFrame ()
+ : _buffer(4 * Kumu::Megabyte)
{
- _buffer = make_shared<ASDCP::JP2K::SFrameBuffer>(4 * Kumu::Megabyte);
+}
+
+
+StereoJ2KPictureFrame::StereoJ2KPictureFrame(StereoJ2KPictureFrame&& other)
+ : _buffer(std::move(other._buffer))
+{
+
}
@@ -123,26 +121,26 @@ StereoJ2KPictureFrame::xyz_image (Eye eye, int reduce) const
{
switch (eye) {
case Eye::LEFT:
- return decompress_j2k(_buffer->Left.RoData(), _buffer->Left.Size(), reduce);
+ return decompress_j2k(_buffer.Left.RoData(), _buffer.Left.Size(), reduce);
case Eye::RIGHT:
- return decompress_j2k(_buffer->Right.RoData(), _buffer->Right.Size(), reduce);
+ return decompress_j2k(_buffer.Right.RoData(), _buffer.Right.Size(), reduce);
}
return {};
}
-shared_ptr<StereoJ2KPictureFrame::Part>
+StereoJ2KPictureFrame::Part
StereoJ2KPictureFrame::right () const
{
- return make_shared<Part>(_buffer, Eye::RIGHT);
+ return Part(_buffer, Eye::RIGHT);
}
-shared_ptr<StereoJ2KPictureFrame::Part>
+StereoJ2KPictureFrame::Part
StereoJ2KPictureFrame::left () const
{
- return make_shared<Part>(_buffer, Eye::LEFT);
+ return Part(_buffer, Eye::LEFT);
}
diff --git a/src/stereo_j2k_picture_frame.h b/src/stereo_j2k_picture_frame.h
index 193960f3..e1291314 100644
--- a/src/stereo_j2k_picture_frame.h
+++ b/src/stereo_j2k_picture_frame.h
@@ -75,28 +75,30 @@ public:
StereoJ2KPictureFrame (StereoJ2KPictureFrame const &) = delete;
StereoJ2KPictureFrame& operator= (StereoJ2KPictureFrame const &) = delete;
+ StereoJ2KPictureFrame(StereoJ2KPictureFrame&&);
+ StereoJ2KPictureFrame& operator=(StereoJ2KPictureFrame&&);
+
std::shared_ptr<OpenJPEGImage> xyz_image (Eye eye, int reduce = 0) const;
- class Part : public Data
+ class Part : public ConstantData
{
public:
- Part (std::shared_ptr<ASDCP::JP2K::SFrameBuffer> buffer, Eye eye);
+ Part(ASDCP::JP2K::SFrameBuffer const& buffer, Eye eye);
uint8_t const * data () const override;
- uint8_t * data () override;
int size () const override;
private:
friend class StereoJ2KPictureFrame;
- ASDCP::JP2K::FrameBuffer& mono () const;
+ ASDCP::JP2K::FrameBuffer const& mono() const;
- std::shared_ptr<ASDCP::JP2K::SFrameBuffer> _buffer;
+ ASDCP::JP2K::SFrameBuffer const& _buffer;
Eye _eye;
};
- std::shared_ptr<Part> left () const;
- std::shared_ptr<Part> right () const;
+ Part left() const;
+ Part right() const;
private:
/* XXX: this is a bit of a shame, but I tried friend StereoJ2KPictureAssetReader and it's
@@ -106,7 +108,7 @@ private:
StereoJ2KPictureFrame (ASDCP::JP2K::MXFSReader* reader, int n, std::shared_ptr<DecryptionContext>, bool check_hmac);
- std::shared_ptr<ASDCP::JP2K::SFrameBuffer> _buffer;
+ ASDCP::JP2K::SFrameBuffer _buffer;
};
diff --git a/src/verify.cc b/src/verify.cc
index 1e27514a..a1eccd23 100644
--- a/src/verify.cc
+++ b/src/verify.cc
@@ -564,7 +564,7 @@ verify_picture_asset(
auto reader = mono_asset->start_read ();
for (int64_t i = 0; i < duration; ++i) {
auto frame = reader->get_frame (i);
- check_frame_size(context, i, frame->size(), mono_asset->frame_rate().numerator);
+ check_frame_size(context, i, frame.size(), mono_asset->frame_rate().numerator);
if (!mono_asset->encrypted() || mono_asset->key()) {
vector<VerificationNote> j2k_notes;
verify_j2k(frame, start_frame, i, mono_asset->frame_rate().numerator, j2k_notes);
@@ -576,12 +576,12 @@ verify_picture_asset(
auto reader = stereo_asset->start_read ();
for (int64_t i = 0; i < duration; ++i) {
auto frame = reader->get_frame (i);
- check_frame_size(context, i, frame->left()->size(), stereo_asset->frame_rate().numerator);
- check_frame_size(context, i, frame->right()->size(), stereo_asset->frame_rate().numerator);
+ check_frame_size(context, i, frame.left().size(), stereo_asset->frame_rate().numerator);
+ check_frame_size(context, i, frame.right().size(), stereo_asset->frame_rate().numerator);
if (!stereo_asset->encrypted() || stereo_asset->key()) {
vector<VerificationNote> j2k_notes;
- verify_j2k(frame->left(), start_frame, i, stereo_asset->frame_rate().numerator, j2k_notes);
- verify_j2k(frame->right(), start_frame, i, stereo_asset->frame_rate().numerator, j2k_notes);
+ verify_j2k(frame.left(), start_frame, i, stereo_asset->frame_rate().numerator, j2k_notes);
+ verify_j2k(frame.right(), start_frame, i, stereo_asset->frame_rate().numerator, j2k_notes);
check_and_add (j2k_notes);
}
context.progress(float(i) / duration);
diff --git a/src/verify_j2k.cc b/src/verify_j2k.cc
index 47ee151c..12179c8d 100644
--- a/src/verify_j2k.cc
+++ b/src/verify_j2k.cc
@@ -65,14 +65,14 @@ public:
void
-dcp::verify_j2k(shared_ptr<const Data> j2k, int start_index, int frame_index, int frame_rate, vector<VerificationNote>& notes)
+dcp::verify_j2k(ConstantData const& j2k, int start_index, int frame_index, int frame_rate, vector<VerificationNote>& notes)
{
/* See ITU-T T800 (visible on https://github.com/Ymagis/ClairMeta/issues/130) */
unsigned int const max_tile_part_size = std::floor(200e6 / (8 * frame_rate));
try {
- auto ptr = j2k->data();
- auto end = ptr + j2k->size();
+ auto ptr = j2k.data();
+ auto end = ptr + j2k.size();
map<string, uint8_t> markers = {
{ "SOC", 0x4f },
diff --git a/src/verify_j2k.h b/src/verify_j2k.h
index dbfc488b..02efc815 100644
--- a/src/verify_j2k.h
+++ b/src/verify_j2k.h
@@ -48,7 +48,7 @@
namespace dcp {
-class Data;
+class ConstantData;
/** @param start_index Frame index within the DCP where this frame's reel starts.
@@ -56,7 +56,7 @@ class Data;
* @param frame_rate Video frame rate (in frames per second) to calculate how big the tile parts
* can be.
*/
-void verify_j2k(std::shared_ptr<const Data> data, int start_index, int frame_index, int frame_rate, std::vector<VerificationNote>& notes);
+void verify_j2k(ConstantData const& data, int start_index, int frame_index, int frame_rate, std::vector<VerificationNote>& notes);
}