X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2FIndex.cpp;h=3bebb1d330eed99d64c97d8eb3c018b3692162a1;hb=d28ab84e2422180474aa3e80cc98097dca25aca0;hp=96c81ed4c7dbbd2da94758cdad61ff5f9dccf97f;hpb=c6900386fb66832781456838804ed7e28c535d63;p=asdcplib.git diff --git a/src/Index.cpp b/src/Index.cpp index 96c81ed..3bebb1d 100755 --- a/src/Index.cpp +++ b/src/Index.cpp @@ -1,5 +1,5 @@ /* -Copyright (c) 2005-2006, John Hurst +Copyright (c) 2005-2009, John Hurst All rights reserved. Redistribution and use in source and binary forms, with or without @@ -29,13 +29,14 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \brief MXF index segment objects */ -#include "MDD.h" #include "MXF.h" +const ui32_t kl_length = ASDCP::SMPTE_UL_LENGTH + ASDCP::MXF_BER_LENGTH; + // ASDCP::MXF::IndexTableSegment::IndexTableSegment() : IndexStartPosition(0), IndexDuration(0), EditUnitByteCount(0), - IndexSID(0), BodySID(0), SliceCount(0), PosTableCount(0) + IndexSID(129), BodySID(1), SliceCount(0), PosTableCount(0) { } @@ -46,72 +47,54 @@ ASDCP::MXF::IndexTableSegment::~IndexTableSegment() // ASDCP::Result_t -ASDCP::MXF::IndexTableSegment::InitFromBuffer(const byte_t* p, ui32_t l) +ASDCP::MXF::IndexTableSegment::InitFromTLVSet(TLVReader& TLVSet) { - ASDCP_TEST_NULL(p); - - Result_t result = KLVPacket::InitFromBuffer(p, l, s_MDD_Table[MDDindex_IndexTableSegment].ul); - - if ( ASDCP_SUCCESS(result) ) - { - TLVReader MemRDR(m_ValueStart, m_ValueLength, m_Lookup); - - result = MemRDR.ReadObject(OBJ_READ_ARGS(InterchangeObject, InstanceUID)); - if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadObject(OBJ_READ_ARGS(IndexTableSegmentBase, IndexEditRate)); - if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi64(OBJ_READ_ARGS(IndexTableSegmentBase, IndexStartPosition)); - if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi64(OBJ_READ_ARGS(IndexTableSegmentBase, IndexDuration)); - if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi32(OBJ_READ_ARGS(IndexTableSegmentBase, EditUnitByteCount)); - if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi32(OBJ_READ_ARGS(IndexTableSegmentBase, IndexSID)); - if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi32(OBJ_READ_ARGS(IndexTableSegmentBase, BodySID)); - if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi8(OBJ_READ_ARGS(IndexTableSegmentBase, SliceCount)); - if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi8(OBJ_READ_ARGS(IndexTableSegmentBase, PosTableCount)); - if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadObject(OBJ_READ_ARGS(IndexTableSegment, DeltaEntryArray)); - if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadObject(OBJ_READ_ARGS(IndexTableSegment, IndexEntryArray)); - } - - if ( ASDCP_SUCCESS(result) ) - { - Batch::iterator i; - ui32_t offset = 0; - for ( i = IndexEntryArray.begin(); i != IndexEntryArray.end(); i++ ) - { - if ( (*i).Flags == 0x40 ) - offset = 0; - - (*i).KeyFrameOffset = offset++; - } - } - + Result_t result = InterchangeObject::InitFromTLVSet(TLVSet); + if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(IndexTableSegmentBase, IndexEditRate)); + if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi64(OBJ_READ_ARGS(IndexTableSegmentBase, IndexStartPosition)); + if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi64(OBJ_READ_ARGS(IndexTableSegmentBase, IndexDuration)); + if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi32(OBJ_READ_ARGS(IndexTableSegmentBase, EditUnitByteCount)); + if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi32(OBJ_READ_ARGS(IndexTableSegmentBase, IndexSID)); + if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi32(OBJ_READ_ARGS(IndexTableSegmentBase, BodySID)); + if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi8(OBJ_READ_ARGS(IndexTableSegmentBase, SliceCount)); + if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi8(OBJ_READ_ARGS(IndexTableSegmentBase, PosTableCount)); + if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(IndexTableSegment, DeltaEntryArray)); + if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(IndexTableSegment, IndexEntryArray)); return result; } // ASDCP::Result_t -ASDCP::MXF::IndexTableSegment::WriteToBuffer(ASDCP::FrameBuffer& Buffer) +ASDCP::MXF::IndexTableSegment::WriteToTLVSet(TLVWriter& TLVSet) { - return WriteKLToBuffer(Buffer, s_MDD_Table[MDDindex_IndexTableSegment].ul, 0); -#if 0 - Result_t result = KLVPacket::InitFromBuffer(p, l, s_MDD_Table[MDDindex_IndexTableSegment].ul); + Result_t result = InterchangeObject::WriteToTLVSet(TLVSet); + if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(IndexTableSegmentBase, IndexEditRate)); + if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi64(OBJ_WRITE_ARGS(IndexTableSegmentBase, IndexStartPosition)); + if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi64(OBJ_WRITE_ARGS(IndexTableSegmentBase, IndexDuration)); + if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS(IndexTableSegmentBase, EditUnitByteCount)); + if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS(IndexTableSegmentBase, IndexSID)); + if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS(IndexTableSegmentBase, BodySID)); + if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi8(OBJ_WRITE_ARGS(IndexTableSegmentBase, SliceCount)); + if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi8(OBJ_WRITE_ARGS(IndexTableSegmentBase, PosTableCount)); + if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(IndexTableSegment, DeltaEntryArray)); + if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(IndexTableSegment, IndexEntryArray)); + return result; +} - if ( ASDCP_SUCCESS(result) ) - { - TLVWriter MemRDR(m_ValueStart, m_ValueLength, m_Lookup); - - result = MemRDR.ReadObject(OBJ_READ_ARGS(InterchangeObject, InstanceUID)); - if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadObject(OBJ_READ_ARGS(IndexTableSegmentBase, IndexEditRate)); - if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi64(OBJ_READ_ARGS(IndexTableSegmentBase, IndexStartPosition)); - if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi64(OBJ_READ_ARGS(IndexTableSegmentBase, IndexDuration)); - if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi32(OBJ_READ_ARGS(IndexTableSegmentBase, EditUnitByteCount)); - if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi32(OBJ_READ_ARGS(IndexTableSegmentBase, IndexSID)); - if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi32(OBJ_READ_ARGS(IndexTableSegmentBase, BodySID)); - if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi8(OBJ_READ_ARGS(IndexTableSegmentBase, SliceCount)); - if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi8(OBJ_READ_ARGS(IndexTableSegmentBase, PosTableCount)); - if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadObject(OBJ_READ_ARGS(IndexTableSegment, DeltaEntryArray)); - if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadObject(OBJ_READ_ARGS(IndexTableSegment, IndexEntryArray)); - } +// +ASDCP::Result_t +ASDCP::MXF::IndexTableSegment::InitFromBuffer(const byte_t* p, ui32_t l) +{ + m_Typeinfo = &Dict::Type(MDD_IndexTableSegment); + return InterchangeObject::InitFromBuffer(p, l); +} - return result; -#endif +// +ASDCP::Result_t +ASDCP::MXF::IndexTableSegment::WriteToBuffer(ASDCP::FrameBuffer& Buffer) +{ + m_Typeinfo = &Dict::Type(MDD_IndexTableSegment); + return InterchangeObject::WriteToBuffer(Buffer); } // @@ -123,14 +106,13 @@ ASDCP::MXF::IndexTableSegment::Dump(FILE* stream) if ( stream == 0 ) stream = stderr; - KLVPacket::Dump(stream, false); - fprintf(stream, " InstanceUID = %s\n", InstanceUID.ToString(identbuf)); - fprintf(stream, " IndexEditRate = %s\n", IndexEditRate.ToString(identbuf)); + InterchangeObject::Dump(stream); + fprintf(stream, " IndexEditRate = %s\n", IndexEditRate.EncodeString(identbuf, IdentBufferLen)); fprintf(stream, " IndexStartPosition = %s\n", i64sz(IndexStartPosition, identbuf)); fprintf(stream, " IndexDuration = %s\n", i64sz(IndexDuration, identbuf)); - fprintf(stream, " EditUnitByteCount = %lu\n", EditUnitByteCount); - fprintf(stream, " IndexSID = %lu\n", IndexSID); - fprintf(stream, " BodySID = %lu\n", BodySID); + fprintf(stream, " EditUnitByteCount = %u\n", EditUnitByteCount); + fprintf(stream, " IndexSID = %u\n", IndexSID); + fprintf(stream, " BodySID = %u\n", BodySID); fprintf(stream, " SliceCount = %hu\n", SliceCount); fprintf(stream, " PosTableCount = %hu\n", PosTableCount); @@ -143,40 +125,44 @@ ASDCP::MXF::IndexTableSegment::Dump(FILE* stream) } else { - fprintf(stream, " IndexEntryArray: %lu entries\n", IndexEntryArray.size()); + fprintf(stream, " IndexEntryArray: %du entries\n", IndexEntryArray.size()); } - - fputs("==========================================================================\n", stream); } +//------------------------------------------------------------------------------------------ +// + // const char* -ASDCP::MXF::IndexTableSegment::DeltaEntry::ToString(char* str_buf) const +ASDCP::MXF::IndexTableSegment::DeltaEntry::EncodeString(char* str_buf, ui32_t buf_len) const { - sprintf(str_buf, "%3i %-3hu %-3lu", PosTableIndex, Slice, ElementData); + snprintf(str_buf, buf_len, "%3d %-3hu %-3u", PosTableIndex, Slice, ElementData); return str_buf; } // -ASDCP::Result_t -ASDCP::MXF::IndexTableSegment::DeltaEntry::ReadFrom(ASDCP::MemIOReader& Reader) +bool +ASDCP::MXF::IndexTableSegment::DeltaEntry::Unarchive(Kumu::MemIOReader* Reader) { - Result_t result = Reader.ReadUi8((ui8_t*)&PosTableIndex); - if ( ASDCP_SUCCESS(result) ) result = Reader.ReadUi8(&Slice); - if ( ASDCP_SUCCESS(result) ) result = Reader.ReadUi32BE(&ElementData); - return result; + if ( ! Reader->ReadUi8((ui8_t*)&PosTableIndex) ) return false; + if ( ! Reader->ReadUi8(&Slice) ) return false; + if ( ! Reader->ReadUi32BE(&ElementData) ) return false; + return true; } // -ASDCP::Result_t -ASDCP::MXF::IndexTableSegment::DeltaEntry::WriteTo(ASDCP::MemIOWriter& Writer) +bool +ASDCP::MXF::IndexTableSegment::DeltaEntry::Archive(Kumu::MemIOWriter* Writer) const { - Result_t result = Writer.WriteUi8((ui8_t)PosTableIndex); - if ( ASDCP_SUCCESS(result) ) result = Writer.WriteUi8(Slice); - if ( ASDCP_SUCCESS(result) ) result = Writer.WriteUi32BE(ElementData); - return result; + if ( ! Writer->WriteUi8((ui8_t)PosTableIndex) ) return false; + if ( ! Writer->WriteUi8(Slice) ) return false; + if ( ! Writer->WriteUi32BE(ElementData) ) return false; + return true; } +//------------------------------------------------------------------------------------------ +// + // Flags: // Bit 7: Random Access // Bit 6: Sequence Header @@ -191,45 +177,45 @@ ASDCP::MXF::IndexTableSegment::DeltaEntry::WriteTo(ASDCP::MemIOWriter& Writer) // const char* -ASDCP::MXF::IndexTableSegment::IndexEntry::ToString(char* str_buf) const +ASDCP::MXF::IndexTableSegment::IndexEntry::EncodeString(char* str_buf, ui32_t buf_len) const { char intbuf[IntBufferLen]; char txt_flags[6]; - txt_flags[5] = 0; txt_flags[0] = ( (Flags & 0x80) != 0 ) ? 'r' : ' '; txt_flags[1] = ( (Flags & 0x40) != 0 ) ? 's' : ' '; txt_flags[2] = ( (Flags & 0x20) != 0 ) ? 'f' : ' '; txt_flags[3] = ( (Flags & 0x10) != 0 ) ? 'b' : ' '; txt_flags[4] = ( (Flags & 0x0f) == 3 ) ? 'B' : ( (Flags & 0x0f) == 2 ) ? 'P' : 'I'; + txt_flags[5] = 0; - sprintf(str_buf, "%3i %-3hu %s %s", - TemporalOffset, KeyFrameOffset, txt_flags, - i64sz(StreamOffset, intbuf)); + snprintf(str_buf, buf_len, "%3i %-3hu %s %s", + TemporalOffset, KeyFrameOffset, txt_flags, + i64sz(StreamOffset, intbuf)); return str_buf; } // -ASDCP::Result_t -ASDCP::MXF::IndexTableSegment::IndexEntry::ReadFrom(ASDCP::MemIOReader& Reader) +bool +ASDCP::MXF::IndexTableSegment::IndexEntry::Unarchive(Kumu::MemIOReader* Reader) { - Result_t result = Reader.ReadUi8((ui8_t*)&TemporalOffset); - if ( ASDCP_SUCCESS(result) ) result = Reader.ReadUi8((ui8_t*)&KeyFrameOffset); - if ( ASDCP_SUCCESS(result) ) result = Reader.ReadUi8(&Flags); - if ( ASDCP_SUCCESS(result) ) result = Reader.ReadUi64BE(&StreamOffset); - return result; + if ( ! Reader->ReadUi8((ui8_t*)&TemporalOffset) ) return false; + if ( ! Reader->ReadUi8((ui8_t*)&KeyFrameOffset) ) return false; + if ( ! Reader->ReadUi8(&Flags) ) return false; + if ( ! Reader->ReadUi64BE(&StreamOffset) ) return false; + return true; } // -ASDCP::Result_t -ASDCP::MXF::IndexTableSegment::IndexEntry::WriteTo(ASDCP::MemIOWriter& Writer) +bool +ASDCP::MXF::IndexTableSegment::IndexEntry::Archive(Kumu::MemIOWriter* Writer) const { - Result_t result = Writer.WriteUi8((ui8_t)TemporalOffset); - if ( ASDCP_SUCCESS(result) ) result = Writer.WriteUi8((ui8_t)KeyFrameOffset); - if ( ASDCP_SUCCESS(result) ) result = Writer.WriteUi8(Flags); - if ( ASDCP_SUCCESS(result) ) result = Writer.WriteUi64BE(StreamOffset); - return result; + if ( ! Writer->WriteUi8((ui8_t)TemporalOffset) ) return false; + if ( ! Writer->WriteUi8((ui8_t)KeyFrameOffset) ) return false; + if ( ! Writer->WriteUi8(Flags) ) return false; + if ( ! Writer->WriteUi64BE(StreamOffset) ) return false; + return true; }