1 //=========================================================================
2 // FILENAME	: tagutils-asf.h
3 // DESCRIPTION	: ASF (wma/wmv) metadata reader
4 //=========================================================================
5 // Copyright (c) 2008- NETGEAR, Inc. All Rights Reserved.
6 //=========================================================================
7 
8 /*
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program. If not, see <http://www.gnu.org/licenses/>.
21  */
22 
23 
24 #define __PACKED__  __attribute__((packed))
25 
26 #ifdef HAVE_MACHINE_ENDIAN_H
27 #include <machine/endian.h>
28 #else
29 #include <endian.h>
30 #endif
31 
32 typedef struct _GUID {
33 	uint32_t l;
34 	uint16_t w[2];
35 	uint8_t b[8];
36 } __PACKED__ GUID;
37 
38 #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
39 	GUID name = { l, { w1, w2 }, { b1, b2, b3, b4, b5, b6, b7, b8 } }
40 #define IsEqualGUID(rguid1, rguid2) (!memcmp(rguid1, rguid2, sizeof(GUID)))
41 
42 #if __BYTE_ORDER == __LITTLE_ENDIAN
43 #define SWAP32(l) (l)
44 #define SWAP16(w) (w)
45 #else
46 #define SWAP32(l) ( (((l) >> 24) & 0x000000ff) | (((l) >> 8) & 0x0000ff00) | (((l) << 8) & 0x00ff0000) | (((l) << 24) & 0xff000000) )
47 #define SWAP16(w) ( (((w) >> 8) & 0x00ff) | (((w) << 8) & 0xff00) )
48 #endif
49 
50 DEFINE_GUID(ASF_StreamHeader, SWAP32(0xb7dc0791), SWAP16(0xa9b7), SWAP16(0x11cf),
51 	    0x8e, 0xe6, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65);
52 
53 DEFINE_GUID(ASF_VideoStream, SWAP32(0xbc19efc0), SWAP16(0x5b4d), SWAP16(0x11cf),
54 	    0xa8, 0xfd, 0x00, 0x80, 0x5f, 0x5c, 0x44, 0x2b);
55 
56 DEFINE_GUID(ASF_AudioStream, SWAP32(0xf8699e40), SWAP16(0x5b4d), SWAP16(0x11cf),
57 	    0xa8, 0xfd, 0x00, 0x80, 0x5f, 0x5c, 0x44, 0x2b);
58 
59 DEFINE_GUID(ASF_HeaderObject, SWAP32(0x75b22630), SWAP16(0x668e), SWAP16(0x11cf),
60 	    0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c);
61 
62 DEFINE_GUID(ASF_FileProperties, SWAP32(0x8cabdca1), SWAP16(0xa947), SWAP16(0x11cf),
63 	    0x8e, 0xe4, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65);
64 
65 DEFINE_GUID(ASF_ContentDescription, SWAP32(0x75b22633), SWAP16(0x668e), SWAP16(0x11cf),
66 	    0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c);
67 
68 DEFINE_GUID(ASF_ExtendedContentDescription, SWAP32(0xd2d0a440), SWAP16(0xe307), SWAP16(0x11d2),
69 	    0x97, 0xf0, 0x00, 0xa0, 0xc9, 0x5e, 0xa8, 0x50);
70 
71 DEFINE_GUID(ASF_ClientGuid, SWAP32(0x8d262e32), SWAP16(0xfc28), SWAP16(0x11d7),
72 	    0xa9, 0xea, 0x00, 0x04, 0x5a, 0x6b, 0x76, 0xc2);
73 
74 DEFINE_GUID(ASF_HeaderExtension, SWAP32(0x5fbf03b5), SWAP16(0xa92e), SWAP16(0x11cf),
75 	    0x8e, 0xe3, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65);
76 
77 DEFINE_GUID(ASF_CodecList, SWAP32(0x86d15240), SWAP16(0x311d), SWAP16(0x11d0),
78 	    0xa3, 0xa4, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6);
79 
80 DEFINE_GUID(ASF_DataObject, SWAP32(0x75b22636), SWAP16(0x668e), SWAP16(0x11cf),
81 	    0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c);
82 
83 DEFINE_GUID(ASF_PaddingObject, SWAP32(0x1806d474), SWAP16(0xcadf), SWAP16(0x4509),
84 	    0xa4, 0xba, 0x9a, 0xab, 0xcb, 0x96, 0xaa, 0xe8);
85 
86 DEFINE_GUID(ASF_SimpleIndexObject, SWAP32(0x33000890), SWAP16(0xe5b1), SWAP16(0x11cf),
87 	    0x89, 0xf4, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xcb);
88 
89 DEFINE_GUID(ASF_NoErrorCorrection, SWAP32(0x20fb5700), SWAP16(0x5b55), SWAP16(0x11cf),
90 	    0xa8, 0xfd, 0x00, 0x80, 0x5f, 0x5c, 0x44, 0x2b);
91 
92 DEFINE_GUID(ASF_AudioSpread, SWAP32(0xbfc3cd50), SWAP16(0x618f), SWAP16(0x11cf),
93 	    0x8b, 0xb2, 0x00, 0xaa, 0x00, 0xb4, 0xe2, 0x20);
94 
95 DEFINE_GUID(ASF_Reserved1, SWAP32(0xabd3d211), SWAP16(0xa9ba), SWAP16(0x11cf),
96 	    0x8e, 0xe6, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65);
97 
98 DEFINE_GUID(ASF_Reserved2, SWAP32(0x86d15241), SWAP16(0x311d), SWAP16(0x11d0),
99 	    0xa3, 0xa4, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6);
100 
101 DEFINE_GUID(ASF_ContentEncryptionObject, SWAP32(0x2211B3FB), SWAP16(0xBD23), SWAP16(0x11D2),
102 	    0xB4, 0xB7, 0x00, 0xA0, 0xC9, 0x55, 0xFC, 0x6E);
103 
104 DEFINE_GUID(ASF_ExtendedContentEncryptionObject, SWAP32(0x298AE614), SWAP16(0x2622), SWAP16(0x4C17),
105 	    0xB9, 0x35, 0xDA, 0xE0, 0x7E, 0xE9, 0x28, 0x9C);
106 
107 DEFINE_GUID(ASF_ExtendedStreamPropertiesObject, SWAP32(0x14E6A5CB), SWAP16(0xC672), SWAP16(0x4332),
108 	    0x83, 0x99, 0xA9, 0x69, 0x52, 0x06, 0x5B, 0x5A);
109 
110 DEFINE_GUID(ASF_MediaTypeAudio, SWAP32(0x31178C9D), SWAP16(0x03E1), SWAP16(0x4528),
111 	    0xB5, 0x82, 0x3D, 0xF9, 0xDB, 0x22, 0xF5, 0x03);
112 
113 DEFINE_GUID(ASF_FormatTypeWave, SWAP32(0xC4C4C4D1), SWAP16(0x0049), SWAP16(0x4E2B),
114 	    0x98, 0xFB, 0x95, 0x37, 0xF6, 0xCE, 0x51, 0x6D);
115 
116 DEFINE_GUID(ASF_StreamBufferStream, SWAP32(0x3AFB65E2), SWAP16(0x47EF), SWAP16(0x40F2),
117 	    0xAC, 0x2C, 0x70, 0xA9, 0x0D, 0x71, 0xD3, 0x43);
118 
119 typedef struct _BITMAPINFOHEADER {
120 	uint32_t biSize;
121 	int32_t biWidth;
122 	int32_t biHeight;
123 	uint16_t biPlanes;
124 	uint16_t biBitCount;
125 	uint32_t biCompression;
126 	uint32_t biSizeImage;
127 	int32_t biXPelsPerMeter;
128 	int32_t biYPelsPerMeter;
129 	uint32_t biClrUsed;
130 	uint32_t biClrImportant;
131 } __PACKED__ BITMAPINFOHEADER;
132 
133 typedef struct _WAVEFORMATEX {
134 	uint16_t wFormatTag;
135 	uint16_t nChannels;
136 	uint32_t nSamplesPerSec;
137 	uint32_t nAvgBytesPerSec;
138 	uint16_t nBlockAlign;
139 	uint16_t wBitsPerSample;
140 	uint16_t cbSize;
141 } __PACKED__ WAVEFORMATEX;
142 
143 typedef struct _asf_stream_object_t {
144 	GUID ID;
145 	uint64_t Size;
146 	GUID StreamType;
147 	GUID ErrorCorrectionType;
148 	uint64_t TimeOffset;
149 	uint32_t TypeSpecificSize;
150 	uint32_t ErrorCorrectionSize;
151 	uint16_t StreamNumber;
152 	uint32_t Reserved;
153 } __PACKED__ asf_stream_object_t;
154 
155 typedef struct _asf_media_stream_t {
156 	asf_stream_object_t Hdr;
157 	GUID MajorType;
158 	GUID SubType;
159 	uint32_t FixedSizeSamples;
160 	uint32_t TemporalCompression;
161 	uint32_t SampleSize;
162 	GUID FormatType;
163 	uint32_t FormatSize;
164 } __PACKED__ asf_media_stream_t;
165 
166 typedef struct _avi_audio_format_t {
167 	uint16_t wFormatTag;
168 	uint16_t nChannels;
169 	uint32_t nSamplesPerSec;
170 	uint32_t nAvgBytesPerSec;
171 	uint16_t nBlockAlign;
172 	uint16_t wBitsPerSample;
173 	uint16_t cbSize;
174 } __PACKED__ avi_audio_format_t;
175 
176 typedef struct _asf_extended_stream_object_t {
177 	GUID ID;
178 	uint64_t Size;
179 	uint64_t StartTime;
180 	uint64_t EndTime;
181 	uint32_t DataBitrate;
182 	uint32_t BufferSize;
183 	uint32_t InitialBufferFullness;
184 	uint32_t AltDataBitrate;
185 	uint32_t AltBufferSize;
186 	uint32_t AltInitialBufferFullness;
187 	uint32_t MaximumObjectSize;
188 	uint32_t Flags;
189 	uint16_t StreamNumber;
190 	uint16_t LanguageIDIndex;
191 	uint64_t AvgTimePerFrame;
192 	uint16_t StreamNameCount;
193 	uint16_t PayloadExtensionSystemCount;
194 } __PACKED__ asf_extended_stream_object_t;
195 
196 typedef struct _asf_stream_name_t {
197 	uint16_t ID;
198 	uint16_t Length;
199 } __PACKED__ asf_stream_name_t;
200 
201 typedef struct _asf_payload_extension_t {
202 	GUID ID;
203 	uint16_t Size;
204 	uint32_t InfoLength;
205 } __PACKED__ asf_payload_extension_t;
206 
207 
208 
209 typedef struct _asf_object_t {
210 	GUID ID;
211 	uint64_t Size;
212 } __PACKED__ asf_object_t;
213 
214 typedef struct _asf_codec_entry_t {
215 	uint16_t Type;
216 	uint16_t NameLen;
217 	uint32_t Name;
218 	uint16_t DescLen;
219 	uint32_t Desc;
220 	uint16_t InfoLen;
221 	uint32_t Info;
222 } __PACKED__ asf_codec_entry_t;
223 
224 typedef struct _asf_codec_list_t {
225 	GUID ID;
226 	uint64_t Size;
227 	GUID Reserved;
228 	uint64_t NumEntries;
229 	asf_codec_entry_t Entries[2];
230 	asf_codec_entry_t VideoCodec;
231 } __PACKED__ asf_codec_list_t;
232 
233 typedef struct _asf_content_description_t {
234 	GUID ID;
235 	uint64_t Size;
236 	uint16_t TitleLength;
237 	uint16_t AuthorLength;
238 	uint16_t CopyrightLength;
239 	uint16_t DescriptionLength;
240 	uint16_t RatingLength;
241 	uint32_t Title;
242 	uint32_t Author;
243 	uint32_t Copyright;
244 	uint32_t Description;
245 	uint32_t Rating;
246 } __PACKED__ asf_content_description_t;
247 
248 typedef struct _asf_file_properties_t {
249 	GUID ID;
250 	uint64_t Size;
251 	GUID FileID;
252 	uint64_t FileSize;
253 	uint64_t CreationTime;
254 	uint64_t TotalPackets;
255 	uint64_t PlayDuration;
256 	uint64_t SendDuration;
257 	uint64_t Preroll;
258 	uint32_t Flags;
259 	uint32_t MinPacketSize;
260 	uint32_t MaxPacketSize;
261 	uint32_t MaxBitrate;
262 } __PACKED__ asf_file_properties_t;
263 
264 typedef struct _asf_header_extension_t {
265 	GUID ID;
266 	uint64_t Size;
267 	GUID Reserved1;
268 	uint16_t Reserved2;
269 	uint32_t DataSize;
270 } __PACKED__ asf_header_extension_t;
271 
272 typedef struct _asf_video_stream_t {
273 	asf_stream_object_t Hdr;
274 	uint32_t Width;
275 	uint32_t Height;
276 	uint8_t ReservedFlags;
277 	uint16_t FormatSize;
278 	BITMAPINFOHEADER bmi;
279 	uint8_t ebih[1];
280 } __PACKED__ asf_video_stream_t;
281 
282 typedef struct _asf_audio_stream_t {
283 	asf_stream_object_t Hdr;
284 	WAVEFORMATEX wfx;
285 } __PACKED__ asf_audio_stream_t;
286 
287 typedef struct _asf_payload_t {
288 	uint8_t StreamNumber;
289 	uint8_t MediaObjectNumber;
290 	uint32_t MediaObjectOffset;
291 	uint8_t ReplicatedDataLength;
292 	uint32_t ReplicatedData[2];
293 	uint32_t PayloadLength;
294 } __PACKED__ asf_payload_t;
295 
296 typedef struct _asf_packet_t {
297 	uint8_t TypeFlags;
298 	uint8_t ECFlags;
299 	uint8_t ECType;
300 	uint8_t ECCycle;
301 	uint8_t PropertyFlags;
302 	uint32_t PacketLength;
303 	uint32_t Sequence;
304 	uint32_t PaddingLength;
305 	uint32_t SendTime;
306 	uint16_t Duration;
307 	uint8_t PayloadFlags;
308 	asf_payload_t Payload;
309 } __PACKED__ asf_packet_t;
310 
311 typedef struct _asf_data_object_t {
312 	GUID ID;
313 	uint64_t Size;
314 	GUID FileID;
315 	uint64_t TotalPackets;
316 	unsigned short Reserved;
317 } __PACKED__ asf_data_object_t;
318 
319 typedef struct _asf_padding_object_t {
320 	GUID ID;
321 	uint64_t Size;
322 } __PACKED__ asf_padding_object_t;
323 
324 typedef struct _asf_simple_index_object_t {
325 	GUID ID;
326 	uint64_t Size;
327 	GUID FileID;
328 	uint32_t IndexEntryTimeInterval;
329 	uint32_t MaximumPacketCount;
330 	uint32_t IndexEntriesCount;
331 } __PACKED__ asf_simple_index_object_t;
332 
333 typedef struct _asf_header_object_t {
334 	GUID ID;
335 	uint64_t Size;
336 	uint32_t NumObjects;
337 	uint16_t Reserved;
338 	asf_header_extension_t HeaderExtension;
339 	asf_content_description_t ContentDescription;
340 	asf_file_properties_t FileProperties;
341 	asf_video_stream_t *        VideoStream;
342 	asf_audio_stream_t *        AudioStream;
343 	asf_codec_list_t CodecList;
344 	asf_padding_object_t PaddingObject;
345 } __PACKED__ asf_header_object_t;
346 
347 
348 #define ASF_VT_UNICODE          (0)
349 #define ASF_VT_BYTEARRAY        (1)
350 #define ASF_VT_BOOL             (2)
351 #define ASF_VT_DWORD            (3)
352 #define ASF_VT_QWORD            (4)
353 #define ASF_VT_WORD             (5)
354 
355 static int _get_asffileinfo(char *file, struct song_metadata *psong);
356