Mercurial > mplayer.hg
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 } |