Result_t AS_02::MXF::AS02IndexWriterVBR::WriteToFile(Kumu::FileWriter& Writer) { assert(m_Dict); ASDCP::FrameBuffer index_body_buffer; ui32_t index_body_size = m_PacketList->m_List.size() * MaxIndexSegmentSize; // segment-count * max-segment-size Result_t result = index_body_buffer.Capacity(index_body_size); ui64_t start_position = 0; if ( m_CurrentSegment != 0 ) { m_CurrentSegment->IndexDuration = m_CurrentSegment->IndexEntryArray.size(); start_position = m_CurrentSegment->IndexStartPosition + m_CurrentSegment->IndexDuration; m_CurrentSegment = 0; } std::list<InterchangeObject*>::iterator pl_i = m_PacketList->m_List.begin(); for ( ; pl_i != m_PacketList->m_List.end() && KM_SUCCESS(result); pl_i++ ) { InterchangeObject* object = *pl_i; object->m_Lookup = m_Lookup; ASDCP::FrameBuffer WriteWrapper; WriteWrapper.SetData(index_body_buffer.Data() + index_body_buffer.Size(), index_body_buffer.Capacity() - index_body_buffer.Size()); result = object->WriteToBuffer(WriteWrapper); index_body_buffer.Size(index_body_buffer.Size() + WriteWrapper.Size()); delete *pl_i; *pl_i = 0; } m_PacketList->m_List.clear(); if ( KM_SUCCESS(result) ) { IndexByteCount = index_body_buffer.Size(); UL body_ul(m_Dict->ul(MDD_ClosedCompleteBodyPartition)); result = Partition::WriteToFile(Writer, body_ul); } if ( KM_SUCCESS(result) ) { ui32_t write_count = 0; result = Writer.Write(index_body_buffer.RoData(), index_body_buffer.Size(), &write_count); assert(write_count == index_body_buffer.Size()); } if ( KM_SUCCESS(result) ) { m_CurrentSegment = new IndexTableSegment(m_Dict); assert(m_CurrentSegment); AddChildObject(m_CurrentSegment); m_CurrentSegment->DeltaEntryArray.push_back(IndexTableSegment::DeltaEntry()); m_CurrentSegment->IndexEditRate = m_EditRate; m_CurrentSegment->IndexStartPosition = start_position; } return result; }
Result_t AS_02::MXF::AS02IndexWriterCBR::WriteToFile(Kumu::FileWriter& Writer) { assert(m_Dict); ASDCP::FrameBuffer index_body_buffer; ui32_t index_body_size = MaxIndexSegmentSize; // segment-count * max-segment-size Result_t result = index_body_buffer.Capacity(index_body_size); m_CurrentSegment = new IndexTableSegment(m_Dict); assert(m_CurrentSegment); m_CurrentSegment->m_Lookup = m_Lookup; m_CurrentSegment->IndexEditRate = m_EditRate; m_CurrentSegment->IndexStartPosition = 0; m_CurrentSegment->IndexDuration = m_Duration; m_CurrentSegment->EditUnitByteCount = m_SampleSize; AddChildObject(m_CurrentSegment); ASDCP::FrameBuffer WriteWrapper; WriteWrapper.SetData(index_body_buffer.Data() + index_body_buffer.Size(), index_body_buffer.Capacity() - index_body_buffer.Size()); result = m_CurrentSegment->WriteToBuffer(WriteWrapper); index_body_buffer.Size(index_body_buffer.Size() + WriteWrapper.Size()); delete m_CurrentSegment; m_CurrentSegment = 0; m_PacketList->m_List.clear(); if ( KM_SUCCESS(result) ) { IndexByteCount = index_body_buffer.Size(); UL body_ul(m_Dict->ul(MDD_ClosedCompleteBodyPartition)); result = Partition::WriteToFile(Writer, body_ul); } if ( KM_SUCCESS(result) ) { ui32_t write_count = 0; result = Writer.Write(index_body_buffer.RoData(), index_body_buffer.Size(), &write_count); assert(write_count == index_body_buffer.Size()); } return result; }