X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2FAS_02_PHDR.cpp;h=db9228a8fa32159883d49c96a1d13e3808284f63;hb=c37d749945eba6b8922ecf58ef886f32ee55b38e;hp=c6017efe5d8944bc24ebce538e7d31638fb7f076;hpb=8d24b6effb0377fc3041c2e024e7c5593caecc52;p=asdcplib.git diff --git a/src/AS_02_PHDR.cpp b/src/AS_02_PHDR.cpp index c6017ef..db9228a 100644 --- a/src/AS_02_PHDR.cpp +++ b/src/AS_02_PHDR.cpp @@ -57,7 +57,12 @@ AS_02::PHDR::FrameBuffer::Dump(FILE* stream, ui32_t dump_bytes) const if ( stream == 0 ) stream = stderr; - fprintf(stream, "Hello, HDR world!\n"); + fprintf(stream, "Frame %d, %d bytes (metadata: %zd bytes)\n", FrameNumber(), Size(), OpaqueMetadata.size()); + + if ( dump_bytes > 0 ) + { + Kumu::hexdump(RoData(), Kumu::xmin(dump_bytes, Size()), stream); + } } @@ -188,8 +193,6 @@ AS_02::PHDR::MXFReader::h__Reader::OpenRead(const std::string& filename, std::st } } - m_IndexAccess.Dump(); - return result; } @@ -217,6 +220,11 @@ AS_02::PHDR::MXFReader::h__Reader::ReadFrame(ui32_t FrameNum, AS_02::PHDR::Frame { 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; @@ -390,7 +398,7 @@ AS_02::PHDR::MXFWriter::h__Writer::OpenWrite(const std::string& filename, if ( KM_SUCCESS(result) ) { m_IndexStrategy = IndexStrategy; - m_PartitionSpace = PartitionSpace_sec; // later converted to edit units by SetSourceStream() + m_PartitionSpace = PartitionSpace_sec; // later converted to edit units by WritePHDRHeader() m_HeaderSize = HeaderSize; if ( essence_descriptor->GetUL() != UL(m_Dict->ul(MDD_RGBAEssenceDescriptor)) @@ -446,7 +454,7 @@ AS_02::PHDR::MXFWriter::h__Writer::WritePHDRHeader(const std::string& PackageLab CreateTrackAndSequence(m_HeaderPart, *m_FilePackage, MD_DEF_LABEL, EditRate, UL(m_Dict->ul(MDD_PHDRImageMetadataItem)), - 3, m_Dict); + 3 /* track id */, m_Dict); metdata_track.Sequence->Duration.set_has_value(); m_DurationUpdateList.push_back(&(metdata_track.Sequence->Duration.get())); @@ -559,18 +567,46 @@ AS_02::PHDR::MXFWriter::h__Writer::WriteFrame(const AS_02::PHDR::FrameBuffer& Fr 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, 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, 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 ) + { + m_IndexWriter.ThisPartition = m_File.Tell(); + m_IndexWriter.WriteToFile(m_File); + m_RIP.PairArray.push_back(RIP::Pair(0, m_IndexWriter.ThisPartition)); + + UL body_ul(m_Dict->ul(MDD_ClosedCompleteBodyPartition)); + Partition body_part(m_Dict); + body_part.BodySID = 1; + 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::Pair(1, body_part.ThisPartition)); + } } if ( KM_SUCCESS(result) ) @@ -629,8 +665,6 @@ AS_02::PHDR::MXFWriter::h__Writer::Finalize(const std::string& PHDR_master_metad 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_FramesWritten++; } }