From 4f57826e2756c250a2c8609d31e5f2eaca4c377b Mon Sep 17 00:00:00 2001 From: powturbo Date: Wed, 8 Jul 2015 16:19:39 +0200 Subject: [PATCH] Variable Byte --- vint.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/vint.c b/vint.c index 2dabe24..55698d2 100644 --- a/vint.c +++ b/vint.c @@ -203,3 +203,32 @@ unsigned char *vbdec15(unsigned char *__restrict in, unsigned n, unsigned short unsigned char *vbenc16(unsigned short *__restrict in, unsigned n, unsigned char *__restrict out) { unsigned short *in_ = in +n; while(in < in_) vbput16(out, *in++); return out;} unsigned char *vbdec16(unsigned char *__restrict in, unsigned n, unsigned short *__restrict out) { unsigned short *out_ = out+n,x; while(out < out_) _vbget16(in, x, *out++ = x); return in; } + +//---------------------------------- Zigzag encoding ------------------------------------------------------------------------------------ +unsigned char *vbzenc32(unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned start) { + unsigned *ip,v; + for(ip = in; ip != in+(n&~(4-1)); ) { + v = zigzagenc32((*ip)-start); start=*ip++; _vbputu32(out, v, ;); + v = zigzagenc32((*ip)-start); start=*ip++; _vbputu32(out, v, ;); + v = zigzagenc32((*ip)-start); start=*ip++; _vbputu32(out, v, ;); + v = zigzagenc32((*ip)-start); start=*ip++; _vbputu32(out, v, ;); + } + while(ip < in+n) { v = zigzagenc32((*ip)-start); start = *ip++; _vbputu32(out, v, ;); } + return out; +} + +unsigned char *vbzdec32(unsigned char *__restrict in, unsigned n, unsigned *__restrict out, unsigned start) { + unsigned x,*op; + for(op = out; op != out+(n&~(8-1)); ) { + _vbgetu32(in, x, ;); *op++ = (start += zigzagdec32(x)); + _vbgetu32(in, x, ;); *op++ = (start += zigzagdec32(x)); + _vbgetu32(in, x, ;); *op++ = (start += zigzagdec32(x)); + _vbgetu32(in, x, ;); *op++ = (start += zigzagdec32(x)); + _vbgetu32(in, x, ;); *op++ = (start += zigzagdec32(x)); + _vbgetu32(in, x, ;); *op++ = (start += zigzagdec32(x)); + _vbgetu32(in, x, ;); *op++ = (start += zigzagdec32(x)); + _vbgetu32(in, x, ;); *op++ = (start += zigzagdec32(x)); + } + while(op != out+n) _vbgetu32(in, x, *op++ = (start += zigzagdec32(x))); + return in; +}