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;