[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