Mercurial > mplayer.hg
comparison TOOLS/movinfo.c @ 1:3b5f5d1c5041
Initial revision
author | arpi_esp |
---|---|
date | Sat, 24 Feb 2001 20:28:24 +0000 |
parents | |
children | f8bc3143449f |
comparison
equal
deleted
inserted
replaced
0:c1bb2c071d63 | 1:3b5f5d1c5041 |
---|---|
1 // show QuickTime .mov file structure (C) 2001. by A'rpi/ESP-team | |
2 | |
3 #include <stdio.h> | |
4 #include <stdlib.h> | |
5 | |
6 unsigned int read_dword(FILE *f){ | |
7 unsigned char atom_size_b[4]; | |
8 if(fread(&atom_size_b,4,1,f)<=0) return -1; | |
9 return (atom_size_b[0]<<24)|(atom_size_b[1]<<16)|(atom_size_b[2]<<8)|atom_size_b[3]; | |
10 } | |
11 | |
12 void lschunks(FILE *f,int level,unsigned int endpos){ | |
13 unsigned int atom_size; | |
14 unsigned int atom_type; | |
15 int pos; | |
16 while(endpos==0 || ftell(f)<endpos){ | |
17 pos=ftell(f); | |
18 atom_size=read_dword(f);// if(fread(&atom_size_b,4,1,f)<=0) break; | |
19 if(fread(&atom_type,4,1,f)<=0) break; | |
20 | |
21 if(atom_size<8) break; // error | |
22 | |
23 printf("%08X: %*s %.4s (%08X) %d\n",pos,level*2,"",&atom_type,atom_type,atom_size); | |
24 | |
25 if(atom_type==0x64737473) { // stsd | |
26 unsigned int tmp; | |
27 unsigned int count; | |
28 int i; | |
29 fread(&tmp,4,1,f); | |
30 count=read_dword(f);// fread(&count,4,1,f); | |
31 printf("desc count = %d\n",count); | |
32 for(i=0;i<count;i++){ | |
33 unsigned int len; | |
34 unsigned int format; | |
35 len=read_dword(f); // fread(&len,4,1,f); | |
36 fread(&format,4,1,f); | |
37 printf(" desc #%d: %.4s (%d)\n",i+1,&format,len); | |
38 fseek(f,len-8,SEEK_CUR); | |
39 } | |
40 } | |
41 | |
42 if(atom_type==0x6F637473) { // stco | |
43 int len,i; | |
44 read_dword(f); | |
45 len=read_dword(f); | |
46 printf("Chunk table size :%d\n",len); | |
47 for(i=0;i<len;i++) printf(" chunk #%d: 0x%X\n",i+1,read_dword(f)); | |
48 } | |
49 | |
50 | |
51 if(atom_type==0x73747473) { // stts | |
52 int len,i; | |
53 read_dword(f); | |
54 len=read_dword(f); | |
55 printf("T->S table size :%d\n",len); | |
56 for(i=0;i<len;i++){ | |
57 int num=read_dword(f); | |
58 int dur=read_dword(f); | |
59 printf("%5d samples: %d duration\n",num,dur); | |
60 } | |
61 } | |
62 | |
63 if(atom_type==0x63737473) { // stsc | |
64 int len,i; | |
65 read_dword(f); | |
66 len=read_dword(f); | |
67 printf("S->C table size :%d\n",len); | |
68 for(i=0;i<len;i++){ | |
69 int first=read_dword(f); | |
70 int spc=read_dword(f); | |
71 int sdid=read_dword(f); | |
72 printf(" chunk %d... %d s/c desc: %d\n",first,spc,sdid); | |
73 } | |
74 } | |
75 | |
76 if(atom_type==0x7A737473) { // stsz | |
77 int len,i,ss; | |
78 read_dword(f); | |
79 ss=read_dword(f); | |
80 len=read_dword(f); | |
81 printf("Sample size table len: %d\n",len); | |
82 if(ss){ | |
83 printf(" common sample size: %d bytes\n",ss); | |
84 } else { | |
85 for(i=0;i<len;i++) printf(" sample #%d: %d bytes\n",i+1,read_dword(f)); | |
86 } | |
87 } | |
88 | |
89 | |
90 #if 1 | |
91 switch(atom_type){ | |
92 case 0x75716D72: // rmqu | |
93 case 0x65657266: // free JUNK | |
94 case 0x64686B74: // tkhd Track header | |
95 case 0x61746475: // udta User data | |
96 case 0x7461646D: // mdat Movie data | |
97 case 0x64737473: // stsd Sample description | |
98 case 0x6F637473: // stco Chunk offset table | |
99 case 0x73747473: // stts Sample time table | |
100 case 0x63737473: // stsc Sample->Chunk mapping table | |
101 case 0x7A737473: // stsz Sample size table | |
102 break; | |
103 default: lschunks(f,level+1,pos+atom_size); | |
104 } | |
105 #else | |
106 switch(atom_type){ | |
107 case 0x766F6F6D: // moov | |
108 case 0x61726D72: // rmra | |
109 case 0x61646D72: // rmda | |
110 lschunks(f,level+1,pos+atom_size); | |
111 } | |
112 #endif | |
113 fseek(f,pos+atom_size,SEEK_SET); | |
114 } | |
115 } | |
116 | |
117 int main(int argc,char* argv[]){ | |
118 int pos; | |
119 FILE *f=fopen(argc>1?argv[1]:"Akira.mov","rb"); | |
120 if(!f) return 1; | |
121 | |
122 lschunks(f,0,0); | |
123 | |
124 } |