Mercurial > mplayer.hg
annotate TOOLS/movinfo.c @ 32963:ce00479b68ce
Cosmetic: Format to MPlayer coding style.
Additionally: sort prototype declarations, remove useless comment at top of
file, add comment to include file, group and sort includes, move assignment
outside condition, group statements by adding or removing new lines to ease
reading and remove needless parentheses and braces.
author | ib |
---|---|
date | Tue, 08 Mar 2011 12:29:44 +0000 |
parents | b573c7c7173b |
children | 1c35122fba8c |
rev | line source |
---|---|
30416
b573c7c7173b
Add standard license header to C tools missing them.
diego
parents:
29263
diff
changeset
|
1 /* show QuickTime .mov file structure (C) 2001. by A'rpi/ESP-team |
b573c7c7173b
Add standard license header to C tools missing them.
diego
parents:
29263
diff
changeset
|
2 * various hacks by alex@naxine.org |
b573c7c7173b
Add standard license header to C tools missing them.
diego
parents:
29263
diff
changeset
|
3 * |
b573c7c7173b
Add standard license header to C tools missing them.
diego
parents:
29263
diff
changeset
|
4 * This program is free software; you can redistribute it and/or modify |
b573c7c7173b
Add standard license header to C tools missing them.
diego
parents:
29263
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
b573c7c7173b
Add standard license header to C tools missing them.
diego
parents:
29263
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
b573c7c7173b
Add standard license header to C tools missing them.
diego
parents:
29263
diff
changeset
|
7 * (at your option) any later version. |
b573c7c7173b
Add standard license header to C tools missing them.
diego
parents:
29263
diff
changeset
|
8 * |
b573c7c7173b
Add standard license header to C tools missing them.
diego
parents:
29263
diff
changeset
|
9 * This program is distributed in the hope that it will be useful, |
b573c7c7173b
Add standard license header to C tools missing them.
diego
parents:
29263
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
b573c7c7173b
Add standard license header to C tools missing them.
diego
parents:
29263
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
b573c7c7173b
Add standard license header to C tools missing them.
diego
parents:
29263
diff
changeset
|
12 * GNU General Public License for more details. |
b573c7c7173b
Add standard license header to C tools missing them.
diego
parents:
29263
diff
changeset
|
13 * |
b573c7c7173b
Add standard license header to C tools missing them.
diego
parents:
29263
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along |
b573c7c7173b
Add standard license header to C tools missing them.
diego
parents:
29263
diff
changeset
|
15 * with this program; if not, write to the Free Software Foundation, Inc., |
b573c7c7173b
Add standard license header to C tools missing them.
diego
parents:
29263
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
b573c7c7173b
Add standard license header to C tools missing them.
diego
parents:
29263
diff
changeset
|
17 */ |
1175 | 18 |
19 /* | |
20 Blocks: 4bytes atom_size | |
21 4bytes atom_type (name) | |
22 ... | |
23 | |
24 By older files, mdat is at the beginning, and moov follows it later, | |
25 by newer files, moov is at the begininng. | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26759
diff
changeset
|
26 |
1175 | 27 Fontosabb typeok: |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26759
diff
changeset
|
28 |
1175 | 29 trak: track: ezeken belul van egy-egy stream (video/audio) |
30 tkhd: track header: fps (video esten picture size is itt van) | |
31 vmhd: video media handler (video stream informaciok) | |
32 smhd: sound media handler (audio stream informaciok) | |
33 */ | |
1 | 34 |
35 #include <stdio.h> | |
36 #include <stdlib.h> | |
37 | |
1175 | 38 #undef NO_SPECIAL |
39 | |
26575
1ca484e74f18
Mark all functions that are only used within the file as static.
diego
parents:
26474
diff
changeset
|
40 static char *atom2human_type(int type) |
1175 | 41 { |
42 switch (type) | |
43 { | |
26759
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26576
diff
changeset
|
44 case 0x766F6F6D: return "Information sections"; /* moov */ |
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26576
diff
changeset
|
45 case 0x6468766D: return "Movie header"; /* mvhd */ |
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26576
diff
changeset
|
46 case 0x6169646D: return "Media stream"; /* mdia */ |
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26576
diff
changeset
|
47 case 0x64686D76: return "Video media header"; /* vmhd */ |
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26576
diff
changeset
|
48 case 0x64686D73: return "Sound media header"; /* smhd */ |
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26576
diff
changeset
|
49 case 0x6468646D: return "Media header"; /* mdhd */ |
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26576
diff
changeset
|
50 case 0x666E696D: return "Media information"; /* minf */ |
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26576
diff
changeset
|
51 case 0x726C6468: return "Handler reference"; /* hdlr */ |
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26576
diff
changeset
|
52 case 0x6B617274: return "New track (stream)"; /* trak */ |
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26576
diff
changeset
|
53 case 0x75716D72: return "rmqu"; |
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26576
diff
changeset
|
54 case 0x65657266: return "free"; |
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26576
diff
changeset
|
55 case 0x64686B74: return "Track header"; /* tkhd */ |
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26576
diff
changeset
|
56 case 0x61746475: return "User data"; /* udta */ |
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26576
diff
changeset
|
57 case 0x7461646D: return "Movie data"; /* mdat */ |
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26576
diff
changeset
|
58 case 0x6C627473: return "Sample information table"; /* stbl */ |
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26576
diff
changeset
|
59 case 0x64737473: return "Sample description"; /* stsd */ |
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26576
diff
changeset
|
60 case 0x6F637473: return "Chunk offset table"; /* stco */ |
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26576
diff
changeset
|
61 case 0x73747473: return "Sample time table"; /* stts */ |
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26576
diff
changeset
|
62 case 0x63737473: return "Sample->Chunk mapping table"; /* stsc */ |
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26576
diff
changeset
|
63 case 0x7A737473: return "Sample size table"; /* stsz */ |
1175 | 64 } |
26759
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26576
diff
changeset
|
65 return "unknown"; |
1175 | 66 } |
67 | |
68 #define S_NONE 0 | |
69 #define S_AUDIO 1 | |
70 #define S_VIDEO 2 | |
71 int stream = S_NONE; | |
72 int v_stream = 0; | |
73 int a_stream = 0; | |
74 | |
26575
1ca484e74f18
Mark all functions that are only used within the file as static.
diego
parents:
26474
diff
changeset
|
75 static unsigned int read_dword(FILE *f){ |
1 | 76 unsigned char atom_size_b[4]; |
77 if(fread(&atom_size_b,4,1,f)<=0) return -1; | |
78 return (atom_size_b[0]<<24)|(atom_size_b[1]<<16)|(atom_size_b[2]<<8)|atom_size_b[3]; | |
79 } | |
80 | |
26575
1ca484e74f18
Mark all functions that are only used within the file as static.
diego
parents:
26474
diff
changeset
|
81 static void video_stream_info(FILE *f, int len) |
1175 | 82 { |
83 int orig_pos = ftell(f); | |
84 unsigned char data[len-8]; | |
85 int i; | |
23658 | 86 // char codec[len-8]; |
1175 | 87 |
88 len -= 8; | |
89 for (i=0; i<len; i++) | |
90 fread(&data[i], 1, 1, f); | |
91 | |
6908 | 92 // strncpy(codec, &data[43], len-43); |
93 // printf(" [codec: %s]\n", &codec); | |
1175 | 94 fseek(f,orig_pos,SEEK_SET); |
95 } | |
96 | |
26575
1ca484e74f18
Mark all functions that are only used within the file as static.
diego
parents:
26474
diff
changeset
|
97 static void audio_stream_info(FILE *f, int len) |
1175 | 98 { |
99 int orig_pos = ftell(f); | |
100 unsigned char data[len-8]; | |
101 int i; | |
102 | |
103 len -= 8; | |
104 for (i=0; i<len; i++) | |
105 fread(&data[i], 1, 1, f); | |
106 | |
107 printf(" [%d bit", data[19]); | |
108 if (data[17] == 1) | |
109 printf(" mono"); | |
110 else | |
111 printf(" %d channels", data[17]); | |
112 printf("]\n"); | |
113 fseek(f,orig_pos,SEEK_SET); | |
114 } | |
115 | |
26576 | 116 #if 0 |
26575
1ca484e74f18
Mark all functions that are only used within the file as static.
diego
parents:
26474
diff
changeset
|
117 static void userdata_info(FILE *f, int len, int pos, int level) |
1199 | 118 { |
119 int orig_pos = pos; /*ftell(f);*/ | |
120 unsigned int atom_size = 1; | |
121 unsigned int atom_type; | |
122 | |
123 // printf("userdata @ %d:%d (%d)\n", pos, pos+len, len); | |
124 | |
125 // fseek(f, pos+3, SEEK_SET); | |
126 | |
127 while (atom_size != 0) | |
128 { | |
129 atom_size=read_dword(f);// if(fread(&atom_size_b,4,1,f)<=0) break; | |
130 if(fread(&atom_type,4,1,f)<=0) break; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26759
diff
changeset
|
131 |
1199 | 132 if(atom_size<8) break; // error |
133 | |
134 // printf("%08X: %*s %.4s (%08X) %05d (begin: %08X)\n",pos,level*2,"", | |
135 // &atom_type,atom_type,atom_size,pos+8); | |
136 | |
137 switch(atom_type) | |
138 { | |
139 case 0x797063A9: /* cpy (copyright) */ | |
140 { | |
141 char *data = malloc(atom_size-8); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26759
diff
changeset
|
142 |
1199 | 143 fseek(f, pos+6, SEEK_SET); |
144 fread(data, atom_size-8, 1, f); | |
145 printf(" Copyright: %s\n", data); | |
146 free(data); | |
147 } | |
148 break; | |
149 case 0x666E69A9: /* inf (information) */ | |
150 { | |
151 char data[atom_size-8]; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26759
diff
changeset
|
152 |
1199 | 153 fread(&data, 1, atom_size-8, f); |
154 printf(" Owner: %s\n", &data); | |
155 } | |
156 break; | |
157 case 0x6D616EA9: /* nam (name) */ | |
158 { | |
159 char data[atom_size-8]; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26759
diff
changeset
|
160 |
1199 | 161 fread(&data, 1, atom_size-8, f); |
162 printf(" Name: %s\n", &data); | |
163 } | |
164 break; | |
165 } | |
166 } | |
167 fseek(f,orig_pos,SEEK_SET); | |
168 } | |
26576 | 169 #endif |
1199 | 170 |
171 int time_scale = 0; | |
172 | |
26575
1ca484e74f18
Mark all functions that are only used within the file as static.
diego
parents:
26474
diff
changeset
|
173 static void lschunks(FILE *f,int level,unsigned int endpos){ |
1 | 174 unsigned int atom_size; |
175 unsigned int atom_type; | |
176 int pos; | |
1175 | 177 |
1 | 178 while(endpos==0 || ftell(f)<endpos){ |
179 pos=ftell(f); | |
180 atom_size=read_dword(f);// if(fread(&atom_size_b,4,1,f)<=0) break; | |
181 if(fread(&atom_type,4,1,f)<=0) break; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26759
diff
changeset
|
182 |
1 | 183 if(atom_size<8) break; // error |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26759
diff
changeset
|
184 |
1175 | 185 printf("%08X: %*s %.4s (%08X) %05d [%s] (begin: %08X)\n",pos,level*2,"",&atom_type,atom_type,atom_size, |
186 atom2human_type(atom_type), pos+8); // 8: atom_size fields (4) + atom_type fields (4) | |
187 | |
188 #ifndef NO_SPECIAL | |
1199 | 189 // if (atom_type == 0x61746475) |
190 // userdata_info(f, atom_size, pos, level); | |
191 | |
192 if (atom_type == 0x6468646D) | |
193 { | |
194 char data[4]; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26759
diff
changeset
|
195 |
1199 | 196 fread(&data, 1, 1, f); // char |
197 printf("mdhd version %d\n", data[0]); | |
198 fread(&data, 3, 1, f); // int24 | |
199 fread(&data, 4, 1, f); // int32 | |
200 fread(&data, 4, 1, f); // int32 | |
201 fread(&data, 4, 1, f); // int32 | |
202 time_scale = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]; | |
203 printf("timescale: %d\n", time_scale); | |
204 fread(&data, 4, 1, f); // int32 | |
205 fread(&data, 2, 1, f); // int16 | |
206 fread(&data, 2, 1, f); // int16 | |
207 } | |
208 | |
1175 | 209 if (atom_type == 0x64686D76) |
210 { | |
211 stream = S_VIDEO; | |
212 printf(" Found VIDEO Stream #%d\n", v_stream++); | |
213 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26759
diff
changeset
|
214 |
1175 | 215 if (atom_type == 0x64686D73) |
216 { | |
217 stream = S_AUDIO; | |
218 printf(" Found AUDIO Stream #%d\n", a_stream++); | |
219 } | |
220 | |
221 if (atom_type == 0x64686B74) // tkhd - track header | |
222 { | |
223 int i; | |
224 unsigned char data[atom_size]; | |
1199 | 225 int x, y; |
1175 | 226 |
227 for (i=0; i<atom_size; i++) | |
228 fread(&data[i], 1, 1, f); | |
229 | |
230 x = data[77]; | |
231 y = data[81]; | |
1199 | 232 printf(" Flags: %d\n", data[3]); |
1175 | 233 printf(" Picture size: %dx%d\n", x, y); |
234 if (x == 0 && y == 0) | |
235 printf(" Possible audio stream!\n"); | |
236 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26759
diff
changeset
|
237 |
1 | 238 if(atom_type==0x64737473) { // stsd |
239 unsigned int tmp; | |
240 unsigned int count; | |
241 int i; | |
242 fread(&tmp,4,1,f); | |
243 count=read_dword(f);// fread(&count,4,1,f); | |
244 printf("desc count = %d\n",count); | |
245 for(i=0;i<count;i++){ | |
246 unsigned int len; | |
247 unsigned int format; | |
248 len=read_dword(f); // fread(&len,4,1,f); | |
249 fread(&format,4,1,f); | |
250 printf(" desc #%d: %.4s (%d)\n",i+1,&format,len); | |
1175 | 251 if (stream == S_VIDEO) |
252 video_stream_info(f, len); | |
253 if (stream == S_AUDIO) | |
254 audio_stream_info(f, len); | |
1 | 255 fseek(f,len-8,SEEK_CUR); |
256 } | |
257 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26759
diff
changeset
|
258 |
1 | 259 if(atom_type==0x6F637473) { // stco |
260 int len,i; | |
261 read_dword(f); | |
262 len=read_dword(f); | |
263 printf("Chunk table size :%d\n",len); | |
264 for(i=0;i<len;i++) printf(" chunk #%d: 0x%X\n",i+1,read_dword(f)); | |
265 } | |
266 | |
267 | |
268 if(atom_type==0x73747473) { // stts | |
269 int len,i; | |
270 read_dword(f); | |
271 len=read_dword(f); | |
272 printf("T->S table size :%d\n",len); | |
273 for(i=0;i<len;i++){ | |
274 int num=read_dword(f); | |
275 int dur=read_dword(f); | |
1199 | 276 printf("%5d samples: %d duration", num, dur); |
277 if (stream == S_AUDIO) | |
278 printf("(rate: %f Hz)\n", (float)time_scale/dur); | |
279 else | |
280 printf("(fps: %f)\n", (float)time_scale/dur); | |
1 | 281 } |
282 } | |
283 | |
284 if(atom_type==0x63737473) { // stsc | |
285 int len,i; | |
286 read_dword(f); | |
287 len=read_dword(f); | |
288 printf("S->C table size :%d\n",len); | |
289 for(i=0;i<len;i++){ | |
290 int first=read_dword(f); | |
291 int spc=read_dword(f); | |
292 int sdid=read_dword(f); | |
1199 | 293 printf(" chunk %d... %d s/c desc: %d\n",first,spc,sdid); |
1 | 294 } |
295 } | |
296 | |
297 if(atom_type==0x7A737473) { // stsz | |
298 int len,i,ss; | |
299 read_dword(f); | |
300 ss=read_dword(f); | |
301 len=read_dword(f); | |
302 printf("Sample size table len: %d\n",len); | |
303 if(ss){ | |
304 printf(" common sample size: %d bytes\n",ss); | |
305 } else { | |
306 for(i=0;i<len;i++) printf(" sample #%d: %d bytes\n",i+1,read_dword(f)); | |
307 } | |
308 } | |
1175 | 309 #endif |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26759
diff
changeset
|
310 |
1 | 311 #if 1 |
312 switch(atom_type){ | |
1175 | 313 case 0x7461646D: // mdat Movie data |
1 | 314 case 0x75716D72: // rmqu |
315 case 0x65657266: // free JUNK | |
316 case 0x64686B74: // tkhd Track header | |
317 case 0x61746475: // udta User data | |
318 case 0x64737473: // stsd Sample description | |
319 case 0x6F637473: // stco Chunk offset table | |
320 case 0x73747473: // stts Sample time table | |
321 case 0x63737473: // stsc Sample->Chunk mapping table | |
322 case 0x7A737473: // stsz Sample size table | |
6870 | 323 case 0x746f6e70: // pnot |
324 case 0x54434950: // PICT | |
6908 | 325 case 0x70797466: |
1 | 326 break; |
327 default: lschunks(f,level+1,pos+atom_size); | |
328 } | |
329 #else | |
330 switch(atom_type){ | |
331 case 0x766F6F6D: // moov | |
332 case 0x61726D72: // rmra | |
333 case 0x61646D72: // rmda | |
334 lschunks(f,level+1,pos+atom_size); | |
335 } | |
336 #endif | |
337 fseek(f,pos+atom_size,SEEK_SET); | |
338 } | |
339 } | |
340 | |
1175 | 341 int main(int argc,char* argv[]) |
342 { | |
343 FILE *f; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26759
diff
changeset
|
344 |
1175 | 345 if ((f = fopen(argc>1?argv[1]:"Akira.mov","rb")) == NULL) |
346 return 1; | |
1 | 347 |
26474
5ac02417f474
Remove useless 0 flag from s printf conversion specifier, fixes the warning:
diego
parents:
24202
diff
changeset
|
348 printf("%.8s %.4s (%.8s) %5s [%s]\n\n", |
1175 | 349 "position", "atom", "atomtype", "len", "human readable atom name"); |
1 | 350 |
1175 | 351 lschunks(f, 0, 0); |
352 | |
353 printf("\nSummary: streams: %d video/%d audio\n", v_stream, a_stream); | |
23659
f15f95c2671a
Fix "control reaches end of non-void function" warnings.
diego
parents:
23658
diff
changeset
|
354 |
f15f95c2671a
Fix "control reaches end of non-void function" warnings.
diego
parents:
23658
diff
changeset
|
355 return 0; |
1 | 356 } |