annotate DOCS/tech/mpcf.txt @ 13637:2043bbc8e3c9

sync by Mizda Gabor <gabrov@freemail.hu>
author diego
date Thu, 14 Oct 2004 09:51:49 +0000
parents 8ff17d153414
children 6cdd5669e930
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13308
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
1 NUT Open Container Format DRAFT 20040911
10817
59ac254c2541 some updates
alex
parents: 10166
diff changeset
2 ----------------------------------------
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
3
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
4
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
5
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
6 Intro:
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
7
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
8 Features / goals:
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
9 (supported by the format, not necessary by a specific implementation)
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
10
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
11 Simple
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
12 use the same encoding for nearly all fields
10158
93e5428d0b3e some changes (michael: is the colorspace_type field needed?)
alex
parents: 10061
diff changeset
13 simple decoding, so slow cpus (and embedded systems) can handle it
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
14 Extendible
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
15 no limit for the possible values for all fields (using universal vlc)
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
16 allow adding of new headers in the future
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
17 allow adding more fields at the end of headers
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
18 Compact
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
19 ~0.2% overhead, for normal bitrates
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
20 index is <10kb per hour (1 keyframe every 3sec)
10831
3f716efeb27a moved packet header after startcodes
alex
parents: 10827
diff changeset
21 a usual header for a file is about 100bytes (audio + video headers together)
12082
f705b0777572 removing subpackets (everyone hates them ...)
michael
parents: 11975
diff changeset
22 a packet header is about ~1-8 bytes
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
23 Error resistant
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
24 seeking / playback without an index
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
25 headers & index can be repeated
10158
93e5428d0b3e some changes (michael: is the colorspace_type field needed?)
alex
parents: 10061
diff changeset
26 damaged files can be played back with minimal data lost and fast
93e5428d0b3e some changes (michael: is the colorspace_type field needed?)
alex
parents: 10061
diff changeset
27 resyncing times
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
28
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
29
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
30
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
31 Definitions:
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
32
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
33 MUST the specific part must be done to conform to this standard
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
34 SHOULD its recommanded to be done that way but its not strictly required
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
35
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
36
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
37
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
38 Syntax:
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
39
9295
michael
parents: 9294
diff changeset
40 Type definitions:
12209
3baef37d3b7c moving f() and u()
michael
parents: 12208
diff changeset
41
13047
4e613c87c2f5 spelling: big-endian and little-endian
diego
parents: 12503
diff changeset
42 f(x) n fixed bits in big-endian order
12209
3baef37d3b7c moving f() and u()
michael
parents: 12208
diff changeset
43 u(x) unsigned number encoded in x bits in MSB first order
3baef37d3b7c moving f() and u()
michael
parents: 12208
diff changeset
44
9295
michael
parents: 9294
diff changeset
45 v
michael
parents: 9294
diff changeset
46 value=0
michael
parents: 9294
diff changeset
47 do{
michael
parents: 9294
diff changeset
48 more_data u(1)
michael
parents: 9294
diff changeset
49 data u(7)
michael
parents: 9294
diff changeset
50 value= 128*value + data
michael
parents: 9294
diff changeset
51 }while(more_data)
9579
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
52
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
53 s
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
54 temp v
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
55 temp++
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
56 if(temp&1) value= -(temp>>1)
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
57 else value= (temp>>1)
9323
774afe44f17b some more info (copy & pasted from ML)
michael
parents: 9312
diff changeset
58
774afe44f17b some more info (copy & pasted from ML)
michael
parents: 9312
diff changeset
59 b (binary data or string)
774afe44f17b some more info (copy & pasted from ML)
michael
parents: 9312
diff changeset
60 for(i=0; i<length; i++){
774afe44f17b some more info (copy & pasted from ML)
michael
parents: 9312
diff changeset
61 data[i] u(8)
9295
michael
parents: 9294
diff changeset
62 }
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
63 Note: strings MUST be encoded in utf8
9295
michael
parents: 9294
diff changeset
64
12117
e1e5e2124dae minor changes
michael
parents: 12110
diff changeset
65 vb
e1e5e2124dae minor changes
michael
parents: 12110
diff changeset
66 length v
e1e5e2124dae minor changes
michael
parents: 12110
diff changeset
67 value b
e1e5e2124dae minor changes
michael
parents: 12110
diff changeset
68
9295
michael
parents: 9294
diff changeset
69
michael
parents: 9294
diff changeset
70 Bitstream syntax:
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
71 packet header
12084
68baf8877c07 reversing the change to the forw/backw pointers, its somewhat simpler to update it if the forward pointer is first
michael
parents: 12082
diff changeset
72 forward ptr v
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
73
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
74 align_byte
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
75 while(not byte aligned)
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
76 one f(1)
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
77
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
78 reserved_bytes
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
79 for(i=0; i<forward_ptr - length_of_non_reserved; i++)
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
80 reserved u(8)
12184
17667db616d3 (de)coder -> (de)muxer
michael
parents: 12162
diff changeset
81 a demuxer MUST ignore any reserved bytes
17667db616d3 (de)coder -> (de)muxer
michael
parents: 12162
diff changeset
82 a muxer MUST NOT write any reserved bytes, as this would make it
10824
d163db068a12 reserved_bytes & byte order stuff
michael
parents: 10817
diff changeset
83 inpossible to add new fields at the end of packets in the future in
d163db068a12 reserved_bytes & byte order stuff
michael
parents: 10817
diff changeset
84 a compatible way
d163db068a12 reserved_bytes & byte order stuff
michael
parents: 10817
diff changeset
85
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
86 main header:
10831
3f716efeb27a moved packet header after startcodes
alex
parents: 10827
diff changeset
87 main_startcode f(64)
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
88 packet header
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
89 version v
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
90 stream_count v
12333
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
91 max_distance v
12501
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
92 max_short_distance v
12413
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
93 global_time_base_nom v
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
94 global_time_base_denom v
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
95 short_startcode v
12084
68baf8877c07 reversing the change to the forw/backw pointers, its somewhat simpler to update it if the forward pointer is first
michael
parents: 12082
diff changeset
96 for(i=0; i<256; ){
68baf8877c07 reversing the change to the forw/backw pointers, its somewhat simpler to update it if the forward pointer is first
michael
parents: 12082
diff changeset
97 tmp_flag v
12428
bfa269cec22b extendible frame_code table
michael
parents: 12413
diff changeset
98 tmp_fields v
bfa269cec22b extendible frame_code table
michael
parents: 12413
diff changeset
99 if(tmp_fields>0) tmp_timestamp s
bfa269cec22b extendible frame_code table
michael
parents: 12413
diff changeset
100 if(tmp_fields>1) tmp_mul v
bfa269cec22b extendible frame_code table
michael
parents: 12413
diff changeset
101 if(tmp_fields>2) tmp_stream v
bfa269cec22b extendible frame_code table
michael
parents: 12413
diff changeset
102 if(tmp_fields>3) tmp_size v
bfa269cec22b extendible frame_code table
michael
parents: 12413
diff changeset
103 else tmp_size=0
bfa269cec22b extendible frame_code table
michael
parents: 12413
diff changeset
104 if(tmp_fields>4) tmp_res v
bfa269cec22b extendible frame_code table
michael
parents: 12413
diff changeset
105 else tmp_res=0
bfa269cec22b extendible frame_code table
michael
parents: 12413
diff changeset
106 if(tmp_fields>5) count v
bfa269cec22b extendible frame_code table
michael
parents: 12413
diff changeset
107 else count= tmp_mul - tmp_size
bfa269cec22b extendible frame_code table
michael
parents: 12413
diff changeset
108 for(j=6; j<tmp_fields; j++){
bfa269cec22b extendible frame_code table
michael
parents: 12413
diff changeset
109 tmp_reserved[i] v
bfa269cec22b extendible frame_code table
michael
parents: 12413
diff changeset
110 }
bfa269cec22b extendible frame_code table
michael
parents: 12413
diff changeset
111 for(j=0; j<count && i<256; j++, i++){
12084
68baf8877c07 reversing the change to the forw/backw pointers, its somewhat simpler to update it if the forward pointer is first
michael
parents: 12082
diff changeset
112 flags[i]= tmp_flag;
68baf8877c07 reversing the change to the forw/backw pointers, its somewhat simpler to update it if the forward pointer is first
michael
parents: 12082
diff changeset
113 stream_id_plus1[i]= tmp_stream;
68baf8877c07 reversing the change to the forw/backw pointers, its somewhat simpler to update it if the forward pointer is first
michael
parents: 12082
diff changeset
114 data_size_mul[i]= tmp_mul;
12428
bfa269cec22b extendible frame_code table
michael
parents: 12413
diff changeset
115 data_size_lsb[i]= tmp_size + j;
12413
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
116 timestamp_delta[i]= tmp_timestamp;
12501
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
117 reserved_count[i]= tmp_res;
12082
f705b0777572 removing subpackets (everyone hates them ...)
michael
parents: 11975
diff changeset
118 }
f705b0777572 removing subpackets (everyone hates them ...)
michael
parents: 11975
diff changeset
119 }
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
120 reserved_bytes
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
121 checksum u(32)
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
122
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
123 stream_header:
10831
3f716efeb27a moved packet header after startcodes
alex
parents: 10827
diff changeset
124 stream_startcode f(64)
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
125 packet_header
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
126 stream_id v
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
127 stream_class v
12150
2c9a2b1772bc language_code & fourcc vb->v reversal
michael
parents: 12118
diff changeset
128 fourcc vb
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
129 average_bitrate v
9297
8a19be9649e7 use fraction for time_base
michael
parents: 9296
diff changeset
130 time_base_nom v
8a19be9649e7 use fraction for time_base
michael
parents: 9296
diff changeset
131 time_base_denom v
9579
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
132 msb_timestamp_shift v
12333
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
133 decode_delay v
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
134 fixed_fps u(1)
9356
025a25987ac0 simplification
michael
parents: 9350
diff changeset
135 reserved u(6)
9357
21347f49e8d8 supprting various codec specific/private headers for different APIs (ideas by arpi/alex/fabian)
michael
parents: 9356
diff changeset
136 for(;;){
9361
06c106f23a41 encoding the whole name doesnt make sense
michael
parents: 9360
diff changeset
137 codec_specific_data_type v
06c106f23a41 encoding the whole name doesnt make sense
michael
parents: 9360
diff changeset
138 if(codec_specific_data_type==0) break;
12117
e1e5e2124dae minor changes
michael
parents: 12110
diff changeset
139 codec_specific_data vb
9357
21347f49e8d8 supprting various codec specific/private headers for different APIs (ideas by arpi/alex/fabian)
michael
parents: 9356
diff changeset
140 }
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
141
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
142 video_stream_header:
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
143 stream_header
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
144 width v
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
145 height v
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
146 sample_width v
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
147 sample_height v
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
148 colorspace_type v
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
149 reserved_bytes
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
150 checksum u(32)
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
151
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
152 audio_stream_header:
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
153 stream_header
12333
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
154 samplerate_nom v
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
155 samplerate_denom v
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
156 channel_count v
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
157 reserved_bytes
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
158 checksum u(32)
9420
8a1a8f5e9c91 variable subpacket size support
michael
parents: 9373
diff changeset
159
12082
f705b0777572 removing subpackets (everyone hates them ...)
michael
parents: 11975
diff changeset
160
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
161 frame
12082
f705b0777572 removing subpackets (everyone hates them ...)
michael
parents: 11975
diff changeset
162 frame_code f(8)
12084
68baf8877c07 reversing the change to the forw/backw pointers, its somewhat simpler to update it if the forward pointer is first
michael
parents: 12082
diff changeset
163 if(stream_id_plus1[frame_code]==0){
12082
f705b0777572 removing subpackets (everyone hates them ...)
michael
parents: 11975
diff changeset
164 stream_id v
f705b0777572 removing subpackets (everyone hates them ...)
michael
parents: 11975
diff changeset
165 }
12413
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
166 if(timestamp_delta[frame_code]==0){
12261
d43f1c599701 remove data_size prediction
michael
parents: 12254
diff changeset
167 coded_timestamp v
d43f1c599701 remove data_size prediction
michael
parents: 12254
diff changeset
168 }
12413
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
169 if(flags[frame_code]&1){
12082
f705b0777572 removing subpackets (everyone hates them ...)
michael
parents: 11975
diff changeset
170 data_size_msb v
f705b0777572 removing subpackets (everyone hates them ...)
michael
parents: 11975
diff changeset
171 }
12501
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
172 for(i=0; i<reserved_count[frame_code]; i++)
12413
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
173 reserved v
12082
f705b0777572 removing subpackets (everyone hates them ...)
michael
parents: 11975
diff changeset
174 data
f705b0777572 removing subpackets (everyone hates them ...)
michael
parents: 11975
diff changeset
175
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
176 Index:
10831
3f716efeb27a moved packet header after startcodes
alex
parents: 10827
diff changeset
177 index_startcode f(64)
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
178 packet header
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
179 index_length v
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
180 for(i=0; i<index_length; i++){
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
181 index_timestamp v
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
182 index_position v
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
183 }
9310
b16480522be9 some typos
michael
parents: 9307
diff changeset
184 reserved_bytes
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
185 checksum u(32)
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
186
13308
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
187 info_packet: (optional) (file global)
10831
3f716efeb27a moved packet header after startcodes
alex
parents: 10827
diff changeset
188 info_startcode f(64)
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
189 packet header
9323
774afe44f17b some more info (copy & pasted from ML)
michael
parents: 9312
diff changeset
190 for(;;){
9579
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
191 id v
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
192 if(id==0) break
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
193 name= info_table[id][0]
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
194 type= info_table[id][1]
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
195 if(type==NULL)
12117
e1e5e2124dae minor changes
michael
parents: 12110
diff changeset
196 type vb
9579
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
197 if(name==NULL)
12117
e1e5e2124dae minor changes
michael
parents: 12110
diff changeset
198 name vb
9579
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
199 if(type=="v")
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
200 value v
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
201 else
12117
e1e5e2124dae minor changes
michael
parents: 12110
diff changeset
202 value vb
9323
774afe44f17b some more info (copy & pasted from ML)
michael
parents: 9312
diff changeset
203 }
9310
b16480522be9 some typos
michael
parents: 9307
diff changeset
204 reserved_bytes
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
205 checksum u(32)
13308
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
206
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
207 meta_packet: (optional) (stream specific)
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
208 meta_startcode f(64)
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
209 packet header
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
210 stream_id v
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
211 for(;;){
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
212 id v
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
213 if(id==0) break
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
214 name= meta_table[id][0]
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
215 type= meta_table[id][1]
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
216 if(type==NULL)
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
217 type vb
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
218 if(name==NULL)
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
219 name vb
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
220 if(type=="v")
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
221 value v
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
222 else
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
223 value vb
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
224 }
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
225 reserved_bytes
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
226 checksum u(32)
9323
774afe44f17b some more info (copy & pasted from ML)
michael
parents: 9312
diff changeset
227
12413
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
228 sync_point
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
229 frame_startcode f(64)
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
230 global_timestamp v
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
231
12242
f67bc1d216a1 file_id_string (idea by ivan)
michael
parents: 12238
diff changeset
232 file
f67bc1d216a1 file_id_string (idea by ivan)
michael
parents: 12238
diff changeset
233 file_id_string
12502
6db7e319aaa0 index fixes
michael
parents: 12501
diff changeset
234 while(!eof && next_code != index_startcode){
12242
f67bc1d216a1 file_id_string (idea by ivan)
michael
parents: 12238
diff changeset
235 main_header
f67bc1d216a1 file_id_string (idea by ivan)
michael
parents: 12238
diff changeset
236 for(i=0; i<stream_count; i++){
f67bc1d216a1 file_id_string (idea by ivan)
michael
parents: 12238
diff changeset
237 if(next_packet==video_stream_header)
f67bc1d216a1 file_id_string (idea by ivan)
michael
parents: 12238
diff changeset
238 video_stream_header
f67bc1d216a1 file_id_string (idea by ivan)
michael
parents: 12238
diff changeset
239 else
f67bc1d216a1 file_id_string (idea by ivan)
michael
parents: 12238
diff changeset
240 audio_stream_header
f67bc1d216a1 file_id_string (idea by ivan)
michael
parents: 12238
diff changeset
241 }
12413
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
242 while(next_code != main_startcode){
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
243 if(next_code == info_startcode)
12242
f67bc1d216a1 file_id_string (idea by ivan)
michael
parents: 12238
diff changeset
244 info_packet
12368
39974ab6ec8a cosmetic
michael
parents: 12365
diff changeset
245 else{
12413
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
246 if(next_code == short_startcode)
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
247 short_startcode u(24)
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
248 else if(next_code == frame_startcode)
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
249 sync_point
12242
f67bc1d216a1 file_id_string (idea by ivan)
michael
parents: 12238
diff changeset
250 frame
12368
39974ab6ec8a cosmetic
michael
parents: 12365
diff changeset
251 }
12242
f67bc1d216a1 file_id_string (idea by ivan)
michael
parents: 12238
diff changeset
252 }
f67bc1d216a1 file_id_string (idea by ivan)
michael
parents: 12238
diff changeset
253 }
12502
6db7e319aaa0 index fixes
michael
parents: 12501
diff changeset
254 index
9323
774afe44f17b some more info (copy & pasted from ML)
michael
parents: 9312
diff changeset
255
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
256 forward_ptr
12238
a0ddf85bdee0 removing backward pointers
michael
parents: 12209
diff changeset
257 size of the packet (exactly the distance from the first byte of the
a0ddf85bdee0 removing backward pointers
michael
parents: 12209
diff changeset
258 startcode of the current packet to the first byte of the following packet
12242
f67bc1d216a1 file_id_string (idea by ivan)
michael
parents: 12238
diff changeset
259
f67bc1d216a1 file_id_string (idea by ivan)
michael
parents: 12238
diff changeset
260 file_id_string
f67bc1d216a1 file_id_string (idea by ivan)
michael
parents: 12238
diff changeset
261 "nut/multimedia container\0"
9323
774afe44f17b some more info (copy & pasted from ML)
michael
parents: 9312
diff changeset
262
774afe44f17b some more info (copy & pasted from ML)
michael
parents: 9312
diff changeset
263 *_startcode
12162
ab533510d598 remove old example stream
michael
parents: 12161
diff changeset
264 all startcodes start with 'N'
ab533510d598 remove old example stream
michael
parents: 12161
diff changeset
265
ab533510d598 remove old example stream
michael
parents: 12161
diff changeset
266 main_startcode
ab533510d598 remove old example stream
michael
parents: 12161
diff changeset
267 0x7A561F5F04ADULL + (((uint64_t)('N'<<8) + 'M')<<48)
ab533510d598 remove old example stream
michael
parents: 12161
diff changeset
268 stream_starcode
ab533510d598 remove old example stream
michael
parents: 12161
diff changeset
269 0x11405BF2F9DBULL + (((uint64_t)('N'<<8) + 'S')<<48)
12333
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
270 frame_startcode
12162
ab533510d598 remove old example stream
michael
parents: 12161
diff changeset
271 0xE4ADEECA4569ULL + (((uint64_t)('N'<<8) + 'K')<<48)
12392
f4878bfe49c8 nicer startcode before keyframe rule
michael
parents: 12379
diff changeset
272 frame_startcodes SHOULD be placed immedeatly before a keyframe if the
f4878bfe49c8 nicer startcode before keyframe rule
michael
parents: 12379
diff changeset
273 previous frame of the same stream was a non-keyframe, unless such
f4878bfe49c8 nicer startcode before keyframe rule
michael
parents: 12379
diff changeset
274 non-keyframe - keyframe tansitions are very frequent
12365
dc05db3f172f additional start_code rule (implemenattion does this since a long time already)
michael
parents: 12333
diff changeset
275
12162
ab533510d598 remove old example stream
michael
parents: 12161
diff changeset
276 index_startcode
ab533510d598 remove old example stream
michael
parents: 12161
diff changeset
277 0xDD672F23E64EULL + (((uint64_t)('N'<<8) + 'X')<<48)
ab533510d598 remove old example stream
michael
parents: 12161
diff changeset
278 info_startcode
ab533510d598 remove old example stream
michael
parents: 12161
diff changeset
279 0xAB68B596BA78ULL + (((uint64_t)('N'<<8) + 'I')<<48)
13308
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
280 meta_startcode
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
281 FIXME
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
282
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
283 version
12238
a0ddf85bdee0 removing backward pointers
michael
parents: 12209
diff changeset
284 2 for now
a0ddf85bdee0 removing backward pointers
michael
parents: 12209
diff changeset
285
12333
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
286 max_distance
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
287 max distance of frame_startcodes, the distance may only be larger if
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
288 there is only a single frame between the 2 frame_startcodes
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
289 this can be used by the demuxer to detect damaged frame headers if the
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
290 damage results in a too long chain
12501
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
291 SHOULD be set to <=32768 or at least <=65536 unless there is a very good
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
292 reason to set it higher otherwise reasonable error recovery will be
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
293 impossible
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
294
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
295 max_short_distance
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
296 max distance of short startcodes or frame_startcodes, the distance may
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
297 only be larger if there is only a single frame between the 2
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
298 frame_startcodes/short startcodes this can be used by the demuxer to
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
299 detect damaged frame headers if the damage results in a too long chain
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
300 SHOULD be set to <=4096 or at least <=8192 unless there is a very good
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
301 reason to set it higher otherwise reasonable error recovery will be
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
302 impossible
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
303
12238
a0ddf85bdee0 removing backward pointers
michael
parents: 12209
diff changeset
304
12413
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
305 short_startcode
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
306 MUST be 3 bytes long and MUST have 'N' as first byte, the second byte
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
307 MUST not be a printable uppercase letter / must not be within 65..90,
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
308 default is 0x4EFE79
12501
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
309
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
310 stream_id
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
311 Note: streams with a lower relative class MUST have a lower relative id
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
312 so a stream with class 0 MUST allways have a id which is lower then any
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
313 stream with class > 0
12150
2c9a2b1772bc language_code & fourcc vb->v reversal
michael
parents: 12118
diff changeset
314 stream_id MUST be < stream_count
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
315
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
316 stream_class
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
317 0 video
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
318 32 audio
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
319 64 subtiles
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
320 Note the remaining values are reserved and MUST NOT be used
12184
17667db616d3 (de)coder -> (de)muxer
michael
parents: 12162
diff changeset
321 a demuxer MUST ignore streams with reserved classes
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
322
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
323 fourcc
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
324 identification for the codec
9323
774afe44f17b some more info (copy & pasted from ML)
michael
parents: 9312
diff changeset
325 example: "H264"
10817
59ac254c2541 some updates
alex
parents: 10166
diff changeset
326 MUST contain 2 or 4 bytes, note, this might be increased in the future
59ac254c2541 some updates
alex
parents: 10166
diff changeset
327 if needed
59ac254c2541 some updates
alex
parents: 10166
diff changeset
328
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
329 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
330 ISO 639 and ISO 3166 for language/country code
9325
18cdba535f36 hex editor friendly language_code
michael
parents: 9323
diff changeset
331 something like "usen" (US english), can be 0
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
332 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
333 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
334 and http://www.din.de/gremien/nas/nabd/iso3166ma/codlstp1/en_listp1.html
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
335
9297
8a19be9649e7 use fraction for time_base
michael
parents: 9296
diff changeset
336 time_base_nom / time_base_denom = time_base
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
337 the number of timer ticks per second, this MUST be equal to the fps
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
338 if the fixed_fps is 1
9297
8a19be9649e7 use fraction for time_base
michael
parents: 9296
diff changeset
339 time_base_denom MUST not be 0
8a19be9649e7 use fraction for time_base
michael
parents: 9296
diff changeset
340 time_base_nom and time_base_denom MUST be relative prime
12254
362cf8df665e new time_base_nom limit
michael
parents: 12247
diff changeset
341 time_base_nom MUST be < 2^31
9297
8a19be9649e7 use fraction for time_base
michael
parents: 9296
diff changeset
342 examples:
8a19be9649e7 use fraction for time_base
michael
parents: 9296
diff changeset
343 fps time_base_nom time_base_denom
8a19be9649e7 use fraction for time_base
michael
parents: 9296
diff changeset
344 30 30 1
8a19be9649e7 use fraction for time_base
michael
parents: 9296
diff changeset
345 29.97 30000 1001
8a19be9649e7 use fraction for time_base
michael
parents: 9296
diff changeset
346 23.976 24000 1001
9579
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
347 sample_rate sample_rate_mul time_base_nom time_base_denom
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
348 44100 1 44100 1
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
349 44100 64 11025 16
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
350 48000 1024 375 8
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
351 Note: the advantage to using a large sample_rate_mul is that the
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
352 timestamps need fewer bits
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
353
12413
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
354 global_time_base_nom / global_time_base_denom = global_time_base
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
355 the number of timer ticks per second
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
356 global_time_base_denom MUST not be 0
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
357 global_time_base_nom and global_time_base_denom MUST be relative prime
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
358 global_time_base_nom MUST be < 2^31
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
359
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
360 global_timestamp
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
361 timestamp in global_time_base units
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
362 when a global_timestamp is encountered the last_timestamp of all streams
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
363 is set to the following:
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
364 ln= global_time_base_denom*time_base_nom
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
365 sn= global_timestamp
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
366 d1= global_time_base_nom
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
367 d2= time_base_denom
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
368 last_timestamp= (ln/d1*sn + ln%d1*sn/d1)/d2
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
369 Note, this calculation MUST be done with unsigned 64 bit integers, and
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
370 is equivalent to (ln*sn)/(d1*d2) but this would require a 96bit integer
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
371
9579
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
372 msb_timestamp_shift
12261
d43f1c599701 remove data_size prediction
michael
parents: 12254
diff changeset
373 amount of bits in lsb_timestamp
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
374 MUST be <16
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
375
12333
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
376 decode_delay
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
377 maximum time between input and output for a codec, used to generate dts
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
378 from pts
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
379 is 0 for streams without b frames, and 1 for streams with b frames, may
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
380 be larger for future codecs
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
381
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
382 fixed_fps
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
383 1 indicates that the fps is fixed
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
384
9357
21347f49e8d8 supprting various codec specific/private headers for different APIs (ideas by arpi/alex/fabian)
michael
parents: 9356
diff changeset
385 codec_specific_data_type
10817
59ac254c2541 some updates
alex
parents: 10166
diff changeset
386 0 none/end
9361
06c106f23a41 encoding the whole name doesnt make sense
michael
parents: 9360
diff changeset
387 1 native
06c106f23a41 encoding the whole name doesnt make sense
michael
parents: 9360
diff changeset
388 2 bitmapinfoheader
06c106f23a41 encoding the whole name doesnt make sense
michael
parents: 9360
diff changeset
389 3 waveformatex
06c106f23a41 encoding the whole name doesnt make sense
michael
parents: 9360
diff changeset
390 4 imagedesc
06c106f23a41 encoding the whole name doesnt make sense
michael
parents: 9360
diff changeset
391 5 sounddesc
13308
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
392 "native", means a simple api & container independent storage form,
9357
21347f49e8d8 supprting various codec specific/private headers for different APIs (ideas by arpi/alex/fabian)
michael
parents: 9356
diff changeset
393 for example some mpeg4-es headers
21347f49e8d8 supprting various codec specific/private headers for different APIs (ideas by arpi/alex/fabian)
michael
parents: 9356
diff changeset
394
9356
025a25987ac0 simplification
michael
parents: 9350
diff changeset
395 codec_specific_data
025a25987ac0 simplification
michael
parents: 9350
diff changeset
396 private global data for a codec (could be huffman tables or ...)
12082
f705b0777572 removing subpackets (everyone hates them ...)
michael
parents: 11975
diff changeset
397
f705b0777572 removing subpackets (everyone hates them ...)
michael
parents: 11975
diff changeset
398 frame_code
f705b0777572 removing subpackets (everyone hates them ...)
michael
parents: 11975
diff changeset
399 the meaning of this byte is stored in the main header
f705b0777572 removing subpackets (everyone hates them ...)
michael
parents: 11975
diff changeset
400 the value 78 ('N') is forbidden to ensure that the byte is always
f705b0777572 removing subpackets (everyone hates them ...)
michael
parents: 11975
diff changeset
401 different from the first byte of any startcode
9420
8a1a8f5e9c91 variable subpacket size support
michael
parents: 9373
diff changeset
402
12082
f705b0777572 removing subpackets (everyone hates them ...)
michael
parents: 11975
diff changeset
403 flags[frame_code]
12413
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
404 the bits of the flags from MSB to LSB are KD
12261
d43f1c599701 remove data_size prediction
michael
parents: 12254
diff changeset
405 if D is 1 then data_size_msb is coded, otherwise data_size_msb is 0
12238
a0ddf85bdee0 removing backward pointers
michael
parents: 12209
diff changeset
406 K is the keyframe_type
a0ddf85bdee0 removing backward pointers
michael
parents: 12209
diff changeset
407 0-> no keyframe,
a0ddf85bdee0 removing backward pointers
michael
parents: 12209
diff changeset
408 1-> keyframe,
12413
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
409 flags=4 can be used to mark illegal frame_code bytes
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
410 frame_code=78 must have flags=4
12333
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
411 * frames MUST not depend(1) upon frames prior to the last
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
412 frame_startcode
12110
a34dc5a369ca restrictions to ensure that O(log n) seeking and error recovery is possible
michael
parents: 12084
diff changeset
413 depend(1) means dependancy on the container level (NUT) not dependancy
a34dc5a369ca restrictions to ensure that O(log n) seeking and error recovery is possible
michael
parents: 12084
diff changeset
414 on the codec level
a34dc5a369ca restrictions to ensure that O(log n) seeking and error recovery is possible
michael
parents: 12084
diff changeset
415
12084
68baf8877c07 reversing the change to the forw/backw pointers, its somewhat simpler to update it if the forward pointer is first
michael
parents: 12082
diff changeset
416 stream_id_plus1[frame_code]
12082
f705b0777572 removing subpackets (everyone hates them ...)
michael
parents: 11975
diff changeset
417 must be <250
12084
68baf8877c07 reversing the change to the forw/backw pointers, its somewhat simpler to update it if the forward pointer is first
michael
parents: 12082
diff changeset
418 if its 0 then the stream_id is coded in the frame
9579
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
419
12082
f705b0777572 removing subpackets (everyone hates them ...)
michael
parents: 11975
diff changeset
420 data_size_mul[frame_code]
12379
4100528fadf1 limits too small, my CBR mp3 samples have 2x overhead after removial of size prediction
michael
parents: 12368
diff changeset
421 must be <16384
9579
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
422
12082
f705b0777572 removing subpackets (everyone hates them ...)
michael
parents: 11975
diff changeset
423 data_size_lsb[frame_code]
12379
4100528fadf1 limits too small, my CBR mp3 samples have 2x overhead after removial of size prediction
michael
parents: 12368
diff changeset
424 must be <16384
12082
f705b0777572 removing subpackets (everyone hates them ...)
michael
parents: 11975
diff changeset
425
12413
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
426 timestamp_delta[frame_code]
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
427 must be <16384 and >-16384
87a6dc69b65a proposals by rich:
michael
parents: 12392
diff changeset
428
12084
68baf8877c07 reversing the change to the forw/backw pointers, its somewhat simpler to update it if the forward pointer is first
michael
parents: 12082
diff changeset
429 data_size
12261
d43f1c599701 remove data_size prediction
michael
parents: 12254
diff changeset
430 data_size= data_size_lsb + data_size_msb*data_size_mul;
12082
f705b0777572 removing subpackets (everyone hates them ...)
michael
parents: 11975
diff changeset
431
12261
d43f1c599701 remove data_size prediction
michael
parents: 12254
diff changeset
432 coded_timestamp
d43f1c599701 remove data_size prediction
michael
parents: 12254
diff changeset
433 if coded_timestamp < (1<<msb_timestamp_shift) then its a
d43f1c599701 remove data_size prediction
michael
parents: 12254
diff changeset
434 lsb timestamp, otherwise its a full timestamp + (1<<msb_timestamp_shift)
d43f1c599701 remove data_size prediction
michael
parents: 12254
diff changeset
435 lsb timestamps are converted to full timesamps by:
d43f1c599701 remove data_size prediction
michael
parents: 12254
diff changeset
436 mask = (1<<msb_timestamp_shift)-1;
d43f1c599701 remove data_size prediction
michael
parents: 12254
diff changeset
437 delta= last_timestamp - mask/2
d43f1c599701 remove data_size prediction
michael
parents: 12254
diff changeset
438 timestamp= ((timestamp_lsb-delta)&mask) + delta
12333
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
439 a full timestamp must be used if there is no reference timestamp
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
440 available after the last frame_startcode with the current stream_id
12261
d43f1c599701 remove data_size prediction
michael
parents: 12254
diff changeset
441
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
442 lsb_timestamp
12082
f705b0777572 removing subpackets (everyone hates them ...)
michael
parents: 11975
diff changeset
443 least significant bits of the timestamp in time_base precission
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
444 Example: IBBP display order
12084
68baf8877c07 reversing the change to the forw/backw pointers, its somewhat simpler to update it if the forward pointer is first
michael
parents: 12082
diff changeset
445 keyframe timestamp=0 -> timestamp=0
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
446 frame lsb_timestamp=3 -> timestamp=3
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
447 frame lsb_timestamp=1 -> timestamp=1
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
448 frame lsb_timestamp=2 -> timestamp=2
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
449 ...
12084
68baf8877c07 reversing the change to the forw/backw pointers, its somewhat simpler to update it if the forward pointer is first
michael
parents: 12082
diff changeset
450 keyframe msb_timestamp=257 -> timestamp=257
12082
f705b0777572 removing subpackets (everyone hates them ...)
michael
parents: 11975
diff changeset
451 frame lsb_timestamp=255->timestamp=255
9579
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
452 frame lsb_timestamp=0 -> timestamp=256
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
453 frame lsb_timestamp=4 -> timestamp=260
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
454 frame lsb_timestamp=2 -> timestamp=258
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
455 frame lsb_timestamp=3 -> timestamp=259
12110
a34dc5a369ca restrictions to ensure that O(log n) seeking and error recovery is possible
michael
parents: 12084
diff changeset
456 all timestamps of keyframes of a single stream MUST be monotone
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
457
12333
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
458 dts
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
459 dts are calculated by using a decode_delay+1 sized buffer for each
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
460 stream, into which the current pts is inserted and the element with
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
461 the smallest value is removed, this is then the current dts
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
462 this buffer is initalized with decode_delay -1 elements
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
463 all frames with dts == timestamp must be monotone, that means a frame
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
464 which occures later in the stream must have a larger or equal dts
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
465 then an earlier frame
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
466 FIXME rename timestamp* to pts* ?
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
467
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
468 width/height
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
469 MUST be set to the coded width/height
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
470
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
471 sample_width/sample_height (aspect ratio)
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
472 sample_width is the horizontal distance between samples
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
473 sample_width and sample_height MUST be relative prime if not zero
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
474 MUST be 0 if unknown
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
475
10158
93e5428d0b3e some changes (michael: is the colorspace_type field needed?)
alex
parents: 10061
diff changeset
476 colorspace_type
10166
e860465ef46e colorspace_type
michael
parents: 10158
diff changeset
477 0 unknown
e860465ef46e colorspace_type
michael
parents: 10158
diff changeset
478 1 ITU Rec 624 / ITU Rec 601 Y range: 16..235 Cb/Cr range: 16..240
e860465ef46e colorspace_type
michael
parents: 10158
diff changeset
479 2 ITU Rec 709 Y range: 16..235 Cb/Cr range: 16..240
e860465ef46e colorspace_type
michael
parents: 10158
diff changeset
480 17 ITU Rec 624 / ITU Rec 601 Y range: 0..255 Cb/Cr range: 0..255
e860465ef46e colorspace_type
michael
parents: 10158
diff changeset
481 18 ITU Rec 709 Y range: 0..255 Cb/Cr range: 0..255
e860465ef46e colorspace_type
michael
parents: 10158
diff changeset
482
12333
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
483 samplerate_nom / samplerate_denom = samplerate
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
484 the number of samples per second
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
485
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
486 checksum
12118
b8fea9441d02 switching from crc32 to adler32 checksums, cuz they are faster and simpler
michael
parents: 12117
diff changeset
487 adler32 checksum
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
488
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
489 index_timestamp
12502
6db7e319aaa0 index fixes
michael
parents: 12501
diff changeset
490 value of the timetamp in a sync point relative to the last sync-point
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
491
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
492 index_position
12502
6db7e319aaa0 index fixes
michael
parents: 12501
diff changeset
493 position in bytes of the first byte of a sync-point, relative to the
6db7e319aaa0 index fixes
michael
parents: 12501
diff changeset
494 last sync_point
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
495
9579
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
496 id
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
497 the id of the type/name pair, so its more compact
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
498 0 means end
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
499
9323
774afe44f17b some more info (copy & pasted from ML)
michael
parents: 9312
diff changeset
500 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
501 for example: "UTF8" -> String or "JPEG" -> jpeg image
9579
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
502 Note: nonstandard fields should be prefixed by "X-"
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
503 Note: MUST be less than 6 byte long (might be increased to 64 later)
9323
774afe44f17b some more info (copy & pasted from ML)
michael
parents: 9312
diff changeset
504
13308
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
505 info packet types
9295
michael
parents: 9294
diff changeset
506 the name of the info entry, valid names are
13308
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
507
9347
97888c25ae60 changing name to "nut" for now, we can change it again if we agree on something else
michael
parents: 9335
diff changeset
508 "Author"
97888c25ae60 changing name to "nut" for now, we can change it again if we agree on something else
michael
parents: 9335
diff changeset
509 "Description"
97888c25ae60 changing name to "nut" for now, we can change it again if we agree on something else
michael
parents: 9335
diff changeset
510 "Copyright"
9369
f7fc442571f7 added (PAL),(NTSC),..
alex
parents: 9361
diff changeset
511 "Encoder" the name & version of the software used for encoding
9347
97888c25ae60 changing name to "nut" for now, we can change it again if we agree on something else
michael
parents: 9335
diff changeset
512 "Title"
9373
e1e2177841ef dvds have covers too - Andreas Hess <jaska@gmx.net>
alex
parents: 9372
diff changeset
513 "Cover" an image of the (cd,dvd,vhs,..) cover (preferable PNG or JPEG)
9350
12391e52c2f7 -typo, +time, -ntsc/pal (idea by alex)
michael
parents: 9347
diff changeset
514 "Source" "DVD", "VCD", "CD", "MD", "FM radio", "VHS", "TV",
12391e52c2f7 -typo, +time, -ntsc/pal (idea by alex)
michael
parents: 9347
diff changeset
515 "LD"
9373
e1e2177841ef dvds have covers too - Andreas Hess <jaska@gmx.net>
alex
parents: 9372
diff changeset
516 Optional: appended PAL,NTSC,SECAM, ... in parentheses
9350
12391e52c2f7 -typo, +time, -ntsc/pal (idea by alex)
michael
parents: 9347
diff changeset
517 "CaptureDevice" "BT878", "BT848", "webcam", ... (more exact names are fine too)
12391e52c2f7 -typo, +time, -ntsc/pal (idea by alex)
michael
parents: 9347
diff changeset
518 "CreationTime" "2003-01-20 20:13:15Z", ...
12391e52c2f7 -typo, +time, -ntsc/pal (idea by alex)
michael
parents: 9347
diff changeset
519 (ISO 8601 format, see http://www.cl.cam.ac.uk/~mgk25/iso-time.html)
12391e52c2f7 -typo, +time, -ntsc/pal (idea by alex)
michael
parents: 9347
diff changeset
520 Note: dont forget the timezone
13308
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
521 "Keywords"
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
522 "TotalTime" total length of the stream in msecs
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
523
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
524 meta packet types
11975
645975e01061 replaygain
alex
parents: 10985
diff changeset
525 "ReplayGain"
13308
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
526 "Language" the language code
12503
a160a68209ac disposition
michael
parents: 12502
diff changeset
527 "Disposition" "original", "dub" (translated), "comment", "lyrics", "karaoke"
9295
michael
parents: 9294
diff changeset
528 Note: if someone needs some others, please tell us about them, so we can
michael
parents: 9294
diff changeset
529 add them to the official standard (if they are sane)
9360
add934b25d6d "X-" prefix for nonstd fields & "keywords" idea by (Andreas Hess <jaska at gmx dot net>)
michael
parents: 9357
diff changeset
530 Note: nonstandard fields should be prefixed by "X-"
9579
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
531 Note: MUST be less than 64 bytes long
9295
michael
parents: 9294
diff changeset
532
michael
parents: 9294
diff changeset
533 value
9579
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
534 value of this name/type pair
9295
michael
parents: 9294
diff changeset
535
9310
b16480522be9 some typos
michael
parents: 9307
diff changeset
536 stuffing
9579
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
537 0x80 can be placed infront of any type v entry for stuffing
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
538 purposes
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
539
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
540 info_table[][2]={
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
541 {NULL , NULL }, // end
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
542 {NULL , NULL },
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
543 {NULL , "UTF8"},
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
544 {NULL , "v"},
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
545 {NULL , "s"},
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
546 {"Author" , "UTF8"},
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
547 {"Titel" , "UTF8"},
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
548 {"Description" , "UTF8"},
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
549 {"Copyright" , "UTF8"},
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
550 {"Encoder" , "UTF8"},
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
551 {"Keyword" , "UTF8"},
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
552 {"Cover" , "JPEG"},
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
553 {"Cover" , "PNG"},
13308
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
554 };
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
555
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
556 meta_table[][2]={
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
557 {NULL , NULL }, // end
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
558 {NULL , NULL },
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
559 {NULL , "UTF8"},
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
560 {NULL , "v"},
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
561 {NULL , "s"},
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
562 {"Language" , to be decided},
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
563 {"Disposition" , to be decided},
8ff17d153414 info packet is now file global, while meta pakcet is stream specific, as discussed with Rich
alex
parents: 13047
diff changeset
564 {"ReplayGain" , to be decided},
9579
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
565 };
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
566
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
567 Structure:
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
568
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
569 the headers MUST be in exactly the following order (to simplify demuxer design)
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
570 main header
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
571 stream_header (id=0)
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
572 stream_header (id=1)
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
573 ...
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
574 stream_header (id=n)
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
575
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
576 headers may be repated, but if they are then they MUST all be repeated together
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
577 and repeated headers MUST be identical
12501
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
578 headers MAY only repeated at the closest possible positions after 2^x where x is
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
579 an integer and the file end, so the headers may be repeated at 4102 if thats the
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
580 closest possition after 2^12=4096 at which the headers can be placed
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
581
12501
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
582 headers MUST be placed at least at the begin of the file and immedeatly before
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
583 the index or at the file end if there is no index
9310
b16480522be9 some typos
michael
parents: 9307
diff changeset
584 headers MUST be repeated at least twice (so they exist 3 times in a file)
9295
michael
parents: 9294
diff changeset
585
12501
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
586 a demuxer MUST not demux a stream which contains more than one stream, or which
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
587 is wrapped in a structure to facilitate more than one stream or otherwise
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
588 duplicate the role of a container. any such file is to be considered invalid
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
589
12503
a160a68209ac disposition
michael
parents: 12502
diff changeset
590 info packets which describe the whole file or individual streams/tracks must be
a160a68209ac disposition
michael
parents: 12502
diff changeset
591 placed before any video/audio/... frames
a160a68209ac disposition
michael
parents: 12502
diff changeset
592
9310
b16480522be9 some typos
michael
parents: 9307
diff changeset
593 Index
12502
6db7e319aaa0 index fixes
michael
parents: 12501
diff changeset
594 every sync-point must be exacty once in the index
9311
4b04416ada91 zero_bit for normal frames, so we can distinguish them from other packets
michael
parents: 9310
diff changeset
595 Note: in case of realtime streaming there is no end, so no index there either
9310
b16480522be9 some typos
michael
parents: 9307
diff changeset
596
b16480522be9 some typos
michael
parents: 9307
diff changeset
597 Info packets
b16480522be9 some typos
michael
parents: 9307
diff changeset
598 the info_packet can be repeated, it can also contain different names & values
b16480522be9 some typos
michael
parents: 9307
diff changeset
599 each time but only if allso the time is different
b16480522be9 some typos
michael
parents: 9307
diff changeset
600 Info packets can be used to describe the file or some part of it (chapters)
b16480522be9 some typos
michael
parents: 9307
diff changeset
601
b16480522be9 some typos
michael
parents: 9307
diff changeset
602 info packets, SHOULD be placed at the begin of the file at least
b16480522be9 some typos
michael
parents: 9307
diff changeset
603 for realtime streaming info packets will normally be transmitted when they apply
b16480522be9 some typos
michael
parents: 9307
diff changeset
604 for example, the current song title & artist of the currently shown music video
b16480522be9 some typos
michael
parents: 9307
diff changeset
605
b16480522be9 some typos
michael
parents: 9307
diff changeset
606 Unknown packets
12184
17667db616d3 (de)coder -> (de)muxer
michael
parents: 12162
diff changeset
607 MUST be ignored by the demuxer
9310
b16480522be9 some typos
michael
parents: 9307
diff changeset
608
12501
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
609 demuxer (non-normative)
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
610
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
611 in the absence of valid header at beginning, players SHOULD search for backup
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
612 headers starting at offset 2^x for each x players SHOULD end their search from a
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
613 particular offset when any startcode is found (including syncpoint)
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
614
cd0d9a99b730 remove index flag
michael
parents: 12428
diff changeset
615
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
616 Sample code (GPL, & untested)
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
617
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
618 typedef BufferContext{
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
619 uint8_t *buf;
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
620 uint8_t *buf_ptr;
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
621 }BufferContext;
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
622
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
623 static inline uint64_t get_bytes(BufferContext *bc, int count){
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
624 uint64_t val=0;
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
625
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
626 assert(count>0 && count<9)
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
627
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
628 for(i=0; i<count; i++){
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
629 val <<=8;
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
630 val += *(bc->buf_ptr++);
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
631 }
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
632
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
633 return val;
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
634 }
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
635
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
636 static inline void put_bytes(BufferContext *bc, int count, uint64_t val){
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
637 uint64_t val=0;
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
638
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
639 assert(count>0 && count<9)
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
640
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
641 for(i=count-1; i>=0; i--){
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
642 *(bc->buf_ptr++)= val >> (8*i);
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
643 }
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
644
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
645 return val;
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
646 }
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
647
10061
76b1c7d20da8 corrected the sample code
alex
parents: 9580
diff changeset
648 static inline uint64_t get_v(BufferContext *bc){
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
649 uint64_t val= 0;
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
650
10158
93e5428d0b3e some changes (michael: is the colorspace_type field needed?)
alex
parents: 10061
diff changeset
651 for(; space_left(bc) > 0; ){
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
652 int tmp= *(bc->buf_ptr++);
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
653 if(tmp&0x80)
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
654 val= (val<<7) + tmp - 0x80;
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
655 else
9299
aa26f77e7aae remove non byte sized stuff
michael
parents: 9297
diff changeset
656 return (val<<7) + tmp;
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
657 }
9579
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
658
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
659 return -1;
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
660 }
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
661
10061
76b1c7d20da8 corrected the sample code
alex
parents: 9580
diff changeset
662 static inline int put_v(BufferContext *bc, uint64_t val){
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
663 int i;
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
664
10158
93e5428d0b3e some changes (michael: is the colorspace_type field needed?)
alex
parents: 10061
diff changeset
665 if(space_left(bc) < 9) return -1;
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
666
9579
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
667 val &= 0x7FFFFFFFFFFFFFFFULL; // FIXME can only encode upto 63 bits currently
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
668 for(i=7; ; i+=7){
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
669 if(val>>i == 0) break;
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
670 }
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
671
10827
michael
parents: 10824
diff changeset
672 for(i-=7; i>0; i-=7){
9294
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
673 *(bc->buf_ptr++)= 0x80 | (val>>i);
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
674 }
7159ed6a4d0b nonsense (MPlayer container format draft 0.01)
michael
parents:
diff changeset
675 *(bc->buf_ptr++)= val&0x7F;
9579
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
676
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
677 return 0;
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
678 }
89d27a306886 *signed int vlc (needs only 5 lines of code so its no increase of complexity)
michael
parents: 9422
diff changeset
679
12333
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
680 static int64_t get_dts(int64_t pts, int64_t *pts_cache, int delay, int reset){
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
681 if(reset) memset(pts_cache, -1, delay*sizeof(int64_t));
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
682
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
683 while(delay--){
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
684 int64_t t= pts_cache[delay];
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
685 if(t < pts){
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
686 pts_cache[delay]= pts;
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
687 pts= t;
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
688 }
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
689 }
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
690
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
691 return pts;
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
692 }
80036bf4a9f5 remove frame types
michael
parents: 12297
diff changeset
693
10158
93e5428d0b3e some changes (michael: is the colorspace_type field needed?)
alex
parents: 10061
diff changeset
694 Authors
93e5428d0b3e some changes (michael: is the colorspace_type field needed?)
alex
parents: 10061
diff changeset
695
93e5428d0b3e some changes (michael: is the colorspace_type field needed?)
alex
parents: 10061
diff changeset
696 Folks from MPlayer Developers Mailinglist (http://www.mplayehrq.hu/).
93e5428d0b3e some changes (michael: is the colorspace_type field needed?)
alex
parents: 10061
diff changeset
697 Authors in ABC-order: (FIXME! Tell us if we left you out)
93e5428d0b3e some changes (michael: is the colorspace_type field needed?)
alex
parents: 10061
diff changeset
698 Beregszaszi, Alex (alex@fsn.hu)
93e5428d0b3e some changes (michael: is the colorspace_type field needed?)
alex
parents: 10061
diff changeset
699 Bunkus, Moritz (moritz@bunkus.org)
93e5428d0b3e some changes (michael: is the colorspace_type field needed?)
alex
parents: 10061
diff changeset
700 Diedrich, Tobias (td@sim.uni-hannover.de)
12297
a6b64a263ca2 imo i'm one of the nut spec authors :)
rfelker
parents: 12261
diff changeset
701 Felker, Rich (dalias@aerifal.cx)
10158
93e5428d0b3e some changes (michael: is the colorspace_type field needed?)
alex
parents: 10061
diff changeset
702 Franz, Fabian (FabianFranz@gmx.de)
93e5428d0b3e some changes (michael: is the colorspace_type field needed?)
alex
parents: 10061
diff changeset
703 Gereoffy, Arpad (arpi@thot.banki.hu)
93e5428d0b3e some changes (michael: is the colorspace_type field needed?)
alex
parents: 10061
diff changeset
704 Hess, Andreas (jaska@gmx.net)
93e5428d0b3e some changes (michael: is the colorspace_type field needed?)
alex
parents: 10061
diff changeset
705 Niedermayer, Michael (michaelni@gmx.at)