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;