Mercurial > mplayer.hg
comparison libmpdemux/demux_avi.c @ 9228:5ef5179188ca
- ignore movi_end if reading from stdin
- assume I-only stream if no index (buggy seekable avi is still better than non-seekable)
author | arpi |
---|---|
date | Sun, 02 Feb 2003 21:32:05 +0000 |
parents | 497e3b284a10 |
children | 9ab19ded1b39 |
comparison
equal
deleted
inserted
replaced
9227:fd31a5bef5f9 | 9228:5ef5179188ca |
---|---|
180 //int max_packs=128; | 180 //int max_packs=128; |
181 int ret=0; | 181 int ret=0; |
182 demux_stream_t *ds; | 182 demux_stream_t *ds; |
183 | 183 |
184 do{ | 184 do{ |
185 int flags=0; | 185 int flags=1; |
186 AVIINDEXENTRY *idx=NULL; | 186 AVIINDEXENTRY *idx=NULL; |
187 #if 0 | 187 #if 0 |
188 demux->filepos=stream_tell(demux->stream); | 188 demux->filepos=stream_tell(demux->stream); |
189 if(demux->filepos>=demux->movi_end){ | 189 if(demux->filepos>=demux->movi_end){ |
190 demux->stream->eof=1; | 190 demux->stream->eof=1; |
212 mp_dbg(MSGT_DEMUX,MSGL_DBG3,"Skip chunk %.4s (0x%X) \n",(char *)&idx->ckid,(unsigned int)idx->ckid); | 212 mp_dbg(MSGT_DEMUX,MSGL_DBG3,"Skip chunk %.4s (0x%X) \n",(char *)&idx->ckid,(unsigned int)idx->ckid); |
213 continue; // skip this chunk | 213 continue; // skip this chunk |
214 } | 214 } |
215 | 215 |
216 pos = priv->idx_offset + (unsigned long)idx->dwChunkOffset; | 216 pos = priv->idx_offset + (unsigned long)idx->dwChunkOffset; |
217 if((pos<demux->movi_start || pos>=demux->movi_end) && (demux->movi_end>demux->movi_start)){ | 217 if((pos<demux->movi_start || pos>=demux->movi_end) && (demux->movi_end>demux->movi_start) && (demux->stream->type!=STREAMTYPE_STREAM)){ |
218 mp_msg(MSGT_DEMUX,MSGL_V,"ChunkOffset out of range! idx=0x%X \n",pos); | 218 mp_msg(MSGT_DEMUX,MSGL_V,"ChunkOffset out of range! idx=0x%X \n",pos); |
219 continue; | 219 continue; |
220 } | 220 } |
221 #if 0 | 221 #if 0 |
222 if(pos!=demux->filepos){ | 222 if(pos!=demux->filepos){ |
241 if((len!=idx->dwChunkLength)&&((len+1)!=idx->dwChunkLength)){ | 241 if((len!=idx->dwChunkLength)&&((len+1)!=idx->dwChunkLength)){ |
242 mp_msg(MSGT_DEMUX,MSGL_V,"ChunkSize mismatch! raw=%d idx=%ld \n",len,idx->dwChunkLength); | 242 mp_msg(MSGT_DEMUX,MSGL_V,"ChunkSize mismatch! raw=%d idx=%ld \n",len,idx->dwChunkLength); |
243 if(len>0x200000 && idx->dwChunkLength>0x200000) continue; // both values bad :( | 243 if(len>0x200000 && idx->dwChunkLength>0x200000) continue; // both values bad :( |
244 len=choose_chunk_len(idx->dwChunkLength,len); | 244 len=choose_chunk_len(idx->dwChunkLength,len); |
245 } | 245 } |
246 if(idx->dwFlags&AVIIF_KEYFRAME) flags=1; | 246 if(!(idx->dwFlags&AVIIF_KEYFRAME)) flags=0; |
247 } else { | 247 } else { |
248 demux->filepos=stream_tell(demux->stream); | 248 demux->filepos=stream_tell(demux->stream); |
249 if(demux->filepos>=demux->movi_end && demux->movi_end>demux->movi_start){ | 249 if(demux->filepos>=demux->movi_end && demux->movi_end>demux->movi_start && (demux->stream->type!=STREAMTYPE_STREAM)){ |
250 demux->stream->eof=1; | 250 demux->stream->eof=1; |
251 return 0; | 251 return 0; |
252 } | 252 } |
253 id=stream_read_dword_le(demux->stream); | 253 id=stream_read_dword_le(demux->stream); |
254 len=stream_read_dword_le(demux->stream); | 254 len=stream_read_dword_le(demux->stream); |
300 unsigned int len; | 300 unsigned int len; |
301 //int max_packs=128; | 301 //int max_packs=128; |
302 int ret=0; | 302 int ret=0; |
303 | 303 |
304 do{ | 304 do{ |
305 int flags=0; | 305 int flags=1; |
306 AVIINDEXENTRY *idx=NULL; | 306 AVIINDEXENTRY *idx=NULL; |
307 int idx_pos=0; | 307 int idx_pos=0; |
308 demux->filepos=stream_tell(demux->stream); | 308 demux->filepos=stream_tell(demux->stream); |
309 | 309 |
310 if(ds==demux->video) idx_pos=priv->idx_pos_v++; else | 310 if(ds==demux->video) idx_pos=priv->idx_pos_v++; else |
352 if((len!=idx->dwChunkLength)&&((len+1)!=idx->dwChunkLength)){ | 352 if((len!=idx->dwChunkLength)&&((len+1)!=idx->dwChunkLength)){ |
353 mp_msg(MSGT_DEMUX,MSGL_V,"ChunkSize mismatch! raw=%d idx=%ld \n",len,idx->dwChunkLength); | 353 mp_msg(MSGT_DEMUX,MSGL_V,"ChunkSize mismatch! raw=%d idx=%ld \n",len,idx->dwChunkLength); |
354 if(len>0x200000 && idx->dwChunkLength>0x200000) continue; // both values bad :( | 354 if(len>0x200000 && idx->dwChunkLength>0x200000) continue; // both values bad :( |
355 len=choose_chunk_len(idx->dwChunkLength,len); | 355 len=choose_chunk_len(idx->dwChunkLength,len); |
356 } | 356 } |
357 if(idx->dwFlags&AVIIF_KEYFRAME) flags=1; | 357 if(!(idx->dwFlags&AVIIF_KEYFRAME)) flags=0; |
358 } else return 0; | 358 } else return 0; |
359 ret=demux_avi_read_packet(demux,demux_avi_select_stream(demux,id),id,len,idx_pos,flags); | 359 ret=demux_avi_read_packet(demux,demux_avi_select_stream(demux,id),id,len,idx_pos,flags); |
360 // if(!ret && priv->skip_video_frames<=0) | 360 // if(!ret && priv->skip_video_frames<=0) |
361 // if(--max_packs==0){ | 361 // if(--max_packs==0){ |
362 // demux->stream->eof=1; | 362 // demux->stream->eof=1; |