9 ASDCP::MXF::IndexTableSegment::IndexTableSegment() :
10 IndexStartPosition(0), IndexDuration(0), EditUnitByteCount(0),
11 IndexSID(0), BodySID(0), SliceCount(0), PosTableCount(0)
16 ASDCP::MXF::IndexTableSegment::~IndexTableSegment()
22 ASDCP::MXF::IndexTableSegment::InitFromBuffer(const byte_t* p, ui32_t l)
26 Result_t result = KLVPacket::InitFromBuffer(p, l, s_MDD_Table[MDDindex_IndexTableSegment].ul);
28 if ( ASDCP_SUCCESS(result) )
30 TLVReader MemRDR(m_ValueStart, m_ValueLength, m_Lookup);
32 result = MemRDR.ReadObject(OBJ_READ_ARGS(InterchangeObject, InstanceUID));
33 if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadObject(OBJ_READ_ARGS(IndexTableSegmentBase, IndexEditRate));
34 if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi64(OBJ_READ_ARGS(IndexTableSegmentBase, IndexStartPosition));
35 if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi64(OBJ_READ_ARGS(IndexTableSegmentBase, IndexDuration));
36 if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi32(OBJ_READ_ARGS(IndexTableSegmentBase, EditUnitByteCount));
37 if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi32(OBJ_READ_ARGS(IndexTableSegmentBase, IndexSID));
38 if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi32(OBJ_READ_ARGS(IndexTableSegmentBase, BodySID));
39 if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi8(OBJ_READ_ARGS(IndexTableSegmentBase, SliceCount));
40 if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi8(OBJ_READ_ARGS(IndexTableSegmentBase, PosTableCount));
41 if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadObject(OBJ_READ_ARGS(IndexTableSegment, DeltaEntryArray));
42 if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadObject(OBJ_READ_ARGS(IndexTableSegment, IndexEntryArray));
45 if ( ASDCP_SUCCESS(result) )
47 Batch<IndexEntry>::iterator i;
49 for ( i = IndexEntryArray.begin(); i != IndexEntryArray.end(); i++ )
51 if ( (*i).Flags == 0x40 )
54 (*i).KeyFrameOffset = offset++;
63 ASDCP::MXF::IndexTableSegment::WriteToBuffer(ASDCP::FrameBuffer& Buffer)
65 return WriteKLToBuffer(Buffer, s_MDD_Table[MDDindex_IndexTableSegment].ul, 0);
67 Result_t result = KLVPacket::InitFromBuffer(p, l, s_MDD_Table[MDDindex_IndexTableSegment].ul);
69 if ( ASDCP_SUCCESS(result) )
71 TLVWriter MemRDR(m_ValueStart, m_ValueLength, m_Lookup);
73 result = MemRDR.ReadObject(OBJ_READ_ARGS(InterchangeObject, InstanceUID));
74 if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadObject(OBJ_READ_ARGS(IndexTableSegmentBase, IndexEditRate));
75 if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi64(OBJ_READ_ARGS(IndexTableSegmentBase, IndexStartPosition));
76 if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi64(OBJ_READ_ARGS(IndexTableSegmentBase, IndexDuration));
77 if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi32(OBJ_READ_ARGS(IndexTableSegmentBase, EditUnitByteCount));
78 if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi32(OBJ_READ_ARGS(IndexTableSegmentBase, IndexSID));
79 if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi32(OBJ_READ_ARGS(IndexTableSegmentBase, BodySID));
80 if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi8(OBJ_READ_ARGS(IndexTableSegmentBase, SliceCount));
81 if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadUi8(OBJ_READ_ARGS(IndexTableSegmentBase, PosTableCount));
82 if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadObject(OBJ_READ_ARGS(IndexTableSegment, DeltaEntryArray));
83 if ( ASDCP_SUCCESS(result) ) result = MemRDR.ReadObject(OBJ_READ_ARGS(IndexTableSegment, IndexEntryArray));
92 ASDCP::MXF::IndexTableSegment::Dump(FILE* stream)
94 char identbuf[IdentBufferLen];
99 KLVPacket::Dump(stream, false);
100 fprintf(stream, " InstanceUID = %s\n", InstanceUID.ToString(identbuf));
101 fprintf(stream, " IndexEditRate = %s\n", IndexEditRate.ToString(identbuf));
102 fprintf(stream, " IndexStartPosition = %s\n", i64sz(IndexStartPosition, identbuf));
103 fprintf(stream, " IndexDuration = %s\n", i64sz(IndexDuration, identbuf));
104 fprintf(stream, " EditUnitByteCount = %lu\n", EditUnitByteCount);
105 fprintf(stream, " IndexSID = %lu\n", IndexSID);
106 fprintf(stream, " BodySID = %lu\n", BodySID);
107 fprintf(stream, " SliceCount = %hu\n", SliceCount);
108 fprintf(stream, " PosTableCount = %hu\n", PosTableCount);
110 fprintf(stream, " DeltaEntryArray:\n"); DeltaEntryArray.Dump(stream);
111 fprintf(stream, " IndexEntryArray:\n"); IndexEntryArray.Dump(stream);
113 fputs("==========================================================================\n", stream);
118 ASDCP::MXF::IndexTableSegment::DeltaEntry::ToString(char* str_buf) const
120 sprintf(str_buf, "%3i %-3hu %-3lu", PosTableIndex, Slice, ElementData);
126 ASDCP::MXF::IndexTableSegment::DeltaEntry::ReadFrom(ASDCP::MemIOReader& Reader)
128 Result_t result = Reader.ReadUi8((ui8_t*)&PosTableIndex);
129 if ( ASDCP_SUCCESS(result) ) result = Reader.ReadUi8(&Slice);
130 if ( ASDCP_SUCCESS(result) ) result = Reader.ReadUi32BE(&ElementData);
136 ASDCP::MXF::IndexTableSegment::DeltaEntry::WriteTo(ASDCP::MemIOWriter& Writer)
138 Result_t result = Writer.WriteUi8((ui8_t)PosTableIndex);
139 if ( ASDCP_SUCCESS(result) ) result = Writer.WriteUi8(Slice);
140 if ( ASDCP_SUCCESS(result) ) result = Writer.WriteUi32BE(ElementData);
145 // Bit 7: Random Access
146 // Bit 6: Sequence Header
147 // Bit 5: forward prediction flag
148 // Bit 4: backward prediction flag
150 // 00== I frame (no prediction)
151 // 10== P frame(forward prediction from previous frame)
152 // 01== B frame (backward prediction from future frame)
153 // 11== B frame (forward & backward prediction)
154 // Bits 0-3: reserved [RP210 Flags to indicate coding of elements in this edit unit]
158 ASDCP::MXF::IndexTableSegment::IndexEntry::ToString(char* str_buf) const
160 char intbuf[IntBufferLen];
164 txt_flags[0] = ( (Flags & 0x80) != 0 ) ? 'r' : ' ';
165 txt_flags[1] = ( (Flags & 0x40) != 0 ) ? 's' : ' ';
166 txt_flags[2] = ( (Flags & 0x20) != 0 ) ? 'f' : ' ';
167 txt_flags[3] = ( (Flags & 0x10) != 0 ) ? 'b' : ' ';
168 txt_flags[4] = ( (Flags & 0x0f) == 3 ) ? 'B' : ( (Flags & 0x0f) == 2 ) ? 'P' : 'I';
170 sprintf(str_buf, "%3i %-3hu %s %s",
171 TemporalOffset, KeyFrameOffset, txt_flags,
172 i64sz(StreamOffset, intbuf));
179 ASDCP::MXF::IndexTableSegment::IndexEntry::ReadFrom(ASDCP::MemIOReader& Reader)
181 Result_t result = Reader.ReadUi8((ui8_t*)&TemporalOffset);
182 if ( ASDCP_SUCCESS(result) ) result = Reader.ReadUi8((ui8_t*)&KeyFrameOffset);
183 if ( ASDCP_SUCCESS(result) ) result = Reader.ReadUi8(&Flags);
184 if ( ASDCP_SUCCESS(result) ) result = Reader.ReadUi64BE(&StreamOffset);
190 ASDCP::MXF::IndexTableSegment::IndexEntry::WriteTo(ASDCP::MemIOWriter& Writer)
192 Result_t result = Writer.WriteUi8((ui8_t)TemporalOffset);
193 if ( ASDCP_SUCCESS(result) ) result = Writer.WriteUi8((ui8_t)KeyFrameOffset);
194 if ( ASDCP_SUCCESS(result) ) result = Writer.WriteUi8(Flags);
195 if ( ASDCP_SUCCESS(result) ) result = Writer.WriteUi64BE(StreamOffset);