]> git.sesse.net Git - vlc/blob - modules/demux/asf/libasf.h
ASF: macro removal in ASF_CountObject
[vlc] / modules / demux / asf / libasf.h
1 /*****************************************************************************
2  * libasf.h :
3  *****************************************************************************
4  * Copyright © 2001-2004, 2011 the VideoLAN team
5  *
6  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
21  *****************************************************************************/
22
23
24 /*****************************************************************************
25  * Structure needed for decoder
26  *****************************************************************************/
27
28 #include "libasf_guid.h"
29
30 #define ASF_OBJECT_COMMON          \
31     int          i_type;           \
32     guid_t       i_object_id;      \
33     uint64_t     i_object_size;    \
34     uint64_t     i_object_pos;     \
35     union asf_object_u *p_father;  \
36     union asf_object_u *p_first;   \
37     union asf_object_u *p_last;    \
38     union asf_object_u *p_next;
39
40 typedef struct
41 {
42     ASF_OBJECT_COMMON
43
44 } asf_object_common_t;
45
46 typedef struct
47 {
48     uint32_t i_packet_number;
49     uint16_t i_packet_count;
50
51 } asf_index_entry_t;
52
53 /****************************************************************************
54  * High level asf object
55  ****************************************************************************/
56 /* This is the first header found in an asf file
57  * It's the only object that has subobjects */
58 typedef struct
59 {
60     ASF_OBJECT_COMMON
61     uint32_t i_sub_object_count;
62     uint8_t  i_reserved1; /* 0x01, but could be safely ignored */
63     uint8_t  i_reserved2; /* 0x02, if not must failed to source the contain */
64
65 } asf_object_header_t;
66
67 typedef struct
68 {
69     ASF_OBJECT_COMMON
70     guid_t      i_file_id;
71     uint64_t    i_total_data_packets;
72     uint16_t    i_reserved;
73
74 } asf_object_data_t;
75
76
77 typedef struct
78 {
79     ASF_OBJECT_COMMON
80     guid_t      i_file_id;
81     uint64_t    i_index_entry_time_interval;
82     uint32_t    i_max_packet_count;
83     uint32_t    i_index_entry_count;
84
85     asf_index_entry_t *index_entry;
86
87 } asf_object_index_t;
88
89 /****************************************************************************
90  * Sub level asf object
91  ****************************************************************************/
92 #define ASF_FILE_PROPERTIES_BROADCAST   0x01
93 #define ASF_FILE_PROPERTIES_SEEKABLE    0x02
94
95 typedef struct
96 {
97     ASF_OBJECT_COMMON
98
99     guid_t  i_file_id;
100     uint64_t     i_file_size;
101     uint64_t     i_creation_date;
102     uint64_t     i_data_packets_count;
103     uint64_t     i_play_duration;
104     uint64_t     i_send_duration;
105     uint64_t     i_preroll;
106     uint32_t     i_flags;
107     uint32_t     i_min_data_packet_size;
108     uint32_t     i_max_data_packet_size;
109     uint32_t     i_max_bitrate;
110
111 } asf_object_file_properties_t;
112
113 #define ASF_STREAM_PROPERTIES_ENCRYPTED 0x8000
114 typedef struct
115 {
116     ASF_OBJECT_COMMON
117
118     guid_t  i_stream_type;
119     guid_t  i_error_correction_type;
120     uint64_t     i_time_offset;
121     uint32_t     i_type_specific_data_length;
122     uint32_t     i_error_correction_data_length;
123     uint16_t     i_flags;
124         /* extrated from flags */
125         uint8_t i_stream_number;
126     uint32_t    i_reserved;
127     uint8_t     *p_type_specific_data;
128     uint8_t     *p_error_correction_data;
129 } asf_object_stream_properties_t;
130
131 typedef struct
132 {
133     ASF_OBJECT_COMMON
134
135     guid_t      i_reserved1;
136     uint16_t    i_reserved2;
137     uint32_t    i_header_extension_size;
138     uint8_t     *p_header_extension_data;
139
140 } asf_object_header_extension_t;
141
142 enum {
143     ASF_METADATA_TYPE_STRING,
144     ASF_METADATA_TYPE_BYTE,
145     ASF_METADATA_TYPE_BOOL,
146     ASF_METADATA_TYPE_DWORD,
147     ASF_METADATA_TYPE_QWORD,
148     ASF_METADATA_TYPE_WORD,
149 };
150
151 typedef struct
152 {
153     uint16_t    i_stream;
154     uint16_t    i_type;
155     char        *psz_name;
156
157     int64_t i_val;
158     int i_data;
159     uint8_t *p_data;
160
161 } asf_metadata_record_t;
162
163 typedef struct
164 {
165     ASF_OBJECT_COMMON
166
167     uint32_t i_record_entries_count;
168     asf_metadata_record_t *record;
169
170 } asf_object_metadata_t;
171
172 typedef struct
173 {
174     ASF_OBJECT_COMMON
175
176     char *psz_title;
177     char *psz_artist;
178     char *psz_copyright;
179     char *psz_description;
180     char *psz_rating;
181
182 } asf_object_content_description_t;
183
184 typedef struct
185 {
186     uint16_t i_length;
187     uint16_t *i_char;
188
189 } string16_t;
190
191 #define ASF_CODEC_TYPE_VIDEO    0x0001
192 #define ASF_CODEC_TYPE_AUDIO    0x0002
193 #define ASF_CODEC_TYPE_UNKNOW   0xffff
194
195 typedef struct
196 {
197     uint16_t    i_type;
198     char        *psz_name;
199     char        *psz_description;
200
201     uint16_t    i_information_length;
202     uint8_t     *p_information;
203 } asf_codec_entry_t;
204
205 typedef struct
206 {
207     ASF_OBJECT_COMMON
208     guid_t      i_reserved;
209     uint32_t    i_codec_entries_count;
210     asf_codec_entry_t *codec;
211
212 } asf_object_codec_list_t;
213
214 typedef struct
215 {
216     uint64_t     i_offset;
217     uint64_t     i_presentation_time;
218     uint16_t     i_entry_length;
219     uint32_t     i_send_time;
220     uint32_t     i_flags;
221     uint32_t     i_marker_description_length;
222     uint8_t      *i_marker_description;
223
224 } asf_marker_t;
225
226 typedef struct
227 {
228     ASF_OBJECT_COMMON
229     guid_t      i_reserved1;
230     uint32_t    i_count;
231     uint16_t    i_reserved2;
232     string16_t name;
233     asf_marker_t *marker;
234
235 } asf_object_marker_t;
236
237 typedef struct
238 {
239     ASF_OBJECT_COMMON
240     int  i_language;
241     char **ppsz_language;
242
243 } asf_object_language_list_t;
244
245 typedef struct
246 {
247     ASF_OBJECT_COMMON
248
249     int i_bitrate;
250     struct
251     {
252         int      i_stream_number;
253         uint32_t i_avg_bitrate;
254     } bitrate[128];
255 } asf_object_stream_bitrate_properties_t;
256
257 typedef struct
258 {
259     ASF_OBJECT_COMMON
260
261     int64_t i_start_time;
262     int64_t i_end_time;
263     int32_t i_data_bitrate;
264     int32_t i_buffer_size;
265     int32_t i_initial_buffer_fullness;
266     int32_t i_alternate_data_bitrate;
267     int32_t i_alternate_buffer_size;
268     int32_t i_alternate_initial_buffer_fullness;
269     int32_t i_maximum_object_size;
270
271     int32_t i_flags;
272     int16_t i_stream_number;
273     int16_t i_language_index;
274     int64_t i_average_time_per_frame;
275
276     int     i_stream_name_count;
277     int     i_payload_extension_system_count;
278
279     int     *pi_stream_name_language;
280     char    **ppsz_stream_name;
281
282     asf_object_stream_properties_t *p_sp;
283 } asf_object_extended_stream_properties_t;
284
285 typedef struct
286 {
287     ASF_OBJECT_COMMON
288
289     guid_t  type;
290     int16_t i_stream_number_count;
291     int16_t *pi_stream_number;
292
293 } asf_object_advanced_mutual_exclusion_t;
294
295 typedef struct
296 {
297     ASF_OBJECT_COMMON
298
299     int i_priority_count;
300     int *pi_priority_flag;
301     int *pi_priority_stream_number;
302 } asf_object_stream_prioritization_t;
303
304 typedef struct
305 {
306     ASF_OBJECT_COMMON
307
308     int i_count;
309     char **ppsz_name;
310     char **ppsz_value;
311 } asf_object_extended_content_description_t;
312
313 /****************************************************************************
314  * Special Root Object
315  ****************************************************************************/
316 typedef struct
317 {
318     ASF_OBJECT_COMMON
319
320     asf_object_header_t *p_hdr;
321     asf_object_data_t   *p_data;
322     /* could be NULL if !b_seekable or not-present */
323     asf_object_index_t  *p_index;
324
325     /* from asf_object_header_t */
326     asf_object_file_properties_t *p_fp;
327
328     /* from asf_object_header_extension_t */
329     asf_object_metadata_t *p_metadata;
330
331 } asf_object_root_t;
332
333 /****************************************************************************
334  * asf_object_t: union of all objects.
335  ****************************************************************************/
336 typedef union asf_object_u
337 {
338     asf_object_common_t common;
339     asf_object_header_t header;
340     asf_object_data_t   data;
341     asf_object_index_t  index;
342     asf_object_root_t   root;
343     asf_object_file_properties_t    file_properties;
344     asf_object_stream_properties_t  stream_properties;
345     asf_object_header_extension_t   header_extension;
346     asf_object_metadata_t           metadata;
347     asf_object_codec_list_t         codec_list;
348     asf_object_marker_t             marker;
349     asf_object_language_list_t      language_list;
350     asf_object_stream_bitrate_properties_t stream_bitrate;
351     asf_object_extended_stream_properties_t ext_stream;
352     asf_object_content_description_t content_description;
353     asf_object_advanced_mutual_exclusion_t advanced_mutual_exclusion;
354     asf_object_stream_prioritization_t stream_prioritization;
355     asf_object_extended_content_description_t extended_content_description;
356
357 } asf_object_t;
358
359 asf_object_root_t *ASF_ReadObjectRoot( stream_t *, int b_seekable );
360 void               ASF_FreeObjectRoot( stream_t *, asf_object_root_t *p_root );
361
362 int ASF_CountObject ( void *p_obj, const guid_t *p_guid );
363
364 #define ASF_FindObject( a, b, c )  __ASF_FindObject( (asf_object_t*)(a), b, c )
365 void *__ASF_FindObject( asf_object_t *p_obj, const guid_t *p_guid, int i_number );