From bc8f5448441a85605f052294d40cf947473e83f5 Mon Sep 17 00:00:00 2001 From: milla Date: Thu, 3 Jun 2021 14:23:52 +0200 Subject: [PATCH 1/2] Templatize h__AS02WriteClip, move functions to header. Note that this depends on filereader pluggable at runtime commit as the reader is called as a pointer here. --- src/AS_02_PCM.cpp | 6 +- src/AS_02_TimedText.cpp | 4 +- src/AS_02_internal.h | 119 +++++++++++++++++++++++++++++++++++----- src/h__02_Writer.cpp | 86 ----------------------------- 4 files changed, 109 insertions(+), 106 deletions(-) diff --git a/src/AS_02_PCM.cpp b/src/AS_02_PCM.cpp index d034ffb2..841f1033 100644 --- a/src/AS_02_PCM.cpp +++ b/src/AS_02_PCM.cpp @@ -326,7 +326,7 @@ AS_02::PCM::MXFReader::DumpIndex(FILE* stream) const //------------------------------------------------------------------------------------------ // -class AS_02::PCM::MXFWriter::h__Writer : public AS_02::h__AS02WriterClip +class AS_02::PCM::MXFWriter::h__Writer : public AS_02::h__AS02WriterClip { ASDCP_NO_COPY_CONSTRUCT(h__Writer); h__Writer(); @@ -335,8 +335,8 @@ class AS_02::PCM::MXFWriter::h__Writer : public AS_02::h__AS02WriterClip ASDCP::MXF::WaveAudioDescriptor *m_WaveAudioDescriptor; byte_t m_EssenceUL[SMPTE_UL_LENGTH]; ui32_t m_BytesPerSample; - - h__Writer(const Dictionary *d) : AS_02::h__AS02WriterClip(d), m_WaveAudioDescriptor(0), m_BytesPerSample(0) + + h__Writer(const Dictionary *d) : AS_02::h__AS02WriterClip(d), m_WaveAudioDescriptor(0), m_BytesPerSample(0) { memset(m_EssenceUL, 0, SMPTE_UL_LENGTH); } diff --git a/src/AS_02_TimedText.cpp b/src/AS_02_TimedText.cpp index aa593a14..5b67c329 100644 --- a/src/AS_02_TimedText.cpp +++ b/src/AS_02_TimedText.cpp @@ -386,7 +386,7 @@ AS_02::TimedText::MXFReader::Close() const // -class AS_02::TimedText::MXFWriter::h__Writer : public AS_02::h__AS02WriterClip +class AS_02::TimedText::MXFWriter::h__Writer : public AS_02::h__AS02WriterClip { ASDCP_NO_COPY_CONSTRUCT(h__Writer); h__Writer(); @@ -397,7 +397,7 @@ class AS_02::TimedText::MXFWriter::h__Writer : public AS_02::h__AS02WriterClip ui32_t m_EssenceStreamID; ASDCP::Rational m_EditRate; - h__Writer(const Dictionary *d) : AS_02::h__AS02WriterClip(d), m_EssenceStreamID(10) + h__Writer(const Dictionary *d) : AS_02::h__AS02WriterClip(d), m_EssenceStreamID(10) { memset(m_EssenceUL, 0, SMPTE_UL_LENGTH); } diff --git a/src/AS_02_internal.h b/src/AS_02_internal.h index ba7c33dd..778ac7bc 100644 --- a/src/AS_02_internal.h +++ b/src/AS_02_internal.h @@ -296,7 +296,7 @@ namespace AS_02 } }; - // + // class h__AS02WriterFrame : public h__AS02Writer { ASDCP_NO_COPY_CONSTRUCT(h__AS02WriterFrame); @@ -314,23 +314,112 @@ namespace AS_02 }; // - class h__AS02WriterClip : public h__AS02Writer + template + class h__AS02WriterClip : public h__AS02Writer { ASDCP_NO_COPY_CONSTRUCT(h__AS02WriterClip); - h__AS02WriterClip(); + h__AS02WriterClip() {} public: - ui64_t m_ECStart; // offset of the first essence element - ui64_t m_ClipStart; // state variable for clip-wrap-in-progress - IndexStrategy_t m_IndexStrategy; // per SMPTE ST 2067-5 - - h__AS02WriterClip(const Dictionary*); - virtual ~h__AS02WriterClip(); - - bool HasOpenClip() const; - Result_t StartClip(const byte_t* EssenceUL, AESEncContext* Ctx, HMACContext* HMAC); - Result_t WriteClipBlock(const ASDCP::FrameBuffer& FrameBuf); - Result_t FinalizeClip(ui32_t bytes_per_frame); + ui64_t m_ECStart; // offset of the first essence element + ui64_t m_ClipStart; // state variable for clip-wrap-in-progress + IndexStrategy_t m_IndexStrategy; // per SMPTE ST 2067-5 + + h__AS02WriterClip(const Dictionary* d) : + h__AS02Writer(d), + m_ECStart(0), m_ClipStart(0), m_IndexStrategy(AS_02::IS_FOLLOW) + {} + virtual ~h__AS02WriterClip() + {} + + bool HasOpenClip() const { return m_ClipStart != 0; } + Result_t StartClip(const byte_t* EssenceUL, AESEncContext* Ctx, HMACContext* HMAC) + { + if (Ctx != 0) + { + DefaultLogSink().Error("Encryption not yet supported for PCM clip-wrap.\n"); + return RESULT_STATE; + } + + if (m_ClipStart != 0) + { + DefaultLogSink().Error("Cannot open clip, clip already open.\n"); + return RESULT_STATE; + } + + m_ClipStart = h__AS02Writer::m_File.TellPosition(); + byte_t clip_buffer[24] = { 0 }; + memcpy(clip_buffer, EssenceUL, 16); + bool check = Kumu::write_BER(clip_buffer + 16, 0, 8); + assert(check); + return h__AS02Writer::m_File.Write(clip_buffer, 24); + } + Result_t WriteClipBlock(const ASDCP::FrameBuffer& FrameBuf) + { + if (m_ClipStart == 0) + { + DefaultLogSink().Error("Cannot write clip block, no clip open.\n"); + return RESULT_STATE; + } + + return h__AS02Writer::m_File.Write(FrameBuf.RoData(), FrameBuf.Size()); + } + Result_t FinalizeClip(ui32_t bytes_per_frame) + { + if (m_ClipStart == 0) + { + DefaultLogSink().Error("Cannot close clip, clip not open.\n"); + return RESULT_STATE; + } + + ui64_t current_position = h__AS02Writer::m_File.TellPosition(); + Result_t result = h__AS02Writer::m_File.Seek(m_ClipStart + 16); + + if (KM_SUCCESS(result)) + { + byte_t clip_buffer[8] = { 0 }; + ui64_t size = static_cast(h__AS02Writer::m_FramesWritten) * bytes_per_frame; + bool check = Kumu::write_BER(clip_buffer, size, 8); + assert(check); + result = h__AS02Writer::m_File.Write(clip_buffer, 8); + } + + if (KM_SUCCESS(result)) + { + result = h__AS02Writer::m_File.Seek(current_position); + m_ClipStart = 0; + } + + return result; + } + Result_t FinalizeClip(ui64_t total_bytes_written) + { + if (m_ClipStart == 0) + { + DefaultLogSink().Error("Cannot close clip, clip not open.\n"); + return RESULT_STATE; + } + + ui64_t current_position = h__AS02Writer::m_File.TellPosition(); + Result_t result = h__AS02Writer::m_File.Seek(m_ClipStart + 16); + + if (KM_SUCCESS(result)) + { + byte_t clip_buffer[8] = { 0 }; + bool check = Kumu::write_BER(clip_buffer, total_bytes_written, 8); + assert(check); + result = h__AS02Writer::m_File.Write(clip_buffer, 8); + } + + if (KM_SUCCESS(result)) + { + result = h__AS02Writer::m_File.Seek(current_position); + m_ClipStart = 0; + } + + return result; + + } }; } // namespace AS_02 @@ -339,4 +428,4 @@ namespace AS_02 // // end AS_02_internal.h -// +// \ No newline at end of file diff --git a/src/h__02_Writer.cpp b/src/h__02_Writer.cpp index e35727e4..8043ebdc 100644 --- a/src/h__02_Writer.cpp +++ b/src/h__02_Writer.cpp @@ -309,89 +309,3 @@ AS_02::MXF::AS02IndexWriterCBR::SetEditRate(const ASDCP::Rational& edit_rate, co //------------------------------------------------------------------------------------------ // - -// -AS_02::h__AS02WriterClip::h__AS02WriterClip(const ASDCP::Dictionary* d) : - h__AS02Writer(d), - m_ECStart(0), m_ClipStart(0), m_IndexStrategy(AS_02::IS_FOLLOW) {} - -AS_02::h__AS02WriterClip::~h__AS02WriterClip() {} - -// -bool -AS_02::h__AS02WriterClip::HasOpenClip() const -{ - return m_ClipStart != 0; -} - -// -Result_t -AS_02::h__AS02WriterClip::StartClip(const byte_t* EssenceUL, AESEncContext* Ctx, HMACContext*) -{ - if ( Ctx != 0 ) - { - DefaultLogSink().Error("Encryption not yet supported for PCM clip-wrap.\n"); - return RESULT_STATE; - } - - if ( m_ClipStart != 0 ) - { - DefaultLogSink().Error("Cannot open clip, clip already open.\n"); - return RESULT_STATE; - } - - m_ClipStart = m_File.Tell(); - byte_t clip_buffer[24] = {0}; - memcpy(clip_buffer, EssenceUL, 16); - bool check = Kumu::write_BER(clip_buffer+16, 0, 8); - assert(check); - return m_File.Write(clip_buffer, 24); -} - -// -Result_t -AS_02::h__AS02WriterClip::WriteClipBlock(const ASDCP::FrameBuffer& FrameBuf) -{ - if ( m_ClipStart == 0 ) - { - DefaultLogSink().Error("Cannot write clip block, no clip open.\n"); - return RESULT_STATE; - } - - return m_File.Write(FrameBuf.RoData(), FrameBuf.Size()); -} - -// -Result_t -AS_02::h__AS02WriterClip::FinalizeClip(ui32_t bytes_per_frame) -{ - if ( m_ClipStart == 0 ) - { - DefaultLogSink().Error("Cannot close clip, clip not open.\n"); - return RESULT_STATE; - } - - ui64_t current_position = m_File.Tell(); - Result_t result = m_File.Seek(m_ClipStart+16); - - if ( KM_SUCCESS(result) ) - { - byte_t clip_buffer[8] = {0}; - ui64_t size = static_cast(m_FramesWritten) * bytes_per_frame; - bool check = Kumu::write_BER(clip_buffer, size, 8); - assert(check); - result = m_File.Write(clip_buffer, 8); - } - - if ( KM_SUCCESS(result) ) - { - result = m_File.Seek(current_position); - m_ClipStart = 0; - } - - return result; -} - -// -// end h__02_Writer.cpp -// From 301b00b133eccd88e86a4536266ec258bb3b82de Mon Sep 17 00:00:00 2001 From: milla Date: Wed, 9 Jun 2021 13:10:16 +0200 Subject: [PATCH 2/2] Fix indentation --- src/AS_02_internal.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/AS_02_internal.h b/src/AS_02_internal.h index 778ac7bc..5fb4ee11 100644 --- a/src/AS_02_internal.h +++ b/src/AS_02_internal.h @@ -296,7 +296,7 @@ namespace AS_02 } }; - // + // class h__AS02WriterFrame : public h__AS02Writer { ASDCP_NO_COPY_CONSTRUCT(h__AS02WriterFrame); @@ -428,4 +428,4 @@ namespace AS_02 // // end AS_02_internal.h -// \ No newline at end of file +//