comparison libmpdemux/demux_avi.c @ 18393:09b64c87b29a

Fix calculation of stream sizes when they are too big for a 32-bit variable
author pacman
date Sat, 06 May 2006 06:23:23 +0000
parents cea08919336b
children c25a7de1c47c
comparison
equal deleted inserted replaced
18392:b10d4b3cb9ec 18393:09b64c87b29a
563 sh_video->frametime=(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; 563 sh_video->frametime=(float)sh_video->video.dwScale/(float)sh_video->video.dwRate;
564 564
565 // calculating audio/video bitrate: 565 // calculating audio/video bitrate:
566 if(priv->idx_size>0){ 566 if(priv->idx_size>0){
567 // we have index, let's count 'em! 567 // we have index, let's count 'em!
568 size_t vsize=0; 568 int64_t vsize=0;
569 size_t asize=0; 569 int64_t asize=0;
570 size_t vsamples=0; 570 size_t vsamples=0;
571 size_t asamples=0; 571 size_t asamples=0;
572 int i; 572 int i;
573 for(i=0;i<priv->idx_size;i++){ 573 for(i=0;i<priv->idx_size;i++){
574 int id=avi_stream_id(((AVIINDEXENTRY *)priv->idx)[i].ckid); 574 int id=avi_stream_id(((AVIINDEXENTRY *)priv->idx)[i].ckid);
580 else if(sh_audio && sh_audio->ds->id == id) { 580 else if(sh_audio && sh_audio->ds->id == id) {
581 asize+=len; 581 asize+=len;
582 asamples+=(len+priv->audio_block_size-1)/priv->audio_block_size; 582 asamples+=(len+priv->audio_block_size-1)/priv->audio_block_size;
583 } 583 }
584 } 584 }
585 mp_msg(MSGT_DEMUX,MSGL_V,"AVI video size=%u (%u) audio size=%u (%u)\n",vsize,vsamples,asize,asamples); 585 mp_msg(MSGT_DEMUX,MSGL_V,"AVI video size=%"PRId64" (%u) audio size=%"PRId64" (%u)\n",vsize,vsamples,asize,asamples);
586 priv->numberofframes=vsamples; 586 priv->numberofframes=vsamples;
587 sh_video->i_bps=((float)vsize/(float)vsamples)*(float)sh_video->video.dwRate/(float)sh_video->video.dwScale; 587 sh_video->i_bps=((float)vsize/(float)vsamples)*(float)sh_video->video.dwRate/(float)sh_video->video.dwScale;
588 if(sh_audio) sh_audio->i_bps=((float)asize/(float)asamples)*(float)sh_audio->audio.dwRate/(float)sh_audio->audio.dwScale; 588 if(sh_audio) sh_audio->i_bps=((float)asize/(float)asamples)*(float)sh_audio->audio.dwRate/(float)sh_audio->audio.dwScale;
589 } else { 589 } else {
590 // guessing, results may be inaccurate: 590 // guessing, results may be inaccurate:
591 size_t vsize; 591 int64_t vsize;
592 size_t asize=0; 592 int64_t asize=0;
593 593
594 if((priv->numberofframes=sh_video->video.dwLength)<=1) 594 if((priv->numberofframes=sh_video->video.dwLength)<=1)
595 // bad video header, try to get number of frames from audio 595 // bad video header, try to get number of frames from audio
596 if(sh_audio && sh_audio->wf->nAvgBytesPerSec) priv->numberofframes=sh_video->fps*sh_audio->audio.dwLength/sh_audio->audio.dwRate*sh_audio->audio.dwScale; 596 if(sh_audio && sh_audio->wf->nAvgBytesPerSec) priv->numberofframes=sh_video->fps*sh_audio->audio.dwLength/sh_audio->audio.dwRate*sh_audio->audio.dwScale;
597 if(priv->numberofframes<=1){ 597 if(priv->numberofframes<=1){
607 asize=sh_audio->audio.dwLength; 607 asize=sh_audio->audio.dwLength;
608 sh_audio->i_bps=(float)asize/(sh_video->frametime*priv->numberofframes); 608 sh_audio->i_bps=(float)asize/(sh_video->frametime*priv->numberofframes);
609 } 609 }
610 } 610 }
611 vsize=demuxer->movi_end-demuxer->movi_start-asize-8*priv->numberofframes; 611 vsize=demuxer->movi_end-demuxer->movi_start-asize-8*priv->numberofframes;
612 mp_msg(MSGT_DEMUX,MSGL_V,"AVI video size=%d (%u) audio size=%d\n",vsize,priv->numberofframes,asize); 612 mp_msg(MSGT_DEMUX,MSGL_V,"AVI video size=%"PRId64" (%u) audio size=%"PRId64"\n",vsize,priv->numberofframes,asize);
613 sh_video->i_bps=(float)vsize/(sh_video->frametime*priv->numberofframes); 613 sh_video->i_bps=(float)vsize/(sh_video->frametime*priv->numberofframes);
614 } 614 }
615 615
616 if (sh_video) 616 if (sh_video)
617 sh_video->stream_delay = (float)sh_video->video.dwStart * sh_video->video.dwScale/sh_video->video.dwRate; 617 sh_video->stream_delay = (float)sh_video->video.dwStart * sh_video->video.dwScale/sh_video->video.dwRate;