/*
-Copyright (c) 2011-2014, John Hurst
+Copyright (c) 2011-2018, John Hurst
All rights reserved.
// if PHDRSimplePayload exists, go get it
if ( KM_SUCCESS(result) && SimplePayloadSID )
{
- Array<RIP::Pair>::const_iterator pi;
- RIP::Pair TmpPair;
+ RIP::const_pair_iterator pi;
+ RIP::PartitionPair TmpPair;
// Look up the partition start in the RIP using the SID.
for ( pi = m_RIP.PairArray.begin(); pi != m_RIP.PairArray.end(); ++pi )
}
}
- m_IndexAccess.Dump();
return result;
}
{
FrameBuf.OpaqueMetadata.assign((const char*)tmp_metadata_buffer.RoData(), tmp_metadata_buffer.Size());
}
+ else
+ {
+ DefaultLogSink().Error("Metadata packet not found at frame %d.\n", FrameNum);
+ result = RESULT_OK;
+ }
}
return result;
return RESULT_PARAM;
}
- InitHeader();
+ InitHeader(MXFVersion_2011);
AddSourceClip(EditRate, EditRate/*TODO: for a moment*/, TCFrameRate, TrackName, EssenceUL, DataDefinition, PackageLabel);
AddEssenceDescriptor(WrappingUL);
m_IndexWriter.SetPrimerLookup(&m_HeaderPart.m_Primer);
- m_RIP.PairArray.push_back(RIP::Pair(0, 0)); // Header partition RIP entry
+ m_RIP.PairArray.push_back(RIP::PartitionPair(0, 0)); // Header partition RIP entry
m_IndexWriter.OperationalPattern = m_HeaderPart.OperationalPattern;
m_IndexWriter.EssenceContainers = m_HeaderPart.EssenceContainers;
UL body_ul(m_Dict->ul(MDD_ClosedCompleteBodyPartition));
Partition body_part(m_Dict);
body_part.BodySID = 1;
+ body_part.MajorVersion = m_HeaderPart.MajorVersion;
+ body_part.MinorVersion = m_HeaderPart.MinorVersion;
body_part.OperationalPattern = m_HeaderPart.OperationalPattern;
body_part.EssenceContainers = m_HeaderPart.EssenceContainers;
body_part.ThisPartition = m_ECStart;
result = body_part.WriteToFile(m_File, body_ul);
- m_RIP.PairArray.push_back(RIP::Pair(1, body_part.ThisPartition)); // Second RIP Entry
+ m_RIP.PairArray.push_back(RIP::PartitionPair(1, body_part.ThisPartition)); // Second RIP Entry
}
return result;
if ( KM_SUCCESS(result) )
{
- result = WritePHDRHeader(label, UL(m_Dict->ul(MDD_JPEG_2000WrappingFrame)),
+ result = WritePHDRHeader(label, UL(m_Dict->ul(MDD_MXFGCFUFrameWrappedPictureElement)),
PICT_DEF_LABEL, UL(m_EssenceUL), UL(m_Dict->ul(MDD_PictureDataDef)),
edit_rate, derive_timecode_rate_from_edit_rate(edit_rate));
if ( KM_SUCCESS(result) )
{
- result = WriteEKLVPacket(FrameBuf, m_EssenceUL, Ctx, HMAC);
- }
-
- if ( KM_SUCCESS(result) )
- {
- ASDCP::FrameBuffer metadata_buffer_wrapper;
- metadata_buffer_wrapper.SetData((byte_t*)(FrameBuf.OpaqueMetadata.c_str()), FrameBuf.OpaqueMetadata.size());
- metadata_buffer_wrapper.Size(FrameBuf.OpaqueMetadata.size());
-
+ ui64_t this_stream_offset = m_StreamOffset; // m_StreamOffset will be changed by the call to Write_EKLV_Packet
result = Write_EKLV_Packet(m_File, *m_Dict, m_HeaderPart, m_Info, m_CtFrameBuf, m_FramesWritten,
- m_StreamOffset, metadata_buffer_wrapper, m_MetadataUL, Ctx, HMAC);
+ m_StreamOffset, FrameBuf, m_EssenceUL, MXF_BER_LENGTH, Ctx, HMAC);
+
+ if ( KM_SUCCESS(result) )
+ {
+ ASDCP::FrameBuffer metadata_buffer_wrapper;
+ metadata_buffer_wrapper.SetData((byte_t*)(FrameBuf.OpaqueMetadata.c_str()), FrameBuf.OpaqueMetadata.size());
+ metadata_buffer_wrapper.Size(FrameBuf.OpaqueMetadata.size());
+
+
+ result = Write_EKLV_Packet(m_File, *m_Dict, m_HeaderPart, m_Info, m_CtFrameBuf, m_FramesWritten,
+ m_StreamOffset, metadata_buffer_wrapper, m_MetadataUL,
+ MXF_BER_LENGTH, Ctx, HMAC);
+ }
+
+ if ( KM_SUCCESS(result) )
+ {
+ IndexTableSegment::IndexEntry Entry;
+ Entry.StreamOffset = this_stream_offset;
+ m_IndexWriter.PushIndexEntry(Entry);
+ }
+
+ if ( m_FramesWritten > 1 && ( ( m_FramesWritten + 1 ) % m_PartitionSpace ) == 0 )
+ {
+ assert(m_IndexWriter.GetDuration() > 0);
+ FlushIndexPartition();
+
+ UL body_ul(m_Dict->ul(MDD_ClosedCompleteBodyPartition));
+ Partition body_part(m_Dict);
+ body_part.BodySID = 1;
+ body_part.MajorVersion = m_HeaderPart.MajorVersion;
+ body_part.MinorVersion = m_HeaderPart.MinorVersion;
+ body_part.OperationalPattern = m_HeaderPart.OperationalPattern;
+ body_part.EssenceContainers = m_HeaderPart.EssenceContainers;
+ body_part.ThisPartition = m_File.Tell();
+
+ body_part.BodyOffset = m_StreamOffset;
+ result = body_part.WriteToFile(m_File, body_ul);
+ m_RIP.PairArray.push_back(RIP::PartitionPair(1, body_part.ThisPartition));
+ }
}
if ( KM_SUCCESS(result) )
AS_02::PHDR::MXFWriter::h__Writer::Finalize(const std::string& PHDR_master_metadata)
{
if ( ! m_State.Test_RUNNING() )
- return RESULT_STATE;
+ {
+ KM_RESULT_STATE_HERE();
+ return RESULT_STATE;
+ }
Result_t result = m_State.Goto_FINAL();
if ( KM_SUCCESS(result) )
{
- if ( m_IndexWriter.GetDuration() > 0 )
- {
- m_IndexWriter.ThisPartition = this->m_File.Tell();
- m_IndexWriter.WriteToFile(this->m_File);
- m_RIP.PairArray.push_back(RIP::Pair(0, this->m_IndexWriter.ThisPartition));
- }
+ FlushIndexPartition();
if ( ! PHDR_master_metadata.empty() )
{
static UL GenericStream_DataElement(m_Dict->ul(MDD_GenericStream_DataElement));
ASDCP::MXF::Partition GSPart(m_Dict);
+ GSPart.MajorVersion = m_HeaderPart.MajorVersion;
+ GSPart.MinorVersion = m_HeaderPart.MinorVersion;
GSPart.ThisPartition = here;
GSPart.PreviousPartition = m_RIP.PairArray.back().ByteOffset;
GSPart.OperationalPattern = m_HeaderPart.OperationalPattern;
GSPart.BodySID = 2;
m_MetadataTrackSubDescriptor->SimplePayloadSID = 2;
- m_RIP.PairArray.push_back(RIP::Pair(2, here));
+ m_RIP.PairArray.push_back(RIP::PartitionPair(2, here));
GSPart.EssenceContainers = m_HeaderPart.EssenceContainers;
static UL gs_part_ul(m_Dict->ul(MDD_GenericStreamPartition));
tmp_buf.Size(PHDR_master_metadata.size());
result = Write_EKLV_Packet(m_File, *m_Dict, m_HeaderPart, m_Info, m_CtFrameBuf, m_FramesWritten,
- m_StreamOffset, tmp_buf, GenericStream_DataElement.Value(), 0, 0);
+ m_StreamOffset, tmp_buf, GenericStream_DataElement.Value(),
+ MXF_BER_LENGTH, 0, 0);
}
}