[FFmpeg-devel] [PATCHv3] VP4 video decoder

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


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)

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