ffmpeg / libavformat / asf.h @ 5509bffa
History | View | Annotate | Download (9.41 KB)
1 |
/*
|
---|---|
2 |
* Copyright (c) 2000, 2001 Fabrice Bellard.
|
3 |
*
|
4 |
* This library is free software; you can redistribute it and/or
|
5 |
* modify it under the terms of the GNU Lesser General Public
|
6 |
* License as published by the Free Software Foundation; either
|
7 |
* version 2 of the License, or (at your option) any later version.
|
8 |
*
|
9 |
* This library is distributed in the hope that it will be useful,
|
10 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
12 |
* Lesser General Public License for more details.
|
13 |
*
|
14 |
* You should have received a copy of the GNU Lesser General Public
|
15 |
* License along with this library; if not, write to the Free Software
|
16 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
17 |
*/
|
18 |
#define PACKET_SIZE 3200 |
19 |
|
20 |
typedef struct { |
21 |
int num;
|
22 |
unsigned char seq; |
23 |
/* use for reading */
|
24 |
AVPacket pkt; |
25 |
int frag_offset;
|
26 |
int timestamp;
|
27 |
int64_t duration; |
28 |
|
29 |
int ds_span; /* descrambling */ |
30 |
int ds_packet_size;
|
31 |
int ds_chunk_size;
|
32 |
int ds_data_size;
|
33 |
int ds_silence_data;
|
34 |
|
35 |
int packet_pos;
|
36 |
|
37 |
} ASFStream; |
38 |
|
39 |
typedef struct { |
40 |
uint32_t v1; |
41 |
uint16_t v2; |
42 |
uint16_t v3; |
43 |
uint8_t v4[8];
|
44 |
} GUID; |
45 |
|
46 |
typedef struct { |
47 |
GUID guid; // generated by client computer
|
48 |
uint64_t file_size; // in bytes
|
49 |
// invalid if broadcasting
|
50 |
uint64_t create_time; // time of creation, in 100-nanosecond units since 1.1.1601
|
51 |
// invalid if broadcasting
|
52 |
uint64_t packets_count; // how many packets are there in the file
|
53 |
// invalid if broadcasting
|
54 |
uint64_t play_time; // play time, in 100-nanosecond units
|
55 |
// invalid if broadcasting
|
56 |
uint64_t send_time; // time to send file, in 100-nanosecond units
|
57 |
// invalid if broadcasting (could be ignored)
|
58 |
uint32_t preroll; // timestamp of the first packet, in milliseconds
|
59 |
// if nonzero - substract from time
|
60 |
uint32_t ignore; // preroll is 64bit - but let's just ignore it
|
61 |
uint32_t flags; // 0x01 - broadcast
|
62 |
// 0x02 - seekable
|
63 |
// rest is reserved should be 0
|
64 |
uint32_t min_pktsize; // size of a data packet
|
65 |
// invalid if broadcasting
|
66 |
uint32_t max_pktsize; // shall be the same as for min_pktsize
|
67 |
// invalid if broadcasting
|
68 |
uint32_t max_bitrate; // bandwith of stream in bps
|
69 |
// should be the sum of bitrates of the
|
70 |
// individual media streams
|
71 |
} ASFMainHeader; |
72 |
|
73 |
|
74 |
typedef struct { |
75 |
uint32_t packet_number; |
76 |
uint16_t packet_count; |
77 |
} ASFIndex; |
78 |
|
79 |
|
80 |
typedef struct { |
81 |
uint32_t seqno; |
82 |
unsigned int packet_size; |
83 |
int is_streamed;
|
84 |
int asfid2avid[128]; /* conversion table from asf ID 2 AVStream ID */ |
85 |
ASFStream streams[128]; /* it's max number and it's not that big */ |
86 |
/* non streamed additonnal info */
|
87 |
int64_t nb_packets; |
88 |
int64_t duration; /* in 100ns units */
|
89 |
/* packet filling */
|
90 |
unsigned char multi_payloads_present; |
91 |
int packet_size_left;
|
92 |
int prev_packet_sent_time;
|
93 |
int packet_timestamp_start;
|
94 |
int packet_timestamp_end;
|
95 |
unsigned int packet_nb_payloads; |
96 |
int packet_nb_frames;
|
97 |
uint8_t packet_buf[PACKET_SIZE]; |
98 |
ByteIOContext pb; |
99 |
/* only for reading */
|
100 |
uint64_t data_offset; /* begining of the first data packet */
|
101 |
|
102 |
ASFMainHeader hdr; |
103 |
|
104 |
int packet_flags;
|
105 |
int packet_property;
|
106 |
int packet_timestamp;
|
107 |
int packet_segsizetype;
|
108 |
int packet_segments;
|
109 |
int packet_seq;
|
110 |
int packet_replic_size;
|
111 |
int packet_key_frame;
|
112 |
int packet_padsize;
|
113 |
int packet_frag_offset;
|
114 |
int packet_frag_size;
|
115 |
int packet_frag_timestamp;
|
116 |
int packet_multi_size;
|
117 |
int packet_obj_size;
|
118 |
int packet_time_delta;
|
119 |
int packet_time_start;
|
120 |
int packet_pos;
|
121 |
|
122 |
int stream_index;
|
123 |
|
124 |
|
125 |
int64_t last_indexed_pts; |
126 |
ASFIndex* index_ptr; |
127 |
uint32_t nb_index_count; |
128 |
uint32_t nb_index_memory_alloc; |
129 |
uint16_t maximum_packet; |
130 |
|
131 |
ASFStream* asf_st; /* currently decoded stream */
|
132 |
} ASFContext; |
133 |
|
134 |
static const GUID asf_header = { |
135 |
0x75B22630, 0x668E, 0x11CF, { 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C }, |
136 |
}; |
137 |
|
138 |
static const GUID file_header = { |
139 |
0x8CABDCA1, 0xA947, 0x11CF, { 0x8E, 0xE4, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65 }, |
140 |
}; |
141 |
|
142 |
static const GUID stream_header = { |
143 |
0xB7DC0791, 0xA9B7, 0x11CF, { 0x8E, 0xE6, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65 }, |
144 |
}; |
145 |
|
146 |
static const GUID audio_stream = { |
147 |
0xF8699E40, 0x5B4D, 0x11CF, { 0xA8, 0xFD, 0x00, 0x80, 0x5F, 0x5C, 0x44, 0x2B }, |
148 |
}; |
149 |
|
150 |
static const GUID audio_conceal_none = { |
151 |
// 0x49f1a440, 0x4ece, 0x11d0, { 0xa3, 0xac, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6 },
|
152 |
// New value lifted from avifile
|
153 |
0x20fb5700, 0x5b55, 0x11cf, { 0xa8, 0xfd, 0x00, 0x80, 0x5f, 0x5c, 0x44, 0x2b }, |
154 |
}; |
155 |
|
156 |
static const GUID audio_conceal_spread = { |
157 |
0xBFC3CD50, 0x618F, 0x11CF, { 0x8B, 0xB2, 0x00, 0xAA, 0x00, 0xB4, 0xE2, 0x20 }, |
158 |
}; |
159 |
|
160 |
static const GUID video_stream = { |
161 |
0xBC19EFC0, 0x5B4D, 0x11CF, { 0xA8, 0xFD, 0x00, 0x80, 0x5F, 0x5C, 0x44, 0x2B }, |
162 |
}; |
163 |
|
164 |
static const GUID video_conceal_none = { |
165 |
0x20FB5700, 0x5B55, 0x11CF, { 0xA8, 0xFD, 0x00, 0x80, 0x5F, 0x5C, 0x44, 0x2B }, |
166 |
}; |
167 |
|
168 |
static const GUID command_stream = { |
169 |
0x59DACFC0, 0x59E6, 0x11D0, { 0xA3, 0xAC, 0x00, 0xA0, 0xC9, 0x03, 0x48, 0xF6 }, |
170 |
}; |
171 |
|
172 |
static const GUID comment_header = { |
173 |
0x75b22633, 0x668e, 0x11cf, { 0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c }, |
174 |
}; |
175 |
|
176 |
static const GUID codec_comment_header = { |
177 |
0x86D15240, 0x311D, 0x11D0, { 0xA3, 0xA4, 0x00, 0xA0, 0xC9, 0x03, 0x48, 0xF6 }, |
178 |
}; |
179 |
static const GUID codec_comment1_header = { |
180 |
0x86d15241, 0x311d, 0x11d0, { 0xa3, 0xa4, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6 }, |
181 |
}; |
182 |
|
183 |
static const GUID data_header = { |
184 |
0x75b22636, 0x668e, 0x11cf, { 0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c }, |
185 |
}; |
186 |
|
187 |
static const GUID head1_guid = { |
188 |
0x5fbf03b5, 0xa92e, 0x11cf, { 0x8e, 0xe3, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65 }, |
189 |
}; |
190 |
|
191 |
static const GUID head2_guid = { |
192 |
0xabd3d211, 0xa9ba, 0x11cf, { 0x8e, 0xe6, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65 }, |
193 |
}; |
194 |
|
195 |
static const GUID extended_content_header = { |
196 |
0xD2D0A440, 0xE307, 0x11D2, { 0x97, 0xF0, 0x00, 0xA0, 0xC9, 0x5E, 0xA8, 0x50 }, |
197 |
}; |
198 |
|
199 |
static const GUID simple_index_header = { |
200 |
0x33000890, 0xE5B1, 0x11CF, { 0x89, 0xF4, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0xCB }, |
201 |
}; |
202 |
|
203 |
/* I am not a number !!! This GUID is the one found on the PC used to
|
204 |
generate the stream */
|
205 |
static const GUID my_guid = { |
206 |
0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, |
207 |
}; |
208 |
|
209 |
#define ASF_PACKET_FLAG_ERROR_CORRECTION_PRESENT 0x80 //1000 0000 |
210 |
|
211 |
|
212 |
// ASF data packet structure
|
213 |
// =========================
|
214 |
//
|
215 |
//
|
216 |
// -----------------------------------
|
217 |
// | Error Correction Data | Optional
|
218 |
// -----------------------------------
|
219 |
// | Payload Parsing Information (PPI) |
|
220 |
// -----------------------------------
|
221 |
// | Payload Data |
|
222 |
// -----------------------------------
|
223 |
// | Padding Data |
|
224 |
// -----------------------------------
|
225 |
|
226 |
|
227 |
// PPI_FLAG - Payload parsing information flags
|
228 |
#define ASF_PPI_FLAG_MULTIPLE_PAYLOADS_PRESENT 1 |
229 |
|
230 |
#define ASF_PPI_FLAG_SEQUENCE_FIELD_IS_BYTE 0x02 //0000 0010 |
231 |
#define ASF_PPI_FLAG_SEQUENCE_FIELD_IS_WORD 0x04 //0000 0100 |
232 |
#define ASF_PPI_FLAG_SEQUENCE_FIELD_IS_DWORD 0x06 //0000 0110 |
233 |
#define ASF_PPI_MASK_SEQUENCE_FIELD_SIZE 0x06 //0000 0110 |
234 |
|
235 |
#define ASF_PPI_FLAG_PADDING_LENGTH_FIELD_IS_BYTE 0x08 //0000 1000 |
236 |
#define ASF_PPI_FLAG_PADDING_LENGTH_FIELD_IS_WORD 0x10 //0001 0000 |
237 |
#define ASF_PPI_FLAG_PADDING_LENGTH_FIELD_IS_DWORD 0x18 //0001 1000 |
238 |
#define ASF_PPI_MASK_PADDING_LENGTH_FIELD_SIZE 0x18 //0001 1000 |
239 |
|
240 |
#define ASF_PPI_FLAG_PACKET_LENGTH_FIELD_IS_BYTE 0x20 //0010 0000 |
241 |
#define ASF_PPI_FLAG_PACKET_LENGTH_FIELD_IS_WORD 0x40 //0100 0000 |
242 |
#define ASF_PPI_FLAG_PACKET_LENGTH_FIELD_IS_DWORD 0x60 //0110 0000 |
243 |
#define ASF_PPI_MASK_PACKET_LENGTH_FIELD_SIZE 0x60 //0110 0000 |
244 |
|
245 |
// PL_FLAG - Payload flags
|
246 |
#define ASF_PL_FLAG_REPLICATED_DATA_LENGTH_FIELD_IS_BYTE 0x01 //0000 0001 |
247 |
#define ASF_PL_FLAG_REPLICATED_DATA_LENGTH_FIELD_IS_WORD 0x02 //0000 0010 |
248 |
#define ASF_PL_FLAG_REPLICATED_DATA_LENGTH_FIELD_IS_DWORD 0x03 //0000 0011 |
249 |
#define ASF_PL_MASK_REPLICATED_DATA_LENGTH_FIELD_SIZE 0x03 //0000 0011 |
250 |
|
251 |
#define ASF_PL_FLAG_OFFSET_INTO_MEDIA_OBJECT_LENGTH_FIELD_IS_BYTE 0x04 //0000 0100 |
252 |
#define ASF_PL_FLAG_OFFSET_INTO_MEDIA_OBJECT_LENGTH_FIELD_IS_WORD 0x08 //0000 1000 |
253 |
#define ASF_PL_FLAG_OFFSET_INTO_MEDIA_OBJECT_LENGTH_FIELD_IS_DWORD 0x0c //0000 1100 |
254 |
#define ASF_PL_MASK_OFFSET_INTO_MEDIA_OBJECT_LENGTH_FIELD_SIZE 0x0c //0000 1100 |
255 |
|
256 |
#define ASF_PL_FLAG_MEDIA_OBJECT_NUMBER_LENGTH_FIELD_IS_BYTE 0x10 //0001 0000 |
257 |
#define ASF_PL_FLAG_MEDIA_OBJECT_NUMBER_LENGTH_FIELD_IS_WORD 0x20 //0010 0000 |
258 |
#define ASF_PL_FLAG_MEDIA_OBJECT_NUMBER_LENGTH_FIELD_IS_DWORD 0x30 //0011 0000 |
259 |
#define ASF_PL_MASK_MEDIA_OBJECT_NUMBER_LENGTH_FIELD_SIZE 0x30 //0011 0000 |
260 |
|
261 |
#define ASF_PL_FLAG_STREAM_NUMBER_LENGTH_FIELD_IS_BYTE 0x40 //0100 0000 |
262 |
#define ASF_PL_MASK_STREAM_NUMBER_LENGTH_FIELD_SIZE 0xc0 //1100 0000 |
263 |
|
264 |
#define ASF_PL_FLAG_PAYLOAD_LENGTH_FIELD_IS_BYTE 0x40 //0100 0000 |
265 |
#define ASF_PL_FLAG_PAYLOAD_LENGTH_FIELD_IS_WORD 0x80 //1000 0000 |
266 |
#define ASF_PL_MASK_PAYLOAD_LENGTH_FIELD_SIZE 0xc0 //1100 0000 |
267 |
|
268 |
#define ASF_PL_FLAG_KEY_FRAME 0x80 //1000 0000 |