1 // Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 // Use of this source code is governed by a BSD-style license
4 // that can be found in the LICENSE file in the root of the source
5 // tree. An additional intellectual property rights grant can be found
6 // in the file PATENTS. All contributing project authors may
7 // be found in the AUTHORS file in the root of the source tree.
10 #include "EbmlWriter.h"
15 #define LITERALU64(n) n
17 #define LITERALU64(n) n##LLU
20 void Ebml_WriteLen(EbmlGlobal
*glob
, long long val
)
22 //TODO check and make sure we are not > than 0x0100000000000000LLU
23 unsigned char size
= 8; //size in bytes to output
24 unsigned long long minVal
= LITERALU64(0x00000000000000ff); //mask to compare for byte size
26 for (size
= 1; size
< 8; size
++)
31 minVal
= (minVal
<< 7);
34 val
|= (LITERALU64(0x000000000000080) << ((size
- 1) * 7));
36 Ebml_Serialize(glob
, (void *) &val
, size
);
39 void Ebml_WriteString(EbmlGlobal
*glob
, const char *str
)
41 const size_t size_
= strlen(str
);
42 const unsigned long long size
= size_
;
43 Ebml_WriteLen(glob
, size
);
44 //TODO: it's not clear from the spec whether the nul terminator
45 //should be serialized too. For now we omit the null terminator.
46 Ebml_Write(glob
, str
, size
);
49 void Ebml_WriteUTF8(EbmlGlobal
*glob
, const wchar_t *wstr
)
51 const size_t strlen
= wcslen(wstr
);
53 //TODO: it's not clear from the spec whether the nul terminator
54 //should be serialized too. For now we include it.
55 const unsigned long long size
= strlen
;
57 Ebml_WriteLen(glob
, size
);
58 Ebml_Write(glob
, wstr
, size
);
61 void Ebml_WriteID(EbmlGlobal
*glob
, unsigned long class_id
)
63 if (class_id
>= 0x01000000)
64 Ebml_Serialize(glob
, (void *)&class_id
, 4);
65 else if (class_id
>= 0x00010000)
66 Ebml_Serialize(glob
, (void *)&class_id
, 3);
67 else if (class_id
>= 0x00000100)
68 Ebml_Serialize(glob
, (void *)&class_id
, 2);
70 Ebml_Serialize(glob
, (void *)&class_id
, 1);
72 void Ebml_SerializeUnsigned64(EbmlGlobal
*glob
, unsigned long class_id
, uint64_t ui
)
74 unsigned char sizeSerialized
= 8 | 0x80;
75 Ebml_WriteID(glob
, class_id
);
76 Ebml_Serialize(glob
, &sizeSerialized
, 1);
77 Ebml_Serialize(glob
, &ui
, 8);
80 void Ebml_SerializeUnsigned(EbmlGlobal
*glob
, unsigned long class_id
, unsigned long ui
)
82 unsigned char size
= 8; //size in bytes to output
83 unsigned char sizeSerialized
= 0;
86 Ebml_WriteID(glob
, class_id
);
87 minVal
= 0x7fLU
; //mask to compare for byte size
89 for (size
= 1; size
< 4; size
++)
99 sizeSerialized
= 0x80 | size
;
100 Ebml_Serialize(glob
, &sizeSerialized
, 1);
101 Ebml_Serialize(glob
, &ui
, size
);
103 //TODO: perhaps this is a poor name for this id serializer helper function
104 void Ebml_SerializeBinary(EbmlGlobal
*glob
, unsigned long class_id
, unsigned long bin
)
107 for (size
=4; size
> 1; size
--)
109 if (bin
& 0x000000ff << ((size
-1) * 8))
112 Ebml_WriteID(glob
, class_id
);
113 Ebml_WriteLen(glob
, size
);
114 Ebml_WriteID(glob
, bin
);
117 void Ebml_SerializeFloat(EbmlGlobal
*glob
, unsigned long class_id
, double d
)
119 unsigned char len
= 0x88;
121 Ebml_WriteID(glob
, class_id
);
122 Ebml_Serialize(glob
, &len
, 1);
123 Ebml_Serialize(glob
, &d
, 8);
126 void Ebml_WriteSigned16(EbmlGlobal
*glob
, short val
)
128 signed long out
= ((val
& 0x003FFFFF) | 0x00200000) << 8;
129 Ebml_Serialize(glob
, &out
, 3);
132 void Ebml_SerializeString(EbmlGlobal
*glob
, unsigned long class_id
, const char *s
)
134 Ebml_WriteID(glob
, class_id
);
135 Ebml_WriteString(glob
, s
);
138 void Ebml_SerializeUTF8(EbmlGlobal
*glob
, unsigned long class_id
, wchar_t *s
)
140 Ebml_WriteID(glob
, class_id
);
141 Ebml_WriteUTF8(glob
, s
);
144 void Ebml_SerializeData(EbmlGlobal
*glob
, unsigned long class_id
, unsigned char *data
, unsigned long data_length
)
146 Ebml_WriteID(glob
, class_id
);
147 Ebml_WriteLen(glob
, data_length
);
148 Ebml_Write(glob
, data
, data_length
);
151 void Ebml_WriteVoid(EbmlGlobal
*glob
, unsigned long vSize
)
153 unsigned char tmp
= 0;
156 Ebml_WriteID(glob
, 0xEC);
157 Ebml_WriteLen(glob
, vSize
);
159 for (i
= 0; i
< vSize
; i
++)
161 Ebml_Write(glob
, &tmp
, 1);
165 //TODO Serialize Date