Mercurial > mplayer.hg
comparison libmpdemux/demux_avi.c @ 35410:1c991ec0e6da
Change declaration to use proper type to avoid a ridiculous
number of casts.
author | reimar |
---|---|
date | Wed, 28 Nov 2012 19:43:03 +0000 |
parents | 232b1aacffda |
children | 92dd1764392a |
comparison
equal
deleted
inserted
replaced
35409:232b1aacffda | 35410:1c991ec0e6da |
---|---|
241 do{ | 241 do{ |
242 int flags=1; | 242 int flags=1; |
243 if(priv->idx_size>0 && priv->idx_pos<priv->idx_size){ | 243 if(priv->idx_size>0 && priv->idx_pos<priv->idx_size){ |
244 off_t pos; | 244 off_t pos; |
245 | 245 |
246 AVIINDEXENTRY *idx=&((AVIINDEXENTRY *)priv->idx)[priv->idx_pos++]; | 246 AVIINDEXENTRY *idx = priv->idx + priv->idx_pos++; |
247 | 247 |
248 if(idx->dwFlags&AVIIF_LIST){ | 248 if(idx->dwFlags&AVIIF_LIST){ |
249 if (!valid_stream_id(idx->ckid)) | 249 if (!valid_stream_id(idx->ckid)) |
250 // LIST | 250 // LIST |
251 continue; | 251 continue; |
332 if(ds==demux->audio) idx_pos=priv->idx_pos_a++; else | 332 if(ds==demux->audio) idx_pos=priv->idx_pos_a++; else |
333 idx_pos=priv->idx_pos++; | 333 idx_pos=priv->idx_pos++; |
334 | 334 |
335 if(priv->idx_size>0 && idx_pos<priv->idx_size){ | 335 if(priv->idx_size>0 && idx_pos<priv->idx_size){ |
336 off_t pos; | 336 off_t pos; |
337 AVIINDEXENTRY *idx=&((AVIINDEXENTRY *)priv->idx)[idx_pos]; | 337 AVIINDEXENTRY *idx = priv->idx + idx_pos; |
338 | 338 |
339 if(idx->dwFlags&AVIIF_LIST){ | 339 if(idx->dwFlags&AVIIF_LIST){ |
340 if (!valid_stream_id(idx->ckid)) | 340 if (!valid_stream_id(idx->ckid)) |
341 // LIST | 341 // LIST |
342 continue; | 342 continue; |
478 stream_reset(demuxer->stream); | 478 stream_reset(demuxer->stream); |
479 stream_seek(demuxer->stream,demuxer->movi_start); | 479 stream_seek(demuxer->stream,demuxer->movi_start); |
480 if(priv->idx_size>1){ | 480 if(priv->idx_size>1){ |
481 // decide index format: | 481 // decide index format: |
482 #if 1 | 482 #if 1 |
483 if((AVI_IDX_OFFSET(&((AVIINDEXENTRY *)priv->idx)[0])<demuxer->movi_start || | 483 if((AVI_IDX_OFFSET(priv->idx + 0)<demuxer->movi_start || |
484 AVI_IDX_OFFSET(&((AVIINDEXENTRY *)priv->idx)[1])<demuxer->movi_start )&& !priv->isodml) | 484 AVI_IDX_OFFSET(priv->idx + 1)<demuxer->movi_start )&& !priv->isodml) |
485 priv->idx_offset=demuxer->movi_start-4; | 485 priv->idx_offset=demuxer->movi_start-4; |
486 #else | 486 #else |
487 if(AVI_IDX_OFFSET(&((AVIINDEXENTRY *)priv->idx)[0])<demuxer->movi_start) | 487 if(AVI_IDX_OFFSET(priv->idx)<demuxer->movi_start) |
488 priv->idx_offset=demuxer->movi_start-4; | 488 priv->idx_offset=demuxer->movi_start-4; |
489 #endif | 489 #endif |
490 mp_msg(MSGT_DEMUX,MSGL_V,"AVI index offset: 0x%X (movi=0x%X idx0=0x%X idx1=0x%X)\n", | 490 mp_msg(MSGT_DEMUX,MSGL_V,"AVI index offset: 0x%X (movi=0x%X idx0=0x%X idx1=0x%X)\n", |
491 (int)priv->idx_offset,(int)demuxer->movi_start, | 491 (int)priv->idx_offset,(int)demuxer->movi_start, |
492 (int)((AVIINDEXENTRY *)priv->idx)[0].dwChunkOffset, | 492 (int)priv->idx[0].dwChunkOffset, |
493 (int)((AVIINDEXENTRY *)priv->idx)[1].dwChunkOffset); | 493 (int)priv->idx[1].dwChunkOffset); |
494 } | 494 } |
495 | 495 |
496 if(priv->idx_size>0){ | 496 if(priv->idx_size>0){ |
497 // check that file is non-interleaved: | 497 // check that file is non-interleaved: |
498 int i; | 498 int i; |
499 off_t a_pos=-1; | 499 off_t a_pos=-1; |
500 off_t v_pos=-1; | 500 off_t v_pos=-1; |
501 for(i=0;i<priv->idx_size;i++){ | 501 for(i=0;i<priv->idx_size;i++){ |
502 AVIINDEXENTRY* idx=&((AVIINDEXENTRY *)priv->idx)[i]; | 502 AVIINDEXENTRY *idx = priv->idx + i; |
503 demux_stream_t* ds=demux_avi_select_stream(demuxer,idx->ckid); | 503 demux_stream_t* ds=demux_avi_select_stream(demuxer,idx->ckid); |
504 off_t pos = priv->idx_offset + AVI_IDX_OFFSET(idx); | 504 off_t pos = priv->idx_offset + AVI_IDX_OFFSET(idx); |
505 if(a_pos==-1 && ds==demuxer->audio){ | 505 if(a_pos==-1 && ds==demuxer->audio){ |
506 a_pos=pos; | 506 a_pos=pos; |
507 if(v_pos!=-1) break; | 507 if(v_pos!=-1) break; |
641 // ------------ STEP 1: find nearest video keyframe chunk ------------ | 641 // ------------ STEP 1: find nearest video keyframe chunk ------------ |
642 // find nearest video keyframe chunk pos: | 642 // find nearest video keyframe chunk pos: |
643 if(rel_seek_frames>0){ | 643 if(rel_seek_frames>0){ |
644 // seek forward | 644 // seek forward |
645 while(video_chunk_pos<priv->idx_size-1){ | 645 while(video_chunk_pos<priv->idx_size-1){ |
646 int id=((AVIINDEXENTRY *)priv->idx)[video_chunk_pos].ckid; | 646 int id=priv->idx[video_chunk_pos].ckid; |
647 if(avi_stream_id(id)==d_video->id){ // video frame | 647 if(avi_stream_id(id)==d_video->id){ // video frame |
648 if((--rel_seek_frames)<0 && ((AVIINDEXENTRY *)priv->idx)[video_chunk_pos].dwFlags&AVIIF_KEYFRAME) break; | 648 if((--rel_seek_frames)<0 && priv->idx[video_chunk_pos].dwFlags&AVIIF_KEYFRAME) break; |
649 } | 649 } |
650 ++video_chunk_pos; | 650 ++video_chunk_pos; |
651 } | 651 } |
652 } else { | 652 } else { |
653 // seek backward | 653 // seek backward |
654 while(video_chunk_pos>0){ | 654 while(video_chunk_pos>0){ |
655 int id=((AVIINDEXENTRY *)priv->idx)[video_chunk_pos].ckid; | 655 int id=priv->idx[video_chunk_pos].ckid; |
656 if(avi_stream_id(id)==d_video->id){ // video frame | 656 if(avi_stream_id(id)==d_video->id){ // video frame |
657 if((++rel_seek_frames)>0 && ((AVIINDEXENTRY *)priv->idx)[video_chunk_pos].dwFlags&AVIIF_KEYFRAME) break; | 657 if((++rel_seek_frames)>0 && priv->idx[video_chunk_pos].dwFlags&AVIIF_KEYFRAME) break; |
658 } | 658 } |
659 --video_chunk_pos; | 659 --video_chunk_pos; |
660 } | 660 } |
661 } | 661 } |
662 priv->idx_pos_a=priv->idx_pos_v=priv->idx_pos=video_chunk_pos; | 662 priv->idx_pos_a=priv->idx_pos_v=priv->idx_pos=video_chunk_pos; |
663 | 663 |
664 // re-calc video pts: | 664 // re-calc video pts: |
665 d_video->pack_no=0; | 665 d_video->pack_no=0; |
666 for(i=0;i<video_chunk_pos;i++){ | 666 for(i=0;i<video_chunk_pos;i++){ |
667 int id=((AVIINDEXENTRY *)priv->idx)[i].ckid; | 667 int id=priv->idx[i].ckid; |
668 if(avi_stream_id(id)==d_video->id) ++d_video->pack_no; | 668 if(avi_stream_id(id)==d_video->id) ++d_video->pack_no; |
669 } | 669 } |
670 priv->video_pack_no= | 670 priv->video_pack_no= |
671 sh_video->num_frames=sh_video->num_frames_decoded=d_video->pack_no; | 671 sh_video->num_frames=sh_video->num_frames_decoded=d_video->pack_no; |
672 priv->avi_video_pts=d_video->pack_no*(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; | 672 priv->avi_video_pts=d_video->pack_no*(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; |
694 curr_audio_pos=(priv->avi_video_pts + audio_delay)*(float)sh_audio->audio.dwRate/(float)sh_audio->audio.dwScale; | 694 curr_audio_pos=(priv->avi_video_pts + audio_delay)*(float)sh_audio->audio.dwRate/(float)sh_audio->audio.dwScale; |
695 curr_audio_pos*=sh_audio->audio.dwSampleSize; | 695 curr_audio_pos*=sh_audio->audio.dwSampleSize; |
696 | 696 |
697 // find audio chunk pos: | 697 // find audio chunk pos: |
698 for(i=0;i<chunk_max;i++){ | 698 for(i=0;i<chunk_max;i++){ |
699 int id=((AVIINDEXENTRY *)priv->idx)[i].ckid; | 699 int id=priv->idx[i].ckid; |
700 if(avi_stream_id(id)==d_audio->id){ | 700 if(avi_stream_id(id)==d_audio->id){ |
701 len=((AVIINDEXENTRY *)priv->idx)[i].dwChunkLength; | 701 len=priv->idx[i].dwChunkLength; |
702 if(d_audio->dpos<=curr_audio_pos && curr_audio_pos<(d_audio->dpos+len)){ | 702 if(d_audio->dpos<=curr_audio_pos && curr_audio_pos<(d_audio->dpos+len)){ |
703 break; | 703 break; |
704 } | 704 } |
705 ++d_audio->pack_no; | 705 ++d_audio->pack_no; |
706 priv->audio_block_no+= | 706 priv->audio_block_no+= |
720 int chunks=(priv->avi_video_pts + audio_delay)*(float)sh_audio->audio.dwRate/(float)sh_audio->audio.dwScale; | 720 int chunks=(priv->avi_video_pts + audio_delay)*(float)sh_audio->audio.dwRate/(float)sh_audio->audio.dwScale; |
721 audio_chunk_pos=0; | 721 audio_chunk_pos=0; |
722 | 722 |
723 // find audio chunk pos: | 723 // find audio chunk pos: |
724 for(i=0;i<priv->idx_size && chunks>0;i++){ | 724 for(i=0;i<priv->idx_size && chunks>0;i++){ |
725 int id=((AVIINDEXENTRY *)priv->idx)[i].ckid; | 725 int id=priv->idx[i].ckid; |
726 if(avi_stream_id(id)==d_audio->id){ | 726 if(avi_stream_id(id)==d_audio->id){ |
727 len=((AVIINDEXENTRY *)priv->idx)[i].dwChunkLength; | 727 len=priv->idx[i].dwChunkLength; |
728 if(i>chunk_max){ | 728 if(i>chunk_max){ |
729 skip_audio_bytes+=len; | 729 skip_audio_bytes+=len; |
730 } else { | 730 } else { |
731 ++d_audio->pack_no; | 731 ++d_audio->pack_no; |
732 priv->audio_block_no+= | 732 priv->audio_block_no+= |
752 if(demuxer->type==DEMUXER_TYPE_AVI){ | 752 if(demuxer->type==DEMUXER_TYPE_AVI){ |
753 // interleaved stream: | 753 // interleaved stream: |
754 if(audio_chunk_pos<video_chunk_pos){ | 754 if(audio_chunk_pos<video_chunk_pos){ |
755 // calc priv->skip_video_frames & adjust video pts counter: | 755 // calc priv->skip_video_frames & adjust video pts counter: |
756 for(i=audio_chunk_pos;i<video_chunk_pos;i++){ | 756 for(i=audio_chunk_pos;i<video_chunk_pos;i++){ |
757 int id=((AVIINDEXENTRY *)priv->idx)[i].ckid; | 757 int id=priv->idx[i].ckid; |
758 if(avi_stream_id(id)==d_video->id) ++priv->skip_video_frames; | 758 if(avi_stream_id(id)==d_video->id) ++priv->skip_video_frames; |
759 } | 759 } |
760 // requires for correct audio pts calculation (demuxer): | 760 // requires for correct audio pts calculation (demuxer): |
761 priv->avi_video_pts-=priv->skip_video_frames*(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; | 761 priv->avi_video_pts-=priv->skip_video_frames*(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; |
762 priv->avi_audio_pts=priv->avi_video_pts; | 762 priv->avi_audio_pts=priv->avi_video_pts; |