[FFmpeg-devel] [PATCHv3] VP4 video decoder

Reimar Döffinger Reimar.Doeffinger at gmx.de
Thu May 16 21:52:39 EEST 2019


On Thu, May 16, 2019 at 08:00:55PM +0200, Reimar Döffinger wrote:
> On Thu, May 16, 2019 at 09:35:00PM +1000, Peter Ross wrote:
> > +static int read_mb_value(GetBitContext *gb)
> > +{
> > +    int v = 1;
> > +    int size;
> > +    OPEN_READER(re, gb);
> > +
> > +    do {
> > +        int bit;
> > +        size = 0;
> > +
> > +        UPDATE_CACHE(re, gb);
> > +        bit = SHOW_UBITS(re, gb, 1);
> > +        SKIP_BITS(re, gb, 1);
> > +        if (!bit)
> > +            break;
> > +
> > +        do {
> > +            bit = SHOW_UBITS(re, gb, 1);
> > +            SKIP_BITS(re, gb, 1);
> > +            if (!bit)
> > +                break;
> > +            size++;
> > +        } while (size < 8);
> > +
> > +        v += 1 << size;
> > +
> > +    } while (size == 8);
> > +
> > +    if (size) {
> > +        v += SHOW_UBITS(re, gb, size);
> > +        LAST_SKIP_BITS(re, gb, size);
> > +    }
> > +
> > +    CLOSE_READER(re, gb);
> > +    return v;
> > +}
>
> I meant that you should do something like
> (could maybe be made less messy, and not
> sure it's really necessary to use the macro
> version, I think it'd prefer the plain
> show_bits etc)
>

So many bugs in the previous version, this
one is at least a bit more correct...

int v = 1;
int bits = SHOW_UBITS(re, gb, 9);
while (bits == 0x1ff) {
    // Note: relies on 0-padding to guarantee termination!
    SKIP_BITS(re, gb, 9);
    v += 256;
    bits = SHOW_UBITS(re, gb, 9);
}
if (bits < 0x100) {
    LAST_SKIP_BITS(re, gb, 1);
} else if (bits < 0x180) {
    LAST_SKIP_BITS(re, gb, 2);
    v += 1;
} else if (bits < 0x1c0) {
    LAST_SKIP_BITS(re, gb, 3 + 1);
    v += 2 + ((bits >> 5) & 1);
} else if (bits < 0x1e0) {
    LAST_SKIP_BITS(re, gb, 4 + 2);
    v += 4 + ((bits >> 3) & 3);
} else if (bits < 0x1f0) {
    LAST_SKIP_BITS(re, gb, 5 + 3);
    v += 8 + ((bits >> 1) & 7);
} else if (bits < 0x1f8) {
    SKIP_BITS(re, gb, 6);
    v += 16 + SHOW_UBITS(re, gb, 4);
    LAST_SKIP_BITS(re, gb, 4);
} else if (bits < 0x1fc) {
    SKIP_BITS(re, gb, 7);
    v += 32 + SHOW_UBITS(re, gb, 5);
    LAST_SKIP_BITS(re, gb, 5);
} else if (bits < 0x1fe) {
    SKIP_BITS(re, gb, 8);
    v += 64 + SHOW_UBITS(re, gb, 6);
    LAST_SKIP_BITS(re, gb, 6);
} else {
    SKIP_BITS(re, gb, 9);
    v += 128 + SHOW_UBITS(re, gb, 7);
    LAST_SKIP_BITS(re, gb, 7);
}

CLOSE_READER(re, gb);
return v;


More information about the ffmpeg-devel mailing list