TurboPFor: TurboPFor decode

This commit is contained in:
x
2017-01-29 14:09:46 +01:00
parent 62f424d4a7
commit f6ba8f9b10

64
vp4d.c
View File

@ -359,27 +359,35 @@ size_t TEMPLATE2(P4NDEC, USIZE)(unsigned char *__restrict in, size_t n, uint_t *
#ifdef P4DECX #ifdef P4DECX
unsigned char *TEMPLATE2(p4decx, USIZE)(unsigned char *in, unsigned n, uint_t *__restrict out) { unsigned char *TEMPLATE2(p4decx, USIZE)(unsigned char *in, unsigned n, uint_t *__restrict out) {
unsigned b,i; unsigned b,i;
struct p4 p4; struct p4 p4;
p4ini(&p4, &in, n, &b); p4ini(&p4, &in, n, &b);
if(unlikely(p4.i & 1)) { if(unlikely(p4.isx)) {
for(i = 0; i != n&~3; i+=4) { #define ITX(k) out[i+k] = TEMPLATE2(p4getx, USIZE)(&p4, in, i+k, b);
out[i ] = TEMPLATE2(p4getx, USIZE)(&p4, in, i , b); for(i = 0; i != n&~3; i += 4) { ITX(0); ITX(1); ITX(2); ITX(3); }
out[i+1] = TEMPLATE2(p4getx, USIZE)(&p4, in, i+1, b); for( ; i != n; i++ ) ITX(0);
out[i+2] = TEMPLATE2(p4getx, USIZE)(&p4, in, i+2, b);
out[i+3] = TEMPLATE2(p4getx, USIZE)(&p4, in, i+3, b);
}
for( ; i != n; i++)
out[i ] = TEMPLATE2(p4getx, USIZE)(&p4, in, i , b);
} else { } else {
for(i = 0; i != n&~3; i+=4) { #define ITY(k) out[i+k] = TEMPLATE2(bitgetx, USIZE)(in, i+k, b);
out[i ] = TEMPLATE2(_bitgetx, USIZE)(in, i *b, b); for(i = 0; i != n&~3; i += 4) { ITY(0); ITY(1); ITY(2); ITY(3); }
out[i+1] = TEMPLATE2(_bitgetx, USIZE)(in, (i+1)*b, b); for( ; i != n; i++) ITY(0);
out[i+2] = TEMPLATE2(_bitgetx, USIZE)(in, (i+2)*b, b);
out[i+3] = TEMPLATE2(_bitgetx, USIZE)(in, (i+3)*b, b);
} }
for( ; i != n; i++) return in + PAD8(n*b);
out[i ] = TEMPLATE2(_bitgetx, USIZE)(in, i *b, b); }
unsigned char *TEMPLATE2(p4f1decx, USIZE)(unsigned char *in, unsigned n, uint_t *__restrict out, uint_t start) {
unsigned b,i;
struct p4 p4;
p4ini(&p4, &in, n, &b);
if(unlikely(p4.isx)) {
#define ITX(k) out[i+k] = TEMPLATE2(p4getx, USIZE)(&p4, in, (i+k), b)+start+i+k+1;
for(i = 0; i != n&~3; i+=4) { ITX(0); ITX(1); ITX(2); ITX(3); }
for( ; i != n; i++) ITX(0);
} else {
#define ITY(k) out[i+k] = TEMPLATE2(bitgetx, USIZE)(in, (i+k), b)+start+i+k+1;
for(i = 0; i != n&~3; i += 4) { ITY(0); ITY(1); ITY(2); ITY(3); }
for( ; i != n; i++) ITY(0);
} }
return in + PAD8(n*b); return in + PAD8(n*b);
} }
@ -389,24 +397,16 @@ unsigned char *TEMPLATE2(p4fdecx, USIZE)(unsigned char *in, unsigned n, uint_t *
struct p4 p4; struct p4 p4;
p4ini(&p4, &in, n, &b); p4ini(&p4, &in, n, &b);
if(unlikely(p4.i & 1)) { if(unlikely(p4.isx)) {
for(i = 0; i < n; i++) #define ITX(k) out[i+k] = TEMPLATE2(p4getx, USIZE)(&p4, in, i+k, b)+start;
out[i] = TEMPLATE2(p4getx, USIZE)(&p4, in, i, b)+start+i+1; for(i = 0; i != n&~3; i+=4) { ITX(0); ITX(1); ITX(2); ITX(3); }
} else for(i = 0; i < n; i++) out[i] = TEMPLATE2(_bitgetx, USIZE)(in, i*b, b)+start+i+1; for( ; i != n; i++) ITX(0);
return in + PAD8(n*b); } else {
#define ITY(k) out[i+k] = TEMPLATE2(bitgetx, USIZE)(in, (i+k), b)+start;
for(i = 0; i != n&~3; i+=4) { ITY(0); ITY(1); ITY(2); ITY(3); }
for( ; i != n; i++) ITY(0);
} }
unsigned char *TEMPLATE2(p4f0decx, USIZE)(unsigned char *in, unsigned n, uint_t *__restrict out, uint_t start) {
unsigned b,i;
struct p4 p4;
p4ini(&p4, &in, n, &b);
if(unlikely(p4.i & 1)) {
for(i = 0; i < n; i++)
out[i] = TEMPLATE2(p4getx, USIZE)(&p4, in, i, b)+start;// return p4.ex + PAD8((p4.cum[P4DN-1] + popcnt64(p4.xmap[P4DN-1]))*p4.bx);
} else for(i = 0; i < n; i++) out[i] = TEMPLATE2(_bitgetx, USIZE)(in, i*b, b)+start;
return in + PAD8(n*b); return in + PAD8(n*b);
} }
#endif #endif
#endif #endif