14 // seek an open file handle to the start of the RIP KLV packet
15 Result_t SeekToRIP(const FileReader&);
18 class RIP : public ASDCP::KLVFilePacket
20 ASDCP_NO_COPY_CONSTRUCT(RIP);
29 ui32_t Size() { return sizeof(ui32_t) + sizeof(ui64_t); }
31 inline const char* ToString(char* str_buf) const {
32 char intbuf[IntBufferLen];
33 sprintf(str_buf, "%-6lu: %s", BodySID, ui64sz(ByteOffset, intbuf));
37 inline Result_t ReadFrom(ASDCP::MemIOReader& Reader) {
38 Result_t result = Reader.ReadUi32BE(&BodySID);
40 if ( ASDCP_SUCCESS(result) )
41 result = Reader.ReadUi64BE(&ByteOffset);
46 inline Result_t WriteTo(ASDCP::MemIOWriter& Writer) {
47 Result_t result = Writer.WriteUi32BE(BodySID);
49 if ( ASDCP_SUCCESS(result) )
50 result = Writer.WriteUi64BE(ByteOffset);
56 Array<Pair> PairArray;
60 virtual Result_t InitFromFile(const ASDCP::FileReader& Reader);
61 virtual Result_t WriteToFile(ASDCP::FileWriter& Writer);
62 virtual void Dump(FILE* = 0);
67 class Partition : public ASDCP::KLVFilePacket
69 ASDCP_NO_COPY_CONSTRUCT(Partition);
76 ui64_t PreviousPartition;
77 ui64_t FooterPartition;
78 ui64_t HeaderByteCount;
79 ui64_t IndexByteCount;
83 UL OperationalPattern;
84 Batch<UL> EssenceContainers;
87 virtual ~Partition() {}
88 virtual Result_t InitFromFile(const ASDCP::FileReader& Reader);
89 virtual Result_t WriteToFile(ASDCP::FileWriter& Writer);
90 virtual void Dump(FILE* = 0);
95 class Primer : public ASDCP::KLVPacket, public ASDCP::IPrimerLookup
97 class h__PrimerLookup;
98 mem_ptr<h__PrimerLookup> m_Lookup;
99 ASDCP_NO_COPY_CONSTRUCT(Primer);
109 inline const char* ToString(char* str_buf) const {
110 sprintf(str_buf, "%02x %02x: ", Tag.a, Tag.b);
111 UL.ToString(str_buf + strlen(str_buf));
115 inline Result_t ReadFrom(ASDCP::MemIOReader& Reader) {
116 Result_t result = Reader.ReadUi8(&Tag.a);
118 if ( ASDCP_SUCCESS(result) )
119 result = Reader.ReadUi8(&Tag.b);
121 if ( ASDCP_SUCCESS(result) )
122 result = UL.ReadFrom(Reader);
127 inline Result_t WriteTo(ASDCP::MemIOWriter& Writer) {
128 Result_t result = Writer.WriteUi8(Tag.a);
130 if ( ASDCP_SUCCESS(result) )
131 result = Writer.WriteUi8(Tag.b);
133 if ( ASDCP_SUCCESS(result) )
134 result = UL.WriteTo(Writer);
140 Batch<LocalTagEntry> LocalTagEntryBatch;
145 virtual void ClearTagList();
146 virtual Result_t InsertTag(const ASDCP::UL& Key, ASDCP::TagValue& Tag);
147 virtual Result_t TagForKey(const ASDCP::UL& Key, ASDCP::TagValue& Tag);
149 virtual Result_t InitFromBuffer(const byte_t* p, ui32_t l);
150 virtual Result_t WriteToBuffer(ASDCP::FrameBuffer&);
151 virtual void Dump(FILE* = 0);
156 class InterchangeObject : public ASDCP::KLVPacket
159 IPrimerLookup* m_Lookup;
162 InterchangeObject() : m_Lookup(0) {}
163 virtual ~InterchangeObject() {}
164 virtual Result_t WriteToBuffer(ASDCP::FrameBuffer&);
165 virtual bool IsA(const byte_t* label);
167 virtual void Dump(FILE* stream = 0) {
168 KLVPacket::Dump(stream, true);
173 InterchangeObject* CreateObject(const byte_t* label);
177 class Preface : public InterchangeObject
179 ASDCP_NO_COPY_CONSTRUCT(Preface);
183 Timestamp LastModifiedDate;
185 ui32_t ObjectModelVersion;
187 Batch<UID> Identifications;
189 UL OperationalPattern;
190 Batch<UL> EssenceContainers;
194 virtual ~Preface() {}
195 virtual Result_t InitFromBuffer(const byte_t* p, ui32_t l);
196 virtual Result_t WriteToBuffer(ASDCP::FrameBuffer& Buffer);
197 virtual void Dump(FILE* = 0);
201 class IndexTableSegment : public InterchangeObject
203 ASDCP_NO_COPY_CONSTRUCT(IndexTableSegment);
214 Result_t ReadFrom(ASDCP::MemIOReader& Reader);
215 Result_t WriteTo(ASDCP::MemIOWriter& Writer);
216 inline const char* ToString(char* str_buf) const;
227 std::list<ui32_t> SliceOffset;
228 Array<Rational> PosTable;
230 Result_t ReadFrom(ASDCP::MemIOReader& Reader);
231 Result_t WriteTo(ASDCP::MemIOWriter& Writer);
232 inline const char* ToString(char* str_buf) const;
235 Rational IndexEditRate;
236 ui64_t IndexStartPosition;
237 ui64_t IndexDuration;
238 ui32_t EditUnitByteCount;
243 Batch<DeltaEntry> DeltaEntryArray;
244 Batch<IndexEntry> IndexEntryArray;
247 virtual ~IndexTableSegment();
248 virtual Result_t InitFromBuffer(const byte_t* p, ui32_t l);
249 virtual Result_t WriteToBuffer(ASDCP::FrameBuffer& Buffer);
250 virtual void Dump(FILE* = 0);
253 //---------------------------------------------------------------------------------
255 class h__PacketList; // See MXF.cpp
256 class Identification;
259 class OPAtomHeader : public Partition
261 mem_ptr<h__PacketList> m_PacketList;
262 ASDCP_NO_COPY_CONSTRUCT(OPAtomHeader);
265 ASDCP::MXF::RIP m_RIP;
266 ASDCP::MXF::Primer m_Primer;
267 InterchangeObject* m_Preface;
268 ASDCP::FrameBuffer m_Buffer;
272 virtual ~OPAtomHeader();
273 virtual Result_t InitFromFile(const ASDCP::FileReader& Reader);
274 virtual Result_t WriteToFile(ASDCP::FileWriter& Writer, ui32_t HeaderLength = 16384);
275 virtual void Dump(FILE* = 0);
276 virtual Result_t GetMDObjectByType(const byte_t*, InterchangeObject** = 0);
277 Identification* GetIdentification();
281 class OPAtomIndexFooter : public Partition
283 mem_ptr<h__PacketList> m_PacketList;
284 ASDCP::FrameBuffer m_Buffer;
285 ASDCP_NO_COPY_CONSTRUCT(OPAtomIndexFooter);
288 IPrimerLookup* m_Lookup;
291 virtual ~OPAtomIndexFooter();
292 virtual Result_t InitFromFile(const ASDCP::FileReader& Reader);
293 virtual Result_t WriteToFile(ASDCP::FileWriter& Writer);
294 virtual void Dump(FILE* = 0);
296 virtual Result_t Lookup(ui32_t frame_num, IndexTableSegment::IndexEntry&);