4 //------------------------------------------------------------------------------------------
9 ASDCP::MXF::UTF16String::ReadFrom(ASDCP::MemIOReader& Reader)
11 const byte_t* p = Reader.Data() + Reader.Offset();
12 /// cheating - for all use cases, we know the previous two bytes are the length
13 m_length = ASDCP_i16_BE(cp2i<ui16_t>(p-2));
14 assert(m_length % 2 == 0);
16 assert(IdentBufferLen >= m_length);
19 for ( i = 0; i < m_length; i++ )
20 m_buffer[i] = p[(i*2)+1];
24 Reader.SkipOffset(m_length*2);
30 ASDCP::MXF::UTF16String::WriteTo(ASDCP::MemIOWriter& Writer)
32 byte_t* p = Writer.Data() + Writer.Size();
34 m_length = strlen(m_buffer);
35 memset(p, 0, m_length*2);
37 for ( i = 0; i < m_length; i++ )
38 p[(i*2)+1] = m_buffer[i];
42 Writer.AddOffset(m_length*2);
47 //------------------------------------------------------------------------------------------
50 ASDCP::MXF::TLVReader::TLVReader(const byte_t* p, ui32_t c, IPrimerLookup* PrimerLookup) :
51 MemIOReader(p, c), m_Lookup(PrimerLookup)
53 Result_t result = RESULT_OK;
55 while ( Remainder() > 0 && ASDCP_SUCCESS(result) )
60 result = MemIOReader::ReadUi8(&Tag.a);
62 if ( ASDCP_SUCCESS(result) )
63 result = MemIOReader::ReadUi8(&Tag.b);
65 if ( ASDCP_SUCCESS(result) )
66 result = MemIOReader::ReadUi16BE(&pkt_len);
68 if ( ASDCP_SUCCESS(result) )
70 m_ElementMap.insert(TagMap::value_type(Tag, ItemInfo(m_size, pkt_len)));
71 result = SkipOffset(pkt_len);
74 if ( ASDCP_FAILURE(result) )
76 DefaultLogSink().Error("Malformed Set\n");
85 ASDCP::MXF::TLVReader::FindTL(const MDDEntry& Entry)
89 fprintf(stderr, "No Lookup service\n");
95 if ( m_Lookup->TagForKey(Entry.ul, TmpTag) != RESULT_OK )
97 if ( Entry.tag.a == 0 )
99 DefaultLogSink().Error("No such UL in this TL list: %s (%02x %02x)\n",
100 Entry.name, Entry.tag.a, Entry.tag.b);
107 TagMap::iterator e_i = m_ElementMap.find(TmpTag);
109 if ( e_i != m_ElementMap.end() )
111 m_size = (*e_i).second.first;
112 m_capacity = m_size + (*e_i).second.second;
116 // DefaultLogSink().Warn("Not Found (%02x %02x): %s\n", TmpTag.a, TmpTag.b, Entry.name);
122 ASDCP::MXF::TLVReader::ReadObject(const MDDEntry& Entry, IArchive* Object)
124 ASDCP_TEST_NULL(Object);
127 return Object->ReadFrom(*this);
134 ASDCP::MXF::TLVReader::ReadUi8(const MDDEntry& Entry, ui8_t* value)
136 ASDCP_TEST_NULL(value);
139 return MemIOReader::ReadUi8(value);
146 ASDCP::MXF::TLVReader::ReadUi16(const MDDEntry& Entry, ui16_t* value)
148 ASDCP_TEST_NULL(value);
151 return MemIOReader::ReadUi16BE(value);
158 ASDCP::MXF::TLVReader::ReadUi32(const MDDEntry& Entry, ui32_t* value)
160 ASDCP_TEST_NULL(value);
163 return MemIOReader::ReadUi32BE(value);
170 ASDCP::MXF::TLVReader::ReadUi64(const MDDEntry& Entry, ui64_t* value)
172 ASDCP_TEST_NULL(value);
175 return MemIOReader::ReadUi64BE(value);
180 //------------------------------------------------------------------------------------------
183 ASDCP::MXF::TLVWriter::TLVWriter(byte_t* p, ui32_t c, IPrimerLookup* PrimerLookup) :
184 MemIOWriter(p, c), m_Lookup(PrimerLookup)
191 ASDCP::MXF::TLVWriter::WriteTag(const MDDEntry& Entry)
197 DefaultLogSink().Error("No Primer object available\n");
201 if ( m_Lookup->InsertTag(Entry.ul, TmpTag) != RESULT_OK )
203 DefaultLogSink().Error("No tag for entry %s\n", Entry.name);
207 Result_t result = MemIOWriter::WriteUi8(TmpTag.a);
208 if ( ASDCP_SUCCESS(result) ) MemIOWriter::WriteUi8(TmpTag.b);
215 ASDCP::MXF::TLVWriter::WriteObject(const MDDEntry& Entry, IArchive* Object)
217 ASDCP_TEST_NULL(Object);
218 Result_t result = WriteTag(Entry);
220 // write a temp length
221 byte_t* l_p = CurrentData();
223 if ( ASDCP_SUCCESS(result) )
224 MemIOWriter::WriteUi16BE(0);
226 if ( ASDCP_SUCCESS(result) )
228 ui32_t before = Size();
229 result = Object->WriteTo(*this);
231 if ( ASDCP_SUCCESS(result) )
232 i2p<ui16_t>(ASDCP_i16_BE( Size() - before), l_p);
240 ASDCP::MXF::TLVWriter::WriteUi8(const MDDEntry& Entry, ui8_t* value)
242 ASDCP_TEST_NULL(value);
243 Result_t result = WriteTag(Entry);
244 if ( ASDCP_SUCCESS(result) ) MemIOWriter::WriteUi16BE(sizeof(ui8_t));
245 if ( ASDCP_SUCCESS(result) ) MemIOWriter::WriteUi8(*value);
251 ASDCP::MXF::TLVWriter::WriteUi16(const MDDEntry& Entry, ui16_t* value)
253 ASDCP_TEST_NULL(value);
254 Result_t result = WriteTag(Entry);
255 if ( ASDCP_SUCCESS(result) ) MemIOWriter::WriteUi16BE(sizeof(ui16_t));
256 if ( ASDCP_SUCCESS(result) ) MemIOWriter::WriteUi8(*value);
262 ASDCP::MXF::TLVWriter::WriteUi32(const MDDEntry& Entry, ui32_t* value)
264 ASDCP_TEST_NULL(value);
265 Result_t result = WriteTag(Entry);
266 if ( ASDCP_SUCCESS(result) ) MemIOWriter::WriteUi16BE(sizeof(ui32_t));
267 if ( ASDCP_SUCCESS(result) ) MemIOWriter::WriteUi8(*value);
273 ASDCP::MXF::TLVWriter::WriteUi64(const MDDEntry& Entry, ui64_t* value)
275 ASDCP_TEST_NULL(value);
276 Result_t result = WriteTag(Entry);
277 if ( ASDCP_SUCCESS(result) ) MemIOWriter::WriteUi16BE(sizeof(ui64_t));
278 if ( ASDCP_SUCCESS(result) ) MemIOWriter::WriteUi8(*value);