diff options
author | arpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-04-23 03:42:17 +0000 |
---|---|---|
committer | arpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-04-23 03:42:17 +0000 |
commit | b1b6b1fafa2b0d7cb2b28fd8fe7d7b4dc525f46e (patch) | |
tree | 422801d19397532c59e0d36a5b024a9919931f9c /aviheader.c | |
parent | 4ebd355ec3e456c09329d1d28070dd0e8d9d65c7 (diff) | |
download | mpv-b1b6b1fafa2b0d7cb2b28fd8fe7d7b4dc525f46e.tar.bz2 mpv-b1b6b1fafa2b0d7cb2b28fd8fe7d7b4dc525f46e.tar.xz |
stage#1 completed: c files no more included from mplayer.c
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@588 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'aviheader.c')
-rw-r--r-- | aviheader.c | 72 |
1 files changed, 46 insertions, 26 deletions
diff --git a/aviheader.c b/aviheader.c index bb171c1587..1538314222 100644 --- a/aviheader.c +++ b/aviheader.c @@ -1,7 +1,25 @@ + +#include <stdio.h> +#include <stdlib.h> + +extern int verbose; // defined in mplayer.c + +#include "stream.h" +#include "demuxer.h" + +#include "wine/mmreg.h" +#include "wine/avifmt.h" +#include "wine/vfw.h" + +#include "codec-cfg.h" +#include "stheader.h" + #define MIN(a,b) (((a)<(b))?(a):(b)) -void read_avi_header(int index_mode){ +static MainAVIHeader avih; + +void read_avi_header(demuxer_t *demuxer,int index_mode){ sh_audio_t *sh_audio=NULL; sh_video_t *sh_video=NULL; int stream_id=-1; @@ -9,7 +27,7 @@ int idxfix_videostream=0; int idxfix_divx=0; //---- AVI header: -avi_header.idx_size=0; +demuxer->idx_size=0; while(1){ int id=stream_read_dword_le(demuxer->stream); int chunksize,size2; @@ -23,9 +41,9 @@ while(1){ 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); + demuxer->movi_start=stream_tell(demuxer->stream); + demuxer->movi_end=demuxer->movi_start+len; + if(verbose>=1) printf("Found movie at 0x%X - 0x%X\n",demuxer->movi_start,demuxer->movi_end); len=(len+1)&(~1); stream_skip(demuxer->stream,len); } @@ -36,9 +54,9 @@ while(1){ 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); + stream_read(demuxer->stream,(char*) &avih,MIN(size2,sizeof(avih))); + chunksize-=MIN(size2,sizeof(avih)); + if(verbose) print_avih(&avih); break; case ckidSTREAMHEADER: { // read 'strh' AVIStreamHeader h; @@ -79,6 +97,8 @@ while(1){ case mmioFOURCC('d', 'i', 'v', '6'): case mmioFOURCC('M', 'P', '4', '3'): case mmioFOURCC('m', 'p', '4', '3'): + case mmioFOURCC('M', 'P', '4', '2'): + case mmioFOURCC('m', 'p', '4', '2'): case mmioFOURCC('A', 'P', '4', '1'): idxfix_divx=1; // we can fix keyframes only for divx coded files! } @@ -95,13 +115,13 @@ while(1){ break; } case ckidAVINEWINDEX: if(index_mode){ - avi_header.idx_size=size2>>4; + demuxer->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(); + demuxer->idx_size,avih.dwTotalFrames); + demuxer->idx=malloc(demuxer->idx_size<<4); + stream_read(demuxer->stream,(char*)demuxer->idx,demuxer->idx_size<<4); + chunksize-=demuxer->idx_size<<4; + if(verbose>=2) print_index(demuxer->idx,demuxer->idx_size); break; } } @@ -110,20 +130,20 @@ while(1){ } -if(index_mode>=2 || (avi_header.idx_size==0 && index_mode==1)){ +if(index_mode>=2 || (demuxer->idx_size==0 && index_mode==1)){ // build index for file: stream_reset(demuxer->stream); - stream_seek(demuxer->stream,avi_header.movi_start); + stream_seek(demuxer->stream,demuxer->movi_start); - avi_header.idx_pos=0; - avi_header.idx=NULL; + demuxer->idx_pos=0; + demuxer->idx=NULL; while(1){ int id,len,skip; AVIINDEXENTRY* idx; unsigned char c; demuxer->filepos=stream_tell(demuxer->stream); - if(demuxer->filepos>=avi_header.movi_end) break; + if(demuxer->filepos>=demuxer->movi_end) break; id=stream_read_dword_le(demuxer->stream); len=stream_read_dword_le(demuxer->stream); if(id==mmioFOURCC('L','I','S','T')){ @@ -131,12 +151,12 @@ if(index_mode>=2 || (avi_header.idx_size==0 && index_mode==1)){ continue; } if(stream_eof(demuxer->stream)) break; - if(avi_header.idx_pos<=avi_header.idx_size){ - avi_header.idx_size+=32; - avi_header.idx=realloc(avi_header.idx,avi_header.idx_size*sizeof(AVIINDEXENTRY)); - if(!avi_header.idx){avi_header.idx_pos=0; break;} // error! + if(demuxer->idx_pos<=demuxer->idx_size){ + demuxer->idx_size+=32; + demuxer->idx=realloc(demuxer->idx,demuxer->idx_size*sizeof(AVIINDEXENTRY)); + if(!demuxer->idx){demuxer->idx_pos=0; break;} // error! } - idx=&avi_header.idx[avi_header.idx_pos++]; + idx=&((AVIINDEXENTRY *)demuxer->idx)[demuxer->idx_pos++]; idx->ckid=id; idx->dwFlags=AVIIF_KEYFRAME; // FIXME idx->dwChunkOffset=demuxer->filepos; @@ -163,8 +183,8 @@ if(index_mode>=2 || (avi_header.idx_size==0 && index_mode==1)){ skip=(len+1)&(~1); // total bytes in this chunk stream_seek(demuxer->stream,8+demuxer->filepos+skip); } - avi_header.idx_size=avi_header.idx_pos; - printf("AVI: Generated index table for %d chunks!\n",avi_header.idx_size); + demuxer->idx_size=demuxer->idx_pos; + printf("AVI: Generated index table for %d chunks!\n",demuxer->idx_size); } } |