[MPlayer-dev-eng] [PATCH] si2us() in libaf is off-by-one

Guillaume POIRIER poirierg at gmail.com
Thu Sep 22 18:15:01 CEST 2005


Hi,

On 9/7/05, dega <deganews at quickclic.net> wrote:
> si2us() is biased by -1, turning -128 => 255 and 127 => 254 (for 8-bit)
> instead of -128 => 0 and 127 => 255. It makes the same kind of mistake for
> all other sample widths as well.
>
> Obviously, this causes nasty pops in the output stream if one should ever
> encounter extreme values in the input stream. (Discovered during ao_sgi
> testing)
>
> Here is the patch.
>
>
> dega
>
>
> Index: libaf/af_format.c
> ===================================================================
> RCS file: /cvsroot/mplayer/main/libaf/af_format.c,v
> retrieving revision 1.29
> diff -u -r1.29 af_format.c
> --- libaf/af_format.c   1 May 2005 09:02:25 -0000       1.29
> +++ libaf/af_format.c   7 Sep 2005 04:42:28 -0000
> @@ -392,19 +392,19 @@
>    switch(bps){
>    case(1):
>      for(i=0;i<len;i++)
> -      ((uint8_t*)out)[i]=(uint8_t)(SCHAR_MAX+((int)((int8_t*)in)[i]));
> +      ((uint8_t*)out)[i]=(uint8_t)(((int)((int8_t*)in)[i])-SCHAR_MIN);
>      break;
>    case(2):
>      for(i=0;i<len;i++)
> -      ((uint16_t*)out)[i]=(uint16_t)(SHRT_MAX+((int)((int16_t*)in)[i]));
> +      ((uint16_t*)out)[i]=(uint16_t)(((int)((int16_t*)in)[i])-SHRT_MIN);
>      break;
>    case(3):
>      for(i=0;i<len;i++)
> -      store24bit(out, i, (uint32_t)(INT_MAX+(int32_t)load24bit(in, i)));
> +      store24bit(out, i, (uint32_t)((int32_t)load24bit(in, i)-INT_MIN));
>      break;
>    case(4):
>      for(i=0;i<len;i++)
> -      ((uint32_t*)out)[i]=(uint32_t)(INT_MAX+((int32_t*)in)[i]);
> +      ((uint32_t*)out)[i]=(uint32_t)(((int32_t*)in)[i]-INT_MIN);
>      break;
>    }
>  }

What happened to this patch? Is it any good?

Guillaume

--
Reading doesn't hurt, really!
  -- Dominik 'Rathann' Mierzejewski




More information about the MPlayer-dev-eng mailing list