[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