Mercurial > mplayer.hg
annotate DOCS/tech/mpcf.txt @ 9347:97888c25ae60
changing name to "nut" for now, we can change it again if we agree on something else
index_flag so the demuxer knows if the index is missing and doesnt need to search for it
adding start/end_stream_id to the info packet so it can cover individual streams too
author | michael |
---|---|
date | Sat, 08 Feb 2003 18:50:18 +0000 |
parents | de287fe94511 |
children | 12391e52c2f7 |
rev | line source |
---|---|
9347
97888c25ae60
changing name to "nut" for now, we can change it again if we agree on something else
michael
parents:
9335
diff
changeset
|
1 nut format draft 0.02 |
9294 | 2 |
3 | |
4 | |
5 Intro: | |
6 | |
7 Features / goals: | |
8 (supported by the format, not necessary by a specific implementation) | |
9 | |
10 Simple | |
11 use the same encoding for nearly all fields | |
9295 | 12 simple decoding, so slow cpus can handle it |
9294 | 13 Extendible |
14 no limit for the possible values for all fields (using universal vlc) | |
15 allow adding of new headers in the future | |
16 allow adding more fields at the end of headers | |
17 Compact | |
18 ~0.2% overhead, for normal bitrates | |
19 index is <10kb per hour (1 keyframe every 3sec) | |
20 Error resistant | |
21 seeking / playback without an index | |
22 headers & index can be repeated | |
23 audio packet reshuffle | |
24 checksums to allow quick redownloading of damaged parts | |
25 | |
26 | |
27 | |
28 Definitions: | |
29 | |
30 MUST the specific part must be done to conform to this standard | |
31 SHOULD its recommanded to be done that way but its not strictly required | |
32 | |
33 | |
34 | |
35 Syntax: | |
36 | |
9295 | 37 Type definitions: |
38 v | |
39 value=0 | |
40 do{ | |
41 more_data u(1) | |
42 data u(7) | |
43 value= 128*value + data | |
44 }while(more_data) | |
9323 | 45 |
46 b (binary data or string) | |
47 length v | |
48 for(i=0; i<length; i++){ | |
49 data[i] u(8) | |
9295 | 50 } |
9335
de287fe94511
lang & country codes from ISO & utf8 requirement (ideas from Tobias Diedrich <td at sim dot uni-hannover dot de>
michael
parents:
9325
diff
changeset
|
51 Note: strings MUST be encoded in utf8 |
9295 | 52 |
9323 | 53 |
9295 | 54 f(x) n fixed bits |
55 u(x) unsigned number encoded in x bits in MSB first order | |
56 | |
57 | |
58 Bitstream syntax: | |
9294 | 59 packet header |
60 forward ptr v | |
61 backward ptr v | |
62 | |
63 align_byte | |
64 while(not byte aligned) | |
65 one f(1) | |
66 | |
67 reserved_bytes | |
68 for(i=0; i<forward_ptr - length_of_non_reserved; i++) | |
69 reserved u(8) | |
70 | |
71 main header: | |
72 packet header | |
73 main_startcode f(64) | |
74 version v | |
75 stream_count v | |
76 file_size v | |
9310 | 77 length_in_msec v |
9294 | 78 reserved_bytes |
79 checksum u(32) | |
80 | |
81 stream_header: | |
82 packet_header | |
83 stream_startcode f(64) | |
84 stream_id v | |
85 stream_class v | |
9323 | 86 fourcc b |
9294 | 87 average_bitrate v |
9325 | 88 language_code b |
9297 | 89 time_base_nom v |
90 time_base_denom v | |
9294 | 91 lsb_timestamp_length v |
92 fixed_fps u(1) | |
93 codec_specific_header_flag u(1) | |
9347
97888c25ae60
changing name to "nut" for now, we can change it again if we agree on something else
michael
parents:
9335
diff
changeset
|
94 index_flag u(1) |
97888c25ae60
changing name to "nut" for now, we can change it again if we agree on something else
michael
parents:
9335
diff
changeset
|
95 reserved u(5) |
9294 | 96 |
97 video_stream_header: | |
98 stream_header | |
99 width v | |
100 height v | |
101 sample_width v | |
102 sample_height v | |
103 colorspace_type v | |
104 depth v | |
105 reserved_bytes | |
106 checksum u(32) | |
107 | |
108 audio_stream_header: | |
109 stream_header | |
110 samplerate v | |
111 channel_count v | |
112 sub_packet_size v | |
113 shuffle_type v | |
114 reserved_bytes | |
115 checksum u(32) | |
116 | |
117 codec_specific_header: | |
118 packet_header | |
119 codec_specific_startcode f(64) | |
120 stream_id v | |
121 codec_specific data | |
122 checksum | |
123 | |
124 frame | |
125 packet header | |
126 if(keyframe){ | |
127 keyframe_startcode f(64) | |
128 } | |
9311
4b04416ada91
zero_bit for normal frames, so we can distinguish them from other packets
michael
parents:
9310
diff
changeset
|
129 zero_bit f(1) |
9294 | 130 priority u(2) |
131 checksum_flag u(1) | |
132 msb_timestamp_flag u(1) | |
9311
4b04416ada91
zero_bit for normal frames, so we can distinguish them from other packets
michael
parents:
9310
diff
changeset
|
133 reserved u(3) |
4b04416ada91
zero_bit for normal frames, so we can distinguish them from other packets
michael
parents:
9310
diff
changeset
|
134 lsb_timestamp v |
4b04416ada91
zero_bit for normal frames, so we can distinguish them from other packets
michael
parents:
9310
diff
changeset
|
135 stream_id v |
9294 | 136 if(msb_timestamp_flag) |
137 msb_timestamp v | |
138 bitstream | |
139 if(checksum_flag) | |
9312 | 140 frame_checksum u(32) |
9294 | 141 |
142 Index: | |
143 packet header | |
144 index_startcode f(64) | |
145 stream_id v | |
146 index_length v | |
147 for(i=0; i<index_length; i++){ | |
148 index_timestamp v | |
149 index_position v | |
150 } | |
9310 | 151 reserved_bytes |
9294 | 152 checksum u(32) |
153 | |
9310 | 154 info_packet: (optional) |
9294 | 155 packet header |
156 info_startcode f(64) | |
9310 | 157 start_time v |
158 end_time v | |
9347
97888c25ae60
changing name to "nut" for now, we can change it again if we agree on something else
michael
parents:
9335
diff
changeset
|
159 start_stream_id v |
97888c25ae60
changing name to "nut" for now, we can change it again if we agree on something else
michael
parents:
9335
diff
changeset
|
160 end_stream_id v |
9323 | 161 for(;;){ |
162 type b | |
163 if(type=="") break; | |
164 name b | |
165 value b | |
166 } | |
9310 | 167 reserved_bytes |
9294 | 168 checksum u(32) |
9323 | 169 |
9310 | 170 stuffing_packet: (optional) |
171 packet_header | |
172 stuffing_startcode f(64) | |
173 for(i=0; i<forward_ptr - length_of_non_reserved; i++) | |
174 stuffing f(8) | |
9294 | 175 |
9323 | 176 |
9294 | 177 forward_ptr |
178 backward_ptr | |
179 pointer to the next / previous packet | |
9323 | 180 pointers are relative and backward pointer is implicitelly negative |
9294 | 181 Note: a frame with 0 bytes means that its skiped |
9323 | 182 Note: the forward pointer is equal to the size of this packet including |
183 the header | |
184 the backward pointer is equal to the size of the previous packet | |
185 Example: | |
186 0 | |
187 size1 (size of frame1 including header) | |
188 frame1 | |
189 | |
190 size1 | |
191 size2 | |
192 frame2 | |
193 | |
194 size2 | |
195 size3 | |
196 frame3 | |
197 | |
198 | |
199 *_startcode | |
200 the first bit is allways set | |
9294 | 201 |
202 version | |
203 0 for now | |
204 | |
205 file_size | |
206 size in bytes, can be 0 if not meaningfull (realtime streams, ...) | |
207 | |
208 length_in_msec | |
209 length of the file in milli seconds (can be 0 if realtime or such) | |
9347
97888c25ae60
changing name to "nut" for now, we can change it again if we agree on something else
michael
parents:
9335
diff
changeset
|
210 |
97888c25ae60
changing name to "nut" for now, we can change it again if we agree on something else
michael
parents:
9335
diff
changeset
|
211 index_flag |
97888c25ae60
changing name to "nut" for now, we can change it again if we agree on something else
michael
parents:
9335
diff
changeset
|
212 1 indicates that this file has an index |
97888c25ae60
changing name to "nut" for now, we can change it again if we agree on something else
michael
parents:
9335
diff
changeset
|
213 Note, all files MUST have an index at the end except, (realtime) streams |
9294 | 214 |
215 stream_id | |
216 Note: streams with a lower relative class MUST have a lower relative id | |
217 so a stream with class 0 MUST allways have a id which is lower then any | |
218 stream with class > 0 | |
9295 | 219 streams should use low ids |
9294 | 220 |
221 stream_class | |
222 0 video | |
223 32 audio | |
224 64 subtiles | |
225 Note the remaining values are reserved and MUST NOT be used | |
9312 | 226 a decoder MUST ignore streams with reserved classes |
9294 | 227 |
228 fourcc | |
229 identification for the codec | |
9323 | 230 example: "H264" |
9325 | 231 MUST contain 4 bytes, note, this might be increasd in the future if |
232 needed | |
9294 | 233 |
234 language_code | |
9335
de287fe94511
lang & country codes from ISO & utf8 requirement (ideas from Tobias Diedrich <td at sim dot uni-hannover dot de>
michael
parents:
9325
diff
changeset
|
235 ISO 639 and ISO 3166 for language/country code |
9325 | 236 something like "usen" (US english), can be 0 |
9294 | 237 if unknown |
9335
de287fe94511
lang & country codes from ISO & utf8 requirement (ideas from Tobias Diedrich <td at sim dot uni-hannover dot de>
michael
parents:
9325
diff
changeset
|
238 see http://www.loc.gov/standards/iso639-2/englangn.html |
de287fe94511
lang & country codes from ISO & utf8 requirement (ideas from Tobias Diedrich <td at sim dot uni-hannover dot de>
michael
parents:
9325
diff
changeset
|
239 and http://www.din.de/gremien/nas/nabd/iso3166ma/codlstp1/en_listp1.html |
9294 | 240 |
9297 | 241 time_base_nom / time_base_denom = time_base |
9294 | 242 the number of timer ticks per second, this MUST be equal to the fps |
243 if the fixed_fps is 1 | |
9297 | 244 time_base_denom MUST not be 0 |
245 time_base_nom and time_base_denom MUST be relative prime | |
246 time_base_nom MUST be < 2^15 | |
247 examples: | |
248 fps time_base_nom time_base_denom | |
249 30 30 1 | |
250 29.97 30000 1001 | |
251 23.976 24000 1001 | |
9294 | 252 |
253 lsb_timestamp_length | |
254 length in bits of the lsb_timestamp | |
255 MUST be <16 | |
256 | |
257 fixed_fps | |
258 1 indicates that the fps is fixed | |
259 | |
260 codec_specific_header_flag | |
261 1 indicates that this stream has a codec specific header | |
262 | |
263 msb_timestamp_flag | |
264 indicates that the msb_timestamp is coded | |
265 MUST be 1 for keyframes | |
266 | |
267 msb_timestamp | |
268 most significant bits of the timestamp, SHOULD be 0 for the first frame | |
269 | |
270 lsb_timestamp | |
271 most significant bits of the timestamp in time_base precission, with | |
272 lsb_timestamp_length bits | |
273 Example: IBBP display order | |
274 keyframe msb_timestamp=0 lsb_timestamp=0 -> timestamp=0 | |
275 frame lsb_timestamp=3 -> timestamp=3 | |
276 frame lsb_timestamp=1 -> timestamp=1 | |
277 frame lsb_timestamp=2 -> timestamp=2 | |
278 ... | |
279 keyframe msb_timestamp=1 lsb_timestamp=1 -> timestamp=257 | |
280 frame msb_timestamp=0 lsb_timestamp=255->timestamp=255 | |
281 frame msb_timestamp=1 lsb_timestamp=0 -> timestamp=256 | |
282 frame lsb_timestamp=4 -> timestamp=260 | |
283 frame lsb_timestamp=2 -> timestamp=258 | |
284 frame lsb_timestamp=3 -> timestamp=259 | |
285 | |
286 width/height | |
287 MUST be set to the coded width/height | |
288 | |
289 sample_width/sample_height (aspect ratio) | |
290 sample_width is the horizontal distance between samples | |
291 sample_width and sample_height MUST be relative prime if not zero | |
292 MUST be 0 if unknown | |
293 | |
294 depth | |
295 for compatibility with some win32 codecs | |
296 | |
9311
4b04416ada91
zero_bit for normal frames, so we can distinguish them from other packets
michael
parents:
9310
diff
changeset
|
297 zero_bit |
4b04416ada91
zero_bit for normal frames, so we can distinguish them from other packets
michael
parents:
9310
diff
changeset
|
298 MUST be 0, its there to distinguish non keyframes from other packets, |
4b04416ada91
zero_bit for normal frames, so we can distinguish them from other packets
michael
parents:
9310
diff
changeset
|
299 Note: all packets have a 64-bit startcode except non-keyframes to reduce |
4b04416ada91
zero_bit for normal frames, so we can distinguish them from other packets
michael
parents:
9310
diff
changeset
|
300 their size, and all startcodes start with a 1 bit |
4b04416ada91
zero_bit for normal frames, so we can distinguish them from other packets
michael
parents:
9310
diff
changeset
|
301 |
9294 | 302 priority |
303 if 0 then the frame isnt used as reference (b frame) and can be droped | |
304 MUST be > 0 for keyframes | |
305 | |
306 sub_packet_size | |
307 size of an audio packet | |
308 Note a subpacket MUST be in exactly one packet, it cannot be split | |
309 | |
310 shuffle_type | |
311 audio is often encoded in small fixed size packets, and to increase the | |
312 error robustness these can be shuffled | |
313 0 -> no shuffle | |
314 1-16 -> interleave packets by 2^n | |
315 | |
316 checksum | |
9307
ec18ad315bbe
10l (copy & pasting the generator poly for crc32 from ogg was a bad idea...)
michael
parents:
9299
diff
changeset
|
317 crc32 checksum using the generator polynomial 0x104c11db7 (same as ogg) |
9294 | 318 |
319 checksum_flag | |
320 indicates that the frame_checksum is coded | |
321 must be 1 for the last non keyframe before a keyframe | |
322 | |
323 frame_checksum | |
324 identical to checksum, but instead of covering just the current | |
325 packet, it covers all frames of the same stream id since the last | |
9312 | 326 frame_checksum |
9294 | 327 this field is only coded if checksum_flag=1 |
328 | |
329 index_timestamp | |
330 value in time_base precission, relative to the last index_timestamp | |
331 | |
332 index_position | |
333 position in bytes of the first byte of the keyframe header, relative | |
334 to the last index_position | |
335 | |
9310 | 336 start_time, stop_time |
337 the time range in msecs to which the info applies | |
338 Note: can be used to mark chapters | |
9323 | 339 |
9347
97888c25ae60
changing name to "nut" for now, we can change it again if we agree on something else
michael
parents:
9335
diff
changeset
|
340 start_stream_id / end_stream_id |
97888c25ae60
changing name to "nut" for now, we can change it again if we agree on something else
michael
parents:
9335
diff
changeset
|
341 the stream(s) to which the info packet applies |
97888c25ae60
changing name to "nut" for now, we can change it again if we agree on something else
michael
parents:
9335
diff
changeset
|
342 |
9323 | 343 type |
344 the fourcc of the type | |
9347
97888c25ae60
changing name to "nut" for now, we can change it again if we agree on something else
michael
parents:
9335
diff
changeset
|
345 for example: "UTF8" -> String or "JPEG" -> jpeg image |
9323 | 346 0 length means end |
347 | |
9295 | 348 name |
349 the name of the info entry, valid names are | |
9347
97888c25ae60
changing name to "nut" for now, we can change it again if we agree on something else
michael
parents:
9335
diff
changeset
|
350 "Author" |
97888c25ae60
changing name to "nut" for now, we can change it again if we agree on something else
michael
parents:
9335
diff
changeset
|
351 "Description" |
97888c25ae60
changing name to "nut" for now, we can change it again if we agree on something else
michael
parents:
9335
diff
changeset
|
352 "Copyright" |
97888c25ae60
changing name to "nut" for now, we can change it again if we agree on something else
michael
parents:
9335
diff
changeset
|
353 "Encoder" the name& version of the software used for encoding |
97888c25ae60
changing name to "nut" for now, we can change it again if we agree on something else
michael
parents:
9335
diff
changeset
|
354 "Title" |
97888c25ae60
changing name to "nut" for now, we can change it again if we agree on something else
michael
parents:
9335
diff
changeset
|
355 "CDCover" an image of he cd cover (preferable PNG or JPEG) |
97888c25ae60
changing name to "nut" for now, we can change it again if we agree on something else
michael
parents:
9335
diff
changeset
|
356 "Source" "DVD", "VCD", "CD", "MD", "FM radio", "VHS", "PAL-TV", |
97888c25ae60
changing name to "nut" for now, we can change it again if we agree on something else
michael
parents:
9335
diff
changeset
|
357 "NTSC-TV", "LD" |
97888c25ae60
changing name to "nut" for now, we can change it again if we agree on something else
michael
parents:
9335
diff
changeset
|
358 "CaptureDevice" "BT878", "BT848", ... (more exact names are fine too) |
9295 | 359 Note: if someone needs some others, please tell us about them, so we can |
360 add them to the official standard (if they are sane) | |
361 | |
362 value | |
363 | |
9310 | 364 stuffing |
365 0xFF | |
9294 | 366 |
367 Structure: | |
368 | |
369 the headers MUST be in exactly the following order (to simplify demuxer design) | |
370 main header | |
371 stream_header (id=0) | |
372 codec_specific_header (id=0) | |
373 stream_header (id=1) | |
374 codec_specific_header (id=1) | |
375 ... | |
376 stream_header (id=n) | |
377 codec_specific_header (id=n) | |
378 | |
379 headers may be repated, but if they are then they MUST all be repeated together | |
380 and repeated headers MUST be identical | |
381 | |
382 headers MUST be repeated every 10sec at least ? FIXME | |
9310 | 383 headers MUST be repeated at least twice (so they exist 3 times in a file) |
9295 | 384 |
9310 | 385 Index |
386 the index can be repeated but there MUST be at least one at the end | |
9311
4b04416ada91
zero_bit for normal frames, so we can distinguish them from other packets
michael
parents:
9310
diff
changeset
|
387 Note: in case of realtime streaming there is no end, so no index there either |
9310 | 388 |
389 Info packets | |
390 the info_packet can be repeated, it can also contain different names & values | |
391 each time but only if allso the time is different | |
392 Info packets can be used to describe the file or some part of it (chapters) | |
393 | |
394 info packets, SHOULD be placed at the begin of the file at least | |
395 for realtime streaming info packets will normally be transmitted when they apply | |
396 for example, the current song title & artist of the currently shown music video | |
397 | |
398 Stuffing packets | |
399 can be used as a filler, for example to leave some empty space at the begin for | |
400 a copy of the index | |
401 | |
402 Unknown packets | |
403 MUST be ignored by the decoder | |
404 | |
9294 | 405 Sample code (GPL, & untested) |
406 | |
407 typedef BufferContext{ | |
408 uint8_t *buf; | |
409 uint8_t *buf_ptr; | |
410 }BufferContext; | |
411 | |
412 static inline uint64_t get_bytes(BufferContext *bc, int count){ | |
413 uint64_t val=0; | |
414 | |
415 assert(count>0 && count<9) | |
416 | |
417 for(i=0; i<count; i++){ | |
418 val <<=8; | |
419 val += *(bc->buf_ptr++); | |
420 } | |
421 | |
422 return val; | |
423 } | |
424 | |
425 static inline void put_bytes(BufferContext *bc, int count, uint64_t val){ | |
426 uint64_t val=0; | |
427 | |
428 assert(count>0 && count<9) | |
429 | |
430 for(i=count-1; i>=0; i--){ | |
431 *(bc->buf_ptr++)= val >> (8*i); | |
432 } | |
433 | |
434 return val; | |
435 } | |
436 | |
437 static inline uint64_t get_v(BufferContext *bc){ | |
438 uint64_t val= 0; | |
439 | |
440 for(;;){ | |
441 int tmp= *(bc->buf_ptr++); | |
442 if(tmp&0x80) | |
443 val= (val<<7) + tmp - 0x80; | |
444 else | |
9299 | 445 return (val<<7) + tmp; |
9294 | 446 } |
447 } | |
448 | |
449 static inline void put_v(BufferContext *bc, uint64_t val){ | |
450 int i; | |
451 | |
452 assert(val); | |
453 | |
454 for(i=56;; i-=8){ | |
455 if(val>>i) break; | |
456 } | |
457 | |
458 for(;i>0; i-=8){ | |
459 *(bc->buf_ptr++)= 0x80 | (val>>i); | |
460 } | |
461 *(bc->buf_ptr++)= val&0x7F; | |
462 } | |
463 | |
464 | |
465 Example stream | |
466 | |
467 main header | |
468 video_stream_header (stream 0, video jpjp, timebase 30, lsb_timestamp_length=8) | |
469 codec_specific_header (stream 0) | |
470 video_stream_header (stream 1 subtitle usen, timebase 30, lsb_timestamp_length=8) | |
471 video_stream_header (stream 2 subtitle atde, timebase 30, lsb_timestamp_length=8) | |
472 audio_stream_header (stream 3, audio jpjp, timebase 1 , lsb_timestamp_length=8) | |
473 audio_stream_header (stream 4, audio usen, timebase 1 , lsb_timestamp_length=8) | |
474 index (stream 0) | |
475 keyframe (stream 0, msb_timestamp=0, lsb_timestamp=0) | |
476 keyframe (stream 1, msb_timestamp=0, lsb_timestamp=0) | |
477 keyframe (stream 2, msb_timestamp=0, lsb_timestamp=0) | |
478 keyframe (stream 3, msb_timestamp=0, lsb_timestamp=0) | |
479 keyframe (stream 4, msb_timestamp=0, lsb_timestamp=0) | |
480 frame (stream 0, lsb_timestamp=1) | |
481 frame (stream 0, lsb_timestamp=2) | |
482 ... | |
483 frame (stream 0, lsb_timestamp=30) | |
484 keyframe (stream 3, msb_timestamp=0, lsb_timestamp=1) | |
485 keyframe (stream 4, msb_timestamp=0, lsb_timestamp=1) | |
486 frame (stream 0, lsb_timestamp=31) | |
487 frame (stream 0, lsb_timestamp=32) | |
488 ... | |
489 frame (stream 0, lsb_timestamp=60) | |
490 frame (stream 1, lsb_timestamp=60) | |
491 frame (stream 2, lsb_timestamp=60) | |
492 keyframe (stream 3, msb_timestamp=0, lsb_timestamp=2) | |
493 keyframe (stream 4, msb_timestamp=0, lsb_timestamp=2) | |
494 frame (stream 0, lsb_timestamp=61) | |
495 frame (stream 0, lsb_timestamp=62) | |
496 ... | |
497 main header | |
498 video_stream_header (stream 0, video jpjp, timebase 30, lsb_timestamp_length=8) | |
499 codec_specific_header (stream 0) | |
500 video_stream_header (stream 1 subtitle usen, timebase 30, lsb_timestamp_length=8) | |
501 video_stream_header (stream 2 subtitle atde, timebase 30, lsb_timestamp_length=8) | |
502 audio_stream_header (stream 3, audio jpjp, timebase 1 , lsb_timestamp_length=8) | |
503 audio_stream_header (stream 4, audio usen, timebase 1 , lsb_timestamp_length=8) | |
504 frame (stream 0, lsb_timestamp=255) | |
505 frame (stream 0, msb_timestamp=1 lsb_timestamp=0) | |
506 frame (stream 0, lsb_timestamp=1) | |
507 frame (stream 0, lsb_timestamp=2) | |
508 frame (stream 1, msb_timestamp=1 lsb_timestamp=2) | |
509 frame (stream 2, msb_timestamp=1 lsb_timestamp=2) | |
510 frame (stream 0, lsb_timestamp=3) | |
511 frame (stream 0, lsb_timestamp=4) | |
512 ... | |
513 keyframe (stream 3, msb_timestamp=0, lsb_timestamp=9) | |
514 keyframe (stream 4, msb_timestamp=0, lsb_timestamp=9) | |
515 main header | |
516 video_stream_header (stream 0, video jpjp, timebase 30, lsb_timestamp_length=8) | |
517 codec_specific_header (stream 0) | |
518 video_stream_header (stream 1 subtitle usen, timebase 30, lsb_timestamp_length=8) | |
519 video_stream_header (stream 2 subtitle atde, timebase 30, lsb_timestamp_length=8) | |
520 audio_stream_header (stream 3, audio jpjp, timebase 1 , lsb_timestamp_length=8) | |
521 audio_stream_header (stream 4, audio usen, timebase 1 , lsb_timestamp_length=8) | |
522 index (stream 0) | |
9335
de287fe94511
lang & country codes from ISO & utf8 requirement (ideas from Tobias Diedrich <td at sim dot uni-hannover dot de>
michael
parents:
9325
diff
changeset
|
523 |