diff demux_avi.c @ 587:8511095c5283

stage#1 completed: c files no more included from mplayer.c
author arpi_esp
date Mon, 23 Apr 2001 03:42:17 +0000
parents 26e513f392b2
children ef932c18cb14
line wrap: on
line diff
--- a/demux_avi.c	Mon Apr 23 03:39:34 2001 +0000
+++ b/demux_avi.c	Mon Apr 23 03:42:17 2001 +0000
@@ -1,44 +1,51 @@
 //  AVI file parser for DEMUXER v2.6  by A'rpi/ESP-team
 
+#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"
+
 //static float avi_pts_frametime=1.0f/25.0f;
-static float avi_audio_pts=0;
-static float avi_video_pts=0;
-
-static int skip_video_frames=0;
-
-static inline int avi_stream_id(unsigned int id){
-  unsigned char *p=(unsigned char *)&id;
-  unsigned char a,b;
-  a=p[0]-'0'; b=p[1]-'0';
-  if(a>9 || b>9) return 100; // invalid ID
-  return a*10+b;
-}
+float avi_audio_pts=0;
+float avi_video_pts=0;
+//float avi_video_ftime=0.04;
+int skip_video_frames=0;
 
 // Select ds from ID
-static inline demux_stream_t* demux_avi_select_stream(demuxer_t *demux,unsigned int id){
+demux_stream_t* demux_avi_select_stream(demuxer_t *demux,unsigned int id){
   int stream_id=avi_stream_id(id);
 
 //  printf("demux_avi_select_stream(%d)  {a:%d/v:%d}\n",stream_id,
 //       demux->audio->id,demux->video->id);
 
   if(demux->video->id==-1)
-    if(avi_header.v_streams[stream_id])
+    if(demux->v_streams[stream_id])
         demux->video->id=stream_id;
 
   if(demux->audio->id==-1)
-    if(avi_header.a_streams[stream_id])
+    if(demux->a_streams[stream_id])
         demux->audio->id=stream_id;
 
   if(stream_id==demux->audio->id){
       if(!demux->audio->sh){
-        demux->audio->sh=avi_header.a_streams[stream_id];
+        demux->audio->sh=demux->a_streams[stream_id];
         if(verbose) printf("Auto-selected AVI audio ID = %d\n",demux->audio->id);
       }
       return demux->audio;
   }
   if(stream_id==demux->video->id){
       if(!demux->video->sh){
-        demux->video->sh=avi_header.v_streams[stream_id];
+        demux->video->sh=demux->v_streams[stream_id];
         if(verbose) printf("Auto-selected AVI video ID = %d\n",demux->video->id);
       }
       return demux->video;
@@ -74,7 +81,9 @@
      //avi_video_pts+=avi_pts_frametime;
      //avi_video_pts+=(float)avi_header.video.dwScale/(float)avi_header.video.dwRate;
      //avi_video_pts+=((sh_video_t*)ds->sh)->frametime;
+// FIXME!!!
      avi_video_pts+=(float)((sh_video_t*)(demux->video->sh))->video.dwScale/(float)((sh_video_t*)(demux->video->sh))->video.dwRate;
+//     avi_video_pts+=avi_video_ftime;
      avi_audio_pts=avi_video_pts;
   }
   
@@ -108,19 +117,19 @@
 do{
   AVIINDEXENTRY *idx=NULL;
   demux->filepos=stream_tell(demux->stream);
-  if(demux->filepos>=demux->endpos){
+  if(demux->filepos>=demux->movi_end){
           demux->stream->eof=1;
           return 0;
   }
   if(stream_eof(demux->stream)) return 0;
-  if(avi_header.idx_size>0 && avi_header.idx_pos<avi_header.idx_size){
+  if(demux->idx_size>0 && demux->idx_pos<demux->idx_size){
     unsigned int pos;
     
-    //if(avi_header.idx_pos<0) printf("Fatal! idx_pos=%d\n",avi_header.idx_pos);
+    //if(demux->idx_pos<0) printf("Fatal! idx_pos=%d\n",demux->idx_pos);
     
-    idx=&avi_header.idx[avi_header.idx_pos++];
+    idx=&((AVIINDEXENTRY *)demux->idx)[demux->idx_pos++];
     
-    //printf("[%d]",avi_header.idx_pos);fflush(stdout);
+    //printf("[%d]",demux->idx_pos);fflush(stdout);
     
     //stream_seek(demux->stream,idx.dwChunkOffset);
     //printf("IDX  pos=%X  idx.pos=%X  idx.size=%X  idx.flags=%X\n",demux->filepos,
@@ -134,8 +143,8 @@
       continue; // skip this chunk
     }
 
-    pos=idx->dwChunkOffset+avi_header.idx_offset;
-    if(pos<avi_header.movi_start || pos>=avi_header.movi_end){
+    pos=idx->dwChunkOffset+demux->idx_offset;
+    if(pos<demux->movi_start || pos>=demux->movi_end){
       printf("ChunkOffset out of range!  current=0x%X  idx=0x%X  \n",demux->filepos,pos);
       continue;
     }
@@ -165,7 +174,7 @@
       continue;
     }
   }
-  ret=demux_avi_read_packet(demux,id,len,avi_header.idx_pos-1);
+  ret=demux_avi_read_packet(demux,id,len,demux->idx_pos-1);
       if(!ret && skip_video_frames<=0)
         if(--max_packs==0){
           demux->stream->eof=1;
@@ -191,13 +200,14 @@
   int idx_pos=0;
   demux->filepos=stream_tell(demux->stream);
   
-  if(ds==demux->video) idx_pos=avi_header.idx_pos_a++; else
-  if(ds==demux->audio) idx_pos=avi_header.idx_pos_v++; else
-                       idx_pos=avi_header.idx_pos++;
+  if(ds==demux->video) idx_pos=demux->idx_pos_a++; else
+  if(ds==demux->audio) idx_pos=demux->idx_pos_v++; else
+                       idx_pos=demux->idx_pos++;
   
-  if(avi_header.idx_size>0 && idx_pos<avi_header.idx_size){
+  if(demux->idx_size>0 && idx_pos<demux->idx_size){
     unsigned int pos;
-    idx=&avi_header.idx[idx_pos];
+    idx=&((AVIINDEXENTRY *)demux->idx)[idx_pos];
+//    idx=&demux->idx[idx_pos];
     
     if(idx->dwFlags&AVIIF_LIST){
       // LIST
@@ -208,8 +218,8 @@
       continue; // skip this chunk
     }
 
-    pos=idx->dwChunkOffset+avi_header.idx_offset;
-    if(pos<avi_header.movi_start || pos>=avi_header.movi_end){
+    pos=idx->dwChunkOffset+demux->idx_offset;
+    if(pos<demux->movi_start || pos>=demux->movi_end){
       printf("ChunkOffset out of range!  current=0x%X  idx=0x%X  \n",demux->filepos,pos);
       continue;
     }
@@ -257,8 +267,8 @@
 int ret=0;
 int *fpos=NULL;
 
-  if(ds==demux->video) fpos=&avi_header.idx_pos_a; else
-  if(ds==demux->audio) fpos=&avi_header.idx_pos_v; else
+  if(ds==demux->video) fpos=&demux->idx_pos_a; else
+  if(ds==demux->audio) fpos=&demux->idx_pos_v; else
   return 0;
 
   stream_seek(demux->stream,fpos[0]);
@@ -266,7 +276,7 @@
 do{
 
   demux->filepos=stream_tell(demux->stream);
-  if(demux->filepos>=demux->endpos){
+  if(demux->filepos>=demux->movi_end){
           demux->stream->eof=1;
           return 0;
   }
@@ -281,7 +291,7 @@
   
   if(ds==demux_avi_select_stream(demux,id)){
     // read it!
-    ret=demux_avi_read_packet(demux,id,len,avi_header.idx_pos-1);
+    ret=demux_avi_read_packet(demux,id,len,demux->idx_pos-1);
   } else {
     // skip it!
     int skip=(len+1)&(~1); // total bytes in this chunk