[Ffmpeg-devel] Reading bit-reversed VLC codes

Måns Rullgård mans
Sun Mar 18 21:54:13 CET 2007


Michael Niedermayer <michaelni at gmx.at> writes:

> Hi
>
> On Sun, Mar 18, 2007 at 09:38:10PM +0100, Michael Niedermayer wrote:
>> Hi
>> 
>> On Sun, Mar 18, 2007 at 08:33:31PM +0000, M?ns Rullg?rd wrote:
>> > Michael Niedermayer <michaelni at gmx.at> writes:
>> > 
>> > > Hi
>> > >
>> > > On Sun, Mar 18, 2007 at 08:10:59PM +0000, M?ns Rullg?rd wrote:
>> > >> Michael Niedermayer <michaelni at gmx.at> writes:
>> > >> 
>> > >> > Hi
>> > >> >
>> > >> > On Sun, Mar 18, 2007 at 07:27:43PM +0000, M?ns Rullg?rd wrote:
>> > >> >> Michael Niedermayer <michaelni at gmx.at> writes:
>> > >> >> 
>> > >> >> > Hi
>> > >> >> >
>> > >> >> > On Sun, Mar 18, 2007 at 07:13:30PM +0000, M?ns Rullg?rd wrote:
>> > >> >> >> I need to read VLC codes that are stored in reverse order in the
>> > >> >> >> bitstream, i.e. a 4-bit code value of 5 is returned by get_bits as
>> > >> >> >> 0xa.  Is there some way to do this using the lavc VLC reader?
>> > >> >> >
>> > >> >> > for get bits the code in asv1.c
>> > >> >> > static inline int asv2_get_bits(GetBitContext *gb, int n){
>> > >> >> >     return ff_reverse[ get_bits(gb, n) << (8-n) ];
>> > >> >> > }
>> > >> >> 
>> > >> >> Non-VLC elements are stored the right way around, so I don't need to
>> > >> >> do anything special with those.
>> > >> >> 
>> > >> >> > might do what you want, for get_vlc() just change the table
>> > >> >> > before init_vlc()
>> > >> >> 
>> > >> >> I tried reversing the bits of each code before init_vlc(), but that
>> > >> >> only gives me an "incorrect codes" message and an error return.  I
>> > >> >> guess I did something wrong, but I'm at a loss figuring out what.
>> > >> >
>> > >> > well, you cannot just reverse a vlc like that, maybe you
>> > >> > could elaborate on what exactly you are trying to do (link
>> > >> > to codec spec?)
>> > >> 
>> > >> I'm trying to write a zlib decoder.  The spec is RFC1951.
>> > >> 
>> > >> > i thought that you wanted to reverse the output of get_vlc() not the
>> > >> > bits of the vlc codes as stored in the bitstream later wont work in
>> > >> > general example:
>> > >> 
>> > >> [...]
>> > >> 
>> > >> > init_vlc/get_vlc() doesnt support such non prefix codes (for obvious
>> > >> > reasons)
>> > >> 
>> > >> No, of course it doesn't.  Do you have any suggestion how to solve
>> > >> this?
>> > >
>> > > now without reading the RFC (will do so in a moment) are you sure the
>> > > vlc is reversed instead of each byte being reversed?
>> > 
>> > It's stored in such a way that if I get_bits() the right number of
>> > bits for a code, I get the bits reversed compared to the code value
>> > I'm expecting.
>> > 
>> > Here's what the spec has to say:
>> > 
>> >              * Data elements are packed into bytes in order of
>> >                increasing bit number within the byte, i.e., starting
>> >                with the least-significant bit of the byte.
>> 
>> try a
>> #define ALT_BITSTREAM_READER_LE
>> before the #incldues
>
> and pass INIT_VLC_LE to init_vlc()

Segmentation fault.

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




More information about the ffmpeg-devel mailing list