[MPlayer-dev-eng] [PATCH] AVI bitrate printed incorrectly
Dominik 'Rathann' Mierzejewski
dominik at rangers.eu.org
Mon May 1 11:49:02 CEST 2006
On Monday, 01 May 2006 at 06:26, Alan Curry wrote:
> demux_avi.c attempts to calculate the video bitrate based on the total size
> of all the video chunks according to the index, or based on size of the file
> if there is no index. Unfortunately, it puts that size into a size_t, which
> can overflow when there is more than 4G of video. Something similar could
> happen if there is more than 4G of audio.
>
> The wrong values end up in sh_video->i_bps and sh_audio->i_bps, but there are
> no apparent symptoms other than the -identify output and the "VIDEO:" line
> because nothing really cares about sh_video->i_bps and AVIs don't often get
> big enough to contain 4G of audio.
>
> This patch replaces some size_t's with off_t's, making the calculations
> correct for large AVI files.
>
> Index: libmpdemux/demux_avi.c
> ===================================================================
> RCS file: /cvsroot/mplayer/main/libmpdemux/demux_avi.c,v
> retrieving revision 1.74
> diff -u -r1.74 demux_avi.c
> --- libmpdemux/demux_avi.c 18 Feb 2006 09:26:38 -0000 1.74
> +++ libmpdemux/demux_avi.c 1 May 2006 04:02:05 -0000
> @@ -565,8 +565,8 @@
> // calculating audio/video bitrate:
> if(priv->idx_size>0){
> // we have index, let's count 'em!
> - size_t vsize=0;
> - size_t asize=0;
> + off_t vsize=0;
> + off_t asize=0;
> size_t vsamples=0;
> size_t asamples=0;
> int i;
> @@ -582,14 +582,14 @@
> asamples+=(len+priv->audio_block_size-1)/priv->audio_block_size;
> }
> }
> - mp_msg(MSGT_DEMUX,MSGL_V,"AVI video size=%u (%u) audio size=%u (%u)\n",vsize,vsamples,asize,asamples);
> + mp_msg(MSGT_DEMUX,MSGL_V,"AVI video size=%lld (%u) audio size=%lld (%u)\n",(long long)vsize,vsamples,(long long)asize,asamples);
Don't use %lld. Use the PRId64 macro instead. Also, is long long portable?
> priv->numberofframes=vsamples;
> sh_video->i_bps=((float)vsize/(float)vsamples)*(float)sh_video->video.dwRate/(float)sh_video->video.dwScale;
> if(sh_audio) sh_audio->i_bps=((float)asize/(float)asamples)*(float)sh_audio->audio.dwRate/(float)sh_audio->audio.dwScale;
> } else {
> // guessing, results may be inaccurate:
> - size_t vsize;
> - size_t asize=0;
> + off_t vsize;
> + off_t asize=0;
>
> if((priv->numberofframes=sh_video->video.dwLength)<=1)
> // bad video header, try to get number of frames from audio
> @@ -609,7 +609,7 @@
> }
> }
> vsize=demuxer->movi_end-demuxer->movi_start-asize-8*priv->numberofframes;
> - mp_msg(MSGT_DEMUX,MSGL_V,"AVI video size=%d (%u) audio size=%d\n",vsize,priv->numberofframes,asize);
> + mp_msg(MSGT_DEMUX,MSGL_V,"AVI video size=%lld (%u) audio size=%lld\n",(long long)vsize,priv->numberofframes,(long long)asize);
Same here.
> sh_video->i_bps=(float)vsize/(sh_video->frametime*priv->numberofframes);
> }
>
Regards,
R.
--
MPlayer developer and RPMs maintainer: http://rpm.greysector.net/mplayer/
There should be a science of discontent. People need hard times and
oppression to develop psychic muscles.
-- from "Collected Sayings of Muad'Dib" by the Princess Irulan
More information about the MPlayer-dev-eng
mailing list