From d34041569e71fc9bd772354e94dc9d16061072a5 Mon Sep 17 00:00:00 2001 From: arpi_esp Date: Sat, 24 Feb 2001 20:28:24 +0000 Subject: Initial revision git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@2 b3059339-0415-0410-9bf9-f77b7e298cf2 --- aviheader.c | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 aviheader.c (limited to 'aviheader.c') diff --git a/aviheader.c b/aviheader.c new file mode 100644 index 0000000000..9fd8c220c1 --- /dev/null +++ b/aviheader.c @@ -0,0 +1,89 @@ + +#define MIN(a,b) (((a)<(b))?(a):(b)) + +void read_avi_header(int no_index){ + +int stream_id=-1; + +//---- AVI header: +avi_header.idx_size=0; +while(1){ + int id=stream_read_dword_le(demuxer->stream); + int chunksize,size2; + static int last_fccType=0; + // + if(stream_eof(demuxer->stream)) break; + // + if(id==mmioFOURCC('L','I','S','T')){ + int len=stream_read_dword_le(demuxer->stream)-4; // list size + id=stream_read_dword_le(demuxer->stream); // list type + if(verbose>=2) printf("LIST %.4s len=%d\n",&id,len); + if(id==listtypeAVIMOVIE){ + // found MOVI header + avi_header.movi_start=stream_tell(demuxer->stream); + avi_header.movi_end=avi_header.movi_start+len; + if(verbose>=1) printf("Found movie at 0x%X - 0x%X\n",avi_header.movi_start,avi_header.movi_end); + len=(len+1)&(~1); + stream_skip(demuxer->stream,len); + } + continue; + } + size2=stream_read_dword_le(demuxer->stream); + if(verbose>=2) printf("CHUNK %.4s len=%d\n",&id,size2); + chunksize=(size2+1)&(~1); + switch(id){ + case ckidAVIMAINHDR: // read 'avih' + stream_read(demuxer->stream,(char*) &avi_header.avih,MIN(size2,sizeof(avi_header.avih))); + chunksize-=MIN(size2,sizeof(avi_header.avih)); + if(verbose) print_avih(&avi_header.avih); + break; + case ckidSTREAMHEADER: { // read 'strh' + AVIStreamHeader h; + stream_read(demuxer->stream,(char*) &h,MIN(size2,sizeof(h))); + chunksize-=MIN(size2,sizeof(h)); + if(h.fccType==streamtypeVIDEO) memcpy(&avi_header.video,&h,sizeof(h));else + if(h.fccType==streamtypeAUDIO) memcpy(&avi_header.audio,&h,sizeof(h)); + last_fccType=h.fccType; + if(verbose>=1) print_strh(&h); + ++stream_id; + break; } + case ckidSTREAMFORMAT: { // read 'strf' + if(last_fccType==streamtypeVIDEO){ + stream_read(demuxer->stream,(char*) &avi_header.bih,MIN(size2,sizeof(avi_header.bih))); + chunksize-=MIN(size2,sizeof(avi_header.bih)); +// init_video_codec(); +// init_video_out(); + if(demuxer->video->id==-1) demuxer->video->id=stream_id; + } else + if(last_fccType==streamtypeAUDIO){ + int z=(chunksize<64)?chunksize:64; + if(verbose>=2) printf("found 'wf', %d bytes of %d\n",chunksize,sizeof(WAVEFORMATEX)); + stream_read(demuxer->stream,(char*) &avi_header.wf_ext,z); + chunksize-=z; + if(verbose>=1) print_wave_header((WAVEFORMATEX*)&avi_header.wf_ext); +// init_audio_codec(); +// init_audio_out(); + if(demuxer->audio->id==-1) demuxer->audio->id=stream_id; + } + break; + } + case ckidAVINEWINDEX: if(!no_index){ + avi_header.idx_size=size2>>4; + if(verbose>=1) printf("Reading INDEX block, %d chunks for %d frames\n", + avi_header.idx_size,avi_header.avih.dwTotalFrames); + avi_header.idx=malloc(avi_header.idx_size<<4); + stream_read(demuxer->stream,(char*)avi_header.idx,avi_header.idx_size<<4); + chunksize-=avi_header.idx_size<<4; + if(verbose>=2) print_index(); + break; + } + } + if(chunksize>0) stream_skip(demuxer->stream,chunksize); else + if(chunksize<0) printf("WARNING!!! chunksize=%d (id=%.4s)\n",chunksize,&id); + +} + +} + +#undef MIN + -- cgit v1.2.3