[FFmpeg-devel] LIBMPEG2_BITSTREAM_READER vs. golomb.h

Måns Rullgård mans
Wed Jul 16 01:06:30 CEST 2008


Michael Niedermayer <michaelni at gmx.at> writes:

> On Mon, Jul 14, 2008 at 12:02:47AM +0100, M?ns Rullg?rd wrote:
>> I just spent some time bug-hunting, only to discover that the
>> exp-golomb functions in golomb.h do not work with
>> LIBMPEG2_BITSTREAM_READER.  This is because they rely on more than the
>> promised 17 bits to be available after an UPDATE_CACHE() call.
>> 
>> To avoid future mishaps, I was thinking of adding a preprocessor check
>> to golomb.h (I'm too lazy to try to make it work). 
>
> try:
> @@ -64,10 +63,12 @@
>
>          return ff_ue_golomb_vlc_code[buf];
>      }else{
> -        log= 2*av_log2(buf) - 31;
> -        buf>>= log;
> +        log= 31 - av_log2(buf);
> +        LAST_SKIP_BITS(re, gb, log);
> +        UPDATE_CACHE(re, gb);
> +        buf= SHOW_UBITS(re, gb, log+1);
>          buf--;
> -        LAST_SKIP_BITS(re, gb, 32 - log);
> +        LAST_SKIP_BITS(re, gb, log+1);
>          CLOSE_READER(re, gb);
>
>          return buf;
> @@ -149,10 +150,11 @@
>
>          return ff_se_golomb_vlc_code[buf];
>      }else{
> -        log= 2*av_log2(buf) - 31;
> -        buf>>= log;
> -
> -        LAST_SKIP_BITS(re, gb, 32 - log);
> +        log= 31 - av_log2(buf);
> +        LAST_SKIP_BITS(re, gb, log);
> +        UPDATE_CACHE(re, gb);
> +        buf= SHOW_UBITS(re, gb, log+1);
> +        LAST_SKIP_BITS(re, gb, log+1);
>          CLOSE_READER(re, gb);
>
>          if(buf&1) buf= -(buf>>1);

This seems to work with the samples I've tried it on.

-- 
M?ns Rullg?rd
mans at mansr.com




More information about the ffmpeg-devel mailing list