comparison 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
comparison
equal deleted inserted replaced
586:e1b8c0b3ec35 587:8511095c5283
1 // AVI file parser for DEMUXER v2.6 by A'rpi/ESP-team 1 // AVI file parser for DEMUXER v2.6 by A'rpi/ESP-team
2 2
3 #include <stdio.h>
4 #include <stdlib.h>
5
6 extern int verbose; // defined in mplayer.c
7
8 #include "stream.h"
9 #include "demuxer.h"
10
11 #include "wine/mmreg.h"
12 #include "wine/avifmt.h"
13 #include "wine/vfw.h"
14
15 #include "codec-cfg.h"
16 #include "stheader.h"
17
3 //static float avi_pts_frametime=1.0f/25.0f; 18 //static float avi_pts_frametime=1.0f/25.0f;
4 static float avi_audio_pts=0; 19 float avi_audio_pts=0;
5 static float avi_video_pts=0; 20 float avi_video_pts=0;
6 21 //float avi_video_ftime=0.04;
7 static int skip_video_frames=0; 22 int skip_video_frames=0;
8
9 static inline int avi_stream_id(unsigned int id){
10 unsigned char *p=(unsigned char *)&id;
11 unsigned char a,b;
12 a=p[0]-'0'; b=p[1]-'0';
13 if(a>9 || b>9) return 100; // invalid ID
14 return a*10+b;
15 }
16 23
17 // Select ds from ID 24 // Select ds from ID
18 static inline demux_stream_t* demux_avi_select_stream(demuxer_t *demux,unsigned int id){ 25 demux_stream_t* demux_avi_select_stream(demuxer_t *demux,unsigned int id){
19 int stream_id=avi_stream_id(id); 26 int stream_id=avi_stream_id(id);
20 27
21 // printf("demux_avi_select_stream(%d) {a:%d/v:%d}\n",stream_id, 28 // printf("demux_avi_select_stream(%d) {a:%d/v:%d}\n",stream_id,
22 // demux->audio->id,demux->video->id); 29 // demux->audio->id,demux->video->id);
23 30
24 if(demux->video->id==-1) 31 if(demux->video->id==-1)
25 if(avi_header.v_streams[stream_id]) 32 if(demux->v_streams[stream_id])
26 demux->video->id=stream_id; 33 demux->video->id=stream_id;
27 34
28 if(demux->audio->id==-1) 35 if(demux->audio->id==-1)
29 if(avi_header.a_streams[stream_id]) 36 if(demux->a_streams[stream_id])
30 demux->audio->id=stream_id; 37 demux->audio->id=stream_id;
31 38
32 if(stream_id==demux->audio->id){ 39 if(stream_id==demux->audio->id){
33 if(!demux->audio->sh){ 40 if(!demux->audio->sh){
34 demux->audio->sh=avi_header.a_streams[stream_id]; 41 demux->audio->sh=demux->a_streams[stream_id];
35 if(verbose) printf("Auto-selected AVI audio ID = %d\n",demux->audio->id); 42 if(verbose) printf("Auto-selected AVI audio ID = %d\n",demux->audio->id);
36 } 43 }
37 return demux->audio; 44 return demux->audio;
38 } 45 }
39 if(stream_id==demux->video->id){ 46 if(stream_id==demux->video->id){
40 if(!demux->video->sh){ 47 if(!demux->video->sh){
41 demux->video->sh=avi_header.v_streams[stream_id]; 48 demux->video->sh=demux->v_streams[stream_id];
42 if(verbose) printf("Auto-selected AVI video ID = %d\n",demux->video->id); 49 if(verbose) printf("Auto-selected AVI video ID = %d\n",demux->video->id);
43 } 50 }
44 return demux->video; 51 return demux->video;
45 } 52 }
46 if(id!=mmioFOURCC('J','U','N','K')){ 53 if(id!=mmioFOURCC('J','U','N','K')){
72 } 79 }
73 // ezt a 2 sort lehet hogy fell kell majd cserelni: 80 // ezt a 2 sort lehet hogy fell kell majd cserelni:
74 //avi_video_pts+=avi_pts_frametime; 81 //avi_video_pts+=avi_pts_frametime;
75 //avi_video_pts+=(float)avi_header.video.dwScale/(float)avi_header.video.dwRate; 82 //avi_video_pts+=(float)avi_header.video.dwScale/(float)avi_header.video.dwRate;
76 //avi_video_pts+=((sh_video_t*)ds->sh)->frametime; 83 //avi_video_pts+=((sh_video_t*)ds->sh)->frametime;
84 // FIXME!!!
77 avi_video_pts+=(float)((sh_video_t*)(demux->video->sh))->video.dwScale/(float)((sh_video_t*)(demux->video->sh))->video.dwRate; 85 avi_video_pts+=(float)((sh_video_t*)(demux->video->sh))->video.dwScale/(float)((sh_video_t*)(demux->video->sh))->video.dwRate;
86 // avi_video_pts+=avi_video_ftime;
78 avi_audio_pts=avi_video_pts; 87 avi_audio_pts=avi_video_pts;
79 } 88 }
80 89
81 // len=stream_read_dword_le(demux->stream); 90 // len=stream_read_dword_le(demux->stream);
82 skip=(len+1)&(~1); // total bytes in this chunk 91 skip=(len+1)&(~1); // total bytes in this chunk
106 int ret=0; 115 int ret=0;
107 116
108 do{ 117 do{
109 AVIINDEXENTRY *idx=NULL; 118 AVIINDEXENTRY *idx=NULL;
110 demux->filepos=stream_tell(demux->stream); 119 demux->filepos=stream_tell(demux->stream);
111 if(demux->filepos>=demux->endpos){ 120 if(demux->filepos>=demux->movi_end){
112 demux->stream->eof=1; 121 demux->stream->eof=1;
113 return 0; 122 return 0;
114 } 123 }
115 if(stream_eof(demux->stream)) return 0; 124 if(stream_eof(demux->stream)) return 0;
116 if(avi_header.idx_size>0 && avi_header.idx_pos<avi_header.idx_size){ 125 if(demux->idx_size>0 && demux->idx_pos<demux->idx_size){
117 unsigned int pos; 126 unsigned int pos;
118 127
119 //if(avi_header.idx_pos<0) printf("Fatal! idx_pos=%d\n",avi_header.idx_pos); 128 //if(demux->idx_pos<0) printf("Fatal! idx_pos=%d\n",demux->idx_pos);
120 129
121 idx=&avi_header.idx[avi_header.idx_pos++]; 130 idx=&((AVIINDEXENTRY *)demux->idx)[demux->idx_pos++];
122 131
123 //printf("[%d]",avi_header.idx_pos);fflush(stdout); 132 //printf("[%d]",demux->idx_pos);fflush(stdout);
124 133
125 //stream_seek(demux->stream,idx.dwChunkOffset); 134 //stream_seek(demux->stream,idx.dwChunkOffset);
126 //printf("IDX pos=%X idx.pos=%X idx.size=%X idx.flags=%X\n",demux->filepos, 135 //printf("IDX pos=%X idx.pos=%X idx.size=%X idx.flags=%X\n",demux->filepos,
127 // pos-4,idx->dwChunkLength,idx->dwFlags); 136 // pos-4,idx->dwChunkLength,idx->dwFlags);
128 if(idx->dwFlags&AVIIF_LIST){ 137 if(idx->dwFlags&AVIIF_LIST){
132 if(!demux_avi_select_stream(demux,idx->ckid)){ 141 if(!demux_avi_select_stream(demux,idx->ckid)){
133 if(verbose>2) printf("Skip chunk %.4s (0x%X) \n",&idx->ckid,idx->ckid); 142 if(verbose>2) printf("Skip chunk %.4s (0x%X) \n",&idx->ckid,idx->ckid);
134 continue; // skip this chunk 143 continue; // skip this chunk
135 } 144 }
136 145
137 pos=idx->dwChunkOffset+avi_header.idx_offset; 146 pos=idx->dwChunkOffset+demux->idx_offset;
138 if(pos<avi_header.movi_start || pos>=avi_header.movi_end){ 147 if(pos<demux->movi_start || pos>=demux->movi_end){
139 printf("ChunkOffset out of range! current=0x%X idx=0x%X \n",demux->filepos,pos); 148 printf("ChunkOffset out of range! current=0x%X idx=0x%X \n",demux->filepos,pos);
140 continue; 149 continue;
141 } 150 }
142 #if 0 151 #if 0
143 if(pos!=demux->filepos){ 152 if(pos!=demux->filepos){
163 if(id==mmioFOURCC('L','I','S','T')){ 172 if(id==mmioFOURCC('L','I','S','T')){
164 id=stream_read_dword_le(demux->stream); // list type 173 id=stream_read_dword_le(demux->stream); // list type
165 continue; 174 continue;
166 } 175 }
167 } 176 }
168 ret=demux_avi_read_packet(demux,id,len,avi_header.idx_pos-1); 177 ret=demux_avi_read_packet(demux,id,len,demux->idx_pos-1);
169 if(!ret && skip_video_frames<=0) 178 if(!ret && skip_video_frames<=0)
170 if(--max_packs==0){ 179 if(--max_packs==0){
171 demux->stream->eof=1; 180 demux->stream->eof=1;
172 printf("demux: file doesn't contain the selected audio or video stream\n"); 181 printf("demux: file doesn't contain the selected audio or video stream\n");
173 return 0; 182 return 0;
189 do{ 198 do{
190 AVIINDEXENTRY *idx=NULL; 199 AVIINDEXENTRY *idx=NULL;
191 int idx_pos=0; 200 int idx_pos=0;
192 demux->filepos=stream_tell(demux->stream); 201 demux->filepos=stream_tell(demux->stream);
193 202
194 if(ds==demux->video) idx_pos=avi_header.idx_pos_a++; else 203 if(ds==demux->video) idx_pos=demux->idx_pos_a++; else
195 if(ds==demux->audio) idx_pos=avi_header.idx_pos_v++; else 204 if(ds==demux->audio) idx_pos=demux->idx_pos_v++; else
196 idx_pos=avi_header.idx_pos++; 205 idx_pos=demux->idx_pos++;
197 206
198 if(avi_header.idx_size>0 && idx_pos<avi_header.idx_size){ 207 if(demux->idx_size>0 && idx_pos<demux->idx_size){
199 unsigned int pos; 208 unsigned int pos;
200 idx=&avi_header.idx[idx_pos]; 209 idx=&((AVIINDEXENTRY *)demux->idx)[idx_pos];
210 // idx=&demux->idx[idx_pos];
201 211
202 if(idx->dwFlags&AVIIF_LIST){ 212 if(idx->dwFlags&AVIIF_LIST){
203 // LIST 213 // LIST
204 continue; 214 continue;
205 } 215 }
206 if(ds && demux_avi_select_stream(demux,idx->ckid)!=ds){ 216 if(ds && demux_avi_select_stream(demux,idx->ckid)!=ds){
207 if(verbose>2) printf("Skip chunk %.4s (0x%X) \n",&idx->ckid,idx->ckid); 217 if(verbose>2) printf("Skip chunk %.4s (0x%X) \n",&idx->ckid,idx->ckid);
208 continue; // skip this chunk 218 continue; // skip this chunk
209 } 219 }
210 220
211 pos=idx->dwChunkOffset+avi_header.idx_offset; 221 pos=idx->dwChunkOffset+demux->idx_offset;
212 if(pos<avi_header.movi_start || pos>=avi_header.movi_end){ 222 if(pos<demux->movi_start || pos>=demux->movi_end){
213 printf("ChunkOffset out of range! current=0x%X idx=0x%X \n",demux->filepos,pos); 223 printf("ChunkOffset out of range! current=0x%X idx=0x%X \n",demux->filepos,pos);
214 continue; 224 continue;
215 } 225 }
216 #if 0 226 #if 0
217 if(pos!=demux->filepos){ 227 if(pos!=demux->filepos){
255 unsigned int id=0; 265 unsigned int id=0;
256 unsigned int len; 266 unsigned int len;
257 int ret=0; 267 int ret=0;
258 int *fpos=NULL; 268 int *fpos=NULL;
259 269
260 if(ds==demux->video) fpos=&avi_header.idx_pos_a; else 270 if(ds==demux->video) fpos=&demux->idx_pos_a; else
261 if(ds==demux->audio) fpos=&avi_header.idx_pos_v; else 271 if(ds==demux->audio) fpos=&demux->idx_pos_v; else
262 return 0; 272 return 0;
263 273
264 stream_seek(demux->stream,fpos[0]); 274 stream_seek(demux->stream,fpos[0]);
265 275
266 do{ 276 do{
267 277
268 demux->filepos=stream_tell(demux->stream); 278 demux->filepos=stream_tell(demux->stream);
269 if(demux->filepos>=demux->endpos){ 279 if(demux->filepos>=demux->movi_end){
270 demux->stream->eof=1; 280 demux->stream->eof=1;
271 return 0; 281 return 0;
272 } 282 }
273 if(stream_eof(demux->stream)) return 0; 283 if(stream_eof(demux->stream)) return 0;
274 284
279 continue; 289 continue;
280 } 290 }
281 291
282 if(ds==demux_avi_select_stream(demux,id)){ 292 if(ds==demux_avi_select_stream(demux,id)){
283 // read it! 293 // read it!
284 ret=demux_avi_read_packet(demux,id,len,avi_header.idx_pos-1); 294 ret=demux_avi_read_packet(demux,id,len,demux->idx_pos-1);
285 } else { 295 } else {
286 // skip it! 296 // skip it!
287 int skip=(len+1)&(~1); // total bytes in this chunk 297 int skip=(len+1)&(~1); // total bytes in this chunk
288 stream_skip(demux->stream,skip); 298 stream_skip(demux->stream,skip);
289 } 299 }