comparison libmpdemux/demux_avi.c @ 12036:846ed866f86c

OpenDML read/write support
author ranma
date Wed, 17 Mar 2004 14:50:37 +0000
parents 2c2fb4457982
children 8769fa370f83
comparison
equal deleted inserted replaced
12035:b3512c7b26ce 12036:846ed866f86c
211 if(!demux_avi_select_stream(demux,idx->ckid)){ 211 if(!demux_avi_select_stream(demux,idx->ckid)){
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 = (off_t)priv->idx_offset+AVI_IDX_OFFSET(idx);
217 if((pos<demux->movi_start || pos>=demux->movi_end) && (demux->movi_end>demux->movi_start) && (demux->stream->flags & STREAM_SEEK)){ 217 if((pos<demux->movi_start || pos>=demux->movi_end) && (demux->movi_end>demux->movi_start) && (demux->stream->flags & STREAM_SEEK)){
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
323 if(ds && demux_avi_select_stream(demux,idx->ckid)!=ds){ 323 if(ds && demux_avi_select_stream(demux,idx->ckid)!=ds){
324 mp_dbg(MSGT_DEMUX,MSGL_DBG3,"Skip chunk %.4s (0x%X) \n",(char *)&idx->ckid,(unsigned int)idx->ckid); 324 mp_dbg(MSGT_DEMUX,MSGL_DBG3,"Skip chunk %.4s (0x%X) \n",(char *)&idx->ckid,(unsigned int)idx->ckid);
325 continue; // skip this chunk 325 continue; // skip this chunk
326 } 326 }
327 327
328 pos = priv->idx_offset+(unsigned long)idx->dwChunkOffset; 328 pos = priv->idx_offset+AVI_IDX_OFFSET(idx);
329 if((pos<demux->movi_start || pos>=demux->movi_end) && (demux->movi_end>demux->movi_start)){ 329 if((pos<demux->movi_start || pos>=demux->movi_end) && (demux->movi_end>demux->movi_start)){
330 mp_msg(MSGT_DEMUX,MSGL_V,"ChunkOffset out of range! current=0x%X idx=0x%X \n",demux->filepos,pos); 330 mp_msg(MSGT_DEMUX,MSGL_V,"ChunkOffset out of range! current=0x%X idx=0x%X \n",demux->filepos,pos);
331 continue; 331 continue;
332 } 332 }
333 #if 0 333 #if 0
444 priv->pts_corr_bytes=0; 444 priv->pts_corr_bytes=0;
445 priv->pts_has_video=priv->pts_corrected=0; 445 priv->pts_has_video=priv->pts_corrected=0;
446 priv->video_pack_no=0; 446 priv->video_pack_no=0;
447 priv->audio_block_no=0; 447 priv->audio_block_no=0;
448 priv->audio_block_size=0; 448 priv->audio_block_size=0;
449 priv->isodml = 0;
450 priv->suidx_size = 0;
451 priv->suidx = NULL;
452
449 demuxer->priv=(void*)priv; 453 demuxer->priv=(void*)priv;
450 454
451 //---- AVI header: 455 //---- AVI header:
452 read_avi_header(demuxer,(demuxer->stream->flags & STREAM_SEEK_BW)?index_mode:-2); 456 read_avi_header(demuxer,(demuxer->stream->flags & STREAM_SEEK_BW)?index_mode:-2);
453 457
466 priv->idx_pos_a=0; 470 priv->idx_pos_a=0;
467 priv->idx_pos_v=0; 471 priv->idx_pos_v=0;
468 if(priv->idx_size>1){ 472 if(priv->idx_size>1){
469 // decide index format: 473 // decide index format:
470 #if 1 474 #if 1
471 if((unsigned long)((AVIINDEXENTRY *)priv->idx)[0].dwChunkOffset<demuxer->movi_start || 475 if((AVI_IDX_OFFSET(&((AVIINDEXENTRY *)priv->idx)[0])<demuxer->movi_start ||
472 (unsigned long)((AVIINDEXENTRY *)priv->idx)[1].dwChunkOffset<demuxer->movi_start) 476 AVI_IDX_OFFSET(&((AVIINDEXENTRY *)priv->idx)[1])<demuxer->movi_start )&& !priv->isodml)
473 priv->idx_offset=demuxer->movi_start-4; 477 priv->idx_offset=demuxer->movi_start-4;
474 else 478 else
475 priv->idx_offset=0; 479 priv->idx_offset=0;
476 #else 480 #else
477 if((unsigned long)((AVIINDEXENTRY *)priv->idx)[0].dwChunkOffset<demuxer->movi_start) 481 if(AVI_IDX_OFFSET(&((AVIINDEXENTRY *)priv->idx)[0])<demuxer->movi_start)
478 priv->idx_offset=demuxer->movi_start-4; 482 priv->idx_offset=demuxer->movi_start-4;
479 else 483 else
480 priv->idx_offset=0; 484 priv->idx_offset=0;
481 #endif 485 #endif
482 mp_msg(MSGT_DEMUX,MSGL_V,"AVI index offset: 0x%X (movi=0x%X idx0=0x%X idx1=0x%X)\n", 486 mp_msg(MSGT_DEMUX,MSGL_V,"AVI index offset: 0x%X (movi=0x%X idx0=0x%X idx1=0x%X)\n",
492 off_t a_pos=-1; 496 off_t a_pos=-1;
493 off_t v_pos=-1; 497 off_t v_pos=-1;
494 for(i=0;i<priv->idx_size;i++){ 498 for(i=0;i<priv->idx_size;i++){
495 AVIINDEXENTRY* idx=&((AVIINDEXENTRY *)priv->idx)[i]; 499 AVIINDEXENTRY* idx=&((AVIINDEXENTRY *)priv->idx)[i];
496 demux_stream_t* ds=demux_avi_select_stream(demuxer,idx->ckid); 500 demux_stream_t* ds=demux_avi_select_stream(demuxer,idx->ckid);
497 off_t pos = priv->idx_offset + (unsigned long)idx->dwChunkOffset; 501 off_t pos = priv->idx_offset + AVI_IDX_OFFSET(idx);
498 if(a_pos==-1 && ds==demuxer->audio){ 502 if(a_pos==-1 && ds==demuxer->audio){
499 a_pos=pos; 503 a_pos=pos;
500 if(v_pos!=-1) break; 504 if(v_pos!=-1) break;
501 } 505 }
502 if(v_pos==-1 && ds==demuxer->video){ 506 if(v_pos==-1 && ds==demuxer->video){