diff options
author | arpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-02-24 20:28:24 +0000 |
---|---|---|
committer | arpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-02-24 20:28:24 +0000 |
commit | d34041569e71fc9bd772354e94dc9d16061072a5 (patch) | |
tree | 8f481cae1c70f32d1756fbe5f39000577b73042d /TOOLS/movinfo.c | |
parent | e95a95ece09bac96bdfd37322f96c6f57ef79ebc (diff) | |
download | mpv-d34041569e71fc9bd772354e94dc9d16061072a5.tar.bz2 mpv-d34041569e71fc9bd772354e94dc9d16061072a5.tar.xz |
Initial revision
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@2 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'TOOLS/movinfo.c')
-rw-r--r-- | TOOLS/movinfo.c | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/TOOLS/movinfo.c b/TOOLS/movinfo.c new file mode 100644 index 0000000000..3c3c3ddd9e --- /dev/null +++ b/TOOLS/movinfo.c @@ -0,0 +1,124 @@ +// show QuickTime .mov file structure (C) 2001. by A'rpi/ESP-team + +#include <stdio.h> +#include <stdlib.h> + +unsigned int read_dword(FILE *f){ + unsigned char atom_size_b[4]; + if(fread(&atom_size_b,4,1,f)<=0) return -1; + return (atom_size_b[0]<<24)|(atom_size_b[1]<<16)|(atom_size_b[2]<<8)|atom_size_b[3]; +} + +void lschunks(FILE *f,int level,unsigned int endpos){ + unsigned int atom_size; + unsigned int atom_type; + int pos; + while(endpos==0 || ftell(f)<endpos){ + pos=ftell(f); + atom_size=read_dword(f);// if(fread(&atom_size_b,4,1,f)<=0) break; + if(fread(&atom_type,4,1,f)<=0) break; + + if(atom_size<8) break; // error + + printf("%08X: %*s %.4s (%08X) %d\n",pos,level*2,"",&atom_type,atom_type,atom_size); + + if(atom_type==0x64737473) { // stsd + unsigned int tmp; + unsigned int count; + int i; + fread(&tmp,4,1,f); + count=read_dword(f);// fread(&count,4,1,f); + printf("desc count = %d\n",count); + for(i=0;i<count;i++){ + unsigned int len; + unsigned int format; + len=read_dword(f); // fread(&len,4,1,f); + fread(&format,4,1,f); + printf(" desc #%d: %.4s (%d)\n",i+1,&format,len); + fseek(f,len-8,SEEK_CUR); + } + } + + if(atom_type==0x6F637473) { // stco + int len,i; + read_dword(f); + len=read_dword(f); + printf("Chunk table size :%d\n",len); + for(i=0;i<len;i++) printf(" chunk #%d: 0x%X\n",i+1,read_dword(f)); + } + + + if(atom_type==0x73747473) { // stts + int len,i; + read_dword(f); + len=read_dword(f); + printf("T->S table size :%d\n",len); + for(i=0;i<len;i++){ + int num=read_dword(f); + int dur=read_dword(f); + printf("%5d samples: %d duration\n",num,dur); + } + } + + if(atom_type==0x63737473) { // stsc + int len,i; + read_dword(f); + len=read_dword(f); + printf("S->C table size :%d\n",len); + for(i=0;i<len;i++){ + int first=read_dword(f); + int spc=read_dword(f); + int sdid=read_dword(f); + printf(" chunk %d... %d s/c desc: %d\n",first,spc,sdid); + } + } + + if(atom_type==0x7A737473) { // stsz + int len,i,ss; + read_dword(f); + ss=read_dword(f); + len=read_dword(f); + printf("Sample size table len: %d\n",len); + if(ss){ + printf(" common sample size: %d bytes\n",ss); + } else { + for(i=0;i<len;i++) printf(" sample #%d: %d bytes\n",i+1,read_dword(f)); + } + } + + +#if 1 + switch(atom_type){ + case 0x75716D72: // rmqu + case 0x65657266: // free JUNK + case 0x64686B74: // tkhd Track header + case 0x61746475: // udta User data + case 0x7461646D: // mdat Movie data + case 0x64737473: // stsd Sample description + case 0x6F637473: // stco Chunk offset table + case 0x73747473: // stts Sample time table + case 0x63737473: // stsc Sample->Chunk mapping table + case 0x7A737473: // stsz Sample size table + break; + default: lschunks(f,level+1,pos+atom_size); + } +#else + switch(atom_type){ + case 0x766F6F6D: // moov + case 0x61726D72: // rmra + case 0x61646D72: // rmda + lschunks(f,level+1,pos+atom_size); + } +#endif + fseek(f,pos+atom_size,SEEK_SET); + } +} + +int main(int argc,char* argv[]){ +int pos; +FILE *f=fopen(argc>1?argv[1]:"Akira.mov","rb"); +if(!f) return 1; + +lschunks(f,0,0); + +} |