2 Copyright (c) 2005-2009, John Hurst
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions
8 1. Redistributions of source code must retain the above copyright
9 notice, this list of conditions and the following disclaimer.
10 2. Redistributions in binary form must reproduce the above copyright
11 notice, this list of conditions and the following disclaimer in the
12 documentation and/or other materials provided with the distribution.
13 3. The name of the author may not be used to endorse or promote products
14 derived from this software without specific prior written permission.
16 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 #include <KM_fileio.h>
43 const ui32_t MXF_BER_LENGTH = 4;
44 const ui32_t MXF_TAG_LENGTH = 2;
45 const ui32_t SMPTE_UL_LENGTH = 16;
46 const ui32_t SMPTE_UMID_LENGTH = 32;
47 const byte_t SMPTE_UL_START[4] = { 0x06, 0x0e, 0x2b, 0x34 };
49 #ifndef MAX_KLV_PACKET_LENGTH
50 const ui32_t MAX_KLV_PACKET_LENGTH = 1024*1024*64;
53 const ui32_t IdentBufferLen = 128;
54 const ui32_t IntBufferLen = 64;
56 inline const char* i64sz(i64_t i, char* buf)
60 snprintf(buf, IntBufferLen, "%I64d", i);
62 snprintf(buf, IntBufferLen, "%lld", i);
67 inline const char* ui64sz(ui64_t i, char* buf)
71 snprintf(buf, IntBufferLen, "%I64u", i);
73 snprintf(buf, IntBufferLen, "%llu", i);
83 inline bool operator<(const TagValue& rhs) const {
84 if ( a < rhs.a ) return true;
85 if ( a == rhs.a && b < rhs.b ) return true;
89 inline bool operator==(const TagValue& rhs) const {
90 if ( a != rhs.a ) return false;
91 if ( b != rhs.b ) return false;
99 class UL : public Kumu::Identifier<SMPTE_UL_LENGTH>
103 UL(const UL& rhs) : Kumu::Identifier<SMPTE_UL_LENGTH>(rhs) {}
104 UL(const byte_t* value) : Kumu::Identifier<SMPTE_UL_LENGTH>(value) {}
107 const char* EncodeString(char* str_buf, ui32_t buf_len) const;
111 class UMID : public Kumu::Identifier<SMPTE_UMID_LENGTH>
115 UMID(const UMID& rhs) : Kumu::Identifier<SMPTE_UMID_LENGTH>(rhs) {}
116 UMID(const byte_t* value) : Kumu::Identifier<SMPTE_UMID_LENGTH>(value) {}
119 void MakeUMID(int Type);
120 void MakeUMID(int Type, const UUID& ID);
121 const char* EncodeString(char* str_buf, ui32_t buf_len) const;
124 const byte_t nil_UMID[SMPTE_UMID_LENGTH] = {0};
125 const UMID NilUMID(nil_UMID);
130 byte_t ul[SMPTE_UL_LENGTH];
141 static const MDDEntry* FindUL(const byte_t*);
142 static const MDDEntry* FindName(const char*);
143 static const MDDEntry& Type(MDD_t type_id);
144 static bool Replace(const MDDEntry& Entry);
145 static void Restore(const byte_t* ul);
146 static void RestoreAll();
148 inline static const byte_t* ul(MDD_t type_id) {
149 return Type(type_id).ul;
154 // Dictionary* m_Dict;
155 ASDCP_NO_COPY_CONSTRUCT(Dictionary);
162 const MDDEntry* FindUL(const byte_t*) const;
164 inline const byte_t* ul(MDD_t type_id) const {
165 return Type(type_id).ul;
168 const MDDEntry& Type(MDD_t type_id) const;
172 const Dictionary& DefaultSMPTEDict();
173 const Dictionary& DefaultInteropDict();
174 const Dictionary& DefaultCompositeDict();
181 virtual ~IPrimerLookup() {}
182 virtual void ClearTagList() = 0;
183 virtual Result_t InsertTag(const MDDEntry& Entry, ASDCP::TagValue& Tag) = 0;
184 virtual Result_t TagForKey(const ASDCP::UL& Key, ASDCP::TagValue& Tag) = 0;
190 ASDCP_NO_COPY_CONSTRUCT(KLVPacket);
193 const byte_t* m_KeyStart;
195 const byte_t* m_ValueStart;
196 ui32_t m_ValueLength;
199 KLVPacket() : m_KeyStart(0), m_KLLength(0), m_ValueStart(0), m_ValueLength(0) {}
200 virtual ~KLVPacket() {}
202 ui32_t PacketLength() {
203 return m_KLLength + m_ValueLength;
206 virtual bool HasUL(const byte_t*);
207 virtual Result_t InitFromBuffer(const byte_t*, ui32_t);
208 virtual Result_t InitFromBuffer(const byte_t*, ui32_t, const UL& label);
209 virtual Result_t WriteKLToBuffer(ASDCP::FrameBuffer&, const UL& label, ui32_t length);
210 virtual void Dump(FILE*, const Dictionary& Dict, bool show_value);
214 class KLVFilePacket : public KLVPacket
216 ASDCP_NO_COPY_CONSTRUCT(KLVFilePacket);
219 ASDCP::FrameBuffer m_Buffer;
223 virtual ~KLVFilePacket() {}
225 virtual Result_t InitFromFile(const Kumu::FileReader&);
226 virtual Result_t InitFromFile(const Kumu::FileReader&, const UL& label);
227 virtual Result_t WriteKLToFile(Kumu::FileWriter& Writer, const UL& label, ui32_t length);