summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hurst <jhurst@cinecert.com>2021-08-26 20:49:41 -0700
committerGitHub <noreply@github.com>2021-08-26 20:49:41 -0700
commit3e71fd643d02342ffd7b5fd3b561233b3bb31acc (patch)
tree5eb2aa3b254edf3f0c448cd890aadb827ee32fae /src
parent623b3ae0a41e6c27f331e2a3347ec07cf1337b05 (diff)
parent301b00b133eccd88e86a4536266ec258bb3b82de (diff)
Merge pull request #15 from DolbyLaboratories/dolby/atmos_storage/asdcplib_integration/templatize_h02writerclip_depends_on_pluggable_filereader
Templatize h__AS02WriteClip, move functions definition to header. Note that this depends on filereader pluggable at runtime commit as the reader is called as a pointer here.
Diffstat (limited to 'src')
-rw-r--r--src/AS_02_PCM.cpp6
-rw-r--r--src/AS_02_TimedText.cpp4
-rw-r--r--src/AS_02_internal.h115
-rw-r--r--src/h__02_Writer.cpp86
4 files changed, 107 insertions, 104 deletions
diff --git a/src/AS_02_PCM.cpp b/src/AS_02_PCM.cpp
index d034ffb..841f103 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<AS_02::MXF::AS02IndexWriterCBR>
{
ASDCP_NO_COPY_CONSTRUCT(h__Writer);
h__Writer();
@@ -335,8 +335,8 @@ public:
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<AS_02::MXF::AS02IndexWriterCBR>(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 aa593a1..5b67c32 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<AS_02::MXF::AS02IndexWriterCBR>
{
ASDCP_NO_COPY_CONSTRUCT(h__Writer);
h__Writer();
@@ -397,7 +397,7 @@ public:
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<AS_02::MXF::AS02IndexWriterCBR>(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 ba7c33d..5fb4ee1 100644
--- a/src/AS_02_internal.h
+++ b/src/AS_02_internal.h
@@ -314,23 +314,112 @@ namespace AS_02
};
//
- class h__AS02WriterClip : public h__AS02Writer<AS_02::MXF::AS02IndexWriterCBR>
+ template <typename IndexWriterType>
+ class h__AS02WriterClip : public h__AS02Writer<IndexWriterType>
{
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<IndexWriterType>(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<IndexWriterType>::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<IndexWriterType>::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<IndexWriterType>::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<IndexWriterType>::m_File.TellPosition();
+ Result_t result = h__AS02Writer<IndexWriterType>::m_File.Seek(m_ClipStart + 16);
+
+ if (KM_SUCCESS(result))
+ {
+ byte_t clip_buffer[8] = { 0 };
+ ui64_t size = static_cast<ui64_t>(h__AS02Writer<IndexWriterType>::m_FramesWritten) * bytes_per_frame;
+ bool check = Kumu::write_BER(clip_buffer, size, 8);
+ assert(check);
+ result = h__AS02Writer<IndexWriterType>::m_File.Write(clip_buffer, 8);
+ }
+
+ if (KM_SUCCESS(result))
+ {
+ result = h__AS02Writer<IndexWriterType>::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<IndexWriterType>::m_File.TellPosition();
+ Result_t result = h__AS02Writer<IndexWriterType>::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<IndexWriterType>::m_File.Write(clip_buffer, 8);
+ }
+
+ if (KM_SUCCESS(result))
+ {
+ result = h__AS02Writer<IndexWriterType>::m_File.Seek(current_position);
+ m_ClipStart = 0;
+ }
+
+ return result;
+
+ }
};
} // namespace AS_02
diff --git a/src/h__02_Writer.cpp b/src/h__02_Writer.cpp
index e35727e..8043ebd 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<AS_02::MXF::AS02IndexWriterCBR>(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<ui64_t>(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
-//