Telegram Web, preconfigured for usage in I2P.
http://web.telegram.i2p/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
10321 lines
368 KiB
10321 lines
368 KiB
10 years ago
|
var WebPZlib = (function WebPZlib() {
|
||
|
var dd = (function() {
|
||
|
var o = 32768;
|
||
|
var r = 0;
|
||
|
var s = 1;
|
||
|
var t = 2;
|
||
|
var u = 6;
|
||
|
var x = true;
|
||
|
var y = 32768;
|
||
|
var z = 64;
|
||
|
var A = 1024 * 8;
|
||
|
var B = 2 * o;
|
||
|
var C = 3;
|
||
|
var D = 258;
|
||
|
var E = 16;
|
||
|
var F = 0x2000;
|
||
|
var G = 13;
|
||
|
if (F > y) alert("error: zip_INBUFSIZ is too small");
|
||
|
if ((o << 1) > (1 << E)) alert("error: zip_WSIZE is too large");
|
||
|
if (G > E - 1) alert("error: zip_HASH_BITS is too large");
|
||
|
if (G < 8 || D != 258) alert("error: Code too clever");
|
||
|
var H = F;
|
||
|
var I = 1 << G;
|
||
|
var J = I - 1;
|
||
|
var K = o - 1;
|
||
|
var L = 0;
|
||
|
var M = 4096;
|
||
|
var N = D + C + 1;
|
||
|
var O = o - N;
|
||
|
var P = 1;
|
||
|
var Q = 15;
|
||
|
var R = 7;
|
||
|
var S = 29;
|
||
|
var T = 256;
|
||
|
var U = 256;
|
||
|
var V = T + 1 + S;
|
||
|
var W = 30;
|
||
|
var X = 19;
|
||
|
var Y = 16;
|
||
|
var Z = 17;
|
||
|
var de = 18;
|
||
|
var df = 2 * V + 1;
|
||
|
var dg = parseInt((G + C - 1) / C, 10);
|
||
|
var dh;
|
||
|
var di, zip_qtail;
|
||
|
var dj;
|
||
|
var dk = null;
|
||
|
var dl, zip_outoff;
|
||
|
var dm;
|
||
|
var dn;
|
||
|
var dp;
|
||
|
var dq;
|
||
|
var dr;
|
||
|
var ds;
|
||
|
var dt;
|
||
|
var du;
|
||
|
var dv;
|
||
|
var dw;
|
||
|
var dx;
|
||
|
var dy;
|
||
|
var dz;
|
||
|
var dA;
|
||
|
var dB;
|
||
|
var dC;
|
||
|
var dD;
|
||
|
var dE;
|
||
|
var dF;
|
||
|
var dG;
|
||
|
var dH;
|
||
|
var dI;
|
||
|
var dJ;
|
||
|
var dK;
|
||
|
var dL;
|
||
|
var dM;
|
||
|
var dN;
|
||
|
var dO;
|
||
|
var dP;
|
||
|
var dQ;
|
||
|
var dR;
|
||
|
var dS;
|
||
|
var dT;
|
||
|
var dU;
|
||
|
var dV;
|
||
|
var dW;
|
||
|
var dX;
|
||
|
var dY;
|
||
|
var dZ;
|
||
|
var ea;
|
||
|
var eb;
|
||
|
var ec;
|
||
|
var ed;
|
||
|
var ee;
|
||
|
var ef;
|
||
|
var eg;
|
||
|
var eh;
|
||
|
var ei;
|
||
|
var ej;
|
||
|
var ek;
|
||
|
var el = function() {
|
||
|
this.fc = 0;
|
||
|
this.dl = 0
|
||
|
};
|
||
|
var em = function() {
|
||
|
this.dyn_tree = null;
|
||
|
this.static_tree = null;
|
||
|
this.extra_bits = null;
|
||
|
this.extra_base = 0;
|
||
|
this.elems = 0;
|
||
|
this.max_length = 0;
|
||
|
this.max_code = 0
|
||
|
};
|
||
|
var en = function(a, b, c, d) {
|
||
|
this.good_length = a;
|
||
|
this.max_lazy = b;
|
||
|
this.nice_length = c;
|
||
|
this.max_chain = d
|
||
|
};
|
||
|
var eo = function() {
|
||
|
this.next = null;
|
||
|
this.len = 0;
|
||
|
this.ptr = new Array(A);
|
||
|
this.off = 0
|
||
|
};
|
||
|
var ep = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0];
|
||
|
var eq = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13];
|
||
|
var er = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7];
|
||
|
var es = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
|
||
|
var et = [new en(0, 0, 0, 0), new en(4, 4, 8, 4), new en(4, 5, 16, 8), new en(4, 6, 32, 32), new en(4, 4, 16, 16), new en(8, 16, 32, 32), new en(8, 16, 128, 128), new en(8, 32, 128, 256), new en(32, 128, 258, 1024), new en(32, 258, 258, 4096)];
|
||
|
var eu = function(a) {
|
||
|
var i;
|
||
|
if (!a) a = u;
|
||
|
else if (a < 1) a = 1;
|
||
|
else if (a > 9) a = 9;
|
||
|
dH = a;
|
||
|
dj = false;
|
||
|
dD = false;
|
||
|
if (dk != null) return;
|
||
|
dh = di = zip_qtail = null;
|
||
|
dk = new Array(A);
|
||
|
dn = new Array(B);
|
||
|
dp = new Array(H);
|
||
|
dq = new Array(y + z);
|
||
|
dr = new Array(1 << E);
|
||
|
dK = new Array(df);
|
||
|
for (i = 0; i < df; i++) dK[i] = new el();
|
||
|
dL = new Array(2 * W + 1);
|
||
|
for (i = 0; i < 2 * W + 1; i++) dL[i] = new el();
|
||
|
dM = new Array(V + 2);
|
||
|
for (i = 0; i < V + 2; i++) dM[i] = new el();
|
||
|
dN = new Array(W);
|
||
|
for (i = 0; i < W; i++) dN[i] = new el();
|
||
|
dO = new Array(2 * X + 1);
|
||
|
for (i = 0; i < 2 * X + 1; i++) dO[i] = new el();
|
||
|
dP = new em();
|
||
|
dQ = new em();
|
||
|
dR = new em();
|
||
|
dS = new Array(Q + 1);
|
||
|
dT = new Array(2 * V + 1);
|
||
|
dW = new Array(2 * V + 1);
|
||
|
dX = new Array(D - C + 1);
|
||
|
dY = new Array(512);
|
||
|
dZ = new Array(S);
|
||
|
ea = new Array(W);
|
||
|
eb = new Array(parseInt(F / 8, 10))
|
||
|
};
|
||
|
var ev = function() {
|
||
|
dh = di = zip_qtail = null;
|
||
|
dk = null;
|
||
|
dn = null;
|
||
|
dp = null;
|
||
|
dq = null;
|
||
|
dr = null;
|
||
|
dK = null;
|
||
|
dL = null;
|
||
|
dM = null;
|
||
|
dN = null;
|
||
|
dO = null;
|
||
|
dP = null;
|
||
|
dQ = null;
|
||
|
dR = null;
|
||
|
dS = null;
|
||
|
dT = null;
|
||
|
dW = null;
|
||
|
dX = null;
|
||
|
dY = null;
|
||
|
dZ = null;
|
||
|
ea = null;
|
||
|
eb = null
|
||
|
};
|
||
|
var ew = function(p) {
|
||
|
p.next = dh;
|
||
|
dh = p
|
||
|
};
|
||
|
var ex = function() {
|
||
|
var p;
|
||
|
if (dh != null) {
|
||
|
p = dh;
|
||
|
dh = dh.next
|
||
|
} else p = new eo();
|
||
|
p.next = null;
|
||
|
p.len = p.off = 0;
|
||
|
return p
|
||
|
};
|
||
|
var ey = function(i) {
|
||
|
return dr[o + i]
|
||
|
};
|
||
|
var ez = function(i, a) {
|
||
|
return dr[o + i] = a
|
||
|
};
|
||
|
var eA = function(c) {
|
||
|
dk[zip_outoff + dl++] = c;
|
||
|
if (zip_outoff + dl == A) fg()
|
||
|
};
|
||
|
var eB = function(w) {
|
||
|
w &= 0xffff;
|
||
|
if (zip_outoff + dl < A - 2) {
|
||
|
dk[zip_outoff + dl++] = (w & 0xff);
|
||
|
dk[zip_outoff + dl++] = (w >>> 8)
|
||
|
} else {
|
||
|
eA(w & 0xff);
|
||
|
eA(w >>> 8)
|
||
|
}
|
||
|
};
|
||
|
var eC = function() {
|
||
|
dv = ((dv << dg) ^ (dn[dB + C - 1] & 0xff)) & J;
|
||
|
dw = ey(dv);
|
||
|
dr[dB & K] = dw;
|
||
|
ez(dv, dB)
|
||
|
};
|
||
|
var eD = function(c, a) {
|
||
|
fd(a[c].fc, a[c].dl)
|
||
|
};
|
||
|
var eE = function(a) {
|
||
|
return (a < 256 ? dY[a] : dY[256 + (a >> 7)]) & 0xff
|
||
|
};
|
||
|
var eF = function(a, n, m) {
|
||
|
return a[n].fc < a[m].fc || (a[n].fc == a[m].fc && dW[n] <= dW[m])
|
||
|
};
|
||
|
var eG = function(a, b, n) {
|
||
|
var i;
|
||
|
var l = ej.length;
|
||
|
for (i = 0; i < n && ek < l; i += 1) {
|
||
|
a[b + i] = ej[ek++]
|
||
|
}
|
||
|
return i
|
||
|
};
|
||
|
var eH = function() {
|
||
|
var j;
|
||
|
for (j = 0; j < I; j++) dr[o + j] = 0;
|
||
|
dG = et[dH].max_lazy;
|
||
|
dI = et[dH].good_length;
|
||
|
if (!x) dJ = et[dH].nice_length;
|
||
|
dF = et[dH].max_chain;
|
||
|
dB = 0;
|
||
|
du = 0;
|
||
|
dE = eG(dn, 0, 2 * o);
|
||
|
if (dE <= 0) {
|
||
|
dD = true;
|
||
|
dE = 0;
|
||
|
return
|
||
|
}
|
||
|
dD = false;
|
||
|
while (dE < N && !dD) eJ();
|
||
|
dv = 0;
|
||
|
for (j = 0; j < C - 1; j++) {
|
||
|
dv = ((dv << dg) ^ (dn[j] & 0xff)) & J
|
||
|
}
|
||
|
};
|
||
|
var eI = function(a) {
|
||
|
var b = dF;
|
||
|
var c = dB;
|
||
|
var d;
|
||
|
var e;
|
||
|
var f = dA;
|
||
|
var g = (dB > O ? dB - O : L);
|
||
|
var h = dB + D;
|
||
|
var i = dn[c + f - 1];
|
||
|
var j = dn[c + f];
|
||
|
if (dA >= dI) b >>= 2;
|
||
|
do {
|
||
|
d = a;
|
||
|
if (dn[d + f] != j || dn[d + f - 1] != i || dn[d] != dn[c] || dn[++d] != dn[c + 1]) {
|
||
|
continue
|
||
|
}
|
||
|
c += 2;
|
||
|
d++;
|
||
|
do {} while (dn[++c] == dn[++d] && dn[++c] == dn[++d] && dn[++c] == dn[++d] && dn[++c] == dn[++d] && dn[++c] == dn[++d] && dn[++c] == dn[++d] && dn[++c] == dn[++d] && dn[++c] == dn[++d] && c < h);
|
||
|
e = D - (h - c);
|
||
|
c = h - D;
|
||
|
if (e > f) {
|
||
|
dC = a;
|
||
|
f = e;
|
||
|
if (x) {
|
||
|
if (e >= D) break
|
||
|
} else {
|
||
|
if (e >= dJ) break
|
||
|
}
|
||
|
i = dn[c + f - 1];
|
||
|
j = dn[c + f]
|
||
|
}
|
||
|
} while ((a = dr[a & K]) > g && --b != 0);
|
||
|
return f
|
||
|
};
|
||
|
var eJ = function() {
|
||
|
var n, m;
|
||
|
var a = B - dE - dB;
|
||
|
if (a == -1) {
|
||
|
a--
|
||
|
} else if (dB >= o + O) {
|
||
|
for (n = 0; n < o; n++) dn[n] = dn[n + o];
|
||
|
dC -= o;
|
||
|
dB -= o;
|
||
|
du -= o;
|
||
|
for (n = 0; n < I; n++) {
|
||
|
m = ey(n);
|
||
|
ez(n, m >= o ? m - o : L)
|
||
|
}
|
||
|
for (n = 0; n < o; n++) {
|
||
|
m = dr[n];
|
||
|
dr[n] = (m >= o ? m - o : L)
|
||
|
}
|
||
|
a += o
|
||
|
}
|
||
|
if (!dD) {
|
||
|
n = eG(dn, dB + dE, a);
|
||
|
if (n <= 0) dD = true;
|
||
|
else dE += n
|
||
|
}
|
||
|
};
|
||
|
var eK = function() {
|
||
|
while (dE != 0 && di == null) {
|
||
|
var a;
|
||
|
eC();
|
||
|
if (dw != L && dB - dw <= O) {
|
||
|
dz = eI(dw);
|
||
|
if (dz > dE) dz = dE
|
||
|
}
|
||
|
if (dz >= C) {
|
||
|
a = fa(dB - dC, dz - C);
|
||
|
dE -= dz;
|
||
|
if (dz <= dG) {
|
||
|
dz--;
|
||
|
do {
|
||
|
dB++;
|
||
|
eC()
|
||
|
} while (--dz != 0);
|
||
|
dB++
|
||
|
} else {
|
||
|
dB += dz;
|
||
|
dz = 0;
|
||
|
dv = dn[dB] & 0xff;
|
||
|
dv = ((dv << dg) ^ (dn[dB + 1] & 0xff)) & J
|
||
|
}
|
||
|
} else {
|
||
|
a = fa(0, dn[dB] & 0xff);
|
||
|
dE--;
|
||
|
dB++
|
||
|
}
|
||
|
if (a) {
|
||
|
eZ(0);
|
||
|
du = dB
|
||
|
}
|
||
|
while (dE < N && !dD) eJ()
|
||
|
}
|
||
|
};
|
||
|
var eL = function() {
|
||
|
while (dE != 0 && di == null) {
|
||
|
eC();
|
||
|
dA = dz;
|
||
|
dx = dC;
|
||
|
dz = C - 1;
|
||
|
if (dw != L && dA < dG && dB - dw <= O) {
|
||
|
dz = eI(dw);
|
||
|
if (dz > dE) dz = dE;
|
||
|
if (dz == C && dB - dC > M) {
|
||
|
dz--
|
||
|
}
|
||
|
}
|
||
|
if (dA >= C && dz <= dA) {
|
||
|
var a;
|
||
|
a = fa(dB - 1 - dx, dA - C);
|
||
|
dE -= dA - 1;
|
||
|
dA -= 2;
|
||
|
do {
|
||
|
dB++;
|
||
|
eC()
|
||
|
} while (--dA != 0);
|
||
|
dy = 0;
|
||
|
dz = C - 1;
|
||
|
dB++;
|
||
|
if (a) {
|
||
|
eZ(0);
|
||
|
du = dB
|
||
|
}
|
||
|
} else if (dy != 0) {
|
||
|
if (fa(0, dn[dB - 1] & 0xff)) {
|
||
|
eZ(0);
|
||
|
du = dB
|
||
|
}
|
||
|
dB++;
|
||
|
dE--
|
||
|
} else {
|
||
|
dy = 1;
|
||
|
dB++;
|
||
|
dE--
|
||
|
}
|
||
|
while (dE < N && !dD) eJ()
|
||
|
}
|
||
|
};
|
||
|
var eM = function() {
|
||
|
if (dD) return;
|
||
|
ds = 0;
|
||
|
dt = 0;
|
||
|
eP();
|
||
|
eH();
|
||
|
di = null;
|
||
|
dl = 0;
|
||
|
zip_outoff = 0;
|
||
|
if (dH <= 3) {
|
||
|
dA = C - 1;
|
||
|
dz = 0
|
||
|
} else {
|
||
|
dz = C - 1;
|
||
|
dy = 0
|
||
|
}
|
||
|
dm = false
|
||
|
};
|
||
|
var eN = function(a, b, c) {
|
||
|
var n;
|
||
|
if (!dj) {
|
||
|
eM();
|
||
|
dj = true;
|
||
|
if (dE == 0) {
|
||
|
dm = true;
|
||
|
return 0
|
||
|
}
|
||
|
}
|
||
|
if ((n = eO(a, b, c)) == c) return c;
|
||
|
if (dm) return n;
|
||
|
if (dH <= 3) eK();
|
||
|
else eL();
|
||
|
if (dE == 0) {
|
||
|
if (dy != 0) {
|
||
|
fa(0, dn[dB - 1] & 0xff)
|
||
|
}
|
||
|
eZ(1);
|
||
|
dm = true
|
||
|
}
|
||
|
return n + eO(a, n + b, c - n)
|
||
|
};
|
||
|
var eO = function(a, b, c) {
|
||
|
var n, i, j;
|
||
|
n = 0;
|
||
|
while (di != null && n < c) {
|
||
|
i = c - n;
|
||
|
if (i > di.len) i = di.len;
|
||
|
for (j = 0; j < i; j++) {
|
||
|
a[b + n + j] = di.ptr[di.off + j]
|
||
|
}
|
||
|
di.off += i;
|
||
|
di.len -= i;
|
||
|
n += i;
|
||
|
if (di.len == 0) {
|
||
|
var p;
|
||
|
p = di;
|
||
|
di = di.next;
|
||
|
ew(p)
|
||
|
}
|
||
|
}
|
||
|
if (n == c) {
|
||
|
return n
|
||
|
}
|
||
|
if (zip_outoff < dl) {
|
||
|
i = c - n;
|
||
|
if (i > dl - zip_outoff) {
|
||
|
i = dl - zip_outoff
|
||
|
}
|
||
|
for (j = 0; j < i; j++) {
|
||
|
a[b + n + j] = dk[zip_outoff + j]
|
||
|
}
|
||
|
zip_outoff += i;
|
||
|
n += i;
|
||
|
if (dl == zip_outoff) {
|
||
|
dl = zip_outoff = 0
|
||
|
}
|
||
|
}
|
||
|
return n
|
||
|
};
|
||
|
var eP = function() {
|
||
|
var n;
|
||
|
var a;
|
||
|
var b;
|
||
|
var c;
|
||
|
var d;
|
||
|
if (dN[0].dl != 0) return;
|
||
|
dP.dyn_tree = dK;
|
||
|
dP.static_tree = dM;
|
||
|
dP.extra_bits = ep;
|
||
|
dP.extra_base = T + 1;
|
||
|
dP.elems = V;
|
||
|
dP.max_length = Q;
|
||
|
dP.max_code = 0;
|
||
|
dQ.dyn_tree = dL;
|
||
|
dQ.static_tree = dN;
|
||
|
dQ.extra_bits = eq;
|
||
|
dQ.extra_base = 0;
|
||
|
dQ.elems = W;
|
||
|
dQ.max_length = Q;
|
||
|
dQ.max_code = 0;
|
||
|
dR.dyn_tree = dO;
|
||
|
dR.static_tree = null;
|
||
|
dR.extra_bits = er;
|
||
|
dR.extra_base = 0;
|
||
|
dR.elems = X;
|
||
|
dR.max_length = R;
|
||
|
dR.max_code = 0;
|
||
|
b = 0;
|
||
|
for (c = 0; c < S - 1; c++) {
|
||
|
dZ[c] = b;
|
||
|
for (n = 0; n < (1 << ep[c]); n++) dX[b++] = c
|
||
|
}
|
||
|
dX[b - 1] = c;
|
||
|
d = 0;
|
||
|
for (c = 0; c < 16; c++) {
|
||
|
ea[c] = d;
|
||
|
for (n = 0; n < (1 << eq[c]); n++) {
|
||
|
dY[d++] = c
|
||
|
}
|
||
|
}
|
||
|
d >>= 7;
|
||
|
for (; c < W; c++) {
|
||
|
ea[c] = d << 7;
|
||
|
for (n = 0; n < (1 << (eq[c] - 7)); n++) dY[256 + d++] = c
|
||
|
}
|
||
|
for (a = 0; a <= Q; a++) dS[a] = 0;
|
||
|
n = 0;
|
||
|
while (n <= 143) {
|
||
|
dM[n++].dl = 8;
|
||
|
dS[8]++
|
||
|
}
|
||
|
while (n <= 255) {
|
||
|
dM[n++].dl = 9;
|
||
|
dS[9]++
|
||
|
}
|
||
|
while (n <= 279) {
|
||
|
dM[n++].dl = 7;
|
||
|
dS[7]++
|
||
|
}
|
||
|
while (n <= 287) {
|
||
|
dM[n++].dl = 8;
|
||
|
dS[8]++
|
||
|
}
|
||
|
eT(dM, V + 1);
|
||
|
for (n = 0; n < W; n++) {
|
||
|
dN[n].dl = 5;
|
||
|
dN[n].fc = fe(n, 5)
|
||
|
}
|
||
|
eQ()
|
||
|
};
|
||
|
var eQ = function() {
|
||
|
var n;
|
||
|
for (n = 0; n < V; n++) dK[n].fc = 0;
|
||
|
for (n = 0; n < W; n++) dL[n].fc = 0;
|
||
|
for (n = 0; n < X; n++) dO[n].fc = 0;
|
||
|
dK[U].fc = 1;
|
||
|
eh = ei = 0;
|
||
|
ec = ed = ee = 0;
|
||
|
ef = 0;
|
||
|
eg = 1
|
||
|
};
|
||
|
var eR = function(a, k) {
|
||
|
var v = dT[k];
|
||
|
var j = k << 1;
|
||
|
while (j <= dU) {
|
||
|
if (j < dU && eF(a, dT[j + 1], dT[j])) j++;
|
||
|
if (eF(a, v, dT[j])) break;
|
||
|
dT[k] = dT[j];
|
||
|
k = j;
|
||
|
j <<= 1
|
||
|
}
|
||
|
dT[k] = v
|
||
|
};
|
||
|
var eS = function(a) {
|
||
|
var b = a.dyn_tree;
|
||
|
var c = a.extra_bits;
|
||
|
var d = a.extra_base;
|
||
|
var e = a.max_code;
|
||
|
var g = a.max_length;
|
||
|
var i = a.static_tree;
|
||
|
var h;
|
||
|
var n, m;
|
||
|
var j;
|
||
|
var k;
|
||
|
var f;
|
||
|
var l = 0;
|
||
|
for (j = 0; j <= Q; j++) dS[j] = 0;
|
||
|
b[dT[dV]].dl = 0;
|
||
|
for (h = dV + 1; h < df; h++) {
|
||
|
n = dT[h];
|
||
|
j = b[b[n].dl].dl + 1;
|
||
|
if (j > g) {
|
||
|
j = g;
|
||
|
l++
|
||
|
}
|
||
|
b[n].dl = j;
|
||
|
if (n > e) continue;
|
||
|
dS[j]++;
|
||
|
k = 0;
|
||
|
if (n >= d) k = c[n - d];
|
||
|
f = b[n].fc;
|
||
|
eh += f * (j + k);
|
||
|
if (i != null) ei += f * (i[n].dl + k)
|
||
|
}
|
||
|
if (l == 0) return;
|
||
|
do {
|
||
|
j = g - 1;
|
||
|
while (dS[j] == 0) j--;
|
||
|
dS[j]--;
|
||
|
dS[j + 1] += 2;
|
||
|
dS[g]--;
|
||
|
l -= 2
|
||
|
} while (l > 0);
|
||
|
for (j = g; j != 0; j--) {
|
||
|
n = dS[j];
|
||
|
while (n != 0) {
|
||
|
m = dT[--h];
|
||
|
if (m > e) continue;
|
||
|
if (b[m].dl != j) {
|
||
|
eh += (j - b[m].dl) * b[m].fc;
|
||
|
b[m].fc = j
|
||
|
}
|
||
|
n--
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
var eT = function(a, b) {
|
||
|
var c = new Array(Q + 1);
|
||
|
var d = 0;
|
||
|
var e;
|
||
|
var n;
|
||
|
for (e = 1; e <= Q; e++) {
|
||
|
d = ((d + dS[e - 1]) << 1);
|
||
|
c[e] = d
|
||
|
}
|
||
|
for (n = 0; n <= b; n++) {
|
||
|
var f = a[n].dl;
|
||
|
if (f == 0) continue;
|
||
|
a[n].fc = fe(c[f]++, f)
|
||
|
}
|
||
|
};
|
||
|
var eU = function(a) {
|
||
|
var b = a.dyn_tree;
|
||
|
var c = a.static_tree;
|
||
|
var d = a.elems;
|
||
|
var n, m;
|
||
|
var e = -1;
|
||
|
var f = d;
|
||
|
dU = 0;
|
||
|
dV = df;
|
||
|
for (n = 0; n < d; n++) {
|
||
|
if (b[n].fc != 0) {
|
||
|
dT[++dU] = e = n;
|
||
|
dW[n] = 0
|
||
|
} else b[n].dl = 0
|
||
|
}
|
||
|
while (dU < 2) {
|
||
|
var g = dT[++dU] = (e < 2 ? ++e : 0);
|
||
|
b[g].fc = 1;
|
||
|
dW[g] = 0;
|
||
|
eh--;
|
||
|
if (c != null) ei -= c[g].dl
|
||
|
}
|
||
|
a.max_code = e;
|
||
|
for (n = dU >> 1; n >= 1; n--) eR(b, n);
|
||
|
do {
|
||
|
n = dT[P];
|
||
|
dT[P] = dT[dU--];
|
||
|
eR(b, P);
|
||
|
m = dT[P];
|
||
|
dT[--dV] = n;
|
||
|
dT[--dV] = m;
|
||
|
b[f].fc = b[n].fc + b[m].fc;
|
||
|
if (dW[n] > dW[m] + 1) dW[f] = dW[n];
|
||
|
else dW[f] = dW[m] + 1;
|
||
|
b[n].dl = b[m].dl = f;
|
||
|
dT[P] = f++;
|
||
|
eR(b, P)
|
||
|
} while (dU >= 2);
|
||
|
dT[--dV] = dT[P];
|
||
|
eS(a);
|
||
|
eT(b, e)
|
||
|
};
|
||
|
var eV = function(a, b) {
|
||
|
var n;
|
||
|
var c = -1;
|
||
|
var d;
|
||
|
var e = a[0].dl;
|
||
|
var f = 0;
|
||
|
var g = 7;
|
||
|
var h = 4;
|
||
|
if (e == 0) {
|
||
|
g = 138;
|
||
|
h = 3
|
||
|
}
|
||
|
a[b + 1].dl = 0xffff;
|
||
|
for (n = 0; n <= b; n++) {
|
||
|
d = e;
|
||
|
e = a[n + 1].dl;
|
||
|
if (++f < g && d == e) continue;
|
||
|
else if (f < h) dO[d].fc += f;
|
||
|
else if (d != 0) {
|
||
|
if (d != c) dO[d].fc++;
|
||
|
dO[Y].fc++
|
||
|
} else if (f <= 10) dO[Z].fc++;
|
||
|
else dO[de].fc++;
|
||
|
f = 0;
|
||
|
c = d;
|
||
|
if (e == 0) {
|
||
|
g = 138;
|
||
|
h = 3
|
||
|
} else if (d == e) {
|
||
|
g = 6;
|
||
|
h = 3
|
||
|
} else {
|
||
|
g = 7;
|
||
|
h = 4
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
var eW = function(a, b) {
|
||
|
var n;
|
||
|
var c = -1;
|
||
|
var d;
|
||
|
var e = a[0].dl;
|
||
|
var f = 0;
|
||
|
var g = 7;
|
||
|
var h = 4;
|
||
|
if (e == 0) {
|
||
|
g = 138;
|
||
|
h = 3
|
||
|
}
|
||
|
for (n = 0; n <= b; n++) {
|
||
|
d = e;
|
||
|
e = a[n + 1].dl;
|
||
|
if (++f < g && d == e) {
|
||
|
continue
|
||
|
} else if (f < h) {
|
||
|
do {
|
||
|
eD(d, dO)
|
||
|
} while (--f != 0)
|
||
|
} else if (d != 0) {
|
||
|
if (d != c) {
|
||
|
eD(d, dO);
|
||
|
f--
|
||
|
}
|
||
|
eD(Y, dO);
|
||
|
fd(f - 3, 2)
|
||
|
} else if (f <= 10) {
|
||
|
eD(Z, dO);
|
||
|
fd(f - 3, 3)
|
||
|
} else {
|
||
|
eD(de, dO);
|
||
|
fd(f - 11, 7)
|
||
|
}
|
||
|
f = 0;
|
||
|
c = d;
|
||
|
if (e == 0) {
|
||
|
g = 138;
|
||
|
h = 3
|
||
|
} else if (d == e) {
|
||
|
g = 6;
|
||
|
h = 3
|
||
|
} else {
|
||
|
g = 7;
|
||
|
h = 4
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
var eX = function() {
|
||
|
var a;
|
||
|
eV(dK, dP.max_code);
|
||
|
eV(dL, dQ.max_code);
|
||
|
eU(dR);
|
||
|
for (a = X - 1; a >= 3; a--) {
|
||
|
if (dO[es[a]].dl != 0) break
|
||
|
}
|
||
|
eh += 3 * (a + 1) + 5 + 5 + 4;
|
||
|
return a
|
||
|
};
|
||
|
var eY = function(a, b, c) {
|
||
|
var d;
|
||
|
fd(a - 257, 5);
|
||
|
fd(b - 1, 5);
|
||
|
fd(c - 4, 4);
|
||
|
for (d = 0; d < c; d++) {
|
||
|
fd(dO[es[d]].dl, 3)
|
||
|
}
|
||
|
eW(dK, a - 1);
|
||
|
eW(dL, b - 1)
|
||
|
};
|
||
|
var eZ = function(a) {
|
||
|
var b, static_lenb;
|
||
|
var c;
|
||
|
var d;
|
||
|
d = dB - du;
|
||
|
eb[ee] = ef;
|
||
|
eU(dP);
|
||
|
eU(dQ);
|
||
|
c = eX();
|
||
|
b = (eh + 3 + 7) >> 3;
|
||
|
static_lenb = (ei + 3 + 7) >> 3;
|
||
|
if (static_lenb <= b) b = static_lenb;
|
||
|
if (d + 4 <= b && du >= 0) {
|
||
|
var i;
|
||
|
fd((r << 1) + a, 3);
|
||
|
ff();
|
||
|
eB(d);
|
||
|
eB(~d);
|
||
|
for (i = 0; i < d; i++) eA(dn[du + i])
|
||
|
} else if (static_lenb == b) {
|
||
|
fd((s << 1) + a, 3);
|
||
|
fb(dM, dN)
|
||
|
} else {
|
||
|
fd((t << 1) + a, 3);
|
||
|
eY(dP.max_code + 1, dQ.max_code + 1, c + 1);
|
||
|
fb(dK, dL)
|
||
|
}
|
||
|
eQ();
|
||
|
if (a != 0) ff()
|
||
|
};
|
||
|
var fa = function(a, b) {
|
||
|
dq[ec++] = b;
|
||
|
if (a == 0) {
|
||
|
dK[b].fc++
|
||
|
} else {
|
||
|
a--;
|
||
|
dK[dX[b] + T + 1].fc++;
|
||
|
dL[eE(a)].fc++;
|
||
|
dp[ed++] = a;
|
||
|
ef |= eg
|
||
|
}
|
||
|
eg <<= 1;
|
||
|
if ((ec & 7) == 0) {
|
||
|
eb[ee++] = ef;
|
||
|
ef = 0;
|
||
|
eg = 1
|
||
|
}
|
||
|
if (dH > 2 && (ec & 0xfff) == 0) {
|
||
|
var c = ec * 8;
|
||
|
var d = dB - du;
|
||
|
var e;
|
||
|
for (e = 0; e < W; e++) {
|
||
|
c += dL[e].fc * (5 + eq[e])
|
||
|
}
|
||
|
c >>= 3;
|
||
|
if (ed < parseInt(ec / 2, 10) && c < parseInt(d / 2, 10)) return true
|
||
|
}
|
||
|
return (ec == F - 1 || ed == H)
|
||
|
};
|
||
|
var fb = function(a, b) {
|
||
|
var c;
|
||
|
var d;
|
||
|
var e = 0;
|
||
|
var f = 0;
|
||
|
var g = 0;
|
||
|
var h = 0;
|
||
|
var i;
|
||
|
var j;
|
||
|
if (ec != 0)
|
||
|
do {
|
||
|
if ((e & 7) == 0) h = eb[g++];
|
||
|
d = dq[e++] & 0xff;
|
||
|
if ((h & 1) == 0) {
|
||
|
eD(d, a)
|
||
|
} else {
|
||
|
i = dX[d];
|
||
|
eD(i + T + 1, a);
|
||
|
j = ep[i];
|
||
|
if (j != 0) {
|
||
|
d -= dZ[i];
|
||
|
fd(d, j)
|
||
|
}
|
||
|
c = dp[f++];
|
||
|
i = eE(c);
|
||
|
eD(i, b);
|
||
|
j = eq[i];
|
||
|
if (j != 0) {
|
||
|
c -= ea[i];
|
||
|
fd(c, j)
|
||
|
}
|
||
|
}
|
||
|
h >>= 1
|
||
|
} while (e < ec);
|
||
|
eD(U, a)
|
||
|
};
|
||
|
var fc = 16;
|
||
|
var fd = function(a, b) {
|
||
|
if (dt > fc - b) {
|
||
|
ds |= (a << dt);
|
||
|
eB(ds);
|
||
|
ds = (a >> (fc - dt));
|
||
|
dt += b - fc
|
||
|
} else {
|
||
|
ds |= a << dt;
|
||
|
dt += b
|
||
|
}
|
||
|
};
|
||
|
var fe = function(a, b) {
|
||
|
var c = 0;
|
||
|
do {
|
||
|
c |= a & 1;
|
||
|
a >>= 1;
|
||
|
c <<= 1
|
||
|
} while (--b > 0);
|
||
|
return c >> 1
|
||
|
};
|
||
|
var ff = function() {
|
||
|
if (dt > 8) {
|
||
|
eB(ds)
|
||
|
} else if (dt > 0) {
|
||
|
eA(ds)
|
||
|
}
|
||
|
ds = 0;
|
||
|
dt = 0
|
||
|
};
|
||
|
var fg = function() {
|
||
|
if (dl != 0) {
|
||
|
var q, i;
|
||
|
q = ex();
|
||
|
if (di == null) di = zip_qtail = q;
|
||
|
else zip_qtail = zip_qtail.next = q;
|
||
|
q.len = dl - zip_outoff;
|
||
|
for (i = 0; i < q.len; i++) q.ptr[i] = dk[zip_outoff + i];
|
||
|
dl = zip_outoff = 0
|
||
|
}
|
||
|
};
|
||
|
var fh = function(a, b) {
|
||
|
var i, j;
|
||
|
ej = a;
|
||
|
ek = 0;
|
||
|
if (typeof b == "undefined") {
|
||
|
b = u
|
||
|
}
|
||
|
eu(b);
|
||
|
var c = [0];
|
||
|
var d = [];
|
||
|
while ((i = eN(c, 0, c.length)) > 0) {
|
||
|
d.push(c[0])
|
||
|
}
|
||
|
ej = null;
|
||
|
return d
|
||
|
};
|
||
|
return fh
|
||
|
})();
|
||
|
var fi = (function() {
|
||
|
var D = 32768;
|
||
|
var E = 0;
|
||
|
var F = 1;
|
||
|
var G = 2;
|
||
|
var H = 9;
|
||
|
var I = 6;
|
||
|
var J = 32768;
|
||
|
var K = 64;
|
||
|
var L;
|
||
|
var M;
|
||
|
var N = null;
|
||
|
var O;
|
||
|
var P, fixed_bd;
|
||
|
var Q;
|
||
|
var R;
|
||
|
var S;
|
||
|
var T;
|
||
|
var U;
|
||
|
var V;
|
||
|
var W, zip_td;
|
||
|
var X, zip_bd;
|
||
|
var Y;
|
||
|
var Z;
|
||
|
var de = new Array(0x0000, 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff);
|
||
|
var df = new Array(3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0);
|
||
|
var dg = new Array(0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99);
|
||
|
var dh = new Array(1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577);
|
||
|
var di = new Array(0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13);
|
||
|
var dj = new Array(16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15);
|
||
|
var dk = function() {
|
||
|
this.next = null;
|
||
|
this.list = null
|
||
|
};
|
||
|
var dl = function() {
|
||
|
this.e = 0;
|
||
|
this.b = 0;
|
||
|
this.n = 0;
|
||
|
this.t = null
|
||
|
};
|
||
|
var dm = function(b, n, s, d, e, l) {
|
||
|
this.BMAX = 16;
|
||
|
this.N_MAX = 288;
|
||
|
this.status = 0;
|
||
|
this.root = null;
|
||
|
this.m = 0; {
|
||
|
var a;
|
||
|
var c = new Array(this.BMAX + 1);
|
||
|
var m;
|
||
|
var f;
|
||
|
var g;
|
||
|
var h;
|
||
|
var i;
|
||
|
var j;
|
||
|
var k;
|
||
|
var t = new Array(this.BMAX + 1);
|
||
|
var p;
|
||
|
var A;
|
||
|
var q;
|
||
|
var r = new dl();
|
||
|
var u = new Array(this.BMAX);
|
||
|
var v = new Array(this.N_MAX);
|
||
|
var w;
|
||
|
var x = new Array(this.BMAX + 1);
|
||
|
var B;
|
||
|
var y;
|
||
|
var z;
|
||
|
var o;
|
||
|
var C;
|
||
|
C = this.root = null;
|
||
|
for (i = 0; i < c.length; i++) c[i] = 0;
|
||
|
for (i = 0; i < t.length; i++) t[i] = 0;
|
||
|
for (i = 0; i < u.length; i++) u[i] = null;
|
||
|
for (i = 0; i < v.length; i++) v[i] = 0;
|
||
|
for (i = 0; i < x.length; i++) x[i] = 0;
|
||
|
m = n > 256 ? b[256] : this.BMAX;
|
||
|
p = b;
|
||
|
A = 0;
|
||
|
i = n;
|
||
|
do {
|
||
|
c[p[A]]++;
|
||
|
A++
|
||
|
} while (--i > 0);
|
||
|
if (c[0] == n) {
|
||
|
this.root = null;
|
||
|
this.m = 0;
|
||
|
this.status = 0;
|
||
|
return
|
||
|
}
|
||
|
for (j = 1; j <= this.BMAX; j++)
|
||
|
if (c[j] != 0) break;
|
||
|
k = j;
|
||
|
if (l < j) l = j;
|
||
|
for (i = this.BMAX; i != 0; i--)
|
||
|
if (c[i] != 0) break;
|
||
|
g = i;
|
||
|
if (l > i) l = i;
|
||
|
for (y = 1 << j; j < i; j++, y <<= 1)
|
||
|
if ((y -= c[j]) < 0) {
|
||
|
this.status = 2;
|
||
|
this.m = l;
|
||
|
return
|
||
|
}
|
||
|
if ((y -= c[i]) < 0) {
|
||
|
this.status = 2;
|
||
|
this.m = l;
|
||
|
return
|
||
|
}
|
||
|
c[i] += y;
|
||
|
x[1] = j = 0;
|
||
|
p = c;
|
||
|
A = 1;
|
||
|
B = 2;
|
||
|
while (--i > 0) x[B++] = (j += p[A++]);
|
||
|
p = b;
|
||
|
A = 0;
|
||
|
i = 0;
|
||
|
do {
|
||
|
if ((j = p[A++]) != 0) v[x[j]++] = i
|
||
|
} while (++i < n);
|
||
|
n = x[g];
|
||
|
x[0] = i = 0;
|
||
|
p = v;
|
||
|
A = 0;
|
||
|
h = -1;
|
||
|
w = t[0] = 0;
|
||
|
q = null;
|
||
|
z = 0;
|
||
|
for (; k <= g; k++) {
|
||
|
a = c[k];
|
||
|
while (a-- > 0) {
|
||
|
while (k > w + t[1 + h]) {
|
||
|
w += t[1 + h];
|
||
|
h++;
|
||
|
z = (z = g - w) > l ? l : z;
|
||
|
if ((f = 1 << (j = k - w)) > a + 1) {
|
||
|
f -= a + 1;
|
||
|
B = k;
|
||
|
while (++j < z) {
|
||
|
if ((f <<= 1) <= c[++B]) break;
|
||
|
f -= c[B]
|
||
|
}
|
||
|
}
|
||
|
if (w + j > m && w < m) j = m - w;
|
||
|
z = 1 << j;
|
||
|
t[1 + h] = j;
|
||
|
q = new Array(z);
|
||
|
for (o = 0; o < z; o++) {
|
||
|
q[o] = new dl()
|
||
|
}
|
||
|
if (C == null) C = this.root = new dk();
|
||
|
else C = C.next = new dk();
|
||
|
C.next = null;
|
||
|
C.list = q;
|
||
|
u[h] = q;
|
||
|
if (h > 0) {
|
||
|
x[h] = i;
|
||
|
r.b = t[h];
|
||
|
r.e = 16 + j;
|
||
|
r.t = q;
|
||
|
j = (i & ((1 << w) - 1)) >> (w - t[h]);
|
||
|
u[h - 1][j].e = r.e;
|
||
|
u[h - 1][j].b = r.b;
|
||
|
u[h - 1][j].n = r.n;
|
||
|
u[h - 1][j].t = r.t
|
||
|
}
|
||
|
}
|
||
|
r.b = k - w;
|
||
|
if (A >= n) r.e = 99;
|
||
|
else if (p[A] < s) {
|
||
|
r.e = (p[A] < 256 ? 16 : 15);
|
||
|
r.n = p[A++]
|
||
|
} else {
|
||
|
r.e = e[p[A] - s];
|
||
|
r.n = d[p[A++] - s]
|
||
|
}
|
||
|
f = 1 << (k - w);
|
||
|
for (j = i >> w; j < z; j += f) {
|
||
|
q[j].e = r.e;
|
||
|
q[j].b = r.b;
|
||
|
q[j].n = r.n;
|
||
|
q[j].t = r.t
|
||
|
}
|
||
|
for (j = 1 << (k - 1);
|
||
|
(i & j) != 0; j >>= 1) i ^= j;
|
||
|
i ^= j;
|
||
|
while ((i & ((1 << w) - 1)) != x[h]) {
|
||
|
w -= t[h];
|
||
|
h--
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
this.m = t[1];
|
||
|
this.status = ((y != 0 && g != 1) ? 1 : 0)
|
||
|
}
|
||
|
};
|
||
|
var dn = function() {
|
||
|
if (Y.length == Z) return -1;
|
||
|
return Y[Z++]
|
||
|
};
|
||
|
var dp = function(n) {
|
||
|
while (R < n) {
|
||
|
Q |= dn() << R;
|
||
|
R += 8
|
||
|
}
|
||
|
};
|
||
|
var dq = function(n) {
|
||
|
return Q & de[n]
|
||
|
};
|
||
|
var dr = function(n) {
|
||
|
Q >>= n;
|
||
|
R -= n
|
||
|
};
|
||
|
var ds = function(a, b, c) {
|
||
|
var e;
|
||
|
var t;
|
||
|
var n;
|
||
|
if (c == 0) return 0;
|
||
|
n = 0;
|
||
|
for (;;) {
|
||
|
dp(X);
|
||
|
t = W.list[dq(X)];
|
||
|
e = t.e;
|
||
|
while (e > 16) {
|
||
|
if (e == 99) return -1;
|
||
|
dr(t.b);
|
||
|
e -= 16;
|
||
|
dp(e);
|
||
|
t = t.t[dq(e)];
|
||
|
e = t.e
|
||
|
}
|
||
|
dr(t.b);
|
||
|
if (e == 16) {
|
||
|
M &= D - 1;
|
||
|
a[b + n++] = L[M++] = t.n;
|
||
|
if (n == c) return c;
|
||
|
continue
|
||
|
}
|
||
|
if (e == 15) break;
|
||
|
dp(e);
|
||
|
U = t.n + dq(e);
|
||
|
dr(e);
|
||
|
dp(zip_bd);
|
||
|
t = zip_td.list[dq(zip_bd)];
|
||
|
e = t.e;
|
||
|
while (e > 16) {
|
||
|
if (e == 99) return -1;
|
||
|
dr(t.b);
|
||
|
e -= 16;
|
||
|
dp(e);
|
||
|
t = t.t[dq(e)];
|
||
|
e = t.e
|
||
|
}
|
||
|
dr(t.b);
|
||
|
dp(e);
|
||
|
V = M - t.n - dq(e);
|
||
|
dr(e);
|
||
|
while (U > 0 && n < c) {
|
||
|
U--;
|
||
|
V &= D - 1;
|
||
|
M &= D - 1;
|
||
|
a[b + n++] = L[M++] = L[V++]
|
||
|
}
|
||
|
if (n == c) return c
|
||
|
}
|
||
|
S = -1;
|
||
|
return n
|
||
|
};
|
||
|
var dt = function(a, b, c) {
|
||
|
var n;
|
||
|
n = R & 7;
|
||
|
dr(n);
|
||
|
dp(16);
|
||
|
n = dq(16);
|
||
|
dr(16);
|
||
|
dp(16);
|
||
|
if (n != ((~Q) & 0xffff)) return -1;
|
||
|
dr(16);
|
||
|
U = n;
|
||
|
n = 0;
|
||
|
while (U > 0 && n < c) {
|
||
|
U--;
|
||
|
M &= D - 1;
|
||
|
dp(8);
|
||
|
a[b + n++] = L[M++] = dq(8);
|
||
|
dr(8)
|
||
|
}
|
||
|
if (U == 0) S = -1;
|
||
|
return n
|
||
|
};
|
||
|
var du = function(a, b, c) {
|
||
|
if (N == null) {
|
||
|
var i;
|
||
|
var l = new Array(288);
|
||
|
var h;
|
||
|
for (i = 0; i < 144; i++) l[i] = 8;
|
||
|
for (; i < 256; i++) l[i] = 9;
|
||
|
for (; i < 280; i++) l[i] = 7;
|
||
|
for (; i < 288; i++) l[i] = 8;
|
||
|
P = 7;
|
||
|
h = new dm(l, 288, 257, df, dg, P);
|
||
|
if (h.status != 0) {
|
||
|
alert("HufBuild error: " + h.status);
|
||
|
return -1
|
||
|
}
|
||
|
N = h.root;
|
||
|
P = h.m;
|
||
|
for (i = 0; i < 30; i++) l[i] = 5;
|
||
|
var d = 5;
|
||
|
h = new dm(l, 30, 0, dh, di, d);
|
||
|
if (h.status > 1) {
|
||
|
N = null;
|
||
|
alert("HufBuild error: " + h.status);
|
||
|
return -1
|
||
|
}
|
||
|
O = h.root;
|
||
|
d = h.m
|
||
|
}
|
||
|
W = N;
|
||
|
zip_td = O;
|
||
|
X = P;
|
||
|
zip_bd = d;
|
||
|
return ds(a, b, c)
|
||
|
};
|
||
|
var dv = function(a, b, c) {
|
||
|
var i;
|
||
|
var j;
|
||
|
var l;
|
||
|
var n;
|
||
|
var t;
|
||
|
var d;
|
||
|
var e;
|
||
|
var f;
|
||
|
var g = new Array(286 + 30);
|
||
|
var h;
|
||
|
for (i = 0; i < g.length; i++) g[i] = 0;
|
||
|
dp(5);
|
||
|
e = 257 + dq(5);
|
||
|
dr(5);
|
||
|
dp(5);
|
||
|
f = 1 + dq(5);
|
||
|
dr(5);
|
||
|
dp(4);
|
||
|
d = 4 + dq(4);
|
||
|
dr(4);
|
||
|
if (e > 286 || f > 30) return -1;
|
||
|
for (j = 0; j < d; j++) {
|
||
|
dp(3);
|
||
|
g[dj[j]] = dq(3);
|
||
|
dr(3)
|
||
|
}
|
||
|
for (; j < 19; j++) g[dj[j]] = 0;
|
||
|
X = 7;
|
||
|
h = new dm(g, 19, 19, null, null, X);
|
||
|
if (h.status != 0) return -1;
|
||
|
W = h.root;
|
||
|
X = h.m;
|
||
|
n = e + f;
|
||
|
i = l = 0;
|
||
|
while (i < n) {
|
||
|
dp(X);
|
||
|
t = W.list[dq(X)];
|
||
|
j = t.b;
|
||
|
dr(j);
|
||
|
j = t.n;
|
||
|
if (j < 16) g[i++] = l = j;
|
||
|
else if (j == 16) {
|
||
|
dp(2);
|
||
|
j = 3 + dq(2);
|
||
|
dr(2);
|
||
|
if (i + j > n) return -1;
|
||
|
while (j-- > 0) g[i++] = l
|
||
|
} else if (j == 17) {
|
||
|
dp(3);
|
||
|
j = 3 + dq(3);
|
||
|
dr(3);
|
||
|
if (i + j > n) return -1;
|
||
|
while (j-- > 0) g[i++] = 0;
|
||
|
l = 0
|
||
|
} else {
|
||
|
dp(7);
|
||
|
j = 11 + dq(7);
|
||
|
dr(7);
|
||
|
if (i + j > n) return -1;
|
||
|
while (j-- > 0) g[i++] = 0;
|
||
|
l = 0
|
||
|
}
|
||
|
}
|
||
|
X = H;
|
||
|
h = new dm(g, e, 257, df, dg, X);
|
||
|
if (X == 0) h.status = 1;
|
||
|
if (h.status != 0) {
|
||
|
if (h.status == 1);
|
||
|
return -1
|
||
|
}
|
||
|
W = h.root;
|
||
|
X = h.m;
|
||
|
for (i = 0; i < f; i++) g[i] = g[i + e];
|
||
|
zip_bd = I;
|
||
|
h = new dm(g, f, 0, dh, di, zip_bd);
|
||
|
zip_td = h.root;
|
||
|
zip_bd = h.m;
|
||
|
if (zip_bd == 0 && e > 257) {
|
||
|
return -1
|
||
|
}
|
||
|
if (h.status == 1) {}
|
||
|
if (h.status != 0) return -1;
|
||
|
return ds(a, b, c)
|
||
|
};
|
||
|
var dw = function() {
|
||
|
var i;
|
||
|
if (L == null) L = new Array(2 * D);
|
||
|
M = 0;
|
||
|
Q = 0;
|
||
|
R = 0;
|
||
|
S = -1;
|
||
|
T = false;
|
||
|
U = V = 0;
|
||
|
W = null
|
||
|
};
|
||
|
var dx = function(a, b, c) {
|
||
|
var n, i;
|
||
|
n = 0;
|
||
|
while (n < c) {
|
||
|
if (T && S == -1) return n;
|
||
|
if (U > 0) {
|
||
|
if (S != E) {
|
||
|
while (U > 0 && n < c) {
|
||
|
U--;
|
||
|
V &= D - 1;
|
||
|
M &= D - 1;
|
||
|
a[b + n++] = L[M++] = L[V++]
|
||
|
}
|
||
|
} else {
|
||
|
while (U > 0 && n < c) {
|
||
|
U--;
|
||
|
M &= D - 1;
|
||
|
dp(8);
|
||
|
a[b + n++] = L[M++] = dq(8);
|
||
|
dr(8)
|
||
|
}
|
||
|
if (U == 0) S = -1
|
||
|
}
|
||
|
if (n == c) return n
|
||
|
}
|
||
|
if (S == -1) {
|
||
|
if (T) break;
|
||
|
dp(1);
|
||
|
if (dq(1) != 0) T = true;
|
||
|
dr(1);
|
||
|
dp(2);
|
||
|
S = dq(2);
|
||
|
dr(2);
|
||
|
W = null;
|
||
|
U = 0
|
||
|
}
|
||
|
switch (S) {
|
||
|
case 0:
|
||
|
i = dt(a, b + n, c - n);
|
||
|
break;
|
||
|
case 1:
|
||
|
if (W != null) i = ds(a, b + n, c - n);
|
||
|
else i = du(a, b + n, c - n);
|
||
|
break;
|
||
|
case 2:
|
||
|
if (W != null) i = ds(a, b + n, c - n);
|
||
|
else i = dv(a, b + n, c - n);
|
||
|
break;
|
||
|
default:
|
||
|
i = -1;
|
||
|
break
|
||
|
}
|
||
|
if (i == -1) {
|
||
|
if (T) return 0;
|
||
|
return -1
|
||
|
}
|
||
|
n += i
|
||
|
}
|
||
|
return n
|
||
|
};
|
||
|
var dy = function(a) {
|
||
|
var i, j;
|
||
|
dw();
|
||
|
Y = a;
|
||
|
Z = 0;
|
||
|
var b = [0];
|
||
|
var c = [];
|
||
|
while ((i = dx(b, 0, b.length)) > 0) {
|
||
|
c.push(b[0])
|
||
|
}
|
||
|
Y = null;
|
||
|
return c
|
||
|
};
|
||
|
return dy
|
||
|
})();
|
||
|
var fj = function(c) {
|
||
|
var a = 1,
|
||
|
b = 0;
|
||
|
var i;
|
||
|
var d = c.length;
|
||
|
var e = 65521;
|
||
|
for (i = 0; i < d; i += 1) {
|
||
|
a = (a + c[i]) % e;
|
||
|
b = (b + a) % e
|
||
|
}
|
||
|
return (b << 16) | a
|
||
|
};
|
||
|
var fk = function(a, b) {
|
||
|
var i;
|
||
|
var c = fj(a);
|
||
|
var d = dd(a, b);
|
||
|
a = d;
|
||
|
a.unshift(0x78, 0xDA);
|
||
|
for (i = 0; i < 4; ++i) a.push(c >> i * 8 & 25);
|
||
|
return a
|
||
|
};
|
||
|
var fl = function(a) {
|
||
|
if (a.length < 6) {
|
||
|
throw "DataError: Not enough input";
|
||
|
}
|
||
|
var b = fi(a.slice(2, a.length - 4));
|
||
|
if (a.length > 6 && b.length === 0) {
|
||
|
throw "DataError: Unable to inflate the data";
|
||
|
}
|
||
|
return b
|
||
|
};
|
||
|
return {
|
||
|
'deflate': dd,
|
||
|
'inflate': fi,
|
||
|
'compress': fk,
|
||
|
'uncompress': fl
|
||
|
}
|
||
|
})();
|
||
|
var char = 0,
|
||
|
short = 0,
|
||
|
int = 0,
|
||
|
long = 0,
|
||
|
void_ = 0;
|
||
|
var int8_t = char;
|
||
|
var uint8_t = char;
|
||
|
var int16_t = short;
|
||
|
var uint16_t = short;
|
||
|
var int32_t = int;
|
||
|
var uint32_t = int;
|
||
|
var uint64_t = long;
|
||
|
var int64_t = long;
|
||
|
var float = 0.00;
|
||
|
var size_t = 0;
|
||
|
var double = 0;
|
||
|
var score_t = int64_t;
|
||
|
|
||
|
function cloneObjAttr(a) {
|
||
|
if (a instanceof Array) {
|
||
|
return a
|
||
|
}
|
||
|
if (a instanceof Object) {
|
||
|
var b = {};
|
||
|
for (var c in a) {
|
||
|
if (a.hasOwnProperty(c) && !(a instanceof Array)) b[c] = (a[c])
|
||
|
}
|
||
|
return b
|
||
|
}
|
||
|
throw new alert("Unable to copy obj! Its type isn't supported.");
|
||
|
}
|
||
|
|
||
|
function newObjectIt(a) {
|
||
|
return JSON.parse(JSON.stringify(a))
|
||
|
}
|
||
|
|
||
|
function convertBinaryToArray(a) {
|
||
|
var b = new Array();
|
||
|
var c = a.length;
|
||
|
for (i = 0; i < c; ++i) b.push(a.charCodeAt(i));
|
||
|
return b
|
||
|
}
|
||
|
|
||
|
function int64BitLeft(a, b) {
|
||
|
var c = new Array();
|
||
|
var i;
|
||
|
for (i = 0; i < b; ++i) c[i] = '0';
|
||
|
bits = (a.toString(2) + '' + c.join(""));
|
||
|
return parseInt(bits, 2)
|
||
|
}
|
||
|
|
||
|
function write32BitIn4Bytes(a, b, c) {
|
||
|
var i;
|
||
|
for (i = 3; i >= 0; --i) a[b + (3 - i)] = (c >> (8 * i)) & 0xff
|
||
|
}
|
||
|
|
||
|
function write4BytesIn32Bit(a, b) {
|
||
|
return ((a[b + 0] << 24) | (a[b + 1] << 16) | (a[b + 2] << 8) | a[b + 3])
|
||
|
}
|
||
|
|
||
|
function alert32BitIn4Bytes(a) {
|
||
|
var i, str = '';
|
||
|
for (i = 3; i >= 0; --i) str += ' ' + ((a >> (8 * i)) & 0xff);
|
||
|
alert(str)
|
||
|
}
|
||
|
|
||
|
function Byte2Hex(a) {
|
||
|
return '0x' + a.toString(16)
|
||
|
}
|
||
|
|
||
|
function memcpy(a, b, c, d, e) {
|
||
|
if (typeof a != 'string') {
|
||
|
for (i = 0; i < e; ++i) a[b + i] = c[d + i]
|
||
|
} else {
|
||
|
if (b > 0) alert('string offset is over 0');
|
||
|
a = c.slice(d, e);
|
||
|
return a
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function memcpy2(a, b, c, d, e) {
|
||
|
var f = c.slice(0, d);
|
||
|
var g = c.slice(d, d + e);
|
||
|
var h = c.slice(d + e);
|
||
|
a.splice(0);
|
||
|
a.concat(f, g, h)
|
||
|
}
|
||
|
|
||
|
function memcpyArrM(b, c, d, e, f) {
|
||
|
for (i = 0; i < f; ++i) {
|
||
|
var g = b[c + i].length;
|
||
|
for (var a = 0; a < g; ++a) b[c + i][a] = d[e + i][a]
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function ArrCopy(a) {
|
||
|
var b = new Array();
|
||
|
var c = a.length;
|
||
|
for (i = 0; i < c; ++i) {
|
||
|
b.push(a[i])
|
||
|
}
|
||
|
return b
|
||
|
}
|
||
|
|
||
|
function memset_wl(a, b) {
|
||
|
var c = new Array();
|
||
|
c.push(newObjectIt(a));
|
||
|
for (i = 0; i < b; ++i) c.push(newObjectIt(a));
|
||
|
c.push(0);
|
||
|
return c
|
||
|
}
|
||
|
|
||
|
function memset(a, b) {
|
||
|
var c = new Array();
|
||
|
for (i = 0; i < b; ++i) c.push(a);
|
||
|
c.push(0);
|
||
|
return c
|
||
|
}
|
||
|
|
||
|
function membuild_wl(a, b) {
|
||
|
var c = new Array();
|
||
|
c.push(newObjectIt(a));
|
||
|
for (i = 0; i < b; ++i) c.push(newObjectIt(a));
|
||
|
c.push(0);
|
||
|
return c
|
||
|
}
|
||
|
|
||
|
function membuild(a, b) {
|
||
|
var c = new Array();
|
||
|
for (i = 0; i < b; ++i) c.push(a);
|
||
|
c.push(0);
|
||
|
return c
|
||
|
}
|
||
|
|
||
|
function memset_(a, b, c, d) {
|
||
|
for (i = 0; i < d; ++i) a[b + i] = c
|
||
|
}
|
||
|
|
||
|
function malloc(a, b) {
|
||
|
var c = new Array();
|
||
|
for (i = 0; i < a; ++i) c.push(b);
|
||
|
c.push(0);
|
||
|
return c
|
||
|
}
|
||
|
|
||
|
function mallocStr(a, b) {
|
||
|
var c = new Array();
|
||
|
for (i = 0; i < a; ++i) c.push(' ');
|
||
|
return c.join("")
|
||
|
}
|
||
|
|
||
|
function sizeof(a) {
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function memcmp(a, b, s, c) {
|
||
|
var w = '';
|
||
|
for (i = 0; i < c; ++i) w += String.fromCharCode(a[b + i]);
|
||
|
if (s == w) return 0;
|
||
|
else return 1
|
||
|
}
|
||
|
|
||
|
function Arr(a, b) {
|
||
|
var c = new Array();
|
||
|
for (i = 0; i < a; ++i) c.push(b);
|
||
|
return c
|
||
|
}
|
||
|
|
||
|
function Arr_nOI(a, b) {
|
||
|
var c = new Array();
|
||
|
for (i = 0; i < a; ++i) c.push(newObjectIt(b));
|
||
|
return c
|
||
|
}
|
||
|
|
||
|
function ArrM(b, c) {
|
||
|
var d, resStr = new Array();
|
||
|
for (a = (b.length - 1); a >= 0; --a) c = newObjectIt(Arr(b[a], c));
|
||
|
return c
|
||
|
}
|
||
|
|
||
|
function assert(a) {
|
||
|
if (!a) {
|
||
|
throw new Error('assert :P');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function WebPDecoder() {
|
||
|
var N = 0x0002;
|
||
|
var O = 0,
|
||
|
MODE_RGBA = 1,
|
||
|
MODE_BGR = 2,
|
||
|
MODE_BGRA = 3,
|
||
|
MODE_ARGB = 4,
|
||
|
MODE_RGBA_4444 = 5,
|
||
|
MODE_RGB_565 = 6,
|
||
|
MODE_YUV = 7,
|
||
|
MODE_YUVA = 8,
|
||
|
MODE_LAST = 9;
|
||
|
this.WEBP_CSP_MODE = {
|
||
|
MODE_RGB: 0,
|
||
|
MODE_RGBA: 1,
|
||
|
MODE_BGR: 2,
|
||
|
MODE_BGRA: 3,
|
||
|
MODE_ARGB: 4,
|
||
|
MODE_RGBA_4444: 5,
|
||
|
MODE_RGB_565: 6,
|
||
|
MODE_YUV: 7,
|
||
|
MODE_YUVA: 8,
|
||
|
MODE_LAST: 9
|
||
|
};
|
||
|
var P = {
|
||
|
rgba: uint8_t,
|
||
|
rgba_off: 0,
|
||
|
stride: int,
|
||
|
size: int
|
||
|
};
|
||
|
var Q = {
|
||
|
y: uint8_t,
|
||
|
u: uint8_t,
|
||
|
v: uint8_t,
|
||
|
a: uint8_t,
|
||
|
y_off: uint8_t,
|
||
|
u_off: uint8_t,
|
||
|
v_off: uint8_t,
|
||
|
a_off: uint8_t,
|
||
|
y_stride: int,
|
||
|
u_stride: int,
|
||
|
v_stride: int,
|
||
|
a_stride: int,
|
||
|
y_size: int,
|
||
|
u_size: int,
|
||
|
v_size: int,
|
||
|
a_size: int
|
||
|
};
|
||
|
var R = {
|
||
|
colorspace: 'WEBP_CSP_MODE',
|
||
|
width: int,
|
||
|
height: int,
|
||
|
is_external_memory: int,
|
||
|
u: {
|
||
|
RGBA: P,
|
||
|
YUVA: Q
|
||
|
},
|
||
|
private_memory: null,
|
||
|
private_memory_off: uint8_t
|
||
|
};
|
||
|
|
||
|
function WebPInitDecBuffer(a) {
|
||
|
return WebPInitDecBufferInternal(a, N)
|
||
|
}
|
||
|
var T = 0,
|
||
|
VP8_STATUS_OUT_OF_MEMORY = 1,
|
||
|
VP8_STATUS_INVALID_PARAM = 2,
|
||
|
VP8_STATUS_BITSTREAM_ERROR = 3,
|
||
|
VP8_STATUS_UNSUPPORTED_FEATURE = 4,
|
||
|
VP8_STATUS_SUSPENDED = 5,
|
||
|
VP8_STATUS_USER_ABORT = 6,
|
||
|
VP8_STATUS_NOT_ENOUGH_DATA = 7;
|
||
|
this.VP8StatusCode = {
|
||
|
VP8_STATUS_OK: 0,
|
||
|
VP8_STATUS_OUT_OF_MEMORY: 1,
|
||
|
VP8_STATUS_INVALID_PARAM: 2,
|
||
|
VP8_STATUS_BITSTREAM_ERROR: 3,
|
||
|
VP8_STATUS_UNSUPPORTED_FEATURE: 4,
|
||
|
VP8_STATUS_SUSPENDED: 5,
|
||
|
VP8_STATUS_USER_ABORT: 6,
|
||
|
VP8_STATUS_NOT_ENOUGH_DATA: 7
|
||
|
};
|
||
|
var U = {
|
||
|
width: {
|
||
|
value: int
|
||
|
},
|
||
|
height: {
|
||
|
value: int
|
||
|
},
|
||
|
has_alpha: {
|
||
|
value: int
|
||
|
},
|
||
|
no_incremental_decoding: int,
|
||
|
rotate: int,
|
||
|
uv_sampling: int,
|
||
|
bitstream_version: int
|
||
|
};
|
||
|
this.WebPGetFeatures = function(a, b, c) {
|
||
|
return WebPGetFeaturesInternal(a, b, c, N)
|
||
|
};
|
||
|
var V = {
|
||
|
bypass_filtering: int,
|
||
|
no_fancy_upsampling: int,
|
||
|
use_cropping: int,
|
||
|
crop_left: int,
|
||
|
crop_top: int,
|
||
|
crop_width: int,
|
||
|
crop_height: int,
|
||
|
use_scaling: int,
|
||
|
scaled_width: int,
|
||
|
scaled_height: int,
|
||
|
force_rotation: int,
|
||
|
no_enhancement: int,
|
||
|
use_threads: int
|
||
|
};
|
||
|
this.WebPDecoderConfig = {
|
||
|
input: newObjectIt(U),
|
||
|
output: newObjectIt(R),
|
||
|
options: newObjectIt(V)
|
||
|
};
|
||
|
this.WebPInitDecoderConfig = function(a) {
|
||
|
return WebPInitDecoderConfigInternal(a, N)
|
||
|
};
|
||
|
var Y = {
|
||
|
width: int,
|
||
|
height: int,
|
||
|
mb_y: int,
|
||
|
mb_w: int,
|
||
|
mb_h: int,
|
||
|
y: uint8_t,
|
||
|
u: uint8_t,
|
||
|
v: uint8_t,
|
||
|
y_off: 0,
|
||
|
u_off: 0,
|
||
|
v_off: 0,
|
||
|
y_stride: int,
|
||
|
uv_stride: int,
|
||
|
opaque: void_,
|
||
|
put: 0,
|
||
|
setup: 0,
|
||
|
teardown: 0,
|
||
|
fancy_upsampling: int,
|
||
|
data_size: uint32_t,
|
||
|
data: uint8_t,
|
||
|
data_off: 0,
|
||
|
bypass_filtering: int,
|
||
|
use_cropping: int,
|
||
|
crop_left: int,
|
||
|
crop_right: int,
|
||
|
crop_top: int,
|
||
|
crop_bottom: int,
|
||
|
use_scaling: int,
|
||
|
scaled_width: int,
|
||
|
scaled_height: int,
|
||
|
a: uint8_t,
|
||
|
a_off: 0
|
||
|
};
|
||
|
|
||
|
function VP8InitIo(a) {
|
||
|
return VP8InitIoInternal(a, N)
|
||
|
};
|
||
|
var Z = {
|
||
|
x_expand: int,
|
||
|
fy_scale: int,
|
||
|
fx_scale: int,
|
||
|
fxy_scale: int64_t,
|
||
|
y_accum: int,
|
||
|
y_add: int,
|
||
|
y_sub: int,
|
||
|
x_add: int,
|
||
|
x_sub: int,
|
||
|
src_width: int,
|
||
|
src_height: int,
|
||
|
dst_width: int,
|
||
|
dst_height: int,
|
||
|
dst: uint8_t,
|
||
|
dst_off: 0,
|
||
|
dst_stride: int,
|
||
|
irow: int32_t,
|
||
|
irow_off: 0,
|
||
|
frow: int32_t,
|
||
|
frow_off: 0
|
||
|
};
|
||
|
var ba = {
|
||
|
output: newObjectIt(R),
|
||
|
tmp_y: uint8_t,
|
||
|
tmp_u: uint8_t,
|
||
|
tmp_v: uint8_t,
|
||
|
tmp_y_off: 0,
|
||
|
tmp_u_off: 0,
|
||
|
tmp_v_off: 0,
|
||
|
last_y: int,
|
||
|
options_: newObjectIt(V),
|
||
|
scaler_y: newObjectIt(Z),
|
||
|
scaler_u: newObjectIt(Z),
|
||
|
scaler_v: newObjectIt(Z),
|
||
|
scaler_a: newObjectIt(Z),
|
||
|
memory: void_,
|
||
|
emit: '(OutputFunc)',
|
||
|
emit_alpha: '(OutputFunc)'
|
||
|
};
|
||
|
var bb = {
|
||
|
buf_: uint8_t,
|
||
|
buf_off: null,
|
||
|
buf_end_: uint8_t,
|
||
|
eof_: int,
|
||
|
range_: uint32_t,
|
||
|
value_: uint32_t,
|
||
|
missing_: int
|
||
|
};
|
||
|
|
||
|
function VP8Get(a) {
|
||
|
return VP8GetValue(a, 1)
|
||
|
};
|
||
|
|
||
|
function VP8GetByte(a) {
|
||
|
assert(a);
|
||
|
if (a.buf_off < a.buf_end_) {
|
||
|
assert(a.buf_);
|
||
|
return (a.buf_[a.buf_off++])
|
||
|
}
|
||
|
a.eof_ = 1;
|
||
|
return 0xff
|
||
|
}
|
||
|
|
||
|
function VP8BitUpdate(a, b) {
|
||
|
var c = uint32_t;
|
||
|
var d = (b + 1) << 8;
|
||
|
if (a.missing_ > 0) {
|
||
|
a.value_ |= VP8GetByte(a) << a.missing_;
|
||
|
a.missing_ -= 8
|
||
|
}
|
||
|
c = (a.value_ >= d) + 0;
|
||
|
if (c) {
|
||
|
a.range_ -= b + 1;
|
||
|
a.value_ -= d
|
||
|
} else {
|
||
|
a.range_ = b
|
||
|
}
|
||
|
return c
|
||
|
}
|
||
|
|
||
|
function VP8Shift(a) {
|
||
|
var b = bc[a.range_];
|
||
|
a.range_ = bd[a.range_];
|
||
|
a.value_ <<= b;
|
||
|
a.missing_ += b
|
||
|
};
|
||
|
|
||
|
function VP8GetBit(a, b) {
|
||
|
var c = (a.range_ * b) >> 8;
|
||
|
var d = VP8BitUpdate(a, c);
|
||
|
if (a.range_ < 0x7f) {
|
||
|
VP8Shift(a)
|
||
|
}
|
||
|
return d
|
||
|
};
|
||
|
|
||
|
function VP8GetSigned(a, v) {
|
||
|
var b = a.range_ >> 1;
|
||
|
var c = VP8BitUpdate(a, b);
|
||
|
VP8Shift(a);
|
||
|
return c ? -v : v
|
||
|
};
|
||
|
|
||
|
function VP8InitBitReader(a, b, c, d) {
|
||
|
assert(a);
|
||
|
assert(b);
|
||
|
assert(d);
|
||
|
a.range_ = 255 - 1;
|
||
|
a.buf_ = b;
|
||
|
a.buf_off = c;
|
||
|
a.buf_end_ = d;
|
||
|
a.value_ = 0;
|
||
|
a.missing_ = 8;
|
||
|
a.eof_ = 0
|
||
|
};
|
||
|
var bc = new Array(7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0);
|
||
|
var bd = new Array(127, 127, 191, 127, 159, 191, 223, 127, 143, 159, 175, 191, 207, 223, 239, 127, 135, 143, 151, 159, 167, 175, 183, 191, 199, 207, 215, 223, 231, 239, 247, 127, 131, 135, 139, 143, 147, 151, 155, 159, 163, 167, 171, 175, 179, 183, 187, 191, 195, 199, 203, 207, 211, 215, 219, 223, 227, 231, 235, 239, 243, 247, 251, 127, 129, 131, 133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 177, 179, 181, 183, 185, 187, 189, 191, 193, 195, 197, 199, 201, 203, 205, 207, 209, 211, 213, 215, 217, 219, 221, 223, 225, 227, 229, 231, 233, 235, 237, 239, 241, 243, 245, 247, 249, 251, 253, 127);
|
||
|
|
||
|
function VP8GetValue(a, b) {
|
||
|
var v = 0;
|
||
|
while (b-- > 0) {
|
||
|
v |= VP8GetBit(a, 0x80) << b
|
||
|
}
|
||
|
return v
|
||
|
};
|
||
|
|
||
|
function VP8GetSignedValue(a, b) {
|
||
|
var c = VP8GetValue(a, b);
|
||
|
return VP8Get(a) ? -c : c
|
||
|
};
|
||
|
var be = 0;
|
||
|
var bf = 1;
|
||
|
var bg = 2;
|
||
|
var bh = 0,
|
||
|
B_TM_PRED = 1,
|
||
|
B_VE_PRED = 2,
|
||
|
B_HE_PRED = 3,
|
||
|
B_RD_PRED = 4,
|
||
|
B_VR_PRED = 5,
|
||
|
B_LD_PRED = 6,
|
||
|
B_VL_PRED = 7,
|
||
|
B_HD_PRED = 8,
|
||
|
B_HU_PRED = 9,
|
||
|
NUM_BMODES = B_HU_PRED + 1 - bh,
|
||
|
DC_PRED = bh,
|
||
|
V_PRED = B_VE_PRED,
|
||
|
H_PRED = B_HE_PRED,
|
||
|
TM_PRED = B_TM_PRED,
|
||
|
B_PRED = NUM_BMODES,
|
||
|
B_DC_PRED_NOTOP = 4,
|
||
|
B_DC_PRED_NOLEFT = 5,
|
||
|
B_DC_PRED_NOTOPLEFT = 6,
|
||
|
NUM_B_DC_MODES = 7;
|
||
|
var bi = 3,
|
||
|
NUM_MB_SEGMENTS = 4,
|
||
|
NUM_REF_LF_DELTAS = 4,
|
||
|
NUM_MODE_LF_DELTAS = 4,
|
||
|
MAX_NUM_PARTITIONS = 8,
|
||
|
NUM_TYPES = 4,
|
||
|
NUM_BANDS = 8,
|
||
|
NUM_CTX = 3,
|
||
|
NUM_PROBAS = 11,
|
||
|
NUM_MV_PROBAS = 19;
|
||
|
var bj = 32;
|
||
|
var bk = (bj * 17 + bj * 9);
|
||
|
var bl = (bj * 17);
|
||
|
var bm = (bj * 1 + 8);
|
||
|
var bn = (bm + bj * 16 + bj);
|
||
|
var bo = (bn + 16);
|
||
|
var bp = {
|
||
|
key_frame_: uint8_t,
|
||
|
profile_: uint8_t,
|
||
|
show_: uint8_t,
|
||
|
partition_length_: uint32_t
|
||
|
};
|
||
|
var bq = {
|
||
|
width_: uint16_t,
|
||
|
height_: uint16_t,
|
||
|
xscale_: uint8_t,
|
||
|
yscale_: uint8_t,
|
||
|
colorspace_: uint8_t,
|
||
|
clamp_type_: uint8_t
|
||
|
};
|
||
|
var bs = {
|
||
|
use_segment_: int,
|
||
|
update_map_: int,
|
||
|
absolute_delta_: int,
|
||
|
quantizer_: Arr(NUM_MB_SEGMENTS, int8_t),
|
||
|
filter_strength_: Arr(NUM_MB_SEGMENTS, int8_t)
|
||
|
};
|
||
|
var bt = {
|
||
|
segments_: Arr(bi, uint8_t),
|
||
|
coeffs_: ArrM(new Array(NUM_TYPES, NUM_BANDS, NUM_CTX, NUM_PROBAS), uint8_t)
|
||
|
};
|
||
|
var bu = {
|
||
|
simple_: int,
|
||
|
level_: int,
|
||
|
sharpness_: int,
|
||
|
use_lf_delta_: int,
|
||
|
ref_lf_delta_: Arr(NUM_REF_LF_DELTAS, int),
|
||
|
mode_lf_delta_: Arr(NUM_REF_LF_DELTAS, int)
|
||
|
};
|
||
|
var bv = {
|
||
|
f_level_: int,
|
||
|
f_ilevel_: int,
|
||
|
f_inner_: int
|
||
|
};
|
||
|
var bw = {
|
||
|
nz_: int,
|
||
|
dc_nz_: int,
|
||
|
skip_: int
|
||
|
};
|
||
|
var bx = {
|
||
|
y1_mat_: Arr(2, uint16_t),
|
||
|
y2_mat_: Arr(2, uint16_t),
|
||
|
uv_mat_: Arr(2, uint16_t)
|
||
|
};
|
||
|
var by = {
|
||
|
id_: int,
|
||
|
mb_y_: int,
|
||
|
filter_row_: int,
|
||
|
f_info_: bv,
|
||
|
io_: Y
|
||
|
};
|
||
|
var bz = {
|
||
|
status_: 'VP8StatusCode',
|
||
|
ready_: int,
|
||
|
error_msg_: char,
|
||
|
br_: newObjectIt(bb),
|
||
|
frm_hdr_: newObjectIt(bp),
|
||
|
pic_hdr_: newObjectIt(bq),
|
||
|
filter_hdr_: newObjectIt(bu),
|
||
|
segment_hdr_: newObjectIt(bs),
|
||
|
worker_: 'WebPWorker',
|
||
|
use_threads_: int,
|
||
|
cache_id_: int,
|
||
|
num_caches_: int,
|
||
|
thread_ctx_: by,
|
||
|
mb_w_: int,
|
||
|
mb_h_: int,
|
||
|
tl_mb_x_: int,
|
||
|
tl_mb_y_: int,
|
||
|
br_mb_x_: int,
|
||
|
br_mb_y_: int,
|
||
|
num_parts_: int,
|
||
|
parts_: Arr_nOI(MAX_NUM_PARTITIONS, bb),
|
||
|
buffer_flags_: uint32_t,
|
||
|
dqm_: Arr_nOI(NUM_MB_SEGMENTS, bx),
|
||
|
proba_: newObjectIt(bt),
|
||
|
use_skip_proba_: int,
|
||
|
skip_p_: uint8_t,
|
||
|
intra_t_: uint8_t,
|
||
|
intra_l_: Arr(4, uint8_t),
|
||
|
y_t_: uint8_t,
|
||
|
u_t_: uint8_t,
|
||
|
v_t_: uint8_t,
|
||
|
mb_info_: newObjectIt(bw),
|
||
|
f_info_: newObjectIt(bv),
|
||
|
yuv_b_: uint8_t,
|
||
|
coeffs_: int16_t,
|
||
|
cache_y_: uint8_t,
|
||
|
cache_u_: uint8_t,
|
||
|
cache_v_: uint8_t,
|
||
|
cache_y_off: int,
|
||
|
cache_u_off: int,
|
||
|
cache_v_off: int,
|
||
|
cache_y_stride_: int,
|
||
|
cache_uv_stride_: int,
|
||
|
mem_: void_,
|
||
|
mem_size_: int,
|
||
|
mb_x_: int,
|
||
|
mb_y_: int,
|
||
|
is_i4x4_: uint8_t,
|
||
|
imodes_: Arr(16, uint8_t),
|
||
|
imodes_offset_: 0,
|
||
|
uvmode_: uint8_t,
|
||
|
segment_: uint8_t,
|
||
|
non_zero_: uint32_t,
|
||
|
non_zero_ac_: uint32_t,
|
||
|
filter_type_: int,
|
||
|
filter_row_: int,
|
||
|
filter_levels_: Arr(NUM_MB_SEGMENTS, uint8_t),
|
||
|
alpha_data_: uint8_t,
|
||
|
alpha_data_off: 0,
|
||
|
alpha_data_size_: size_t,
|
||
|
alpha_plane_: uint8_t,
|
||
|
alpha_plane_off: 0,
|
||
|
layer_colorspace_: int,
|
||
|
layer_data_: uint8_t,
|
||
|
layer_data_off: 0,
|
||
|
layer_data_size_: size_t
|
||
|
};
|
||
|
|
||
|
function VP8DecompressAlphaRows(a, b, c) {
|
||
|
var d = a.alpha_plane_;
|
||
|
var e = a.pic_hdr_.width_;
|
||
|
if (b < 0 || b + c > a.pic_hdr_.height_) {
|
||
|
return null
|
||
|
}
|
||
|
if (b == 0) {
|
||
|
var f = a.alpha_data_;
|
||
|
var g = a.alpha_data_off;
|
||
|
var h = a.alpha_data_size_;
|
||
|
var i = e * a.pic_hdr_.height_;
|
||
|
d = WebPZlib.uncompress(f.slice(g, g + h))
|
||
|
}
|
||
|
return (b == 0 ? d : (+b * e))
|
||
|
}
|
||
|
var bA = new Array(3, 4, 3, 4, 4, 2, 2, 1, 1);
|
||
|
|
||
|
function CheckDecBuffer(a) {
|
||
|
var b = 1;
|
||
|
var c = a.colorspace;
|
||
|
var d = a.width;
|
||
|
var e = a.height;
|
||
|
if (c >= MODE_YUV) {
|
||
|
var f = a.u.YUVA;
|
||
|
var g = f.y_stride * e;
|
||
|
var h = f.u_stride * parseInt((e + 1) / 2);
|
||
|
var i = f.v_stride * parseInt((e + 1) / 2);
|
||
|
var j = f.a_stride * e;
|
||
|
b &= (g <= f.y_size);
|
||
|
b &= (h <= f.u_size);
|
||
|
b &= (i <= f.v_size);
|
||
|
b &= (j <= f.a_size);
|
||
|
b &= (f.y_stride >= d);
|
||
|
b &= (f.u_stride >= parseInt(d + 1) / 2);
|
||
|
b &= (f.v_stride >= parseInt(d + 1) / 2);
|
||
|
if (f.a) {
|
||
|
b &= (f.a_stride >= d)
|
||
|
}
|
||
|
} else {
|
||
|
var f = a.u.RGBA;
|
||
|
b &= (f.stride * e <= f.size);
|
||
|
b &= (f.stride >= d * bA[c])
|
||
|
}
|
||
|
return b ? T : VP8_STATUS_INVALID_PARAM
|
||
|
}
|
||
|
|
||
|
function AllocateBuffer(a) {
|
||
|
var w = a.width;
|
||
|
var h = a.height;
|
||
|
if (w <= 0 || h <= 0) {
|
||
|
return VP8_STATUS_INVALID_PARAM
|
||
|
}
|
||
|
if (!a.is_external_memory && a.private_memory == null) {
|
||
|
var b = uint8_t;
|
||
|
var c = 0;
|
||
|
var d = a.colorspace;
|
||
|
var e = int;
|
||
|
var f = 0,
|
||
|
a_stride = 0;
|
||
|
var g = 0;
|
||
|
var i = uint64_t,
|
||
|
a_size = 0,
|
||
|
total_size = uint64_t;
|
||
|
e = w * bA[d];
|
||
|
i = e * h;
|
||
|
if (d >= MODE_YUV) {
|
||
|
f = parseInt((w + 1) / 2);
|
||
|
g = f * parseInt((h + 1) / 2);
|
||
|
if (d == MODE_YUVA) {
|
||
|
a_stride = w;
|
||
|
a_size = a_stride * h
|
||
|
}
|
||
|
}
|
||
|
total_size = i + 2 * g + a_size;
|
||
|
if ((total_size != total_size)) {
|
||
|
return VP8_STATUS_INVALID_PARAM
|
||
|
}
|
||
|
a.private_memory = b = malloc(total_size, size_t);
|
||
|
a.private_memory_off = c = 0;
|
||
|
if (b == null) {
|
||
|
return VP8_STATUS_OUT_OF_MEMORY
|
||
|
}
|
||
|
if (d >= MODE_YUV) {
|
||
|
var j = a.u.YUVA;
|
||
|
j.y = b;
|
||
|
j.y_off = c;
|
||
|
j.y_stride = e;
|
||
|
j.y_size = i;
|
||
|
j.u = b;
|
||
|
j.u_off = c + i;
|
||
|
j.u_stride = f;
|
||
|
j.u_size = g;
|
||
|
j.v = b;
|
||
|
j.v_off = c + i + g;
|
||
|
j.v_stride = f;
|
||
|
j.v_size = g;
|
||
|
if (d == MODE_YUVA) {
|
||
|
j.a = b;
|
||
|
j.a_off = c + i + 2 * g
|
||
|
}
|
||
|
j.a_size = a_size;
|
||
|
j.a_stride = a_stride
|
||
|
} else {
|
||
|
var j = a.u.RGBA;
|
||
|
j.rgba = b;
|
||
|
j.rgba_off = c;
|
||
|
j.stride = e;
|
||
|
j.size = i
|
||
|
}
|
||
|
}
|
||
|
return CheckDecBuffer(a)
|
||
|
}
|
||
|
|
||
|
function WebPAllocateDecBuffer(w, h, a, b) {
|
||
|
if (b == null || w <= 0 || h <= 0) {
|
||
|
return VP8_STATUS_INVALID_PARAM
|
||
|
}
|
||
|
if (a != null) {
|
||
|
if (a.use_cropping) {
|
||
|
var c = a.crop_width;
|
||
|
var d = a.crop_height;
|
||
|
var x = a.crop_left & ~1;
|
||
|
var y = a.crop_top & ~1;
|
||
|
if (x < 0 || y < 0 || c <= 0 || d <= 0 || x + c > w || y + d > h) {
|
||
|
return VP8_STATUS_INVALID_PARAM
|
||
|
}
|
||
|
w = c;
|
||
|
h = d
|
||
|
}
|
||
|
if (a.use_scaling) {
|
||
|
if (a.scaled_width <= 0 || a.scaled_height <= 0) {
|
||
|
return VP8_STATUS_INVALID_PARAM
|
||
|
}
|
||
|
w = a.scaled_width;
|
||
|
h = a.scaled_height
|
||
|
}
|
||
|
}
|
||
|
b.width = w;
|
||
|
b.height = h;
|
||
|
return AllocateBuffer(b)
|
||
|
}
|
||
|
|
||
|
function WebPInitDecBufferInternal(a, b) {
|
||
|
if (b != N) return 0;
|
||
|
if (!a) return 0;
|
||
|
memset_(a, 0, 0, sizeof(a) * a.length);
|
||
|
return 1
|
||
|
}
|
||
|
this.WebPFreeDecBuffer = function(a) {
|
||
|
if (a) {
|
||
|
if (!a.is_external_memory) a.private_memory = '';
|
||
|
a.private_memory_off = 0;
|
||
|
a.private_memory = a.private_memory_off = null
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function WebPCopyDecBuffer(a, b) {
|
||
|
alert('todo: WebPCopyDecBuffer')
|
||
|
}
|
||
|
|
||
|
function WebPGrabDecBuffer(a, b) {
|
||
|
alert('todo: WebPGrabDecBuffer')
|
||
|
}
|
||
|
|
||
|
function VP8DecodeLayer(a) {
|
||
|
assert(a);
|
||
|
assert(a.layer_data_size_ > 0);
|
||
|
return 1
|
||
|
}
|
||
|
var bB = Arr((255 + 255 + 1), uint8_t);
|
||
|
var bC = Arr((255 + 255 + 1), uint8_t);
|
||
|
var bD = Arr((1020 + 1020 + 1), int8_t);
|
||
|
var bE = Arr((112 + 112 + 1), int8_t);
|
||
|
var bF = Arr((255 + 510 + 1), uint8_t);
|
||
|
var bG = 0;
|
||
|
|
||
|
function VP8DspInitTables(a) {
|
||
|
if (!bG) {
|
||
|
var i;
|
||
|
for (i = -255; i <= 255; ++i) {
|
||
|
bB[255 + i] = (i < 0) ? -i : i;
|
||
|
bC[255 + i] = bB[255 + i] >> 1
|
||
|
}
|
||
|
for (i = -1020; i <= 1020; ++i) {
|
||
|
bD[1020 + i] = (i < -128) ? -128 : (i > 127) ? 127 : i
|
||
|
}
|
||
|
for (i = -112; i <= 112; ++i) {
|
||
|
bE[112 + i] = (i < -16) ? -16 : (i > 15) ? 15 : i
|
||
|
}
|
||
|
for (i = -255; i <= 255 + 255; ++i) {
|
||
|
bF[255 + i] = (i < 0) ? 0 : (i > 255) ? 255 : i
|
||
|
}
|
||
|
bG = 1
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function clip_8b(v) {
|
||
|
return (!(v & ~0xff)) ? v : (v < 0) ? 0 : 255
|
||
|
};
|
||
|
|
||
|
function STORE(x, y, v) {
|
||
|
dst[dst_off + x + y * bj] = clip_8b(dst_off + dst[x + y * bj] + ((v) >> 3))
|
||
|
};
|
||
|
var bH = 20091 + (1 << 16);
|
||
|
var bI = 35468;
|
||
|
|
||
|
function MUL(a, b) {
|
||
|
return (((a) * (b)) >> 16)
|
||
|
}
|
||
|
|
||
|
function TransformOne(e, f, g, h) {
|
||
|
var C = Arr(4 * 4, 0),
|
||
|
tmp, tmp_off;
|
||
|
tmp_off = 0;
|
||
|
var i;
|
||
|
tmp = C;
|
||
|
for (i = 0; i < 4; ++i) {
|
||
|
var a = e[f + 0] + e[f + 8];
|
||
|
var b = e[f + 0] - e[f + 8];
|
||
|
var c = MUL(e[f + 4], bI) - MUL(e[f + 12], bH);
|
||
|
var d = MUL(e[f + 4], bH) + MUL(e[f + 12], bI);
|
||
|
tmp[tmp_off + 0] = a + d;
|
||
|
tmp[tmp_off + 1] = b + c;
|
||
|
tmp[tmp_off + 2] = b - c;
|
||
|
tmp[tmp_off + 3] = a - d;
|
||
|
tmp_off += 4;
|
||
|
f++
|
||
|
}
|
||
|
tmp_off = 0;
|
||
|
for (i = 0; i < 4; ++i) {
|
||
|
var j = tmp[tmp_off + 0] + 4;
|
||
|
var a = j + tmp[tmp_off + 8];
|
||
|
var b = j - tmp[tmp_off + 8];
|
||
|
var c = MUL(tmp[tmp_off + 4], bI) - MUL(tmp[tmp_off + 12], bH);
|
||
|
var d = MUL(tmp[tmp_off + 4], bH) + MUL(tmp[tmp_off + 12], bI);
|
||
|
g[h + 0 + 0 * bj] = clip_8b(g[h + 0 + 0 * bj] + ((a + d) >> 3));
|
||
|
g[h + 1 + 0 * bj] = clip_8b(g[h + 1 + 0 * bj] + ((b + c) >> 3));
|
||
|
g[h + 2 + 0 * bj] = clip_8b(g[h + 2 + 0 * bj] + ((b - c) >> 3));
|
||
|
g[h + 3 + 0 * bj] = clip_8b(g[h + 3 + 0 * bj] + ((a - d) >> 3));
|
||
|
tmp_off++;
|
||
|
h += bj
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function TransformTwo(a, b, c, d, e) {
|
||
|
TransformOne(a, b, c, d);
|
||
|
if (e) {
|
||
|
TransformOne(a, b + 16, c, d + 4)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function TransformUV(a, b, c, d) {
|
||
|
bM(a, b + 0 * 16, c, d + 0, 1);
|
||
|
bM(a, b + 2 * 16, c, d + 4 * bj, 1)
|
||
|
}
|
||
|
|
||
|
function TransformDC(a, b, c, d) {
|
||
|
var e = a[b + 0] + 4;
|
||
|
var i, j;
|
||
|
for (j = 0; j < 4; ++j) {
|
||
|
for (i = 0; i < 4; ++i) {
|
||
|
var f = c[d + i + j * bj];
|
||
|
c[d + i + j * bj] = clip_8b(c[d + i + j * bj] + ((e) >> 3))
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function TransformDCUV(a, b, c, d) {
|
||
|
if (a[b + 0 * 16]) TransformDC(a, b + 0 * 16, c, d + 0);
|
||
|
if (a[b + 1 * 16]) TransformDC(a, b + 1 * 16, c, d + 4);
|
||
|
if (a[b + 2 * 16]) TransformDC(a, b + 2 * 16, c, d + 4 * bj);
|
||
|
if (a[b + 3 * 16]) TransformDC(a, b + 3 * 16, c, d + 4 * bj + 4)
|
||
|
};
|
||
|
|
||
|
function TransformWHT(a, b) {
|
||
|
var c = Arr(16, int);
|
||
|
var i = int;
|
||
|
for (i = 0; i < 4; ++i) {
|
||
|
var d = a[0 + i] + a[12 + i];
|
||
|
var e = a[4 + i] + a[8 + i];
|
||
|
var f = a[4 + i] - a[8 + i];
|
||
|
var g = a[0 + i] - a[12 + i];
|
||
|
c[0 + i] = d + e;
|
||
|
c[8 + i] = d - e;
|
||
|
c[4 + i] = g + f;
|
||
|
c[12 + i] = g - f
|
||
|
}
|
||
|
for (i = 0; i < 4; ++i) {
|
||
|
var h = b[b.length - 1];
|
||
|
var j = c[0 + i * 4] + 3;
|
||
|
var d = j + c[3 + i * 4];
|
||
|
var e = c[1 + i * 4] + c[2 + i * 4];
|
||
|
var f = c[1 + i * 4] - c[2 + i * 4];
|
||
|
var g = j - c[3 + i * 4];
|
||
|
b[h + 0] = (d + e) >> 3;
|
||
|
b[h + 16] = (g + f) >> 3;
|
||
|
b[h + 32] = (d - e) >> 3;
|
||
|
b[h + 48] = (g - f) >> 3;
|
||
|
b[b.length - 1] += 64
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function VP8TransformWHT(a, b) {
|
||
|
TransformWHT(a, b)
|
||
|
};
|
||
|
|
||
|
function OUT(x, y) {
|
||
|
dst[(x) + (y) * bj]
|
||
|
}
|
||
|
|
||
|
function TrueMotion(a, b, c) {
|
||
|
var d = a;
|
||
|
var e = b - bj;
|
||
|
var f = bF;
|
||
|
var g = +255 - d[e - 1];
|
||
|
var y;
|
||
|
for (y = 0; y < c; ++y) {
|
||
|
var h = f;
|
||
|
var i = g + a[b - 1];
|
||
|
var x;
|
||
|
for (x = 0; x < c; ++x) {
|
||
|
a[b + x] = h[i + d[e + x]]
|
||
|
}
|
||
|
b += bj
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function TM4(a, b) {
|
||
|
TrueMotion(a, b, 4)
|
||
|
}
|
||
|
|
||
|
function TM8uv(a, b) {
|
||
|
TrueMotion(a, b, 8)
|
||
|
}
|
||
|
|
||
|
function TM16(a, b) {
|
||
|
TrueMotion(a, b, 16)
|
||
|
}
|
||
|
|
||
|
function VE16(a, b) {
|
||
|
var j;
|
||
|
for (j = 0; j < 16; ++j) {
|
||
|
memcpy(a, b + j * bj, a, b - bj, 16)
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function HE16(a, b) {
|
||
|
var j;
|
||
|
for (j = 16; j > 0; --j) {
|
||
|
memset_(a, b + 0, a[b - 1], 16);
|
||
|
b += bj
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function Put16(v, a, b) {
|
||
|
var j;
|
||
|
for (j = 0; j < 16; ++j) {
|
||
|
for (i = 0; i < (16); ++i) a[b + j * bj + i] = v
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function DC16(a, b) {
|
||
|
var c = 16;
|
||
|
var j;
|
||
|
for (j = 0; j < 16; ++j) {
|
||
|
c += a[b - 1 + j * bj] + a[b + j - bj]
|
||
|
}
|
||
|
Put16(c >> 5, a, b)
|
||
|
};
|
||
|
|
||
|
function DC16NoTop(a, b) {
|
||
|
var c = 8;
|
||
|
var j;
|
||
|
for (j = 0; j < 16; ++j) {
|
||
|
c += a[b - 1 + j * bj]
|
||
|
}
|
||
|
Put16(c >> 4, a, b)
|
||
|
};
|
||
|
|
||
|
function DC16NoLeft(a, b) {
|
||
|
var c = 8;
|
||
|
var i;
|
||
|
for (i = 0; i < 16; ++i) {
|
||
|
c += a[b + i - bj]
|
||
|
}
|
||
|
Put16(c >> 4, a, b)
|
||
|
};
|
||
|
|
||
|
function DC16NoTopLeft(a, b) {
|
||
|
Put16(0x80, a, b)
|
||
|
};
|
||
|
|
||
|
function AVG3(a, b, c) {
|
||
|
return (((a) + 2 * (b) + (c) + 2) >> 2)
|
||
|
};
|
||
|
|
||
|
function AVG2(a, b) {
|
||
|
return (((a) + (b) + 1) >> 1)
|
||
|
};
|
||
|
|
||
|
function VE4(a, b) {
|
||
|
var c = a;
|
||
|
var d = b - bj;
|
||
|
var e = new Array();
|
||
|
e.push(AVG3(c[d - 1], c[d + 0], c[d + 1]));
|
||
|
e.push(AVG3(c[d + 0], c[d + 1], c[d + 2]));
|
||
|
e.push(AVG3(c[d + 1], c[d + 2], c[d + 3]));
|
||
|
e.push(AVG3(c[d + 2], c[d + 3], c[d + 4]));
|
||
|
var i;
|
||
|
for (i = 0; i < 4; ++i) {
|
||
|
memcpy(a, b + i * bj, e, 0, 4 * sizeof(e))
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function HE4(a, b) {
|
||
|
var A = a[b - 1 - bj];
|
||
|
var B = a[b - 1];
|
||
|
var C = a[b - 1 + bj];
|
||
|
var D = a[b - 1 + 2 * bj];
|
||
|
var E = a[b - 1 + 3 * bj];
|
||
|
a[b + 0 + 0 * bj] = a[b + 1 + 0 * bj] = a[b + 2 + 0 * bj] = a[b + 3 + 0 * bj] = AVG3(A, B, C);
|
||
|
a[b + 0 + 1 * bj] = a[b + 1 + 1 * bj] = a[b + 2 + 1 * bj] = a[b + 3 + 1 * bj] = AVG3(B, C, D);
|
||
|
a[b + 0 + 2 * bj] = a[b + 1 + 2 * bj] = a[b + 2 + 2 * bj] = a[b + 3 + 2 * bj] = AVG3(C, D, E);
|
||
|
a[b + 0 + 3 * bj] = a[b + 1 + 3 * bj] = a[b + 2 + 3 * bj] = a[b + 3 + 3 * bj] = AVG3(D, E, E)
|
||
|
};
|
||
|
|
||
|
function DC4(a, b) {
|
||
|
var c = 4;
|
||
|
var i;
|
||
|
for (i = 0; i < 4; ++i) c += a[b + i - bj] + a[b - 1 + i * bj];
|
||
|
c >>= 3;
|
||
|
for (i = 0; i < 4; ++i) {
|
||
|
memset_(a, b + i * bj, c, 4)
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function RD4(a, b) {
|
||
|
var I = a[b - 1 + 0 * bj];
|
||
|
var J = a[b - 1 + 1 * bj];
|
||
|
var K = a[b - 1 + 2 * bj];
|
||
|
var L = a[b - 1 + 3 * bj];
|
||
|
var X = a[b - 1 - bj];
|
||
|
var A = a[b + 0 - bj];
|
||
|
var B = a[b + 1 - bj];
|
||
|
var C = a[b + 2 - bj];
|
||
|
var D = a[b + 3 - bj];
|
||
|
a[b + (0) + (3) * bj] = AVG3(J, K, L);
|
||
|
a[b + (0) + (2) * bj] = a[b + (1) + (3) * bj] = AVG3(I, J, K);
|
||
|
a[b + (0) + (1) * bj] = a[b + (1) + (2) * bj] = a[b + (2) + (3) * bj] = AVG3(X, I, J);
|
||
|
a[b + (0) + (0) * bj] = a[b + (1) + (1) * bj] = a[b + (2) + (2) * bj] = a[b + (3) + (3) * bj] = AVG3(A, X, I);
|
||
|
a[b + (1) + (0) * bj] = a[b + (2) + (1) * bj] = a[b + (3) + (2) * bj] = AVG3(B, A, X);
|
||
|
a[b + (2) + (0) * bj] = a[b + (3) + (1) * bj] = AVG3(C, B, A);
|
||
|
a[b + (3) + (0) * bj] = AVG3(D, C, B)
|
||
|
};
|
||
|
|
||
|
function LD4(a, b) {
|
||
|
var A = a[b + 0 - bj];
|
||
|
var B = a[b + 1 - bj];
|
||
|
var C = a[b + 2 - bj];
|
||
|
var D = a[b + 3 - bj];
|
||
|
var E = a[b + 4 - bj];
|
||
|
var F = a[b + 5 - bj];
|
||
|
var G = a[b + 6 - bj];
|
||
|
var H = a[b + 7 - bj];
|
||
|
a[b + (0) + (0) * bj] = AVG3(A, B, C);
|
||
|
a[b + (1) + (0) * bj] = a[b + (0) + (1) * bj] = AVG3(B, C, D);
|
||
|
a[b + (2) + (0) * bj] = a[b + (1) + (1) * bj] = a[b + (0) + (2) * bj] = AVG3(C, D, E);
|
||
|
a[b + (3) + (0) * bj] = a[b + (2) + (1) * bj] = a[b + (1) + (2) * bj] = a[b + (0) + (3) * bj] = AVG3(D, E, F);
|
||
|
a[b + (3) + (1) * bj] = a[b + (2) + (2) * bj] = a[b + (1) + (3) * bj] = AVG3(E, F, G);
|
||
|
a[b + (3) + (2) * bj] = a[b + (2) + (3) * bj] = AVG3(F, G, H);
|
||
|
a[b + (3) + (3) * bj] = AVG3(G, H, H)
|
||
|
};
|
||
|
|
||
|
function VR4(a, b) {
|
||
|
var I = a[b - 1 + 0 * bj];
|
||
|
var J = a[b - 1 + 1 * bj];
|
||
|
var K = a[b - 1 + 2 * bj];
|
||
|
var X = a[b - 1 - bj];
|
||
|
var A = a[b + 0 - bj];
|
||
|
var B = a[b + 1 - bj];
|
||
|
var C = a[b + 2 - bj];
|
||
|
var D = a[b + 3 - bj];
|
||
|
a[b + (0) + (0) * bj] = a[b + (1) + (2) * bj] = AVG2(X, A);
|
||
|
a[b + (1) + (0) * bj] = a[b + (2) + (2) * bj] = AVG2(A, B);
|
||
|
a[b + (2) + (0) * bj] = a[b + (3) + (2) * bj] = AVG2(B, C);
|
||
|
a[b + (3) + (0) * bj] = AVG2(C, D);
|
||
|
a[b + (0) + (3) * bj] = AVG3(K, J, I);
|
||
|
a[b + (0) + (2) * bj] = AVG3(J, I, X);
|
||
|
a[b + (0) + (1) * bj] = a[b + (1) + (3) * bj] = AVG3(I, X, A);
|
||
|
a[b + (1) + (1) * bj] = a[b + (2) + (3) * bj] = AVG3(X, A, B);
|
||
|
a[b + (2) + (1) * bj] = a[b + (3) + (3) * bj] = AVG3(A, B, C);
|
||
|
a[b + (3) + (1) * bj] = AVG3(B, C, D)
|
||
|
};
|
||
|
|
||
|
function VL4(a, b) {
|
||
|
var A = a[b + 0 - bj];
|
||
|
var B = a[b + 1 - bj];
|
||
|
var C = a[b + 2 - bj];
|
||
|
var D = a[b + 3 - bj];
|
||
|
var E = a[b + 4 - bj];
|
||
|
var F = a[b + 5 - bj];
|
||
|
var G = a[b + 6 - bj];
|
||
|
var H = a[b + 7 - bj];
|
||
|
a[b + (0) + (0) * bj] = AVG2(A, B);
|
||
|
a[b + (1) + (0) * bj] = a[b + (0) + (2) * bj] = AVG2(B, C);
|
||
|
a[b + (2) + (0) * bj] = a[b + (1) + (2) * bj] = AVG2(C, D);
|
||
|
a[b + (3) + (0) * bj] = a[b + (2) + (2) * bj] = AVG2(D, E);
|
||
|
a[b + (0) + (1) * bj] = AVG3(A, B, C);
|
||
|
a[b + (1) + (1) * bj] = a[b + (0) + (3) * bj] = AVG3(B, C, D);
|
||
|
a[b + (2) + (1) * bj] = a[b + (1) + (3) * bj] = AVG3(C, D, E);
|
||
|
a[b + (3) + (1) * bj] = a[b + (2) + (3) * bj] = AVG3(D, E, F);
|
||
|
a[b + (3) + (2) * bj] = AVG3(E, F, G);
|
||
|
a[b + (3) + (3) * bj] = AVG3(F, G, H)
|
||
|
};
|
||
|
|
||
|
function HU4(a, b) {
|
||
|
var I = a[b - 1 + 0 * bj];
|
||
|
var J = a[b - 1 + 1 * bj];
|
||
|
var K = a[b - 1 + 2 * bj];
|
||
|
var L = a[b - 1 + 3 * bj];
|
||
|
a[b + (0) + (0) * bj] = AVG2(I, J);
|
||
|
a[b + (2) + (0) * bj] = a[b + (0) + (1) * bj] = AVG2(J, K);
|
||
|
a[b + (2) + (1) * bj] = a[b + (0) + (2) * bj] = AVG2(K, L);
|
||
|
a[b + (1) + (0) * bj] = AVG3(I, J, K);
|
||
|
a[b + (3) + (0) * bj] = a[b + (1) + (1) * bj] = AVG3(J, K, L);
|
||
|
a[b + (3) + (1) * bj] = a[b + (1) + (2) * bj] = AVG3(K, L, L);
|
||
|
a[b + (3) + (2) * bj] = a[b + (2) + (2) * bj] = a[b + (0) + (3) * bj] = a[b + (1) + (3) * bj] = a[b + (2) + (3) * bj] = a[b + (3) + (3) * bj] = L
|
||
|
};
|
||
|
|
||
|
function HD4(a, b) {
|
||
|
var I = a[b - 1 + 0 * bj];
|
||
|
var J = a[b - 1 + 1 * bj];
|
||
|
var K = a[b - 1 + 2 * bj];
|
||
|
var L = a[b - 1 + 3 * bj];
|
||
|
var X = a[b - 1 - bj];
|
||
|
var A = a[b + 0 - bj];
|
||
|
var B = a[b + 1 - bj];
|
||
|
var C = a[b + 2 - bj];
|
||
|
a[b + (0) + (0) * bj] = a[b + (2) + (1) * bj] = AVG2(I, X);
|
||
|
a[b + (0) + (1) * bj] = a[b + (2) + (2) * bj] = AVG2(J, I);
|
||
|
a[b + (0) + (2) * bj] = a[b + (2) + (3) * bj] = AVG2(K, J);
|
||
|
a[b + (0) + (3) * bj] = AVG2(L, K);
|
||
|
a[b + (3) + (0) * bj] = AVG3(A, B, C);
|
||
|
a[b + (2) + (0) * bj] = AVG3(X, A, B);
|
||
|
a[b + (1) + (0) * bj] = a[b + (3) + (1) * bj] = AVG3(I, X, A);
|
||
|
a[b + (1) + (1) * bj] = a[b + (3) + (2) * bj] = AVG3(J, I, X);
|
||
|
a[b + (1) + (2) * bj] = a[b + (3) + (3) * bj] = AVG3(K, J, I);
|
||
|
a[b + (1) + (3) * bj] = AVG3(L, K, J)
|
||
|
};
|
||
|
|
||
|
function VE8uv(a, b) {
|
||
|
var j;
|
||
|
for (j = 0; j < 8; ++j) {
|
||
|
memcpy(a, b + j * bj, a, b - bj, 8)
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function HE8uv(a, b) {
|
||
|
var j;
|
||
|
for (j = 0; j < 8; ++j) {
|
||
|
memset_(a, b + 0, a[b - 1], 8);
|
||
|
b += bj
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function Put8x8uv(v, a, b) {
|
||
|
var j, k;
|
||
|
for (j = 0; j < 8; ++j) {
|
||
|
for (k = 0; k < 8; ++k) a[b + k + j * bj] = v
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function DC8uv(a, b) {
|
||
|
var c = 8;
|
||
|
var i;
|
||
|
for (i = 0; i < 8; ++i) {
|
||
|
c += a[b + i - bj] + a[b - 1 + i * bj]
|
||
|
}
|
||
|
Put8x8uv(((c >> 4) * 0x01), a, b)
|
||
|
};
|
||
|
|
||
|
function DC8uvNoLeft(a, b) {
|
||
|
var c = 4;
|
||
|
var i;
|
||
|
for (i = 0; i < 8; ++i) {
|
||
|
c += a[b + i - bj]
|
||
|
}
|
||
|
Put8x8uv(((c >> 3) * 0x01), a, b)
|
||
|
};
|
||
|
|
||
|
function DC8uvNoTop(a, b) {
|
||
|
var c = 4;
|
||
|
var i;
|
||
|
for (i = 0; i < 8; ++i) {
|
||
|
c += a[b - 1 + i * bj]
|
||
|
}
|
||
|
Put8x8uv(((c >> 3) * 0x01), a, b)
|
||
|
};
|
||
|
|
||
|
function DC8uvNoTopLeft(a, b) {
|
||
|
Put8x8uv(0x80, a, b)
|
||
|
};
|
||
|
var bJ = new Array(function(v, o) {
|
||
|
DC4(v, o)
|
||
|
}, function(v, o) {
|
||
|
TM4(v, o)
|
||
|
}, function(v, o) {
|
||
|
VE4(v, o)
|
||
|
}, function(v, o) {
|
||
|
HE4(v, o)
|
||
|
}, function(v, o) {
|
||
|
RD4(v, o)
|
||
|
}, function(v, o) {
|
||
|
VR4(v, o)
|
||
|
}, function(v, o) {
|
||
|
LD4(v, o)
|
||
|
}, function(v, o) {
|
||
|
VL4(v, o)
|
||
|
}, function(v, o) {
|
||
|
HD4(v, o)
|
||
|
}, function(v, o) {
|
||
|
HU4(v, o)
|
||
|
});
|
||
|
var bK = new Array(function(v, o) {
|
||
|
DC16(v, o)
|
||
|
}, function(v, o) {
|
||
|
TM16(v, o)
|
||
|
}, function(v, o) {
|
||
|
VE16(v, o)
|
||
|
}, function(v, o) {
|
||
|
HE16(v, o)
|
||
|
}, function(v, o) {
|
||
|
DC16NoTop(v, o)
|
||
|
}, function(v, o) {
|
||
|
DC16NoLeft(v, o)
|
||
|
}, function(v, o) {
|
||
|
DC16NoTopLeft(v, o)
|
||
|
});
|
||
|
var bL = new Array(function(v, o) {
|
||
|
DC8uv(v, o)
|
||
|
}, function(v, o) {
|
||
|
TM8uv(v, o)
|
||
|
}, function(v, o) {
|
||
|
VE8uv(v, o)
|
||
|
}, function(v, o) {
|
||
|
HE8uv(v, o)
|
||
|
}, function(v, o) {
|
||
|
DC8uvNoTop(v, o)
|
||
|
}, function(v, o) {
|
||
|
DC8uvNoLeft(v, o)
|
||
|
}, function(v, o) {
|
||
|
DC8uvNoTopLeft(v, o)
|
||
|
});
|
||
|
|
||
|
function do_filter2(p, b, c) {
|
||
|
var d = p[b - 2 * c],
|
||
|
p0 = p[b - c],
|
||
|
q0 = p[b + 0],
|
||
|
q1 = p[b + c];
|
||
|
var a = 3 * (q0 - p0) + bD[1020 + d - q1];
|
||
|
var e = bE[112 + ((a + 4) >> 3)];
|
||
|
var f = bE[112 + ((a + 3) >> 3)];
|
||
|
p[b - c] = bF[255 + p0 + f];
|
||
|
p[b + 0] = bF[255 + q0 - e]
|
||
|
};
|
||
|
|
||
|
function do_filter4(p, b, c) {
|
||
|
var d = p[b - 2 * c],
|
||
|
p0 = p[b - c],
|
||
|
q0 = p[b + 0],
|
||
|
q1 = p[b + c];
|
||
|
var a = 3 * (q0 - p0);
|
||
|
var e = bE[112 + ((a + 4) >> 3)];
|
||
|
var f = bE[112 + ((a + 3) >> 3)];
|
||
|
var g = (e + 1) >> 1;
|
||
|
p[b - 2 * c] = bF[255 + d + g];
|
||
|
p[b - c] = bF[255 + p0 + f];
|
||
|
p[b + 0] = bF[255 + q0 - e];
|
||
|
p[b + c] = bF[255 + q1 - g]
|
||
|
};
|
||
|
|
||
|
function do_filter6(p, b, c) {
|
||
|
var d = p[b - 3 * c],
|
||
|
p1 = p[b - 2 * c],
|
||
|
p0 = p[b - c];
|
||
|
var e = p[b + 0],
|
||
|
q1 = p[b + c],
|
||
|
q2 = p[b + 2 * c];
|
||
|
var a = bD[1020 + 3 * (e - p0) + bD[1020 + p1 - q1]];
|
||
|
var f = (27 * a + 63) >> 7;
|
||
|
var g = (18 * a + 63) >> 7;
|
||
|
var h = (9 * a + 63) >> 7;
|
||
|
p[b - 3 * c] = bF[255 + d + h];
|
||
|
p[b - 2 * c] = bF[255 + p1 + g];
|
||
|
p[b - c] = bF[255 + p0 + f];
|
||
|
p[b + 0] = bF[255 + e - f];
|
||
|
p[b + c] = bF[255 + q1 - g];
|
||
|
p[b + 2 * c] = bF[255 + q2 - h]
|
||
|
};
|
||
|
|
||
|
function hev(p, a, b, c) {
|
||
|
var d = p[a - 2 * b],
|
||
|
p0 = p[a - b],
|
||
|
q0 = p[a + 0],
|
||
|
q1 = p[a + b];
|
||
|
return (bB[255 + d - p0] > c) || (bB[255 + q1 - q0] > c)
|
||
|
};
|
||
|
|
||
|
function needs_filter(p, a, b, c) {
|
||
|
var d = p[a - 2 * b],
|
||
|
p0 = p[a - b],
|
||
|
q0 = p[a + 0],
|
||
|
q1 = p[a + b];
|
||
|
return (2 * bB[255 + p0 - q0] + bC[255 + d - q1]) <= c
|
||
|
};
|
||
|
|
||
|
function needs_filter2(p, a, b, t, c) {
|
||
|
var d = p[a - 4 * b],
|
||
|
p2 = p[a - 3 * b],
|
||
|
p1 = p[a - 2 * b],
|
||
|
p0 = p[a - b];
|
||
|
var e = p[a + 0],
|
||
|
q1 = p[a + b],
|
||
|
q2 = p[a + 2 * b],
|
||
|
q3 = p[a + 3 * b];
|
||
|
if ((2 * bB[255 + p0 - e] + bC[255 + p1 - q1]) > t) return 0;
|
||
|
return bB[255 + d - p2] <= c && bB[255 + p2 - p1] <= c && bB[255 + p1 - p0] <= c && bB[255 + q3 - q2] <= c && bB[255 + q2 - q1] <= c && bB[255 + q1 - e] <= c
|
||
|
};
|
||
|
|
||
|
function SimpleVFilter16(p, a, b, c) {
|
||
|
var i;
|
||
|
for (i = 0; i < 16; ++i) {
|
||
|
if (needs_filter(p, a + i, b, c)) {
|
||
|
do_filter2(p, a + i, b)
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function SimpleHFilter16(p, a, b, c) {
|
||
|
var i;
|
||
|
for (i = 0; i < 16; ++i) {
|
||
|
if (needs_filter(p, a + i * b, 1, c)) {
|
||
|
do_filter2(p, a + i * b, 1)
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function SimpleVFilter16i(p, a, b, c) {
|
||
|
var k;
|
||
|
for (k = 3; k > 0; --k) {
|
||
|
a += 4 * b;
|
||
|
SimpleVFilter16(p, a + 0, b, c)
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function SimpleHFilter16i(p, a, b, c) {
|
||
|
var k;
|
||
|
for (k = 3; k > 0; --k) {
|
||
|
a += 4;
|
||
|
SimpleHFilter16(p, a + 0, b, c)
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function FilterLoop26(p, a, b, c, d, e, f, g) {
|
||
|
while (d-- > 0) {
|
||
|
if (needs_filter2(p, a + 0, b, e, f)) {
|
||
|
if (hev(p, a + 0, b, g)) {
|
||
|
do_filter2(p, a + 0, b)
|
||
|
} else {
|
||
|
do_filter6(p, a + 0, b)
|
||
|
}
|
||
|
}
|
||
|
a += c
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function FilterLoop24(p, a, b, c, d, e, f, g) {
|
||
|
while (d-- > 0) {
|
||
|
if (needs_filter2(p, a + 0, b, e, f)) {
|
||
|
if (hev(p, a + 0, b, g)) {
|
||
|
do_filter2(p, a + 0, b)
|
||
|
} else {
|
||
|
do_filter4(p, a + 0, b)
|
||
|
}
|
||
|
}
|
||
|
a += c
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function VFilter16(p, a, b, c, d, e) {
|
||
|
FilterLoop26(p, a + 0, b, 1, 16, c, d, e)
|
||
|
}
|
||
|
|
||
|
function HFilter16(p, a, b, c, d, e) {
|
||
|
FilterLoop26(p, a + 0, 1, b, 16, c, d, e)
|
||
|
};
|
||
|
|
||
|
function VFilter16i(p, a, b, c, d, e) {
|
||
|
var k;
|
||
|
for (k = 3; k > 0; --k) {
|
||
|
a += 4 * b;
|
||
|
FilterLoop24(p, a + 0, b, 1, 16, c, d, e)
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function HFilter16i(p, a, b, c, d, e) {
|
||
|
var k;
|
||
|
for (k = 3; k > 0; --k) {
|
||
|
a += 4;
|
||
|
FilterLoop24(p, a + 0, 1, b, 16, c, d, e)
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function VFilter8(u, a, v, b, c, d, e, f) {
|
||
|
FilterLoop26(u, a, c, 1, 8, d, e, f);
|
||
|
FilterLoop26(v, b, c, 1, 8, d, e, f)
|
||
|
};
|
||
|
|
||
|
function HFilter8(u, a, v, b, c, d, e, f) {
|
||
|
FilterLoop26(u, a, 1, c, 8, d, e, f);
|
||
|
FilterLoop26(v, b, 1, c, 8, d, e, f)
|
||
|
};
|
||
|
|
||
|
function VFilter8i(u, a, v, b, c, d, e, f) {
|
||
|
FilterLoop24(u, a + 4 * c, c, 1, 8, d, e, f);
|
||
|
FilterLoop24(v, b + 4 * c, c, 1, 8, d, e, f)
|
||
|
};
|
||
|
|
||
|
function HFilter8i(u, a, v, b, c, d, e, f) {
|
||
|
FilterLoop24(u, a + 4, 1, c, 8, d, e, f);
|
||
|
FilterLoop24(v, b + 4, 1, c, 8, d, e, f)
|
||
|
};
|
||
|
var bM;
|
||
|
var bN;
|
||
|
var bO;
|
||
|
var bP;
|
||
|
var bQ;
|
||
|
var bR;
|
||
|
var bS;
|
||
|
var bT;
|
||
|
var bU;
|
||
|
var bV;
|
||
|
var bW;
|
||
|
var bX;
|
||
|
var bY;
|
||
|
var bZ;
|
||
|
var ca;
|
||
|
var cb;
|
||
|
|
||
|
function VP8DspInit(a) {
|
||
|
bM = TransformTwo;
|
||
|
bN = TransformUV;
|
||
|
bO = TransformDC;
|
||
|
bP = TransformDCUV;
|
||
|
bQ = VFilter16;
|
||
|
bR = HFilter16;
|
||
|
bS = VFilter8;
|
||
|
bT = HFilter8;
|
||
|
bU = VFilter16i;
|
||
|
bV = HFilter16i;
|
||
|
bW = VFilter8i;
|
||
|
bX = HFilter8i;
|
||
|
bY = SimpleVFilter16;
|
||
|
bZ = SimpleHFilter16;
|
||
|
ca = SimpleVFilter16i;
|
||
|
cb = SimpleHFilter16i
|
||
|
};
|
||
|
var cc = (32 - 1);
|
||
|
var cd = 3;
|
||
|
var ce = 1;
|
||
|
|
||
|
function InitThreadContext(a) {
|
||
|
a.cache_id_ = 0;
|
||
|
if (a.use_threads_) {
|
||
|
var b = a.worker_;
|
||
|
if (!WebPWorkerReset(b)) {
|
||
|
return VP8SetError(a, VP8_STATUS_OUT_OF_MEMORY, "thread initialization failed.")
|
||
|
}
|
||
|
b.data1 = a;
|
||
|
b.data2 = a.thread_ctx_.io_;
|
||
|
b.hook = VP8FinishRow;
|
||
|
a.num_caches_ = (a.filter_type_ > 0) ? cd : cd - 1
|
||
|
} else {
|
||
|
a.num_caches_ = ce
|
||
|
}
|
||
|
return 1
|
||
|
}
|
||
|
var cf = new Array(0, 2, 8);
|
||
|
|
||
|
function AllocateMemory(a) {
|
||
|
var b = a.num_caches_;
|
||
|
var c = a.mb_w_;
|
||
|
var d = 4 * c * sizeof(uint8_t);
|
||
|
var e = (16 + 8 + 8) * c;
|
||
|
var f = (c + 1) * sizeof(bw);
|
||
|
var g = (a.filter_type_ > 0) ? c * (a.use_threads_ ? 2 : 1) * sizeof(bv) : 0;
|
||
|
var h = bk * sizeof(a.yuv_b_);
|
||
|
var i = 384 * sizeof(a.coeffs_);
|
||
|
var j = (16 * b + parseInt(cf[a.filter_type_]) * 3 / 2);
|
||
|
var k = e * j;
|
||
|
var l = a.alpha_data_ ? (a.pic_hdr_.width_ * a.pic_hdr_.height_) : 0;
|
||
|
var m = d + e + f + g + h + i + k + l + cc;
|
||
|
var n = uint8_t,
|
||
|
mem_offset = 0;
|
||
|
if (m > a.mem_size_) {
|
||
|
a.mem_ = 0;
|
||
|
a.mem_size_ = 0;
|
||
|
if (a.mem_ == null) {
|
||
|
return VP8SetError(a, 'VP8_STATUS_OUT_OF_MEMORY', "no memory during frame initialization.")
|
||
|
}
|
||
|
a.mem_size_ = m
|
||
|
}
|
||
|
n = a.mem_;
|
||
|
a.intra_t_ = 205;
|
||
|
a.y_t_ = memset(205, (16 * c) * sizeof(a.y_t_));
|
||
|
a.u_t_ = memset(205, (8 * c) * sizeof(a.u_t_));
|
||
|
a.v_t_ = memset(205, (8 * c) * sizeof(a.v_t_));
|
||
|
a.f_info_ = g ? memset_wl(bv, g) : null;
|
||
|
a.f_info_off = g ? 0 : null;
|
||
|
a.thread_ctx_.id_ = 0;
|
||
|
a.thread_ctx_.f_info_ = a.f_info_;
|
||
|
if (a.use_threads_) {
|
||
|
a.thread_ctx_.f_info_off += c
|
||
|
}
|
||
|
assert((h & cc) == 0);
|
||
|
a.yuv_b_ = memset(205, h * sizeof(a.yuv_b_));
|
||
|
a.coeffs_ = -12851;
|
||
|
a.cache_y_stride_ = 16 * c;
|
||
|
a.cache_uv_stride_ = 8 * c; {
|
||
|
var o = cf[a.filter_type_];
|
||
|
var p = o * a.cache_y_stride_;
|
||
|
var q = (o / 2) * a.cache_uv_stride_;
|
||
|
a.cache_y_ = Arr(k, 205);
|
||
|
a.cache_y_off = +p;
|
||
|
a.cache_u_ = a.cache_y_;
|
||
|
a.cache_u_off = a.cache_y_off + 16 * b * a.cache_y_stride_ + q;
|
||
|
a.cache_v_ = a.cache_u_;
|
||
|
a.cache_v_off = a.cache_u_off + 8 * b * a.cache_uv_stride_ + q
|
||
|
}
|
||
|
a.alpha_plane_ = l ? Arr(l, uint8_t) : null;
|
||
|
a.mb_info_ = memset_wl(bw, f);
|
||
|
a.intra_t_ = memset(bh, d);
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function InitIo(a, b) {
|
||
|
b.width = a.pic_hdr_.width_;
|
||
|
b.height = a.pic_hdr_.height_;
|
||
|
b.mb_y = 0;
|
||
|
b.y = a.cache_y_;
|
||
|
b.y_off = a.cache_y_off;
|
||
|
b.u = a.cache_u_;
|
||
|
b.u_off = a.cache_u_off;
|
||
|
b.v = a.cache_v_;
|
||
|
b.v_off = a.cache_v_off;
|
||
|
b.y_stride = a.cache_y_stride_;
|
||
|
b.uv_stride = a.cache_uv_stride_;
|
||
|
b.fancy_upsampling = 0;
|
||
|
b.a = null;
|
||
|
b.a_off = null
|
||
|
}
|
||
|
|
||
|
function VP8InitFrame(a, b) {
|
||
|
if (!InitThreadContext(a)) return 0;
|
||
|
if (!AllocateMemory(a)) return 0;
|
||
|
InitIo(a, b);
|
||
|
VP8DspInitTables();
|
||
|
VP8DspInit();
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function hev_thresh_from_level(a, b) {
|
||
|
if (b) {
|
||
|
return (a >= 40) ? 2 : (a >= 15) ? 1 : 0
|
||
|
} else {
|
||
|
return (a >= 40) ? 3 : (a >= 20) ? 2 : (a >= 15) ? 1 : 0
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function DoFilter(a, b, c) {
|
||
|
var d = a.thread_ctx_;
|
||
|
var e = a.cache_y_stride_;
|
||
|
var f = d.f_info_[1 + b];
|
||
|
var g = a.cache_y_;
|
||
|
var h = a.cache_y_off + d.id_ * 16 * e + b * 16;
|
||
|
var i = f.f_level_;
|
||
|
var j = f.f_ilevel_;
|
||
|
var k = 2 * i + j;
|
||
|
if (i == 0) {
|
||
|
return
|
||
|
}
|
||
|
if (a.filter_type_ == 1) {
|
||
|
if (b > 0) {
|
||
|
bZ(g, h, e, k + 4)
|
||
|
}
|
||
|
if (f.f_inner_) {
|
||
|
cb(g, h, e, k)
|
||
|
}
|
||
|
if (c > 0) {
|
||
|
bY(g, h, e, k + 4)
|
||
|
}
|
||
|
if (f.f_inner_) {
|
||
|
ca(g, h, e, k)
|
||
|
}
|
||
|
} else {
|
||
|
var l = a.cache_uv_stride_;
|
||
|
var m = a.cache_u_;
|
||
|
var n = a.cache_u_off + d.id_ * 8 * l + b * 8;
|
||
|
var o = a.cache_v_;
|
||
|
var p = a.cache_v_off + d.id_ * 8 * l + b * 8;
|
||
|
var q = hev_thresh_from_level(i, a.frm_hdr_.key_frame_);
|
||
|
if (b > 0) {
|
||
|
bR(g, h, e, k + 4, j, q);
|
||
|
bT(m, n, o, p, l, k + 4, j, q)
|
||
|
}
|
||
|
if (f.f_inner_) {
|
||
|
bV(g, h, e, k, j, q);
|
||
|
bX(m, n, o, p, l, k, j, q)
|
||
|
}
|
||
|
if (c > 0) {
|
||
|
bQ(g, h, e, k + 4, j, q);
|
||
|
bS(m, n, o, p, l, k + 4, j, q)
|
||
|
}
|
||
|
if (f.f_inner_) {
|
||
|
bU(g, h, e, k, j, q);
|
||
|
bW(m, n, o, p, l, k, j, q)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function FilterRow(a) {
|
||
|
var b = int;
|
||
|
var c = a.thread_ctx_.mb_y_;
|
||
|
assert(a.thread_ctx_.filter_row_);
|
||
|
for (b = a.tl_mb_x_; b < a.br_mb_x_; ++b) {
|
||
|
DoFilter(a, b, c)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function VP8StoreBlock(a) {
|
||
|
if (a.filter_type_ > 0) {
|
||
|
var b = a.f_info_[1 + a.mb_x_];
|
||
|
var c = a.mb_info_[1 + a.mb_x_].skip_;
|
||
|
var d = a.filter_levels_[a.segment_];
|
||
|
if (a.filter_hdr_.use_lf_delta_) {
|
||
|
d += a.filter_hdr_.ref_lf_delta_[0];
|
||
|
if (a.is_i4x4_) {
|
||
|
d += a.filter_hdr_.mode_lf_delta_[0]
|
||
|
}
|
||
|
}
|
||
|
d = (d < 0) ? 0 : (d > 63) ? 63 : d;
|
||
|
b.f_level_ = d;
|
||
|
if (a.filter_hdr_.sharpness_ > 0) {
|
||
|
if (a.filter_hdr_.sharpness_ > 4) {
|
||
|
d >>= 2
|
||
|
} else {
|
||
|
d >>= 1
|
||
|
}
|
||
|
if (d > 9 - a.filter_hdr_.sharpness_) {
|
||
|
d = 9 - a.filter_hdr_.sharpness_
|
||
|
}
|
||
|
}
|
||
|
b.f_ilevel_ = (d < 1) ? 1 : d;
|
||
|
b.f_inner_ = (!c || a.is_i4x4_) + 0
|
||
|
} {
|
||
|
var y;
|
||
|
var e = a.cache_id_ * 16 * a.cache_y_stride_;
|
||
|
var f = a.cache_id_ * 8 * a.cache_uv_stride_;
|
||
|
var g = a.cache_y_;
|
||
|
var h = a.cache_y_off + a.mb_x_ * 16 + e;
|
||
|
var i = a.cache_u_;
|
||
|
var j = a.cache_u_off + a.mb_x_ * 8 + f;
|
||
|
var k = a.cache_v_;
|
||
|
var l = a.cache_v_off + a.mb_x_ * 8 + f;
|
||
|
for (y = 0; y < 16; ++y) {
|
||
|
memcpy(g, h + y * a.cache_y_stride_, a.yuv_b_, +bm + y * bj, 16)
|
||
|
}
|
||
|
for (y = 0; y < 8; ++y) {
|
||
|
memcpy(i, j + y * a.cache_uv_stride_, a.yuv_b_, +bn + y * bj, 8);
|
||
|
memcpy(k, l + y * a.cache_uv_stride_, a.yuv_b_, +bo + y * bj, 8)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function MACROBLOCK_VPOS(a) {
|
||
|
return ((a) * 16)
|
||
|
}
|
||
|
|
||
|
function VP8FinishRow(a, b) {
|
||
|
var c = 1;
|
||
|
var d = a.thread_ctx_;
|
||
|
var e = cf[a.filter_type_];
|
||
|
var f = e * a.cache_y_stride_;
|
||
|
var g = parseInt(e / 2) * a.cache_uv_stride_;
|
||
|
var h = d.id_ * 16 * a.cache_y_stride_;
|
||
|
var i = d.id_ * 8 * a.cache_uv_stride_;
|
||
|
var j = a.cache_y_;
|
||
|
var k = a.cache_y_off - f + h;
|
||
|
var l = a.cache_u_;
|
||
|
var m = a.cache_u_off - g + i;
|
||
|
var n = a.cache_v_;
|
||
|
var o = a.cache_v_off - g + i;
|
||
|
var p = (d.mb_y_ == 0);
|
||
|
var q = (d.mb_y_ >= a.mb_h_ - 1) + 0;
|
||
|
var r = MACROBLOCK_VPOS(d.mb_y_);
|
||
|
var s = MACROBLOCK_VPOS(d.mb_y_ + 1);
|
||
|
if (d.filter_row_) {
|
||
|
FilterRow(a)
|
||
|
}
|
||
|
if (b.put) {
|
||
|
if (!p) {
|
||
|
r -= e;
|
||
|
b.y = j;
|
||
|
b.y_off = k;
|
||
|
b.u = l;
|
||
|
b.u_off = m;
|
||
|
b.v = n;
|
||
|
b.v_off = o
|
||
|
} else {
|
||
|
b.y = a.cache_y_;
|
||
|
b.y_off = a.cache_y_off + h;
|
||
|
b.u = a.cache_u_;
|
||
|
b.u_off = a.cache_u_off + i;
|
||
|
b.v = a.cache_v_;
|
||
|
b.v_off = a.cache_v_off + i
|
||
|
}
|
||
|
if (!q) {
|
||
|
s -= e
|
||
|
}
|
||
|
if (s > b.crop_bottom) {
|
||
|
s = b.crop_bottom
|
||
|
}
|
||
|
if (a.alpha_data_) {
|
||
|
if (r == 0) {
|
||
|
b.a = VP8DecompressAlphaRows(a, r, s - r);
|
||
|
b.a_off = 0
|
||
|
} else {
|
||
|
b.a_off = VP8DecompressAlphaRows(a, r, s - r)
|
||
|
}
|
||
|
if (b.a == null) {
|
||
|
return VP8SetError(a, VP8_STATUS_BITSTREAM_ERROR, "Could not decode alpha data.")
|
||
|
}
|
||
|
}
|
||
|
if (r < b.crop_top) {
|
||
|
var t = b.crop_top - r;
|
||
|
r = b.crop_top;
|
||
|
assert(!(t & 1));
|
||
|
b.y_off += a.cache_y_stride_ * t;
|
||
|
b.u_off += a.cache_uv_stride_ * (t >> 1);
|
||
|
b.v_off += a.cache_uv_stride_ * (t >> 1);
|
||
|
if (b.a) {
|
||
|
b.a_off += b.width * t
|
||
|
}
|
||
|
}
|
||
|
if (r < s) {
|
||
|
b.y_off += b.crop_left;
|
||
|
b.u_off += b.crop_left >> 1;
|
||
|
b.v_off += b.crop_left >> 1;
|
||
|
if (b.a) {
|
||
|
b.a_off += b.crop_left
|
||
|
}
|
||
|
b.mb_y = r - b.crop_top;
|
||
|
b.mb_w = b.crop_right - b.crop_left;
|
||
|
b.mb_h = s - r;
|
||
|
c = b.put(b)
|
||
|
}
|
||
|
}
|
||
|
if (d.id_ + 1 == a.num_caches_) {
|
||
|
if (!q) {
|
||
|
memcpy(a.cache_y_, a.cache_y_off - f, j, k + 16 * a.cache_y_stride_, f);
|
||
|
memcpy(a.cache_u_, a.cache_u_off - g, l, m + 8 * a.cache_uv_stride_, g);
|
||
|
memcpy(a.cache_v_, a.cache_v_off - g, n, o + 8 * a.cache_uv_stride_, g)
|
||
|
}
|
||
|
}
|
||
|
return c
|
||
|
}
|
||
|
|
||
|
function VP8ProcessRow(a, b) {
|
||
|
var c = 1;
|
||
|
var d = a.thread_ctx_;
|
||
|
if (!a.use_threads_) {
|
||
|
d.mb_y_ = a.mb_y_;
|
||
|
d.filter_row_ = a.filter_row_;
|
||
|
c = VP8FinishRow(a, b)
|
||
|
} else {
|
||
|
var e = a.worker_;
|
||
|
c &= WebPWorkerSync(e);
|
||
|
assert(e.status_ == OK);
|
||
|
if (c) {
|
||
|
d.io_ = b;
|
||
|
d.id_ = a.cache_id_;
|
||
|
d.mb_y_ = a.mb_y_;
|
||
|
d.filter_row_ = a.filter_row_;
|
||
|
if (d.filter_row_) {
|
||
|
var f = d.f_info_;
|
||
|
d.f_info_ = a.f_info_;
|
||
|
a.f_info_ = f
|
||
|
}
|
||
|
WebPWorkerLaunch(e);
|
||
|
if (++a.cache_id_ == a.num_caches_) {
|
||
|
a.cache_id_ = 0
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return c
|
||
|
}
|
||
|
|
||
|
function VP8EnterCritical(a, b) {
|
||
|
if (b.setup && !b.setup(b)) {
|
||
|
VP8SetError(a, VP8_STATUS_USER_ABORT, "Frame setup failed");
|
||
|
return a.status_
|
||
|
}
|
||
|
if (b.bypass_filtering) {
|
||
|
a.filter_type_ = 0
|
||
|
} {
|
||
|
var c = cf[a.filter_type_];
|
||
|
if (a.filter_type_ == 2) {
|
||
|
a.tl_mb_x_ = 0;
|
||
|
a.tl_mb_y_ = 0
|
||
|
} else {
|
||
|
a.tl_mb_y_ = b.crop_top >> 4;
|
||
|
a.tl_mb_x_ = b.crop_left >> 4
|
||
|
}
|
||
|
a.br_mb_y_ = (b.crop_bottom + 15 + c) >> 4;
|
||
|
a.br_mb_x_ = (b.crop_right + 15 + c) >> 4;
|
||
|
if (a.br_mb_x_ > a.mb_w_) {
|
||
|
a.br_mb_x_ = a.mb_w_
|
||
|
}
|
||
|
if (a.br_mb_y_ > a.mb_h_) {
|
||
|
a.br_mb_y_ = a.mb_h_
|
||
|
}
|
||
|
}
|
||
|
return T
|
||
|
}
|
||
|
|
||
|
function VP8ExitCritical(a, b) {
|
||
|
var c = 1;
|
||
|
if (a.use_threads_) {
|
||
|
c = WebPWorkerSync(a.worker_)
|
||
|
}
|
||
|
if (b.teardown) {
|
||
|
b.teardown(b)
|
||
|
}
|
||
|
return c
|
||
|
}
|
||
|
var cg = new Array(0 + 0 * bj, 4 + 0 * bj, 8 + 0 * bj, 12 + 0 * bj, 0 + 4 * bj, 4 + 4 * bj, 8 + 4 * bj, 12 + 4 * bj, 0 + 8 * bj, 4 + 8 * bj, 8 + 8 * bj, 12 + 8 * bj, 0 + 12 * bj, 4 + 12 * bj, 8 + 12 * bj, 12 + 12 * bj);
|
||
|
|
||
|
function CheckMode(a, b) {
|
||
|
if (b == bh) {
|
||
|
if (a.mb_x_ == 0) {
|
||
|
return (a.mb_y_ == 0) ? B_DC_PRED_NOTOPLEFT : B_DC_PRED_NOLEFT
|
||
|
} else {
|
||
|
return (a.mb_y_ == 0) ? B_DC_PRED_NOTOP : bh
|
||
|
}
|
||
|
}
|
||
|
return b
|
||
|
}
|
||
|
|
||
|
function Copy32b(a, b, c, d) {
|
||
|
for (i = 0; i < 4; ++i) a[b + i] = c[d + i]
|
||
|
}
|
||
|
|
||
|
function VP8ReconstructBlock(a) {
|
||
|
var b = a.yuv_b_;
|
||
|
var c = bm;
|
||
|
var d = a.yuv_b_;
|
||
|
var e = bn;
|
||
|
var f = a.yuv_b_;
|
||
|
var g = bo;
|
||
|
if (a.mb_x_ > 0) {
|
||
|
var j;
|
||
|
for (j = -1; j < 16; ++j) {
|
||
|
Copy32b(b, (c + j * bj - 4), b, (c + j * bj + 12))
|
||
|
}
|
||
|
for (j = -1; j < 8; ++j) {
|
||
|
Copy32b(d, (e + j * bj - 4), d, (e + j * bj + 4));
|
||
|
Copy32b(f, (g + j * bj - 4), f, (g + j * bj + 4))
|
||
|
}
|
||
|
} else {
|
||
|
var j;
|
||
|
for (j = 0; j < 16; ++j) {
|
||
|
b[c + j * bj - 1] = 129
|
||
|
}
|
||
|
for (j = 0; j < 8; ++j) {
|
||
|
d[e + j * bj - 1] = 129;
|
||
|
f[g + j * bj - 1] = 129
|
||
|
}
|
||
|
if (a.mb_y_ > 0) {
|
||
|
b[c - 1 - bj] = d[e - 1 - bj] = f[g - 1 - bj] = 129
|
||
|
}
|
||
|
} {
|
||
|
var h = a.y_t_;
|
||
|
var k = +a.mb_x_ * 16;
|
||
|
var l = a.u_t_;
|
||
|
var m = +a.mb_x_ * 8;
|
||
|
var o = a.v_t_;
|
||
|
var p = +a.mb_x_ * 8;
|
||
|
var q = a.coeffs_;
|
||
|
var n;
|
||
|
if (a.mb_y_ > 0) {
|
||
|
memcpy(b, c - bj, h, k, 16);
|
||
|
memcpy(d, e - bj, l, m, 8);
|
||
|
memcpy(f, g - bj, o, p, 8)
|
||
|
} else if (a.mb_x_ == 0) {
|
||
|
for (i = 0; i < (16 + 4 + 1); ++i) b[c - bj - 1 + i] = 127;
|
||
|
for (i = 0; i < (8 + 1); ++i) d[e - bj - 1 + i] = 127;
|
||
|
for (i = 0; i < (8 + 1); ++i) f[g - bj - 1 + i] = 127
|
||
|
}
|
||
|
if (a.is_i4x4_) {
|
||
|
var r = b;
|
||
|
var s = c - bj + 16;
|
||
|
if (a.mb_y_ > 0) {
|
||
|
if (a.mb_x_ >= a.mb_w_ - 1) {
|
||
|
r[s + 0] = r[s + 1] = r[s + 2] = r[s + 3] = h[k + 15]
|
||
|
} else {
|
||
|
memcpy(r, s + 0, h, k + 16, 4)
|
||
|
}
|
||
|
}
|
||
|
for (ii = 0; ii < 4; ++ii) r[ii + s + bj * 4] = r[ii + s + 1 * bj * 4] = r[ii + s + 2 * bj * 4] = r[ii + s + 3 * bj * 4] = r[ii + s + 0 * 4];
|
||
|
for (n = 0; n < 16; n++) {
|
||
|
var t = b;
|
||
|
var u = c + cg[n];
|
||
|
bJ[a.imodes_[n]](t, u);
|
||
|
if (a.non_zero_ac_ & (1 << n)) {
|
||
|
bM(q, +n * 16, t, u, 0)
|
||
|
} else if (a.non_zero_ & (1 << n)) {
|
||
|
bO(q, +n * 16, t, u)
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
var v = CheckMode(a, a.imodes_[0]);
|
||
|
bK[v](b, c);
|
||
|
if (a.non_zero_) {
|
||
|
for (n = 0; n < 16; n++) {
|
||
|
var t = b;
|
||
|
var u = c + cg[n];
|
||
|
if (a.non_zero_ac_ & (1 << n)) {
|
||
|
bM(q, +n * 16, t, u, 0)
|
||
|
} else if (a.non_zero_ & (1 << n)) {
|
||
|
bO(q, +n * 16, t, u)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
} {
|
||
|
var v = CheckMode(a, a.uvmode_);
|
||
|
bL[v](d, e);
|
||
|
bL[v](f, g);
|
||
|
if (a.non_zero_ & 0x0f0000) {
|
||
|
var w = a.coeffs_;
|
||
|
var x = 16 * 16;
|
||
|
if (a.non_zero_ac_ & 0x0f0000) {
|
||
|
bN(w, x, d, e)
|
||
|
} else {
|
||
|
bP(w, x, d, e)
|
||
|
}
|
||
|
}
|
||
|
if (a.non_zero_ & 0xf00000) {
|
||
|
var y = a.coeffs_;
|
||
|
var x = 20 * 16;
|
||
|
if (a.non_zero_ac_ & 0xf00000) {
|
||
|
bN(y, x, f, g)
|
||
|
} else {
|
||
|
bP(y, x, f, g)
|
||
|
}
|
||
|
}
|
||
|
if (a.mb_y_ < (a.mb_h_ - 1)) {
|
||
|
memcpy(h, k, b, c + 15 * bj, 16);
|
||
|
memcpy(l, m, d, e + 7 * bj, 8);
|
||
|
memcpy(o, p, f, g + 7 * bj, 8)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function clip(v, M) {
|
||
|
return v < 0 ? 0 : v > M ? M : v
|
||
|
}
|
||
|
var ci = new Array(4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 91, 93, 95, 96, 98, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 143, 145, 148, 151, 154, 157);
|
||
|
var cj = new Array(4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 234, 239, 245, 249, 254, 259, 264, 269, 274, 279, 284);
|
||
|
|
||
|
function VP8ParseQuant(a) {
|
||
|
var b = a.br_;
|
||
|
var c = VP8GetValue(b, 7);
|
||
|
var d = VP8Get(b) ? VP8GetSignedValue(b, 4) : 0;
|
||
|
var e = VP8Get(b) ? VP8GetSignedValue(b, 4) : 0;
|
||
|
var f = VP8Get(b) ? VP8GetSignedValue(b, 4) : 0;
|
||
|
var g = VP8Get(b) ? VP8GetSignedValue(b, 4) : 0;
|
||
|
var h = VP8Get(b) ? VP8GetSignedValue(b, 4) : 0;
|
||
|
var j = a.segment_hdr_;
|
||
|
var i = int;
|
||
|
for (i = 0; i < NUM_MB_SEGMENTS; ++i) {
|
||
|
var q = int;
|
||
|
if (j.use_segment_) {
|
||
|
q = j.quantizer_[i];
|
||
|
if (!j.absolute_delta_) {
|
||
|
q += c
|
||
|
}
|
||
|
} else {
|
||
|
if (i > 0) {
|
||
|
a.dqm_[i] = a.dqm_[0];
|
||
|
continue
|
||
|
} else {
|
||
|
q = c
|
||
|
}
|
||
|
} {
|
||
|
var m = a.dqm_[i];
|
||
|
m.y1_mat_[0] = ci[clip(q + d, 127)];
|
||
|
m.y1_mat_[1] = cj[clip(q + 0, 127)];
|
||
|
m.y2_mat_[0] = ci[clip(q + e, 127)] * 2;
|
||
|
m.y2_mat_[1] = parseInt(cj[clip(q + f, 127)] * 155 / 100);
|
||
|
if (m.y2_mat_[1] < 8) m.y2_mat_[1] = 8;
|
||
|
m.uv_mat_[0] = ci[clip(q + g, 117)];
|
||
|
m.uv_mat_[1] = cj[clip(q + h, 127)]
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
var ck = new Array(-bh, 1, -B_TM_PRED, 2, -B_VE_PRED, 3, 4, 6, -B_HE_PRED, 5, -B_RD_PRED, -B_VR_PRED, -B_LD_PRED, 7, -B_VL_PRED, 8, -B_HD_PRED, -B_HU_PRED);
|
||
|
var cl = new Array(new Array(new Array(new Array(128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128), new Array(128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128), new Array(128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128)), new Array(new Array(253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128), new Array(189, 129, 242, 255, 227, 213, 255, 219, 128, 128, 128), new Array(106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128)), new Array(new Array(1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128), new Array(181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128), new Array(78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128)), new Array(new Array(1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128), new Array(184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128), new Array(77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128)), new Array(new Array(1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128), new Array(170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128), new Array(37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128)), new Array(new Array(1, 204, 254, 255, 245, 255, 128, 128, 128, 128, 128), new Array(207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128), new Array(102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128)), new Array(new Array(1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128), new Array(177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128), new Array(80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128)), new Array(new Array(1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128), new Array(246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128), new Array(255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128))), new Array(new Array(new Array(198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62), new Array(131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1), new Array(68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128)), new Array(new Array(1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128), new Array(184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128), new Array(81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128)), new Array(new Array(1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128), new Array(99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128), new Array(23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128)), new Array(new Array(1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128), new Array(109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128), new Array(44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128)), new Array(new Array(1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128), new Array(94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128), new Array(22, 100, 174, 245, 186, 161, 255, 199, 128, 128, 128)), new Array(new Array(1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128), new Array(124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128), new Array(35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128)), new Array(new Array(1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128), new Array(121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128), new Array(45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128)), new Array(new Array(1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128), new Array(203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128), new Array(137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128))), new Array(new Array(new Array(253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128), new Array(175, 13, 224, 243, 193, 185, 249, 198, 255, 255, 128), new Array(73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128)), new Array(new Array(1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128), new Array(239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128), new Array(155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128)), new Array(new Array(1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128), new Array(201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128), new Array(69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128)), new Array(new Array(1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128), new Array(223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128), new A
|
||
|
var cm = new Array(new Array(new Array(231, 120, 48, 89, 115, 113, 120, 152, 112), new Array(152, 179, 64, 126, 170, 118, 46, 70, 95), new Array(175, 69, 143, 80, 85, 82, 72, 155, 103), new Array(56, 58, 10, 171, 218, 189, 17, 13, 152), new Array(114, 26, 17, 163, 44, 195, 21, 10, 173), new Array(121, 24, 80, 195, 26, 62, 44, 64, 85), new Array(144, 71, 10, 38, 171, 213, 144, 34, 26), new Array(170, 46, 55, 19, 136, 160, 33, 206, 71), new Array(63, 20, 8, 114, 114, 208, 12, 9, 226), new Array(81, 40, 11, 96, 182, 84, 29, 16, 36)), new Array(new Array(134, 183, 89, 137, 98, 101, 106, 165, 148), new Array(72, 187, 100, 130, 157, 111, 32, 75, 80), new Array(66, 102, 167, 99, 74, 62, 40, 234, 128), new Array(41, 53, 9, 178, 241, 141, 26, 8, 107), new Array(74, 43, 26, 146, 73, 166, 49, 23, 157), new Array(65, 38, 105, 160, 51, 52, 31, 115, 128), new Array(104, 79, 12, 27, 217, 255, 87, 17, 7), new Array(87, 68, 71, 44, 114, 51, 15, 186, 23), new Array(47, 41, 14, 110, 182, 183, 21, 17, 194), new Array(66, 45, 25, 102, 197, 189, 23, 18, 22)), new Array(new Array(88, 88, 147, 150, 42, 46, 45, 196, 205), new Array(43, 97, 183, 117, 85, 38, 35, 179, 61), new Array(39, 53, 200, 87, 26, 21, 43, 232, 171), new Array(56, 34, 51, 104, 114, 102, 29, 93, 77), new Array(39, 28, 85, 171, 58, 165, 90, 98, 64), new Array(34, 22, 116, 206, 23, 34, 43, 166, 73), new Array(107, 54, 32, 26, 51, 1, 81, 43, 31), new Array(68, 25, 106, 22, 64, 171, 36, 225, 114), new Array(34, 19, 21, 102, 132, 188, 16, 76, 124), new Array(62, 18, 78, 95, 85, 57, 50, 48, 51)), new Array(new Array(193, 101, 35, 159, 215, 111, 89, 46, 111), new Array(60, 148, 31, 172, 219, 228, 21, 18, 111), new Array(112, 113, 77, 85, 179, 255, 38, 120, 114), new Array(40, 42, 1, 196, 245, 209, 10, 25, 109), new Array(88, 43, 29, 140, 166, 213, 37, 43, 154), new Array(61, 63, 30, 155, 67, 45, 68, 1, 209), new Array(100, 80, 8, 43, 154, 1, 51, 26, 71), new Array(142, 78, 78, 16, 255, 128, 34, 197, 171), new Array(41, 40, 5, 102, 211, 183, 4, 1, 221), new Array(51, 50, 17, 168, 209, 192, 23, 25, 82)), new Array(new Array(138, 31, 36, 171, 27, 166, 38, 44, 229), new Array(67, 87, 58, 169, 82, 115, 26, 59, 179), new Array(63, 59, 90, 180, 59, 166, 93, 73, 154), new Array(40, 40, 21, 116, 143, 209, 34, 39, 175), new Array(47, 15, 16, 183, 34, 223, 49, 45, 183), new Array(46, 17, 33, 183, 6, 98, 15, 32, 183), new Array(57, 46, 22, 24, 128, 1, 54, 17, 37), new Array(65, 32, 73, 115, 28, 128, 23, 128, 205), new Array(40, 3, 9, 115, 51, 192, 18, 6, 223), new Array(87, 37, 9, 115, 59, 77, 64, 21, 47)), new Array(new Array(104, 55, 44, 218, 9, 54, 53, 130, 226), new Array(64, 90, 70, 205, 40, 41, 23, 26, 57), new Array(54, 57, 112, 184, 5, 41, 38, 166, 213), new Array(30, 34, 26, 133, 152, 116, 10, 32, 134), new Array(39, 19, 53, 221, 26, 114, 32, 73, 255), new Array(31, 9, 65, 234, 2, 15, 1, 118, 73), new Array(75, 32, 12, 51, 192, 255, 160, 43, 51), new Array(88, 31, 35, 67, 102, 85, 55, 186, 85), new Array(56, 21, 23, 111, 59, 205, 45, 37, 192), new Array(55, 38, 70, 124, 73, 102, 1, 34, 98)), new Array(new Array(125, 98, 42, 88, 104, 85, 117, 175, 82), new Array(95, 84, 53, 89, 128, 100, 113, 101, 45), new Array(75, 79, 123, 47, 51, 128, 81, 171, 1), new Array(57, 17, 5, 71, 102, 57, 53, 41, 49), new Array(38, 33, 13, 121, 57, 73, 26, 1, 85), new Array(41, 10, 67, 138, 77, 110, 90, 47, 114), new Array(115, 21, 2, 10, 102, 255, 166, 23, 6), new Array(101, 29, 16, 10, 85, 128, 101, 196, 26), new Array(57, 18, 10, 102, 102, 213, 34, 20, 43), new Array(117, 20, 15, 36, 163, 128, 68, 1, 26)), new Array(new Array(102, 61, 71, 37, 34, 53, 31, 243, 192), new Array(69, 60, 71, 38, 73, 119, 28, 222, 37), new Array(68, 45, 128, 34, 1, 47, 11, 245, 171), new Array(62, 17, 19, 70, 146, 85, 55, 62, 70), new Array(37, 43, 37, 154, 100, 163, 85, 160, 1), new Array(63, 9, 92, 136, 28, 64, 32, 201, 85), new Array(75, 15, 9, 9, 64, 255, 184, 119, 16), new Array(86, 6, 28, 5, 64, 255, 25, 248, 1), new Array(56, 8, 17, 132, 137, 255, 55, 116, 128), new Array(58, 15, 20, 82, 135, 57, 26, 121, 40)), new A
|
||
|
|
||
|
function VP8ResetProba(a) {
|
||
|
for (i = 0; i < a.segments_.length; ++i) a.segments_[i] = 255;
|
||
|
a.coeffs_ = newObjectIt(cl)
|
||
|
}
|
||
|
|
||
|
function VP8ParseIntraMode(a, b) {
|
||
|
var c = b.intra_t_;
|
||
|
c[c.length - 1] = 0 + 4 * b.mb_x_;
|
||
|
var d = b.intra_l_;
|
||
|
b.is_i4x4_ = !VP8GetBit(a, 145);
|
||
|
if (!b.is_i4x4_) {
|
||
|
var e = VP8GetBit(a, 156) ? (VP8GetBit(a, 128) ? TM_PRED : H_PRED) : (VP8GetBit(a, 163) ? V_PRED : DC_PRED);
|
||
|
b.imodes_[0] = e;
|
||
|
for (i = 0; i < 4; ++i) c[i + c[c.length - 1]] = e;
|
||
|
for (i = 0; i < 4; ++i) d[i] = e
|
||
|
} else {
|
||
|
var f = b.imodes_;
|
||
|
var g = 0;
|
||
|
var y;
|
||
|
for (y = 0; y < 4; ++y) {
|
||
|
var e = d[y];
|
||
|
var x;
|
||
|
for (x = 0; x < 4; ++x) {
|
||
|
var h = cm[c[c[c.length - 1] + x]][e];
|
||
|
var i = 0;
|
||
|
do {
|
||
|
i = ck[2 * i + VP8GetBit(a, h[i])]
|
||
|
} while (i > 0);
|
||
|
e = -i;
|
||
|
c[c[c.length - 1] + x] = e;
|
||
|
f[g] = e;
|
||
|
g++
|
||
|
}
|
||
|
d[y] = e
|
||
|
}
|
||
|
}
|
||
|
b.uvmode_ = !VP8GetBit(a, 142) ? DC_PRED : !VP8GetBit(a, 114) ? V_PRED : VP8GetBit(a, 183) ? TM_PRED : H_PRED
|
||
|
}
|
||
|
var cn = new Array(new Array(new Array(new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(223, 241, 252, 255, 255, 255, 255, 255, 255, 255, 255), new Array(249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255), new Array(234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255), new Array(250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255), new Array(254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255))), new Array(new Array(new Array(217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(225, 252, 241, 253, 255, 255, 254, 255, 255, 255, 255), new Array(234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255)), new Array(new Array(255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255), new Array(250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255))), new Array(new Array(new Array(186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255), new Array(234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255), new Array(251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255)), new Array(new Array(255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 254, 255, 255, 255, 255, 255, 255, 255, 255,
|
||
|
|
||
|
function VP8ParseProba(a, d) {
|
||
|
var e = d.proba_;
|
||
|
var t, b, c, p;
|
||
|
for (t = 0; t < NUM_TYPES; ++t) {
|
||
|
for (b = 0; b < NUM_BANDS; ++b) {
|
||
|
for (c = 0; c < NUM_CTX; ++c) {
|
||
|
for (p = 0; p < NUM_PROBAS; ++p) {
|
||
|
if (VP8GetBit(a, cn[t][b][c][p])) {
|
||
|
e.coeffs_[t][b][c][p] = VP8GetValue(a, 8)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
d.use_skip_proba_ = VP8Get(a);
|
||
|
if (d.use_skip_proba_) {
|
||
|
d.skip_p_ = VP8GetValue(a, 8)
|
||
|
}
|
||
|
}
|
||
|
var co = 12;
|
||
|
var cp = 20;
|
||
|
this.WebPGetDecoderVersion = function(a) {
|
||
|
return (be << 16) | (bf << 8) | bg
|
||
|
};
|
||
|
|
||
|
function SetOk(a) {
|
||
|
a.status_ = 'VP8_STATUS_OK';
|
||
|
a.error_msg_ = "OK"
|
||
|
}
|
||
|
var cq;
|
||
|
|
||
|
function VP8InitIoInternal(a, b) {
|
||
|
if (b != N) {
|
||
|
alert('mismatch error');
|
||
|
return 0
|
||
|
}
|
||
|
if (a) {}
|
||
|
return 1
|
||
|
}
|
||
|
var cr;
|
||
|
|
||
|
function VP8New(a) {
|
||
|
var b = newObjectIt(bz);
|
||
|
if (b) {
|
||
|
SetOk(b);
|
||
|
b.ready_ = 0
|
||
|
}
|
||
|
return b
|
||
|
}
|
||
|
|
||
|
function VP8Delete(a) {
|
||
|
if (a) {
|
||
|
VP8Clear(a);
|
||
|
a = 0
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function VP8SetError(a, b, c) {
|
||
|
a.status_ = b;
|
||
|
a.error_msg_ = c;
|
||
|
a.ready_ = 0;
|
||
|
alert(b + ': ' + c);
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
function get_le32(a, b) {
|
||
|
return a[b + 0] | (a[b + 1] << 8) | (a[b + 2] << 16) | (a[b + 3] << 24)
|
||
|
}
|
||
|
|
||
|
function VP8CheckAndSkipHeader(a, b, c, d, e, f) {
|
||
|
if (!a || !c || !d || !e) {
|
||
|
return 0
|
||
|
}
|
||
|
if (c.value >= 8) {
|
||
|
if (!memcmp(a, b.value, "VP8 ", 4)) {
|
||
|
d.value = 1;
|
||
|
e.value = get_le32(a, b.value + 4);
|
||
|
if ((f.value >= co) && (e.value > f.value - co)) {
|
||
|
return 0
|
||
|
}
|
||
|
b.value += 8;
|
||
|
c.value -= 8
|
||
|
} else {
|
||
|
d.value = 0;
|
||
|
e.value = 0
|
||
|
}
|
||
|
} else {
|
||
|
d.value = -1;
|
||
|
e.value = 0
|
||
|
}
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function VP8GetInfo(a, b, c, d, e, f, g) {
|
||
|
if (c.value < 10) {
|
||
|
return 0
|
||
|
}
|
||
|
if (a[b.value + 3] != 0x9d || a[b.value + 4] != 0x01 || a[b.value + 5] != 0x2a) {
|
||
|
return 0
|
||
|
} else {
|
||
|
var i = a[b.value + 0] | (a[b.value + 1] << 8) | (a[b.value + 2] << 16);
|
||
|
var j = !(i & 1) + 0;
|
||
|
var w = ((a[b.value + 7] << 8) | a[b.value + 6]) & 0x3fff;
|
||
|
var h = ((a[b.value + 9] << 8) | a[b.value + 8]) & 0x3fff;
|
||
|
if (g) {
|
||
|
if (c.value < 11) return 0;
|
||
|
g.value = !!(a[b.value + 10] & 0x80)
|
||
|
}
|
||
|
if (!j) {
|
||
|
return 0
|
||
|
}
|
||
|
if (((i >> 1) & 7) > 3) {
|
||
|
return 0
|
||
|
}
|
||
|
if (!((i >> 4) & 1)) {
|
||
|
return 0
|
||
|
}
|
||
|
if (((i >> 5)) >= d) {
|
||
|
return 0
|
||
|
}
|
||
|
if (e) {
|
||
|
e.value = w
|
||
|
}
|
||
|
if (f) {
|
||
|
f.value = h
|
||
|
}
|
||
|
return 1
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function VP8XGetInfo(a, b, c, d, e, f, g) {
|
||
|
if (!a || !c || !d) {
|
||
|
return 0
|
||
|
}
|
||
|
if (c.value >= cp) {
|
||
|
if (!memcmp(a, b.value, "VP8X", 4)) {
|
||
|
var h = get_le32(a, b.value + 4);
|
||
|
d.value = 1;
|
||
|
if (h.value != (cp - 8)) {
|
||
|
return 0
|
||
|
}
|
||
|
if (g) {
|
||
|
g.value = get_le32(a, b.value + 8)
|
||
|
}
|
||
|
if (e) {
|
||
|
e.value = get_le32(a, b.value + 12)
|
||
|
}
|
||
|
if (f) {
|
||
|
f.value = get_le32(a, b.value + 16)
|
||
|
}
|
||
|
b.value += cp;
|
||
|
c.value -= cp
|
||
|
} else {
|
||
|
d.value = 0
|
||
|
}
|
||
|
} else {
|
||
|
d.value = -1
|
||
|
}
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function ResetSegmentHeader(a) {
|
||
|
assert(a);
|
||
|
a.use_segment_ = 0;
|
||
|
a.update_map_ = 0;
|
||
|
a.absolute_delta_ = 1;
|
||
|
for (i = 0; i < a.quantizer_.length; ++i) a.quantizer_[i] = 0;
|
||
|
for (i = 0; i < a.filter_strength_.length; ++i) a.filter_strength_[i] = 0
|
||
|
}
|
||
|
|
||
|
function ParseSegmentHeader(a, b, c) {
|
||
|
assert(a);
|
||
|
assert(b);
|
||
|
b.use_segment_ = VP8Get(a);
|
||
|
if (b.use_segment_) {
|
||
|
b.update_map_ = VP8Get(a);
|
||
|
if (VP8Get(a)) {
|
||
|
var s;
|
||
|
b.absolute_delta_ = VP8Get(a);
|
||
|
for (s = 0; s < NUM_MB_SEGMENTS; ++s) {
|
||
|
b.quantizer_[s] = VP8Get(a) ? VP8GetSignedValue(a, 7) : 0
|
||
|
}
|
||
|
for (s = 0; s < NUM_MB_SEGMENTS; ++s) {
|
||
|
b.filter_strength_[s] = VP8Get(a) ? VP8GetSignedValue(a, 6) : 0
|
||
|
}
|
||
|
}
|
||
|
if (b.update_map_) {
|
||
|
var s;
|
||
|
for (s = 0; s < bi; ++s) {
|
||
|
c.segments_[s] = VP8Get(a) ? VP8GetValue(a, 8) : 255
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
b.update_map_ = 0
|
||
|
}
|
||
|
return !a.eof_
|
||
|
}
|
||
|
|
||
|
function ParsePartitions(a, b, c, d) {
|
||
|
var e = a.br_;
|
||
|
var f = b;
|
||
|
var g = c;
|
||
|
var h = b,
|
||
|
buf_end_off = c + d;
|
||
|
var i;
|
||
|
var j = 0;
|
||
|
var k = int;
|
||
|
var p = int;
|
||
|
a.num_parts_ = 1 << VP8GetValue(e, 2);
|
||
|
k = a.num_parts_ - 1;
|
||
|
i = b;
|
||
|
var j = c + k * 3;
|
||
|
if (buf_end_off < j) {
|
||
|
return 'VP8_STATUS_NOT_ENOUGH_DATA'
|
||
|
}
|
||
|
for (p = 0; p < k; ++p) {
|
||
|
var l = f[g + 0] | (f[g + 1] << 8) | (f[g + 2] << 16);
|
||
|
var m = i;
|
||
|
var n = j + l;
|
||
|
if (n > buf_end_off) m = h;
|
||
|
VP8InitBitReader(a.parts_[+p], i, j, n);
|
||
|
i = m;
|
||
|
j = n;
|
||
|
g += 3
|
||
|
}
|
||
|
VP8InitBitReader(a.parts_[+k], i, j, buf_end_off);
|
||
|
return (j < buf_end_off) ? 'VP8_STATUS_OK' : 'VP8_STATUS_SUSPENDED'
|
||
|
}
|
||
|
|
||
|
function ParseFilterHeader(a, b) {
|
||
|
var c = b.filter_hdr_;
|
||
|
c.simple_ = VP8Get(a);
|
||
|
c.level_ = VP8GetValue(a, 6);
|
||
|
c.sharpness_ = VP8GetValue(a, 3);
|
||
|
c.use_lf_delta_ = VP8Get(a);
|
||
|
if (c.use_lf_delta_) {
|
||
|
if (VP8Get(a)) {
|
||
|
var i;
|
||
|
for (i = 0; i < NUM_REF_LF_DELTAS; ++i) {
|
||
|
if (VP8Get(a)) {
|
||
|
c.ref_lf_delta_[i] = VP8GetSignedValue(a, 6)
|
||
|
}
|
||
|
}
|
||
|
for (i = 0; i < NUM_MODE_LF_DELTAS; ++i) {
|
||
|
if (VP8Get(a)) {
|
||
|
c.mode_lf_delta_[i] = VP8GetSignedValue(a, 6)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
b.filter_type_ = (c.level_ == 0) ? 0 : c.simple_ ? 1 : 2;
|
||
|
if (b.filter_type_ > 0) {
|
||
|
if (b.segment_hdr_.use_segment_) {
|
||
|
var s;
|
||
|
for (s = 0; s < NUM_MB_SEGMENTS; ++s) {
|
||
|
var d = b.segment_hdr_.filter_strength_[s];
|
||
|
if (!b.segment_hdr_.absolute_delta_) {
|
||
|
d += c.level_
|
||
|
}
|
||
|
b.filter_levels_[s] = d
|
||
|
}
|
||
|
} else {
|
||
|
b.filter_levels_[0] = c.level_
|
||
|
}
|
||
|
}
|
||
|
return !a.eof_
|
||
|
}
|
||
|
var cs, buf, buf_size;
|
||
|
var ct;
|
||
|
|
||
|
function VP8GetHeaders(a, b) {
|
||
|
var c = {
|
||
|
value: 0
|
||
|
};
|
||
|
var d = uint8_t;
|
||
|
var e = {
|
||
|
value: uint32_t
|
||
|
};
|
||
|
var f = {
|
||
|
value: uint32_t
|
||
|
};
|
||
|
var g = {
|
||
|
value: uint32_t
|
||
|
};
|
||
|
var h = {
|
||
|
value: 0
|
||
|
};
|
||
|
var i = {
|
||
|
value: 0
|
||
|
};
|
||
|
var j = newObjectIt(bp);
|
||
|
var k = newObjectIt(bq);
|
||
|
var l = newObjectIt(bb);
|
||
|
var m = 'VP8StatusCode';
|
||
|
if (a == null) {
|
||
|
alert('(dec == null)');
|
||
|
return 0
|
||
|
}
|
||
|
SetOk(a);
|
||
|
if (b == null) {
|
||
|
return VP8SetError(a, 'VP8_STATUS_INVALID_PARAM', "null VP8Io passed to VP8GetHeaders()")
|
||
|
}
|
||
|
d = b.data;
|
||
|
c.value = b.data_off;
|
||
|
e.value = b.data_size;
|
||
|
if (d == null || e.value <= 4) {
|
||
|
return VP8SetError(a, 'VP8_STATUS_NOT_ENOUGH_DATA', "Not enough data to parse frame header")
|
||
|
}
|
||
|
if (!WebPCheckAndSkipRIFFHeader(d, c, e, f)) {
|
||
|
return VP8SetError(a, VP8_STATUS_BITSTREAM_ERROR, "RIFF: Invalid RIFF container")
|
||
|
}
|
||
|
if (!VP8XGetInfo(d, c, e, h, null, null, null)) {
|
||
|
return VP8SetError(a, VP8_STATUS_BITSTREAM_ERROR, "RIFF: Invalid VP8X container")
|
||
|
}
|
||
|
if (!VP8CheckAndSkipHeader(d, c, e, i, g, f)) {
|
||
|
return VP8SetError(a, VP8_STATUS_BITSTREAM_ERROR, "RIFF: Inconsistent size information.")
|
||
|
}
|
||
|
if (i.value == -1) {
|
||
|
return VP8SetError(a, 'VP8_STATUS_BITSTREAM_ERROR', "RIFF: Inconsistent size information.")
|
||
|
}
|
||
|
if (e.value < 4) {
|
||
|
return VP8SetError(a, VP8_STATUS_NOT_ENOUGH_DATA, "RIFF: Truncated header.")
|
||
|
}
|
||
|
c = c.value;
|
||
|
e = e.value; {
|
||
|
var n = d[c + 0] | (d[c + 1] << 8) | (d[c + 2] << 16);
|
||
|
j = a.frm_hdr_;
|
||
|
j.key_frame_ = !(n & 1) + 0;
|
||
|
j.profile_ = (n >> 1) & 7;
|
||
|
j.show_ = (n >> 4) & 1;
|
||
|
j.partition_length_ = (n >> 5);
|
||
|
if (j.profile_ > 3) return VP8SetError(a, 'VP8_STATUS_BITSTREAM_ERROR', "Incorrect keyframe parameters.");
|
||
|
if (!j.show_) return VP8SetError(a, 'VP8_STATUS_UNSUPPORTED_FEATURE', "Frame not displayable.");
|
||
|
c += 3;
|
||
|
e -= 3
|
||
|
}
|
||
|
k = a.pic_hdr_;
|
||
|
if (j.key_frame_) {
|
||
|
if (e < 7) {
|
||
|
return VP8SetError(a, 'VP8_STATUS_NOT_ENOUGH_DATA', "cannot parse picture header")
|
||
|
}
|
||
|
if (Byte2Hex(d[c + 0]) != 0x9d || Byte2Hex(d[c + 1]) != 0x01 || Byte2Hex(d[c + 2]) != 0x2a) {
|
||
|
return VP8SetError(a, 'VP8_STATUS_BITSTREAM_ERROR', "Bad code word")
|
||
|
}
|
||
|
k.width_ = ((d[c + 4] << 8) | d[c + 3]) & 0x3fff;
|
||
|
k.xscale_ = d[c + 4] >> 6;
|
||
|
k.height_ = ((d[c + 6] << 8) | d[c + 5]) & 0x3fff;
|
||
|
k.yscale_ = d[c + 6] >> 6;
|
||
|
c += 7;
|
||
|
e -= 7;
|
||
|
a.mb_w_ = (k.width_ + 15) >> 4;
|
||
|
a.mb_h_ = (k.height_ + 15) >> 4;
|
||
|
b.width = k.width_;
|
||
|
b.height = k.height_;
|
||
|
b.use_scaling = 0;
|
||
|
b.use_cropping = 0;
|
||
|
b.crop_top = 0;
|
||
|
b.crop_left = 0;
|
||
|
b.crop_right = b.width;
|
||
|
b.crop_bottom = b.height;
|
||
|
b.mb_w = b.width;
|
||
|
b.mb_h = b.height;
|
||
|
VP8ResetProba(a.proba_);
|
||
|
ResetSegmentHeader(a.segment_hdr_);
|
||
|
a.segment_ = 0
|
||
|
}
|
||
|
if (j.partition_length_ > e) {
|
||
|
return VP8SetError(a, 'VP8_STATUS_NOT_ENOUGH_DATA', "bad partition length")
|
||
|
}
|
||
|
a.alpha_data_ = null;
|
||
|
a.alpha_data_size_ = 0;
|
||
|
var l = a.br_;
|
||
|
VP8InitBitReader(l, d, c, c + j.partition_length_);
|
||
|
c += j.partition_length_;
|
||
|
e -= j.partition_length_;
|
||
|
if (j.key_frame_) {
|
||
|
k.colorspace_ = VP8Get(l);
|
||
|
k.clamp_type_ = VP8Get(l)
|
||
|
}
|
||
|
if (!ParseSegmentHeader(l, a.segment_hdr_, a.proba_)) {
|
||
|
return VP8SetError(a, 'VP8_STATUS_BITSTREAM_ERROR', "cannot parse segment header")
|
||
|
}
|
||
|
if (!ParseFilterHeader(l, a)) {
|
||
|
return VP8SetError(a, 'VP8_STATUS_BITSTREAM_ERROR', "cannot parse filter header")
|
||
|
}
|
||
|
m = ParsePartitions(a, d, c, e);
|
||
|
if (m != 'VP8_STATUS_OK') {
|
||
|
return VP8SetError(a, 'VP8_STATUS_BITSTREAM_ERROR', "cannot parse partitions")
|
||
|
}
|
||
|
VP8ParseQuant(a);
|
||
|
if (!j.key_frame_) {
|
||
|
return VP8SetError(a, VP8_STATUS_UNSUPPORTED_FEATURE, "Not a key frame.")
|
||
|
} else {
|
||
|
a.buffer_flags_ = 0x003 | 0x100
|
||
|
}
|
||
|
VP8Get(l);
|
||
|
VP8ParseProba(l, a);
|
||
|
if (a.pic_hdr_.colorspace_) {
|
||
|
var o = 8;
|
||
|
var p = 0x01;
|
||
|
var q = d;
|
||
|
ext_buf_off = c - o;
|
||
|
var r = size_t;
|
||
|
if (j.partition_length_ < o || q[ext_buf_off + o - 1] != p) {}
|
||
|
r = (q[ext_buf_off + 4] << 0) | (q[ext_buf_off + 5] << 8) | (q[ext_buf_off + 6] << 16);
|
||
|
if (j.partition_length_ < r + o) {
|
||
|
return VP8SetError(a, VP8_STATUS_BITSTREAM_ERROR, "RIFF: Inconsistent extra information.")
|
||
|
}
|
||
|
a.alpha_data_ = (r > 0) ? q : null;
|
||
|
a.alpha_data_off = (r > 0) ? ext_buf_off - r : null;
|
||
|
a.alpha_data_size_ = r;
|
||
|
r = (q[ext_buf_off + 0] << 0) | (q[ext_buf_off + 1] << 8) | (q[ext_buf_off + 2] << 16);
|
||
|
a.layer_data_size_ = r;
|
||
|
a.layer_data_ = null;
|
||
|
a.layer_colorspace_ = q[ext_buf_off + 3]
|
||
|
}
|
||
|
a.ready_ = 1;
|
||
|
return 1
|
||
|
}
|
||
|
var cu = new Array(0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 0);
|
||
|
var cv = new Array(173, 148, 140, 0);
|
||
|
var cw = new Array(176, 155, 140, 135, 0);
|
||
|
var cx = new Array(180, 157, 141, 134, 130, 0);
|
||
|
var cy = new Array(254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129, 0);
|
||
|
var cz = new Array(cv, cw, cx, cy);
|
||
|
var cA = new Array(0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15);
|
||
|
var cB = ArrM(new Array(NUM_CTX, NUM_PROBAS), '');
|
||
|
|
||
|
function GetCoeffs(a, b, c, d, n, e) {
|
||
|
var p = b[cu[n]][c];
|
||
|
if (!VP8GetBit(a, p[0])) {
|
||
|
return 0
|
||
|
}
|
||
|
while (1) {
|
||
|
++n;
|
||
|
if (!VP8GetBit(a, p[1])) {
|
||
|
p = b[cu[n]][0]
|
||
|
} else {
|
||
|
var v, j;
|
||
|
if (!VP8GetBit(a, p[2])) {
|
||
|
p = b[cu[n]][1];
|
||
|
v = 1
|
||
|
} else {
|
||
|
if (!VP8GetBit(a, p[3])) {
|
||
|
if (!VP8GetBit(a, p[4])) {
|
||
|
v = 2
|
||
|
} else {
|
||
|
v = 3 + VP8GetBit(a, p[5])
|
||
|
}
|
||
|
} else {
|
||
|
if (!VP8GetBit(a, p[6])) {
|
||
|
if (!VP8GetBit(a, p[7])) {
|
||
|
v = 5 + VP8GetBit(a, 159)
|
||
|
} else {
|
||
|
v = 7 + 2 * VP8GetBit(a, 165);
|
||
|
v += VP8GetBit(a, 145)
|
||
|
}
|
||
|
} else {
|
||
|
var f = uint8_t;
|
||
|
var g = VP8GetBit(a, p[8]);
|
||
|
var h = VP8GetBit(a, p[9 + g]);
|
||
|
var k = 2 * g + h;
|
||
|
v = 0;
|
||
|
f = cz[k];
|
||
|
var l;
|
||
|
for (i = 0; i < (f.length - 1); ++i) {
|
||
|
v += v + VP8GetBit(a, f[i])
|
||
|
}
|
||
|
v += 3 + (8 << k)
|
||
|
}
|
||
|
}
|
||
|
p = b[cu[n]][2]
|
||
|
}
|
||
|
j = cA[n - 1];
|
||
|
e[e[e.length - 1] + j] = VP8GetSigned(a, v) * d[((j > 0) + 0)];
|
||
|
if (n == 16 || !VP8GetBit(a, p[0])) {
|
||
|
return n
|
||
|
}
|
||
|
}
|
||
|
if (n == 16) {
|
||
|
return 16
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
var cC = {
|
||
|
i8: Arr(4, uint8_t),
|
||
|
i32: uint32_t
|
||
|
};
|
||
|
var cD = new Array(new Array(0, 0, 0, 0), new Array(1, 0, 0, 0), new Array(0, 1, 0, 0), new Array(1, 1, 0, 0), new Array(0, 0, 1, 0), new Array(1, 0, 1, 0), new Array(0, 1, 1, 0), new Array(1, 1, 1, 0), new Array(0, 0, 0, 1), new Array(1, 0, 0, 1), new Array(0, 1, 0, 1), new Array(1, 1, 0, 1), new Array(0, 0, 1, 1), new Array(1, 0, 1, 1), new Array(0, 1, 1, 1), new Array(1, 1, 1, 1));
|
||
|
var cE = 0x08040201;
|
||
|
|
||
|
function PACK(X, S) {
|
||
|
return ((((X[0] * 0x1000000 + X[1] * 0x10000 + X[2] * 0x100 + X[3] * 0x1) * cE) & 0xff000000) >> (S))
|
||
|
}
|
||
|
|
||
|
function ParseResiduals(a, b, c) {
|
||
|
var d, out_l_nz, first;
|
||
|
var e = cB;
|
||
|
var q = a.dqm_[a.segment_];
|
||
|
var f = a.coeffs_;
|
||
|
var g = a.mb_info_[1 - 1];
|
||
|
var h = Arr(4, 0),
|
||
|
nz_dc = Arr(4, 0);
|
||
|
var i = Arr(4, 0),
|
||
|
lnz = Arr(4, 0);
|
||
|
var j = 0;
|
||
|
var k = 0;
|
||
|
var x, y, ch;
|
||
|
f = memset(0, 384 * sizeof(f));
|
||
|
if (!a.is_i4x4_) {
|
||
|
var m = Arr(16, 0);
|
||
|
var n = b.dc_nz_ + g.dc_nz_;
|
||
|
b.dc_nz_ = g.dc_nz_ = (GetCoeffs(c, a.proba_.coeffs_[1], n, q.y2_mat_, 0, m) > 0) + 0;
|
||
|
first = 1;
|
||
|
e = a.proba_.coeffs_[0];
|
||
|
VP8TransformWHT(m, f);
|
||
|
f[f.length - 1] = 0
|
||
|
} else {
|
||
|
first = 0;
|
||
|
e = a.proba_.coeffs_[3]
|
||
|
}
|
||
|
i = ArrCopy(cD[b.nz_ & 0xf]);
|
||
|
lnz = ArrCopy(cD[g.nz_ & 0xf]);
|
||
|
for (y = 0; y < 4; ++y) {
|
||
|
var l = lnz[y];
|
||
|
for (x = 0; x < 4; ++x) {
|
||
|
var n = l + i[x];
|
||
|
var o = GetCoeffs(c, e, n, q.y1_mat_, first, f);
|
||
|
i[x] = l = (o > 0) + 0;
|
||
|
nz_dc[x] = ((f[f[f.length - 1] + 0] != 0) + 0);
|
||
|
h[x] = (o > 1) + 0;
|
||
|
f[f.length - 1] += 16
|
||
|
}
|
||
|
lnz[y] = l;
|
||
|
k |= PACK(nz_dc, 24 - y * 4);
|
||
|
j |= PACK(h, 24 - y * 4)
|
||
|
}
|
||
|
d = PACK(i, 24);
|
||
|
out_l_nz = PACK(lnz, 24);
|
||
|
i = ArrCopy(cD[b.nz_ >> 4]);
|
||
|
lnz = ArrCopy(cD[g.nz_ >> 4]);
|
||
|
for (ch = 0; ch < 4; ch += 2) {
|
||
|
for (y = 0; y < 2; ++y) {
|
||
|
var l = lnz[ch + y];
|
||
|
for (x = 0; x < 2; ++x) {
|
||
|
var n = l + i[ch + x];
|
||
|
var o = GetCoeffs(c, a.proba_.coeffs_[2], n, q.uv_mat_, 0, f);
|
||
|
i[ch + x] = l = (o > 0) + 0;
|
||
|
nz_dc[y * 2 + x] = ((f[f[f.length - 1] + 0] != 0) + 0);
|
||
|
h[y * 2 + x] = (o > 1) + 0;
|
||
|
f[f.length - 1] += 16
|
||
|
}
|
||
|
lnz[ch + y] = l
|
||
|
}
|
||
|
k |= PACK(nz_dc, 8 - ch * 2);
|
||
|
j |= PACK(h, 8 - ch * 2)
|
||
|
}
|
||
|
d |= PACK(i, 20);
|
||
|
out_l_nz |= PACK(lnz, 20);
|
||
|
b.nz_ = d;
|
||
|
g.nz_ = out_l_nz;
|
||
|
a.coeffs_ = f;
|
||
|
a.non_zero_ac_ = j + 0;
|
||
|
a.non_zero_ = j | k;
|
||
|
b.skip_ = (!a.non_zero_) + 0
|
||
|
}
|
||
|
var cF;
|
||
|
|
||
|
function VP8DecodeMB(a, b) {
|
||
|
var c = a.br_;
|
||
|
var d = a.mb_info_[1 - 1];
|
||
|
var e = a.mb_info_[1 + a.mb_x_];
|
||
|
if (a.segment_hdr_.update_map_) {
|
||
|
a.segment_ = !VP8GetBit(c, a.proba_.segments_[0]) ? 0 + VP8GetBit(c, a.proba_.segments_[1]) : 2 + VP8GetBit(c, a.proba_.segments_[2])
|
||
|
}
|
||
|
e.skip_ = a.use_skip_proba_ ? VP8GetBit(c, a.skip_p_) : 0;
|
||
|
VP8ParseIntraMode(c, a);
|
||
|
if (c.eof_) {
|
||
|
return 0
|
||
|
}
|
||
|
if (!e.skip_) {
|
||
|
ParseResiduals(a, e, b)
|
||
|
} else {
|
||
|
d.nz_ = e.nz_ = 0;
|
||
|
if (!a.is_i4x4_) {
|
||
|
d.dc_nz_ = e.dc_nz_ = 0
|
||
|
}
|
||
|
a.non_zero_ = 0;
|
||
|
a.non_zero_ac_ = 0
|
||
|
}
|
||
|
return (!b.eof_)
|
||
|
}
|
||
|
|
||
|
function VP8InitScanline(a) {
|
||
|
var b = a.mb_info_[1 - 1];
|
||
|
b.nz_ = 0;
|
||
|
b.dc_nz_ = 0;
|
||
|
memset_(a.intra_l_, 0, bh, a.intra_l_.length);
|
||
|
a.filter_row_ = ((a.filter_type_ > 0) && (a.mb_y_ >= a.tl_mb_y_) && (a.mb_y_ <= a.br_mb_y_)) + 0
|
||
|
}
|
||
|
var cG;
|
||
|
|
||
|
function ParseFrame(a, b) {
|
||
|
for (a.mb_y_ = 0; a.mb_y_ < a.br_mb_y_; ++a.mb_y_) {
|
||
|
cG = a.parts_[a.mb_y_ & (a.num_parts_ - 1)];
|
||
|
VP8InitScanline(a);
|
||
|
for (a.mb_x_ = 0; a.mb_x_ < a.mb_w_; a.mb_x_++) {
|
||
|
if (!VP8DecodeMB(a, cG)) {
|
||
|
return VP8SetError(a, 'VP8_STATUS_NOT_ENOUGH_DATA', "Premature end-of-file encountered." + a.mb_x_ + ' ' + a.mb_y_)
|
||
|
}
|
||
|
VP8ReconstructBlock(a);
|
||
|
VP8StoreBlock(a)
|
||
|
}
|
||
|
if (!VP8ProcessRow(a, b)) {
|
||
|
return VP8SetError(a, 'VP8_STATUS_USER_ABORT', "Output aborted.")
|
||
|
}
|
||
|
}
|
||
|
if (a.use_threads_ && !WebPWorkerSync(a.worker_)) {
|
||
|
return 0
|
||
|
}
|
||
|
if (a.layer_data_size_ > 0) {
|
||
|
if (!VP8DecodeLayer(a)) {
|
||
|
return 0
|
||
|
}
|
||
|
}
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function VP8Decode(a, b) {
|
||
|
var c = 0;
|
||
|
if (a == null) {
|
||
|
return 0
|
||
|
}
|
||
|
if (b == null) {
|
||
|
return VP8SetError(a, 'VP8_STATUS_INVALID_PARAM', "NULL VP8Io parameter in VP8Decode().")
|
||
|
}
|
||
|
if (!a.ready_) {
|
||
|
if (!VP8GetHeaders(a, b)) {
|
||
|
return 0
|
||
|
}
|
||
|
}
|
||
|
assert(a.ready_);
|
||
|
c = (VP8EnterCritical(a, b) == T);
|
||
|
if (c) {
|
||
|
if (c) c = VP8InitFrame(a, b);
|
||
|
if (c) c = ParseFrame(a, b);
|
||
|
c &= VP8ExitCritical(a, b)
|
||
|
}
|
||
|
if (!c) {
|
||
|
VP8Clear(a);
|
||
|
return 0
|
||
|
}
|
||
|
a.ready_ = 0;
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function VP8Clear(a) {
|
||
|
if (a == null) {
|
||
|
return
|
||
|
}
|
||
|
if (a.use_threads_) {
|
||
|
WebPWorkerEnd(a.worker_)
|
||
|
}
|
||
|
if (a.mem_) {
|
||
|
a.mem_ = 0
|
||
|
}
|
||
|
a.mem_ = null;
|
||
|
a.mem_size_ = 0;
|
||
|
a.ready_ = 0
|
||
|
}
|
||
|
var cH = 16,
|
||
|
YUV_RANGE_MIN = -227,
|
||
|
YUV_RANGE_MAX = 256 + 226;
|
||
|
|
||
|
function VP8YuvToRgb(y, u, v, a, b) {
|
||
|
var c = cJ[v];
|
||
|
var d = (cK[v] + VP8kUToG[u]) >> cH;
|
||
|
var e = VP8kUToB[u];
|
||
|
a[b + 0] = cL[y + c - YUV_RANGE_MIN];
|
||
|
a[b + 1] = cL[y + d - YUV_RANGE_MIN];
|
||
|
a[b + 2] = cL[y + e - YUV_RANGE_MIN]
|
||
|
}
|
||
|
|
||
|
function VP8YuvToRgb565(y, u, v, a, b) {
|
||
|
var c = cJ[v];
|
||
|
var d = (cK[v] + VP8kUToG[u]) >> cH;
|
||
|
var e = VP8kUToB[u];
|
||
|
a[b + 0] = ((cL[y + c - YUV_RANGE_MIN] & 0xf8) | (cL[y + d - YUV_RANGE_MIN] >> 5));
|
||
|
a[b + 1] = (((cL[y + d - YUV_RANGE_MIN] << 3) & 0xe0) | (cL[y + e - YUV_RANGE_MIN] >> 3))
|
||
|
}
|
||
|
|
||
|
function VP8YuvToArgbKeepA(y, u, v, a, b) {
|
||
|
VP8YuvToRgb(y, u, v, a, b + 1)
|
||
|
}
|
||
|
|
||
|
function VP8YuvToArgb(y, u, v, a, b) {
|
||
|
a[b + 0] = 0xff;
|
||
|
VP8YuvToArgbKeepA(y, u, v, a, b)
|
||
|
}
|
||
|
|
||
|
function VP8YuvToRgba4444KeepA(y, u, v, a, b) {
|
||
|
var c = cJ[v];
|
||
|
var d = (cK[v] + VP8kUToG[u]) >> cH;
|
||
|
var e = VP8kUToB[u];
|
||
|
a[b + 0] = ((cM[y + c - YUV_RANGE_MIN] << 4) | cM[y + d - YUV_RANGE_MIN]);
|
||
|
a[b + 1] = ((a[b + 1] << 44) | (cM[y + e - YUV_RANGE_MIN] << 4))
|
||
|
}
|
||
|
|
||
|
function VP8YuvToRgba4444(y, u, v, a, b) {
|
||
|
a[b + 1] = 0x0f;
|
||
|
VP8YuvToRgba4444KeepA(y, u, v, a, b)
|
||
|
}
|
||
|
|
||
|
function VP8YuvToBgr(y, u, v, a, b) {
|
||
|
var c = cJ[v];
|
||
|
var d = (cK[v] + VP8kUToG[u]) >> cH;
|
||
|
var e = VP8kUToB[u];
|
||
|
a[b + 0] = cL[y + e - YUV_RANGE_MIN];
|
||
|
a[b + 1] = cL[y + d - YUV_RANGE_MIN];
|
||
|
a[b + 2] = cL[y + c - YUV_RANGE_MIN]
|
||
|
}
|
||
|
|
||
|
function VP8YuvToBgra(y, u, v, a, b) {
|
||
|
VP8YuvToBgr(y, u, v, a, b);
|
||
|
a[b + 3] = 0xff
|
||
|
}
|
||
|
|
||
|
function VP8YuvToRgba(y, u, v, a, b) {
|
||
|
VP8YuvToRgb(y, u, v, a, b);
|
||
|
a[b + 3] = 0xff
|
||
|
}
|
||
|
var cI = (1 << (cH - 1));
|
||
|
var cJ = Arr(256, int16_t),
|
||
|
VP8kUToB = Arr(256, int16_t);
|
||
|
var cK = Arr(256, int32_t),
|
||
|
VP8kUToG = Arr(256, int32_t);
|
||
|
var cL = Arr(YUV_RANGE_MAX - YUV_RANGE_MIN, uint8_t);
|
||
|
var cM = Arr(YUV_RANGE_MAX - YUV_RANGE_MIN, uint8_t);
|
||
|
var cN = 0;
|
||
|
|
||
|
function clip(v, a) {
|
||
|
return v < 0 ? 0 : v > a ? a : v
|
||
|
}
|
||
|
|
||
|
function VP8YUVInit(a) {
|
||
|
var i;
|
||
|
if (cN) {
|
||
|
return
|
||
|
}
|
||
|
for (i = 0; i < 256; ++i) {
|
||
|
cJ[i] = (89858 * (i - 128) + cI) >> cH;
|
||
|
VP8kUToG[i] = -22014 * (i - 128) + cI;
|
||
|
cK[i] = -45773 * (i - 128);
|
||
|
VP8kUToB[i] = (113618 * (i - 128) + cI) >> cH
|
||
|
}
|
||
|
for (i = YUV_RANGE_MIN; i < YUV_RANGE_MAX; ++i) {
|
||
|
var k = ((i - 16) * 76283 + cI) >> cH;
|
||
|
cL[i - YUV_RANGE_MIN] = clip(k, 255);
|
||
|
cM[i - YUV_RANGE_MIN] = clip((k + 8) >> 4, 15)
|
||
|
}
|
||
|
cN = 1
|
||
|
}
|
||
|
|
||
|
function LOAD_UV(u, v) {
|
||
|
return ((u) | ((v) << 16))
|
||
|
}
|
||
|
|
||
|
function FUNC_NAME(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s) {
|
||
|
var x;
|
||
|
var t = (q - 1) >> 1;
|
||
|
var u = LOAD_UV(e[f + 0], g[h + 0]);
|
||
|
var v = LOAD_UV(i[j + 0], k[l + 0]);
|
||
|
if (a) {
|
||
|
var w = (3 * u + v + 0x00020002) >> 2;
|
||
|
r(a[b + 0], w & 0xff, (w >> 16), m, n)
|
||
|
}
|
||
|
if (c) {
|
||
|
var w = (3 * v + u + 0x00020002) >> 2;
|
||
|
r(c[d + 0], w & 0xff, (w >> 16), o, p)
|
||
|
}
|
||
|
for (x = 1; x <= t; ++x) {
|
||
|
var y = LOAD_UV(e[f + x], g[h + x]);
|
||
|
var z = LOAD_UV(i[j + x], k[l + x]);
|
||
|
var A = u + y + v + z + 0x00080008;
|
||
|
var B = (A + 2 * (y + v)) >> 3;
|
||
|
var C = (A + 2 * (u + z)) >> 3;
|
||
|
if (a) {
|
||
|
var w = (B + u) >> 1;
|
||
|
var D = (C + y) >> 1;
|
||
|
r(a[b + 2 * x - 1], w & 0xff, (w >> 16), m, n + (2 * x - 1) * s);
|
||
|
r(a[b + 2 * x - 0], D & 0xff, (D >> 16), m, n + (2 * x - 0) * s)
|
||
|
}
|
||
|
if (c) {
|
||
|
var w = (C + v) >> 1;
|
||
|
var D = (B + z) >> 1;
|
||
|
r(c[d + 2 * x - 1], w & 0xff, (w >> 16), o, p + (2 * x - 1) * s);
|
||
|
r(c[d + 2 * x + 0], D & 0xff, (D >> 16), o, p + (2 * x + 0) * s)
|
||
|
}
|
||
|
u = y;
|
||
|
v = z
|
||
|
}
|
||
|
if (!(q & 1)) {
|
||
|
if (a) {
|
||
|
var w = (3 * u + v + 0x00020002) >> 2;
|
||
|
r(a[b + q - 1], w & 0xff, (w >> 16), m, n + (q - 1) * s)
|
||
|
}
|
||
|
if (c) {
|
||
|
var w = (3 * v + u + 0x00020002) >> 2;
|
||
|
r(c[d + q - 1], w & 0xff, (w >> 16), o, p + (q - 1) * s)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function UpsampleRgbLinePair(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l) {
|
||
|
FUNC_NAME(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l, VP8YuvToRgb, 3)
|
||
|
}
|
||
|
|
||
|
function UpsampleBgrLinePair(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l) {
|
||
|
FUNC_NAME(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l, VP8YuvToBgr, 3)
|
||
|
}
|
||
|
|
||
|
function UpsampleRgbaLinePair(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l) {
|
||
|
FUNC_NAME(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l, VP8YuvToRgba, 4)
|
||
|
}
|
||
|
|
||
|
function UpsampleBgraLinePair(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l) {
|
||
|
FUNC_NAME(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l, VP8YuvToBgra, 4)
|
||
|
}
|
||
|
|
||
|
function UpsampleArgbLinePair(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l) {
|
||
|
FUNC_NAME(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l, VP8YuvToArgb, 4)
|
||
|
}
|
||
|
|
||
|
function UpsampleRgba4444LinePair(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l) {
|
||
|
FUNC_NAME(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l, VP8YuvToRgba4444, 2)
|
||
|
}
|
||
|
|
||
|
function UpsampleRgb565LinePair(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l) {
|
||
|
FUNC_NAME(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l, VP8YuvToRgb565, 2)
|
||
|
}
|
||
|
|
||
|
function UpsampleRgbKeepAlphaLinePair(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l) {
|
||
|
FUNC_NAME(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l, VP8YuvToRgb, 4)
|
||
|
}
|
||
|
|
||
|
function UpsampleBgrKeepAlphaLinePair(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l) {
|
||
|
FUNC_NAME(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l, VP8YuvToBgr, 4)
|
||
|
}
|
||
|
|
||
|
function UpsampleArgbKeepAlphaLinePair(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l) {
|
||
|
FUNC_NAME(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l, VP8YuvToArgbKeepA, 4)
|
||
|
}
|
||
|
|
||
|
function UpsampleRgba4444KeepAlphaLinePair(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l) {
|
||
|
FUNC_NAME(A, a, B, b, C, c, D, d, E, e, F, f, G, g, H, h, l, VP8YuvToRgba4444KeepA, 2)
|
||
|
}
|
||
|
var cO = new Array(MODE_LAST);
|
||
|
var cP = new Array(MODE_LAST);
|
||
|
|
||
|
function InitUpsamplers(a) {
|
||
|
cO[O] = UpsampleRgbLinePair;
|
||
|
cO[MODE_RGBA] = UpsampleRgbaLinePair;
|
||
|
cO[MODE_BGR] = UpsampleBgrLinePair;
|
||
|
cO[MODE_BGRA] = UpsampleBgraLinePair;
|
||
|
cO[MODE_ARGB] = UpsampleArgbLinePair;
|
||
|
cO[MODE_RGBA_4444] = UpsampleRgba4444LinePair;
|
||
|
cO[MODE_RGB_565] = UpsampleRgb565LinePair;
|
||
|
cP[O] = UpsampleRgbLinePair;
|
||
|
cP[MODE_RGBA] = UpsampleRgbKeepAlphaLinePair;
|
||
|
cP[MODE_BGR] = UpsampleBgrLinePair;
|
||
|
cP[MODE_BGRA] = UpsampleBgrKeepAlphaLinePair;
|
||
|
cP[MODE_ARGB] = UpsampleArgbKeepAlphaLinePair;
|
||
|
cP[MODE_RGBA_4444] = UpsampleRgba4444KeepAlphaLinePair;
|
||
|
cP[MODE_RGB_565] = UpsampleRgb565LinePair
|
||
|
}
|
||
|
|
||
|
function FUNC_NAME_SAMPLE(a, b, c, d, u, e, v, f, g, h, j, k, l, m, n) {
|
||
|
var i;
|
||
|
for (i = 0; i < l - 1; i += 2) {
|
||
|
m(a[b + 0], u[e + 0], v[f + 0], g, h);
|
||
|
m(a[b + 1], u[e + 0], v[f + 0], g, h + n);
|
||
|
m(c[d + 0], u[e + 0], v[f + 0], j, k);
|
||
|
m(c[d + 1], u[e + 0], v[f + 0], j, k + n);
|
||
|
b += 2;
|
||
|
d += 2;
|
||
|
e++;
|
||
|
f++;
|
||
|
h += 2 * n;
|
||
|
k += 2 * n
|
||
|
}
|
||
|
if (i == l - 1) {
|
||
|
m(a[b + 0], u[e + 0], v[f + 0], g, h);
|
||
|
m(c[d + 0], u[e + 0], v[f + 0], j, k)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function SampleRgbLinePair(A, a, B, b, C, c, D, d, E, e, F, f, l) {
|
||
|
FUNC_NAME_SAMPLE(A, a, B, b, C, c, D, d, E, e, F, f, l, VP8YuvToRgb, 3)
|
||
|
}
|
||
|
|
||
|
function SampleBgrLinePair(A, a, B, b, C, c, D, d, E, e, F, f, l) {
|
||
|
FUNC_NAME_SAMPLE(A, a, B, b, C, c, D, d, E, e, F, f, l, VP8YuvToBgr, 3)
|
||
|
}
|
||
|
|
||
|
function SampleRgbaLinePair(A, a, B, b, C, c, D, d, E, e, F, f, l) {
|
||
|
FUNC_NAME_SAMPLE(A, a, B, b, C, c, D, d, E, e, F, f, l, VP8YuvToRgba, 4)
|
||
|
}
|
||
|
|
||
|
function SampleBgraLinePair(A, a, B, b, C, c, D, d, E, e, F, f, l) {
|
||
|
FUNC_NAME_SAMPLE(A, a, B, b, C, c, D, d, E, e, F, f, l, VP8YuvToBgra, 4)
|
||
|
}
|
||
|
|
||
|
function SampleArgbLinePair(A, a, B, b, C, c, D, d, E, e, F, f, l) {
|
||
|
FUNC_NAME_SAMPLE(A, a, B, b, C, c, D, d, E, e, F, f, l, VP8YuvToArgb, 4)
|
||
|
}
|
||
|
|
||
|
function SampleRgba4444LinePair(A, a, B, b, C, c, D, d, E, e, F, f, l) {
|
||
|
FUNC_NAME_SAMPLE(A, a, B, b, C, c, D, d, E, e, F, f, l, VP8YuvToRgba4444, 2)
|
||
|
}
|
||
|
|
||
|
function SampleRgb565LinePair(A, a, B, b, C, c, D, d, E, e, F, f, l) {
|
||
|
FUNC_NAME_SAMPLE(A, a, B, b, C, c, D, d, E, e, F, f, l, VP8YuvToRgb565, 2)
|
||
|
}
|
||
|
var cQ = new Array(SampleRgbLinePair, SampleRgbaLinePair, SampleBgrLinePair, SampleBgraLinePair, SampleArgbLinePair, SampleRgba4444LinePair, SampleRgb565LinePair);
|
||
|
|
||
|
function FUNC_NAME_YUV444(y, a, u, b, v, c, d, e, f, g, h) {
|
||
|
var i;
|
||
|
for (i = 0; i < f; ++i) g(y[a + i], u[b + i], v[c + i], d[e + i * h], 0)
|
||
|
}
|
||
|
|
||
|
function Yuv444ToRgb(A, a, B, b, C, c, D, d, l) {
|
||
|
FUNC_NAME_YUV444(A, a, B, b, C, c, D, d, l, VP8YuvToRgb, 3)
|
||
|
}
|
||
|
|
||
|
function Yuv444ToBgr(A, a, B, b, C, c, D, d, l) {
|
||
|
FUNC_NAME_YUV444(A, a, B, b, C, c, D, d, l, VP8YuvToBgr, 3)
|
||
|
}
|
||
|
|
||
|
function Yuv444ToRgba(A, a, B, b, C, c, D, d, l) {
|
||
|
FUNC_NAME_YUV444(A, a, B, b, C, c, D, d, l, VP8YuvToRgba, 4)
|
||
|
}
|
||
|
|
||
|
function Yuv444ToBgra(A, a, B, b, C, c, D, d, l) {
|
||
|
FUNC_NAME_YUV444(A, a, B, b, C, c, D, d, l, VP8YuvToBgra, 4)
|
||
|
}
|
||
|
|
||
|
function Yuv444ToArgb(A, a, B, b, C, c, D, d, l) {
|
||
|
FUNC_NAME_YUV444(A, a, B, b, C, c, D, d, l, VP8YuvToArgb, 4)
|
||
|
}
|
||
|
|
||
|
function Yuv444ToRgba4444(A, a, B, b, C, c, D, d, l) {
|
||
|
FUNC_NAME_YUV444(A, a, B, b, C, c, D, d, l, VP8YuvToRgba4444, 2)
|
||
|
}
|
||
|
|
||
|
function Yuv444ToRgb565(A, a, B, b, C, c, D, d, l) {
|
||
|
FUNC_NAME_YUV444(A, a, B, b, C, c, D, d, l, VP8YuvToRgb565, 2)
|
||
|
}
|
||
|
var cR = new Array(Yuv444ToRgb, Yuv444ToRgba, Yuv444ToBgr, Yuv444ToBgra, Yuv444ToArgb, Yuv444ToRgba4444, Yuv444ToRgb565);
|
||
|
|
||
|
function EmitYUV(a, p) {
|
||
|
var b = p.output;
|
||
|
var c = b.u.YUVA;
|
||
|
var d = c.y;
|
||
|
var e = c.y_off + a.mb_y * c.y_stride;
|
||
|
var f = c.u;
|
||
|
var g = c.u_off + (a.mb_y >> 1) * c.u_stride;
|
||
|
var h = c.v;
|
||
|
var i = c.v_off + (a.mb_y >> 1) * c.v_stride;
|
||
|
var k = a.mb_w;
|
||
|
var l = a.mb_h;
|
||
|
var m = parseInt((k + 1) / 2);
|
||
|
var j;
|
||
|
for (j = 0; j < l; ++j) {
|
||
|
memcpy(d, e + j * c.y_stride, a.y, a.y_off + j * a.y_stride, k)
|
||
|
}
|
||
|
for (j = 0; j < (l + 1) / 2; ++j) {
|
||
|
memcpy(f, g + j * c.u_stride, a.u, a.u_off + j * a.uv_stride, m);
|
||
|
memcpy(h, i + j * c.v_stride, a.v, a.v_off + j * a.uv_stride, m)
|
||
|
}
|
||
|
return a.mb_h
|
||
|
}
|
||
|
|
||
|
function EmitSampledRGB(a, p) {
|
||
|
var b = p.output;
|
||
|
var c = b.u.RGBA;
|
||
|
var d = c.rgba;
|
||
|
var e = c.rgba_off + a.mb_y * c.stride;
|
||
|
var f = a.y;
|
||
|
var g = a.y_off;
|
||
|
var h = a.u;
|
||
|
var i = a.u_off;
|
||
|
var k = a.v;
|
||
|
var l = a.v_off;
|
||
|
var m = cQ[b.colorspace];
|
||
|
var n = a.mb_w;
|
||
|
var o = a.mb_h - 1;
|
||
|
var j;
|
||
|
for (j = 0; j < o; j += 2) {
|
||
|
m(f, g, f, g + a.y_stride, h, i, k, l, d, e, d, e + c.stride, n);
|
||
|
g += 2 * a.y_stride;
|
||
|
i += a.uv_stride;
|
||
|
l += a.uv_stride;
|
||
|
e += 2 * c.stride
|
||
|
}
|
||
|
if (j == o) {
|
||
|
m(f, g, f, g, h, i, k, l, d, e, d, e, n)
|
||
|
}
|
||
|
return a.mb_h
|
||
|
}
|
||
|
|
||
|
function EmitFancyRGB(a, p) {
|
||
|
var b = a.mb_h;
|
||
|
var c = p.output.u.RGBA;
|
||
|
var d = c.rgba;
|
||
|
var e = c.rgba_off + a.mb_y * c.stride;
|
||
|
var f = a.a ? cP[p.output.colorspace] : cO[p.output.colorspace];
|
||
|
var g = a.y;
|
||
|
var h = a.y_off;
|
||
|
var i = a.u;
|
||
|
var j = a.u_off;
|
||
|
var k = a.v;
|
||
|
var l = a.v_off;
|
||
|
var m = p.tmp_u;
|
||
|
var n = p.tmp_u_off;
|
||
|
var o = p.tmp_v;
|
||
|
var q = p.tmp_v_off;
|
||
|
var y = a.mb_y;
|
||
|
var r = a.mb_y + a.mb_h;
|
||
|
var s = a.mb_w;
|
||
|
var t = parseInt((s + 1) / 2);
|
||
|
if (y == 0) {
|
||
|
f(null, null, g, h, i, j, k, l, i, j, k, l, null, null, d, e, s)
|
||
|
} else {
|
||
|
f(p.tmp_y, p.tmp_y_off, g, h, m, n, o, q, i, j, k, l, d, e - c.stride, d, e, s);
|
||
|
b++
|
||
|
}
|
||
|
for (; y + 2 < r; y += 2) {
|
||
|
m = i;
|
||
|
n = j;
|
||
|
o = k;
|
||
|
q = l;
|
||
|
j += a.uv_stride;
|
||
|
l += a.uv_stride;
|
||
|
e += 2 * c.stride;
|
||
|
h += 2 * a.y_stride;
|
||
|
f(g, h - a.y_stride, g, h, m, n, o, q, i, j, k, l, d, e - c.stride, d, e, s)
|
||
|
}
|
||
|
h += a.y_stride;
|
||
|
if (a.crop_top + r < a.crop_bottom) {
|
||
|
memcpy(p.tmp_y, p.tmp_y_off, g, h, s * sizeof(p.tmp_y));
|
||
|
memcpy(p.tmp_u, p.tmp_u_off, i, j, t * sizeof(p.tmp_u));
|
||
|
memcpy(p.tmp_v, p.tmp_v_off, k, l, t * sizeof(p.tmp_v));
|
||
|
b--
|
||
|
} else {
|
||
|
if (!(r & 1)) {
|
||
|
f(g, h, null, null, i, j, k, l, i, j, k, l, d, e + c.stride, null, null, s)
|
||
|
}
|
||
|
}
|
||
|
return b
|
||
|
}
|
||
|
|
||
|
function EmitAlphaYUV(a, p) {
|
||
|
var b = a.mb_w;
|
||
|
var c = a.mb_h;
|
||
|
var j;
|
||
|
var d = p.output.u.YUVA;
|
||
|
var e = d.a;
|
||
|
var f = d.a_off + a.mb_y * d.a_stride;
|
||
|
var g = a.a;
|
||
|
var h = a.a_off;
|
||
|
if (g != null) {
|
||
|
for (j = 0; j < c; ++j) {
|
||
|
memcpy(e, f, g, h, b * sizeof(e));
|
||
|
h += a.width;
|
||
|
f += d.a_stride
|
||
|
}
|
||
|
}
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
function EmitAlphaRGB(a, p) {
|
||
|
var b = p.output.colorspace;
|
||
|
var c = b == MODE_ARGB ? 0 : (b == MODE_RGBA_4444 ? 1 : 3);
|
||
|
var d = b == MODE_RGBA_4444 ? 2 : 4;
|
||
|
var e = a.mb_w;
|
||
|
var f = a.mb_h;
|
||
|
var i, j;
|
||
|
var g = p.output.u.RGBA;
|
||
|
var h = g.rgba;
|
||
|
var k = g.rgba_off + a.mb_y * g.stride;
|
||
|
var l = a.a;
|
||
|
var m = a.a_off;
|
||
|
if (l != null) {
|
||
|
for (j = 0; j < f; ++j) {
|
||
|
for (i = 0; i < e; ++i) {
|
||
|
h[k + d * i + c] = l[m + i]
|
||
|
}
|
||
|
m += a.width;
|
||
|
k += g.stride
|
||
|
}
|
||
|
}
|
||
|
return 0
|
||
|
}
|
||
|
var cS = 30;
|
||
|
|
||
|
function MULT(x, y) {
|
||
|
return (((x) * (y) + (1 << (cS - 1))) >> cS)
|
||
|
}
|
||
|
|
||
|
function InitRescaler(a, b, c, d, e, f, g, h, i, j, k, l, m, n) {
|
||
|
a.x_expand = (b < f) + 0;
|
||
|
a.src_width = b;
|
||
|
a.src_height = c;
|
||
|
a.dst_width = f;
|
||
|
a.dst_height = g;
|
||
|
a.dst = d;
|
||
|
a.dst_off = e;
|
||
|
a.dst_stride = h;
|
||
|
a.x_add = a.x_expand ? (j - 1) : i - j;
|
||
|
a.x_sub = a.x_expand ? (i - 1) : j;
|
||
|
a.y_accum = k;
|
||
|
a.y_add = k;
|
||
|
a.y_sub = l;
|
||
|
a.fx_scale = parseInt((1 << cS) / j);
|
||
|
a.fy_scale = parseInt((1 << cS) / l);
|
||
|
a.fxy_scale = a.x_expand ? parseInt(int64BitLeft(g, cS)) / (j * c) : parseInt(int64BitLeft(g, cS)) / (i * c);
|
||
|
a.irow = m;
|
||
|
a.irow_off = 0 * 4;
|
||
|
a.frow = m;
|
||
|
a.frow_off = n + f * 4
|
||
|
}
|
||
|
|
||
|
function ImportRow(a, b, c) {
|
||
|
var d = 0;
|
||
|
var e = int;
|
||
|
var f = 0;
|
||
|
if (!c.x_expand) {
|
||
|
var g = 0;
|
||
|
for (e = 0; e < c.dst_width; ++e) {
|
||
|
f += c.x_add;
|
||
|
for (; f > 0; f -= c.x_sub) {
|
||
|
g += a[b + (d++)]
|
||
|
} {
|
||
|
var h = a[b + (d++)];
|
||
|
var i = h * (-f);
|
||
|
write32BitIn4Bytes(c.frow, c.frow_off + e * 4, ((g + h) * c.x_sub - i));
|
||
|
g = MULT(i, c.fx_scale)
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
var j = a[b + 0],
|
||
|
right = a[b + 0];
|
||
|
for (e = 0; e < c.dst_width; ++e) {
|
||
|
if (f < 0) {
|
||
|
j = right;
|
||
|
right = a[b + (++d)];
|
||
|
f += c.x_add
|
||
|
}
|
||
|
write32BitIn4Bytes(c.frow, c.frow_off + e * 4, (right * c.x_add + (j - right) * f));
|
||
|
f -= c.x_sub
|
||
|
}
|
||
|
}
|
||
|
for (e = 0; e < c.dst_width; ++e) {
|
||
|
write32BitIn4Bytes(c.irow, c.irow_off + e * 4, (write4BytesIn32Bit(c.frow, c.frow_off + e * 4) + write4BytesIn32Bit(c.irow, c.irow_off + e * 4)))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function ExportRow(a) {
|
||
|
var b = int;
|
||
|
var c = a.fy_scale * (-a.y_accum);
|
||
|
assert(a.y_accum <= 0);
|
||
|
for (b = 0; b < a.dst_width; ++b) {
|
||
|
var d = MULT(write4BytesIn32Bit(a.frow, a.frow_off + b * 4), c);
|
||
|
var v = MULT(write4BytesIn32Bit(a.irow, a.irow_off + b * 4) - d, a.fxy_scale);
|
||
|
a.dst[a.dst_off + b] = (!(v & ~0xff)) ? v : (v < 0) ? 0 : 255;
|
||
|
write32BitIn4Bytes(a.irow, a.irow_off + b * 4, d)
|
||
|
}
|
||
|
a.y_accum += a.y_add;
|
||
|
a.dst_off += a.dst_stride
|
||
|
}
|
||
|
|
||
|
function Rescale(a, b, c, d, e) {
|
||
|
var f = 0;
|
||
|
while (d-- > 0) {
|
||
|
ImportRow(a, e);
|
||
|
b += c;
|
||
|
e.y_accum -= e.y_sub;
|
||
|
while (e.y_accum <= 0) {
|
||
|
ExportRow(e);
|
||
|
f++
|
||
|
}
|
||
|
}
|
||
|
return f
|
||
|
}
|
||
|
|
||
|
function EmitRescaledYUV(a, p) {
|
||
|
var b = a.mb_h;
|
||
|
var c = (b + 1) >> 1;
|
||
|
var d = Rescale(a.y, a.y_off, a.y_stride, b, p.scaler_y);
|
||
|
Rescale(a.u, a.u_off, a.uv_stride, c, p.scaler_u);
|
||
|
Rescale(a.v, a.v_off, a.uv_stride, c, p.scaler_v);
|
||
|
return d
|
||
|
}
|
||
|
|
||
|
function EmitRescaledAlphaYUV(a, p) {
|
||
|
if (a.a != null) {
|
||
|
Rescale(a.a, a.a_off, a.width, a.mb_h, p.scaler_a)
|
||
|
}
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
function IsAlphaMode(a) {
|
||
|
return (a == MODE_RGBA || a == MODE_BGRA || a == MODE_ARGB || a == MODE_RGBA_4444 || a == MODE_YUVA)
|
||
|
}
|
||
|
|
||
|
function InitYUVRescaler(a, p) {
|
||
|
var b = IsAlphaMode(p.output.colorspace);
|
||
|
var c = p.output.u.YUVA;
|
||
|
var d = a.scaled_width;
|
||
|
var e = a.scaled_height;
|
||
|
var f = (d + 1) >> 1;
|
||
|
var g = (e + 1) >> 1;
|
||
|
var h = (a.mb_w + 1) >> 1;
|
||
|
var i = (a.mb_h + 1) >> 1;
|
||
|
var j = 2 * d;
|
||
|
var k = 2 * f;
|
||
|
var l = size_t;
|
||
|
var m = int32_t;
|
||
|
var n = 0;
|
||
|
l = j + 2 * k;
|
||
|
if (b) {
|
||
|
l += j
|
||
|
}
|
||
|
p.memory = malloc(l * sizeof(m) * 4, 0);
|
||
|
if (p.memory == null) {
|
||
|
return 0
|
||
|
}
|
||
|
m = p.memory;
|
||
|
n = 0;
|
||
|
InitRescaler(p.scaler_y, a.mb_w, a.mb_h, c.y, c.y_off, d, e, c.y_stride, a.mb_w, d, a.mb_h, e, m, n);
|
||
|
InitRescaler(p.scaler_u, h, i, c.u, c.u_off, f, g, c.u_stride, h, f, i, g, m, n + j);
|
||
|
InitRescaler(p.scaler_v, h, i, c.v, c.v_off, f, g, c.v_stride, h, f, i, g, m, n + j + k);
|
||
|
p.emit = EmitRescaledYUV;
|
||
|
if (b) {
|
||
|
InitRescaler(p.scaler_a, a.mb_w, a.mb_h, c.a, c.a_off, d, e, c.a_stride, a.mb_w, d, a.mb_h, e, m, n + j + 2 * k);
|
||
|
p.emit_alpha = EmitRescaledAlphaYUV
|
||
|
}
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function Import(a, b, c, d, e) {
|
||
|
var f = 0;
|
||
|
while (f < d && e.y_accum > 0) {
|
||
|
ImportRow(a, b, e);
|
||
|
b += c;
|
||
|
++f;
|
||
|
e.y_accum -= e.y_sub
|
||
|
}
|
||
|
return f
|
||
|
}
|
||
|
|
||
|
function ExportRGB(p, a) {
|
||
|
var b = cR[p.output.colorspace];
|
||
|
var c = p.output.u.RGBA;
|
||
|
var d = c.rgba;
|
||
|
var e = c.rgba_off + (p.last_y + a) * c.stride;
|
||
|
var f = 0;
|
||
|
while (p.scaler_y.y_accum <= 0 && p.scaler_u.y_accum <= 0) {
|
||
|
assert(p.last_y + a + f < p.output.height);
|
||
|
assert(p.scaler_u.y_accum == p.scaler_v.y_accum);
|
||
|
ExportRow(p.scaler_y);
|
||
|
ExportRow(p.scaler_u);
|
||
|
ExportRow(p.scaler_v);
|
||
|
b(p.scaler_y.dst, p.scaler_y.dst_off, p.scaler_u.dst, p.scaler_u.dst_off, p.scaler_v.dst, p.scaler_v.dst_off, d, e, p.scaler_y.dst_width);
|
||
|
e += c.stride;
|
||
|
f++
|
||
|
}
|
||
|
return f
|
||
|
}
|
||
|
|
||
|
function EmitRescaledRGB(a, p) {
|
||
|
var b = a.mb_h;
|
||
|
var c = (b + 1) >> 1;
|
||
|
var j = 0,
|
||
|
uv_j = 0;
|
||
|
var d = 0;
|
||
|
while (j < b) {
|
||
|
var e = Import(a.y, a.y_off + j * a.y_stride, a.y_stride, b - j, p.scaler_y);
|
||
|
var f = Import(a.u, a.u_off + uv_j * a.uv_stride, a.uv_stride, c - uv_j, p.scaler_u);
|
||
|
var g = Import(a.v, a.v_off + uv_j * a.uv_stride, a.uv_stride, c - uv_j, p.scaler_v);
|
||
|
assert(f == g);
|
||
|
j += e;
|
||
|
uv_j += f;
|
||
|
d += ExportRGB(p, d)
|
||
|
}
|
||
|
return d
|
||
|
}
|
||
|
|
||
|
function ExportAlpha(p, a) {
|
||
|
var b = p.output.u.RGBA;
|
||
|
var c = b.rgba;
|
||
|
var d = b.rgba_off + (p.last_y + a) * b.stride;
|
||
|
var e = 0;
|
||
|
while (p.scaler_a.y_accum <= 0) {
|
||
|
var i;
|
||
|
assert(p.last_y + a + e < p.output.height);
|
||
|
ExportRow(p.scaler_a);
|
||
|
for (i = 0; i < p.scaler_a.dst_width; ++i) {
|
||
|
c[d + 4 * i + 3] = p.scaler_a.dst[p.scaler_a.dst_off + i]
|
||
|
}
|
||
|
d += b.stride;
|
||
|
e++
|
||
|
}
|
||
|
return e
|
||
|
}
|
||
|
|
||
|
function EmitRescaledAlphaRGB(a, p) {
|
||
|
if (a.a != null) {
|
||
|
var j = 0,
|
||
|
pos = 0;
|
||
|
while (j < a.mb_h) {
|
||
|
j += Import(a.a, a.a_off + j * a.width, a.width, a.mb_h - j, p.scaler_a);
|
||
|
pos += ExportAlpha(p, pos)
|
||
|
}
|
||
|
}
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
function InitRGBRescaler(a, p) {
|
||
|
var b = IsAlphaMode(p.output.colorspace);
|
||
|
var c = a.scaled_width;
|
||
|
var d = a.scaled_height;
|
||
|
var e = (a.mb_w + 1) >> 1;
|
||
|
var f = (a.mb_h + 1) >> 1;
|
||
|
var g = 2 * c;
|
||
|
var h = int32_t;
|
||
|
var i = 0;
|
||
|
var j = uint8_t;
|
||
|
var k = 0;
|
||
|
var l = size_t,
|
||
|
tmp_size2 = size_t;
|
||
|
l = 3 * g;
|
||
|
tmp_size2 = 3 * c;
|
||
|
if (b) {
|
||
|
l += g;
|
||
|
tmp_size2 += c
|
||
|
}
|
||
|
p.memory = malloc(l * sizeof(h) * 4 + tmp_size2 * sizeof(j) * 1, 0);
|
||
|
p.memory_off = 0;
|
||
|
if (p.memory == null) {
|
||
|
slert('memory error');
|
||
|
return 0
|
||
|
}
|
||
|
h = p.memory;
|
||
|
i = p.memory_off;
|
||
|
j = h;
|
||
|
k = i + l * 1;
|
||
|
InitRescaler(p.scaler_y, a.mb_w, a.mb_h, j, k + 0 * c * 1, c, d, 0, a.mb_w, c, a.mb_h, d, h, i + 0 * g * 4);
|
||
|
InitRescaler(p.scaler_u, e, f, j, k + 1 * c * 1, c, d, 0, a.mb_w, 2 * c, a.mb_h, 2 * d, h, i + 1 * g * 4);
|
||
|
InitRescaler(p.scaler_v, e, f, j, k + 2 * c * 1, c, d, 0, a.mb_w, 2 * c, a.mb_h, 2 * d, h, i + 2 * g * 4);
|
||
|
p.emit = EmitRescaledRGB;
|
||
|
if (b) {
|
||
|
InitRescaler(p.scaler_a, a.mb_w, a.mb_h, j, k + 3 * c * 1, c, d, 0, a.mb_w, c, a.mb_h, d, h, i + 3 * g * 4);
|
||
|
p.emit_alpha = EmitRescaledAlphaRGB
|
||
|
}
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function InitFromOptions(a, b) {
|
||
|
var W = b.width;
|
||
|
var H = b.height;
|
||
|
var x = 0,
|
||
|
y = 0,
|
||
|
w = W,
|
||
|
h = H;
|
||
|
b.use_cropping = (a != null) && (a.use_cropping > 0);
|
||
|
if (b.use_cropping) {
|
||
|
w = a.crop_width;
|
||
|
h = a.crop_height;
|
||
|
x = a.crop_left & ~1;
|
||
|
y = a.crop_top & ~1;
|
||
|
if (x < 0 || y < 0 || w <= 0 || h <= 0 || x + w > W || y + h > H) {
|
||
|
return 0
|
||
|
}
|
||
|
}
|
||
|
b.crop_left = x;
|
||
|
b.crop_top = y;
|
||
|
b.crop_right = x + w;
|
||
|
b.crop_bottom = y + h;
|
||
|
b.mb_w = w;
|
||
|
b.mb_h = h;
|
||
|
b.use_scaling = ((a != null) && (a.use_scaling > 0)) + 0;
|
||
|
if (b.use_scaling) {
|
||
|
if (a.scaled_width <= 0 || a.scaled_height <= 0) {
|
||
|
return 0
|
||
|
}
|
||
|
b.scaled_width = a.scaled_width;
|
||
|
b.scaled_height = a.scaled_height
|
||
|
}
|
||
|
b.bypass_filtering = a && a.bypass_filtering;
|
||
|
b.fancy_upsampling = ((a == null) || (!a.no_fancy_upsampling)) + 0;
|
||
|
if (b.use_scaling) {
|
||
|
b.bypass_filtering = (b.scaled_width < parseInt(W * 3 / 4)) + 0 && (b.scaled_height < parseInt(H * 3 / 4)) + 0;
|
||
|
b.fancy_upsampling = 0
|
||
|
}
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function CustomSetup(a) {
|
||
|
var p = a.opaque;
|
||
|
var b = (p.output.colorspace < MODE_YUV);
|
||
|
p.memory = null;
|
||
|
p.emit = null;
|
||
|
p.emit_alpha = null;
|
||
|
if (!InitFromOptions(p.options_, a)) {
|
||
|
return 0
|
||
|
}
|
||
|
if (a.use_scaling) {
|
||
|
var c = b ? InitRGBRescaler(a, p) : InitYUVRescaler(a, p);
|
||
|
if (!c) {
|
||
|
alert('memory error #1');
|
||
|
return 0
|
||
|
}
|
||
|
} else {
|
||
|
if (b) {
|
||
|
p.emit = EmitSampledRGB;
|
||
|
if (a.fancy_upsampling) {
|
||
|
var d = (a.mb_w + 1) >> 1;
|
||
|
p.memory = malloc(a.mb_w + 2 * d, 205);
|
||
|
if (p.memory == null) {
|
||
|
alert('memory error #2');
|
||
|
return 0
|
||
|
}
|
||
|
p.tmp_y = p.memory;
|
||
|
p.tmp_y_off = 0;
|
||
|
p.tmp_u = p.tmp_y;
|
||
|
p.tmp_u_off = p.tmp_y_off + a.mb_w;
|
||
|
p.tmp_v = p.tmp_u;
|
||
|
p.tmp_v_off = p.tmp_u_off + d;
|
||
|
p.emit = EmitFancyRGB;
|
||
|
InitUpsamplers()
|
||
|
}
|
||
|
} else {
|
||
|
p.emit = EmitYUV
|
||
|
}
|
||
|
if (IsAlphaMode(p.output.colorspace)) {
|
||
|
p.emit_alpha = b ? EmitAlphaRGB : EmitAlphaYUV
|
||
|
}
|
||
|
}
|
||
|
if (b) {
|
||
|
VP8YUVInit()
|
||
|
}
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function CustomPut(a) {
|
||
|
var p = a.opaque;
|
||
|
var b = a.mb_w;
|
||
|
var c = a.mb_h;
|
||
|
var d;
|
||
|
assert(!(a.mb_y & 1));
|
||
|
if (b <= 0 || c <= 0) {
|
||
|
return 0
|
||
|
}
|
||
|
d = p.emit(a, p);
|
||
|
p.last_y += d;
|
||
|
if (p.emit_alpha) {
|
||
|
p.emit_alpha(a, p)
|
||
|
}
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function CustomTeardown(a) {
|
||
|
var p = a.opaque;
|
||
|
p.memory = '';
|
||
|
p.memory = null
|
||
|
}
|
||
|
|
||
|
function WebPInitCustomIo(b, c) {
|
||
|
c.put = function(a) {
|
||
|
return CustomPut(a)
|
||
|
};
|
||
|
c.setup = function(a) {
|
||
|
return CustomSetup(a)
|
||
|
};
|
||
|
c.teardown = function(a) {
|
||
|
return CustomTeardown(a)
|
||
|
};
|
||
|
c.opaque = b
|
||
|
}
|
||
|
var co = 12;
|
||
|
var cT = 10;
|
||
|
var cU = 4096;
|
||
|
var cV = 4096;
|
||
|
var cW = 0,
|
||
|
STATE_PARTS0 = 1,
|
||
|
STATE_DATA = 2,
|
||
|
STATE_DONE = 3,
|
||
|
STATE_ERROR = 4;
|
||
|
var cX = 0,
|
||
|
MEM_MODE_APPEND = 1,
|
||
|
MEM_MODE_MAP = 2;
|
||
|
var cY = {
|
||
|
mode_: 'MemBufferMode',
|
||
|
start_: uint32_t,
|
||
|
end_: uint32_t,
|
||
|
buf_size_: size_t,
|
||
|
buf_: uint8_t,
|
||
|
buf_off: 0,
|
||
|
part0_size_: size_t,
|
||
|
part0_buf_: uint8_t,
|
||
|
part0_buf_off: 0
|
||
|
};
|
||
|
var cZ = {
|
||
|
state_: "DecState",
|
||
|
params_: newObjectIt(ba),
|
||
|
dec_: newObjectIt(bz),
|
||
|
io_: newObjectIt(Y),
|
||
|
mem_: newObjectIt(cY),
|
||
|
output_: newObjectIt(R)
|
||
|
};
|
||
|
var da = {
|
||
|
left_: newObjectIt(bw),
|
||
|
info_: newObjectIt(bw),
|
||
|
intra_t_: Arr(4, uint8_t),
|
||
|
intra_l_: Arr(4, uint8_t),
|
||
|
br_: newObjectIt(bb),
|
||
|
token_br_: newObjectIt(bb)
|
||
|
};
|
||
|
|
||
|
function MemDataSize(a) {
|
||
|
return (a.end_ - a.start_)
|
||
|
}
|
||
|
|
||
|
function AppendToMemBuffer(a, b, c) {
|
||
|
var d = a.mem_;
|
||
|
var e = a.dec_;
|
||
|
var f = e.num_parts_ - 1;
|
||
|
assert(d.mode_ == MEM_MODE_APPEND);
|
||
|
if (d.end_ + c > d.buf_size_) {
|
||
|
var p;
|
||
|
var g = null;
|
||
|
var h = 0;
|
||
|
var i = parseInt((MemDataSize(d) + c + cU - 1) / cU);
|
||
|
var j = i * cU;
|
||
|
var k = d.buf_;
|
||
|
var l = d.buf_off + d.start_;
|
||
|
var g = malloc(j - 1, 205);
|
||
|
var h = 0;
|
||
|
if (!g) return 0;
|
||
|
memcpy(g, h, k, l, MemDataSize(d));
|
||
|
for (p = 0; p <= f; ++p) {
|
||
|
if (e.parts_[p].buf_off != null) {
|
||
|
e.parts_[p].buf_ = g;
|
||
|
e.parts_[p].buf_off = h + ((e.parts_[p].buf_off) - l);
|
||
|
e.parts_[p].buf_end_ = h + ((e.parts_[p].buf_end_) - l)
|
||
|
}
|
||
|
}
|
||
|
d.buf_ = '';
|
||
|
d.buf_ = g;
|
||
|
d.buf_off = h;
|
||
|
d.buf_size_ = j;
|
||
|
d.end_ = MemDataSize(d);
|
||
|
d.start_ = 0
|
||
|
}
|
||
|
memcpy(d.buf_, d.buf_off + d.end_, b, 0, c);
|
||
|
d.end_ += c;
|
||
|
assert(d.end_ <= d.buf_size_);
|
||
|
if (f >= 0) {
|
||
|
e.parts_[f].buf_end_ = d.buf_off + d.end_
|
||
|
}
|
||
|
a.io_.data = d.buf_;
|
||
|
a.io_.data_off = d.buf_off;
|
||
|
a.io_.data_size = MemDataSize(d);
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function RemapMemBuffer(a, b, c, d) {
|
||
|
var p;
|
||
|
var e = a.mem_;
|
||
|
var f = a.dec_;
|
||
|
var g = f.num_parts_ - 1;
|
||
|
var h = e.buf_;
|
||
|
var i = e.buf_off;
|
||
|
assert(e.mode_ == MEM_MODE_MAP);
|
||
|
if (d < e.buf_size_) {
|
||
|
alert('we cannot remap to a shorter buffer!');
|
||
|
return 0
|
||
|
}
|
||
|
for (p = 0; p <= g; ++p) {
|
||
|
if (f.parts_[p].buf_off != null) {
|
||
|
f.parts_[p].buf_ = b;
|
||
|
f.parts_[p].buf_off = c + ((f.parts_[p].buf_off) - i);
|
||
|
f.parts_[p].buf_end_ = c + ((f.parts_[p].buf_end_) - i)
|
||
|
}
|
||
|
}
|
||
|
if (g >= 0) {
|
||
|
f.parts_[g].buf_end_ = c + d
|
||
|
}
|
||
|
if (f.br_.buf_) {
|
||
|
f.br_.buf_ = b;
|
||
|
f.br_.buf_off = c + ((f.br_.buf_off) - i);
|
||
|
f.br_.buf_end_ = c + ((f.br_.buf_end_) - i)
|
||
|
}
|
||
|
e.buf_ = b;
|
||
|
e.buf_off = c;
|
||
|
e.end_ = e.buf_size_ = d;
|
||
|
a.io_.data = b;
|
||
|
a.io_.data_off = c;
|
||
|
a.io_.data_size = d;
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function InitMemBuffer(a) {
|
||
|
a.mode_ = cX;
|
||
|
a.buf_ = 0;
|
||
|
a.buf_size_ = 0;
|
||
|
a.part0_buf_ = 0;
|
||
|
a.part0_size_ = 0
|
||
|
}
|
||
|
|
||
|
function ClearMemBuffer(a) {
|
||
|
assert(a);
|
||
|
if (a.mode_ == MEM_MODE_APPEND) {
|
||
|
a.buf_ = '';
|
||
|
a.buf_off = 0;
|
||
|
a.part0_buf_ = '';
|
||
|
a.part0_buf_off = ''
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function CheckMemBufferMode(a, b) {
|
||
|
if (a.mode_ == cX) {
|
||
|
a.mode_ = b
|
||
|
} else if (a.mode_ != b) {
|
||
|
alert('we mixed the modes => error');
|
||
|
return 0
|
||
|
}
|
||
|
assert(a.mode_ == b);
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function SaveContext(a, b, c) {
|
||
|
var d = a.br_;
|
||
|
var e = a.mb_info_[1 - 1];
|
||
|
var f = a.mb_info_[1 + a.mb_x_];
|
||
|
c.left_ = newObjectIt(e);
|
||
|
c.info_ = newObjectIt(f);
|
||
|
c.br_ = newObjectIt(d);
|
||
|
c.token_br_ = newObjectIt(b);
|
||
|
memcpy(c.intra_t_, 0, a.intra_t_, +4 * a.mb_x_, 4);
|
||
|
memcpy(c.intra_l_, 0, a.intra_l_, 0, 4)
|
||
|
}
|
||
|
|
||
|
function RestoreContext(a, b, c) {
|
||
|
var d = b.br_;
|
||
|
var e = b.mb_info_[1 - 1];
|
||
|
var f = b.mb_info_[1 + b.mb_x_];
|
||
|
e.dc_nz_ = a.left_.dc_nz_;
|
||
|
e.f_ilevel_ = a.left_.f_ilevel_;
|
||
|
e.f_inner_ = a.left_.f_inner_;
|
||
|
e.f_level_ = a.left_.f_level_;
|
||
|
e.nz_ = a.left_.nz_;
|
||
|
e.skip_ = a.left_.skip_;
|
||
|
f.dc_nz_ = a.info_.dc_nz_;
|
||
|
f.f_ilevel_ = a.info_.f_ilevel_;
|
||
|
f.f_inner_ = a.info_.f_inner_;
|
||
|
f.f_level_ = a.info_.f_level_;
|
||
|
f.nz_ = a.info_.nz_;
|
||
|
f.skip_ = a.info_.skip_;
|
||
|
b.br_.buf_end_ = a.br_.buf_end_;
|
||
|
b.br_.buf_off = a.br_.buf_off;
|
||
|
b.br_.eof_ = a.br_.eof_;
|
||
|
b.br_.missing_ = a.br_.missing_;
|
||
|
b.br_.range_ = a.br_.range_;
|
||
|
b.br_.value_ = a.br_.value_;
|
||
|
c.buf_end_ = (a.token_br_.buf_end_);
|
||
|
c.buf_off = (a.token_br_.buf_off);
|
||
|
c.eof_ = (a.token_br_.eof_);
|
||
|
c.missing_ = (a.token_br_.missing_);
|
||
|
c.range_ = (a.token_br_.range_);
|
||
|
c.value_ = (a.token_br_.value_);
|
||
|
memcpy(b.intra_t_, +4 * b.mb_x_, a.intra_t_, 0, 4);
|
||
|
memcpy(b.intra_l_, 0, a.intra_l_, 0, 4)
|
||
|
}
|
||
|
|
||
|
function IDecError(a, b) {
|
||
|
if (a.state_ == STATE_DATA) {
|
||
|
var c = a.io_;
|
||
|
if (c.teardown) {
|
||
|
c.teardown(c)
|
||
|
}
|
||
|
}
|
||
|
a.state_ = STATE_ERROR;
|
||
|
return b
|
||
|
}
|
||
|
|
||
|
function DecodeHeader(a) {
|
||
|
var b = uint32_t,
|
||
|
bits = uint32_t;
|
||
|
var c = a.mem_.buf_;
|
||
|
var d = {
|
||
|
value: (a.mem_.buf_off + a.mem_.start_)
|
||
|
};
|
||
|
var e = {
|
||
|
value: MemDataSize(a.mem_)
|
||
|
};
|
||
|
var f = {
|
||
|
value: uint32_t
|
||
|
};
|
||
|
var g = {
|
||
|
value: uint32_t
|
||
|
};
|
||
|
var h = {
|
||
|
value: 0
|
||
|
};
|
||
|
var i = {
|
||
|
value: 0
|
||
|
};
|
||
|
if (e.value < co) {
|
||
|
return VP8_STATUS_SUSPENDED
|
||
|
}
|
||
|
if (!WebPCheckAndSkipRIFFHeader(c, d, e, g)) {
|
||
|
return IDecError(a, VP8_STATUS_BITSTREAM_ERROR)
|
||
|
}
|
||
|
if (!VP8XGetInfo(c, d, e, h, null, null, null)) {
|
||
|
return IDecError(a, VP8_STATUS_BITSTREAM_ERROR)
|
||
|
}
|
||
|
if (h.value == -1) {
|
||
|
return VP8_STATUS_SUSPENDED
|
||
|
}
|
||
|
if (!VP8CheckAndSkipHeader(c, d, e, i, f, g)) {
|
||
|
return IDecError(a, VP8_STATUS_BITSTREAM_ERROR)
|
||
|
}
|
||
|
if ((i.value == -1) && (f.value == 0)) {
|
||
|
return VP8_STATUS_SUSPENDED
|
||
|
}
|
||
|
if (e.value < cT) {
|
||
|
return VP8_STATUS_SUSPENDED
|
||
|
}
|
||
|
if (!VP8GetInfo(c, d, e, f, null, null, null)) {
|
||
|
return IDecError(a, VP8_STATUS_BITSTREAM_ERROR)
|
||
|
}
|
||
|
e = e.value;
|
||
|
d = d.value;
|
||
|
b = a.mem_.end_ - e;
|
||
|
bits = c[d + 0] | (c[d + 1] << 8) | (c[d + 2] << 16);
|
||
|
a.mem_.part0_size_ = (bits >> 5) + cT;
|
||
|
a.mem_.start_ += b;
|
||
|
assert(a.mem_.start_ <= a.mem_.end_);
|
||
|
a.io_.data_size -= b;
|
||
|
a.io_.data = c;
|
||
|
a.io_.data_off = d;
|
||
|
a.state_ = STATE_PARTS0;
|
||
|
return T
|
||
|
}
|
||
|
|
||
|
function CopyParts0Data(a) {
|
||
|
var b = a.dec_.br_;
|
||
|
var c = b.buf_end_ - b.buf_off;
|
||
|
var d = a.mem_;
|
||
|
assert(c > 0);
|
||
|
assert(c <= d.part0_size_);
|
||
|
if (d.mode_ == MEM_MODE_APPEND) {
|
||
|
var e = malloc(c, uint8_t);
|
||
|
var f = 0;
|
||
|
if (!e) {
|
||
|
return 0
|
||
|
}
|
||
|
memcpy(e, f, b.buf_, b.buf_off, c);
|
||
|
d.part0_buf_ = e;
|
||
|
d.part0_buf_off = f;
|
||
|
d.start_ += c;
|
||
|
b.buf_ = e;
|
||
|
b.buf_off = f;
|
||
|
b.buf_end_ = f + c
|
||
|
} else {}
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function DecodePartition0(a) {
|
||
|
var b = a.dec_;
|
||
|
var c = a.io_;
|
||
|
var d = a.params_;
|
||
|
var e = d.output;
|
||
|
if (MemDataSize(a.mem_) < a.mem_.part0_size_) {
|
||
|
return VP8_STATUS_SUSPENDED
|
||
|
}
|
||
|
if (!VP8GetHeaders(b, c)) {
|
||
|
var f = b.status_;
|
||
|
if (f == VP8_STATUS_SUSPENDED || f == VP8_STATUS_NOT_ENOUGH_DATA) {
|
||
|
return VP8_STATUS_SUSPENDED
|
||
|
}
|
||
|
return IDecError(a, f)
|
||
|
}
|
||
|
b.status_ = WebPAllocateDecBuffer(c.width, c.height, d.options_, e);
|
||
|
if (b.status_ != T) {
|
||
|
return IDecError(a, b.status_)
|
||
|
}
|
||
|
if (!CopyParts0Data(a)) {
|
||
|
return IDecError(a, VP8_STATUS_OUT_OF_MEMORY)
|
||
|
}
|
||
|
if (VP8EnterCritical(b, c) != T) {
|
||
|
return IDecError(a, b.status_)
|
||
|
}
|
||
|
a.state_ = STATE_DATA;
|
||
|
if (!VP8InitFrame(b, c)) {
|
||
|
return IDecError(a, b.status_)
|
||
|
}
|
||
|
return T
|
||
|
}
|
||
|
|
||
|
function DecodeRemaining(a) {
|
||
|
var b = newObjectIt(bb);
|
||
|
var c = a.dec_;
|
||
|
var d = a.io_;
|
||
|
assert(c.ready_);
|
||
|
b = c.br_;
|
||
|
for (; c.mb_y_ < c.mb_h_; ++c.mb_y_) {
|
||
|
var e = c.parts_[c.mb_y_ & (c.num_parts_ - 1)];
|
||
|
if (c.mb_x_ == 0) {
|
||
|
VP8InitScanline(c)
|
||
|
}
|
||
|
for (; c.mb_x_ < c.mb_w_; c.mb_x_++) {
|
||
|
var f = (da);
|
||
|
SaveContext(c, e, f);
|
||
|
if (!VP8DecodeMB(c, e)) {
|
||
|
RestoreContext(f, c, e);
|
||
|
if (c.num_parts_ == 1 && MemDataSize(a.mem_) > cV) {
|
||
|
return IDecError(a, VP8_STATUS_BITSTREAM_ERROR)
|
||
|
}
|
||
|
return VP8_STATUS_SUSPENDED
|
||
|
}
|
||
|
VP8ReconstructBlock(c);
|
||
|
VP8StoreBlock(c);
|
||
|
if (c.num_parts_ == 1) {
|
||
|
a.mem_.start_ = e.buf_off - a.mem_.buf_off;
|
||
|
assert(a.mem_.start_ <= a.mem_.end_)
|
||
|
}
|
||
|
}
|
||
|
if (!VP8ProcessRow(c, d)) {
|
||
|
return IDecError(a, VP8_STATUS_USER_ABORT)
|
||
|
}
|
||
|
c.mb_x_ = 0
|
||
|
}
|
||
|
if (!VP8ExitCritical(c, d)) {
|
||
|
return IDecError(a, VP8_STATUS_USER_ABORT)
|
||
|
}
|
||
|
c.ready_ = 0;
|
||
|
a.state_ = STATE_DONE;
|
||
|
return T
|
||
|
}
|
||
|
|
||
|
function IDecode(a) {
|
||
|
var b = VP8_STATUS_SUSPENDED;
|
||
|
assert(a.dec_);
|
||
|
if (a.state_ == cW) {
|
||
|
b = DecodeHeader(a)
|
||
|
}
|
||
|
if (a.state_ == STATE_PARTS0) {
|
||
|
b = DecodePartition0(a)
|
||
|
}
|
||
|
if (a.state_ == STATE_DATA) {
|
||
|
b = DecodeRemaining(a)
|
||
|
}
|
||
|
return b
|
||
|
}
|
||
|
|
||
|
function WebPINewDecoder(a) {
|
||
|
var b = newObjectIt(cZ);
|
||
|
if (b == null) {
|
||
|
return null
|
||
|
}
|
||
|
b.dec_ = VP8New();
|
||
|
if (b.dec_ == null) {
|
||
|
b = '';
|
||
|
return null
|
||
|
}
|
||
|
b.state_ = cW;
|
||
|
InitMemBuffer(b.mem_);
|
||
|
WebPInitDecBuffer(b.output_);
|
||
|
VP8InitIo(b.io_);
|
||
|
WebPResetDecParams(b.params_);
|
||
|
b.params_.output = a ? a : b.output_;
|
||
|
WebPInitCustomIo(b.params_, b.io_);
|
||
|
b.dec_.use_threads_ = 0;
|
||
|
return b
|
||
|
}
|
||
|
this.WebPIDecode = function(a, b, c) {
|
||
|
var d = newObjectIt(cZ);
|
||
|
if (a != null && b > 0 && c != null) {
|
||
|
if (this.WebPGetFeatures(a, b, c.input) != T) {
|
||
|
return null
|
||
|
}
|
||
|
}
|
||
|
d = WebPINewDecoder(c ? c.output : null);
|
||
|
if (!d) {
|
||
|
return null
|
||
|
}
|
||
|
if (c != null) {
|
||
|
d.params_.options_ = c.options_
|
||
|
}
|
||
|
return d
|
||
|
};
|
||
|
this.WebPIDelete = function(a) {
|
||
|
if (!a) return;
|
||
|
VP8Delete(a.dec_);
|
||
|
ClearMemBuffer(a.mem_);
|
||
|
this.WebPFreeDecBuffer(a.output_);
|
||
|
a = ''
|
||
|
};
|
||
|
this.WebPINew = function(a) {
|
||
|
a = a == 'MODE_RGB' ? O : a;
|
||
|
a = a == 'MODE_RGBA' ? MODE_RGBA : a;
|
||
|
a = a == 'MODE_BGR' ? MODE_BGR : a;
|
||
|
a = a == 'MODE_BGRA' ? MODE_BGRA : a;
|
||
|
a = a == 'MODE_YUV' ? MODE_YUV : a;
|
||
|
var b = WebPINewDecoder(null);
|
||
|
if (!b) return null;
|
||
|
b.output_.colorspace = a;
|
||
|
return b
|
||
|
};
|
||
|
this.WebPINewRGB = function(a, b, c, d) {
|
||
|
var e = newObjectIt(cZ);
|
||
|
if (a >= MODE_YUV) return null;
|
||
|
e = WebPINewDecoder(null);
|
||
|
if (e) return null;
|
||
|
e.output_.colorspace = a;
|
||
|
e.output_.is_external_memory = 1;
|
||
|
e.output_.u.RGBA.rgba = b;
|
||
|
e.output_.u.RGBA.stride = d;
|
||
|
e.output_.u.RGBA.size = c;
|
||
|
return e
|
||
|
};
|
||
|
this.WebPINewYUV = function(a, b, c, d, u, e, f, g, v, h, i, j) {
|
||
|
var k = WebPINewDecoder(null);
|
||
|
if (k) return null;
|
||
|
k.output_.colorspace = MODE_YUV;
|
||
|
k.output_.is_external_memory = 1;
|
||
|
k.output_.u.YUVA.y = a;
|
||
|
k.output_.u.YUVA.y = b;
|
||
|
k.output_.u.YUVA.y_stride = d;
|
||
|
k.output_.u.YUVA.y_size = c;
|
||
|
k.output_.u.YUVA.u = u;
|
||
|
k.output_.u.YUVA.u = e;
|
||
|
k.output_.u.YUVA.u_stride = g;
|
||
|
k.output_.u.YUVA.u_size = f;
|
||
|
k.output_.u.YUVA.v = v;
|
||
|
k.output_.u.YUVA.v = h;
|
||
|
k.output_.u.YUVA.v_stride = j;
|
||
|
k.output_.u.YUVA.v_size = i;
|
||
|
return k
|
||
|
};
|
||
|
|
||
|
function IDecCheckStatus(a) {
|
||
|
assert(a);
|
||
|
if (a.dec_ == null) {
|
||
|
return VP8_STATUS_USER_ABORT
|
||
|
}
|
||
|
if (a.state_ == STATE_ERROR) {
|
||
|
return VP8_STATUS_BITSTREAM_ERROR
|
||
|
}
|
||
|
if (a.state_ == STATE_DONE) {
|
||
|
return T
|
||
|
}
|
||
|
return VP8_STATUS_SUSPENDED
|
||
|
}
|
||
|
this.WebPIAppend = function(a, b, c) {
|
||
|
var d = 0;
|
||
|
if (a == null || b == null) {
|
||
|
return VP8_STATUS_INVALID_PARAM
|
||
|
}
|
||
|
d = IDecCheckStatus(a);
|
||
|
if (d != VP8_STATUS_SUSPENDED) {
|
||
|
return d
|
||
|
}
|
||
|
if (!CheckMemBufferMode(a.mem_, MEM_MODE_APPEND)) {
|
||
|
return VP8_STATUS_INVALID_PARAM
|
||
|
}
|
||
|
if (!AppendToMemBuffer(a, b, c)) {
|
||
|
return VP8_STATUS_OUT_OF_MEMORY
|
||
|
}
|
||
|
return IDecode(a)
|
||
|
};
|
||
|
this.WebPIUpdate = function(a, b, c) {
|
||
|
var d = 0;
|
||
|
if (a == null || b == null) {
|
||
|
return VP8_STATUS_INVALID_PARAM
|
||
|
}
|
||
|
d = IDecCheckStatus(a);
|
||
|
if (d != VP8_STATUS_SUSPENDED) {
|
||
|
return d
|
||
|
}
|
||
|
if (!CheckMemBufferMode(a.mem_, MEM_MODE_MAP)) {
|
||
|
return VP8_STATUS_INVALID_PARAM
|
||
|
}
|
||
|
if (!RemapMemBuffer(a, b, 0, c)) {
|
||
|
return VP8_STATUS_INVALID_PARAM
|
||
|
}
|
||
|
return IDecode(a)
|
||
|
};
|
||
|
|
||
|
function GetOutputBuffer(a) {
|
||
|
if (!a || !a.dec_ || a.state_ <= STATE_PARTS0) {
|
||
|
return null
|
||
|
}
|
||
|
return a.params_.output
|
||
|
}
|
||
|
this.WebPIDecodedArea = function(a, b, c, d, e) {
|
||
|
var f = GetOutputBuffer(a);
|
||
|
if (b) b.value = 0;
|
||
|
if (c) c.value = 0;
|
||
|
if (f) {
|
||
|
if (d) d.value = f.width;
|
||
|
if (e) e.value = a.params_.last_y
|
||
|
} else {
|
||
|
if (d) d.value = 0;
|
||
|
if (e) e.value = 0
|
||
|
}
|
||
|
return f
|
||
|
};
|
||
|
this.WebPIDecGetRGB = function(a, b, c, d, e) {
|
||
|
var f = GetOutputBuffer(a);
|
||
|
if (!f) return null;
|
||
|
if (f.colorspace >= MODE_YUV) {
|
||
|
return null
|
||
|
}
|
||
|
if (typeof b.value !== "undefined") b.value = a.params_.last_y;
|
||
|
if (typeof c.value !== "undefined") c.value = f.width;
|
||
|
if (typeof d.value !== "undefined") d.value = f.height;
|
||
|
if (typeof e.value !== "undefined") e.value = f.u.RGBA.stride;
|
||
|
return f.u.RGBA.rgba
|
||
|
};
|
||
|
this.WebPIDecGetYUV = function(a, b, u, v, c, d, e, f) {
|
||
|
var g = GetOutputBuffer(a);
|
||
|
if (!g) return null;
|
||
|
if (g.colorspace < MODE_YUV) {
|
||
|
return null
|
||
|
}
|
||
|
if (typeof b.value !== "undefined") b.value = g.u.YUVA.u;
|
||
|
if (typeof u.value !== "undefined") u.value = g.u.YUVA.u;
|
||
|
if (typeof v.value !== "undefined") v.value = g.u.YUVA.v;
|
||
|
if (typeof c.value !== "undefined") c.value = g.width;
|
||
|
if (typeof d.value !== "undefined") d.value = g.height;
|
||
|
if (typeof e.value !== "undefined") e.value = g.u.YUVA.y_stride;
|
||
|
if (typeof f.value !== "undefined") f.value = g.u.YUVA.u_stride;
|
||
|
return g.u.YUVA.y
|
||
|
};
|
||
|
|
||
|
function WebPISetIOHooks(a, b, c, d, e) {
|
||
|
if (!a || !a.dec_ || a.state_ > cW) {
|
||
|
return 0
|
||
|
}
|
||
|
a.io_.put = b;
|
||
|
a.io_.setup = c;
|
||
|
a.io_.teardown = d;
|
||
|
a.io_.opaque = e;
|
||
|
return 1
|
||
|
}
|
||
|
var co = 12;
|
||
|
|
||
|
function WebPCheckAndSkipRIFFHeader(a, b, c, d) {
|
||
|
if (c.value >= co && !memcmp(a, b.value, "RIFF", 4)) {
|
||
|
if (memcmp(a, b.value + 8, "WEBP", 4)) {
|
||
|
return 0
|
||
|
} else {
|
||
|
d.value = get_le32(a, b.value + 4);
|
||
|
if (d.value < co) {
|
||
|
return 0
|
||
|
}
|
||
|
b.value += co;
|
||
|
c.value -= co
|
||
|
}
|
||
|
} else {
|
||
|
d.value = 0
|
||
|
}
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function WebPResetDecParams(a) {
|
||
|
if (a) {}
|
||
|
}
|
||
|
var cq = '',
|
||
|
cr = '';
|
||
|
|
||
|
function DecodeInto(a, b, c, d) {
|
||
|
cr = new VP8New();
|
||
|
var e = T;
|
||
|
cq = newObjectIt(Y);
|
||
|
var f = 1;
|
||
|
assert(d);
|
||
|
if (cr == null) {
|
||
|
return VP8_STATUS_INVALID_PARAM
|
||
|
}
|
||
|
VP8InitIo(cq);
|
||
|
cq.data = a;
|
||
|
cq.data_off = b;
|
||
|
cq.data_size = c;
|
||
|
WebPInitCustomIo(d, cq);
|
||
|
cr.use_threads_ = 0;
|
||
|
if (!VP8GetHeaders(cr, cq)) {
|
||
|
e = VP8_STATUS_BITSTREAM_ERROR
|
||
|
} else {
|
||
|
e = WebPAllocateDecBuffer(cq.width, cq.height, d.options_, d.output);
|
||
|
if (e == T) {
|
||
|
if (!VP8Decode(cr, cq)) {
|
||
|
e = cr.status_
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
VP8Delete(cr);
|
||
|
if (e != T) {
|
||
|
this.WebPFreeDecBuffer(d.output)
|
||
|
}
|
||
|
return e
|
||
|
};
|
||
|
|
||
|
function DecodeIntoRGBABuffer(a, b, c, d, e, f) {
|
||
|
var g = newObjectIt(ba);
|
||
|
var h = newObjectIt(R);
|
||
|
if (d == null) {
|
||
|
return null
|
||
|
}
|
||
|
WebPInitDecBuffer(h);
|
||
|
WebPResetDecParams(g);
|
||
|
g.output = h;
|
||
|
h.colorspace = a;
|
||
|
h.u.RGBA.rgba = d;
|
||
|
h.u.RGBA.rgba_off = 0;
|
||
|
h.u.RGBA.stride = e;
|
||
|
h.u.RGBA.size = f;
|
||
|
h.is_external_memory = 1;
|
||
|
if (DecodeInto(b, 0, c, g) != T) {
|
||
|
return null
|
||
|
}
|
||
|
return d
|
||
|
}
|
||
|
|
||
|
function WebPDecodeRGBInto(a, b, c, d, e) {
|
||
|
return DecodeIntoRGBABuffer(O, a, b, c, e, d)
|
||
|
}
|
||
|
|
||
|
function WebPDecodeRGBAInto(a, b, c, d, e) {
|
||
|
return DecodeIntoRGBABuffer(MODE_RGBA, a, b, c, e, d)
|
||
|
}
|
||
|
|
||
|
function WebPDecodeARGBInto(a, b, c, d, e) {
|
||
|
return DecodeIntoRGBABuffer(MODE_ARGB, a, b, c, e, d)
|
||
|
}
|
||
|
|
||
|
function WebPDecodeBGRInto(a, b, c, d, e) {
|
||
|
return DecodeIntoRGBABuffer(MODE_BGR, a, b, c, e, d)
|
||
|
}
|
||
|
|
||
|
function WebPDecodeBGRAInto(a, b, c, d, e) {
|
||
|
return DecodeIntoRGBABuffer(MODE_BGRA, a, b, c, e, d)
|
||
|
}
|
||
|
|
||
|
function WebPDecodeYUVInto(a, b, c, d, e, f, u, g, h, i, v, j, k, l) {
|
||
|
var m = newObjectIt(ba);
|
||
|
var n = newObjectIt(R);
|
||
|
if (c == null) return null;
|
||
|
WebPInitDecBuffer(n);
|
||
|
WebPResetDecParams(m);
|
||
|
m.output = n;
|
||
|
n.colorspace = MODE_YUV;
|
||
|
n.u.YUVA.y = c;
|
||
|
n.u.YUVA.y_off = d;
|
||
|
n.u.YUVA.y_stride = f;
|
||
|
n.u.YUVA.y_size = e;
|
||
|
n.u.YUVA.u = u;
|
||
|
n.u.YUVA.u_off = g;
|
||
|
n.u.YUVA.u_stride = i;
|
||
|
n.u.YUVA.u_size = h;
|
||
|
n.u.YUVA.v = v;
|
||
|
n.u.YUVA.v_off = j;
|
||
|
n.u.YUVA.v_stride = l;
|
||
|
n.u.YUVA.v_size = k;
|
||
|
n.is_external_memory = 1;
|
||
|
if (DecodeInto(a, 0, b, m) != T) {
|
||
|
return null
|
||
|
}
|
||
|
return c
|
||
|
}
|
||
|
var db = -1,
|
||
|
data_size = -1,
|
||
|
params_out = -1;
|
||
|
var dc = -1;
|
||
|
|
||
|
function Decode(a, b, c, d, e, f) {
|
||
|
data_off = {
|
||
|
value: 0
|
||
|
};
|
||
|
c = {
|
||
|
value: c
|
||
|
};
|
||
|
var g = newObjectIt(ba);
|
||
|
var h = newObjectIt(R);
|
||
|
WebPInitDecBuffer(h);
|
||
|
WebPResetDecParams(g);
|
||
|
g.output = h;
|
||
|
h.colorspace = a;
|
||
|
var o = {
|
||
|
data_off: {
|
||
|
value: 0
|
||
|
},
|
||
|
width: {
|
||
|
value: h.width
|
||
|
},
|
||
|
height: {
|
||
|
value: h.height
|
||
|
}
|
||
|
};
|
||
|
if (!WebPGetInfo(b, data_off, c, o.width, o.height)) {
|
||
|
return null
|
||
|
}
|
||
|
h.width = o.width.value;
|
||
|
h.height = o.height.value;
|
||
|
if (d) d.value = h.width.value;
|
||
|
if (e) e.value = h.height.value;
|
||
|
if (DecodeInto(b, data_off.value, c.value, g) != T) {
|
||
|
return null
|
||
|
}
|
||
|
if (f) {
|
||
|
WebPCopyDecBuffer(h, f)
|
||
|
}
|
||
|
return (a >= MODE_YUV) ? h.u.YUVA.y : h.u.RGBA.rgba
|
||
|
}
|
||
|
this.WebPDecodeRGB = function(a, b, c, d) {
|
||
|
return Decode(O, a, b, c, d, null)
|
||
|
};
|
||
|
this.WebPDecodeRGBA = function(a, b, c, d) {
|
||
|
return Decode(MODE_RGBA, a, b, c, d, null)
|
||
|
};
|
||
|
this.WebPDecodeRGBA_4444 = function(a, b, c, d) {
|
||
|
return Decode(MODE_RGBA_4444, a, b, c, d, null)
|
||
|
};
|
||
|
this.WebPDecodeARGB = function(a, b, c, d) {
|
||
|
return Decode(MODE_ARGB, a, b, c, d, null)
|
||
|
};
|
||
|
this.WebPDecodeBGR = function(a, b, c, d) {
|
||
|
return Decode(MODE_BGR, a, b, c, d, null)
|
||
|
};
|
||
|
this.WebPDecodeBGRA = function(a, b, c, d) {
|
||
|
return Decode(MODE_BGRA, a, b, c, d, null)
|
||
|
};
|
||
|
|
||
|
function DefaultFeatures(a) {
|
||
|
assert(a);
|
||
|
a.bitstream_version = 0
|
||
|
}
|
||
|
|
||
|
function GetFeatures(a, b, c, d) {
|
||
|
var e = {
|
||
|
value: 0
|
||
|
};
|
||
|
var f = {
|
||
|
value: 0
|
||
|
};
|
||
|
var g = {
|
||
|
value: 0
|
||
|
};
|
||
|
var h = {
|
||
|
value: 0
|
||
|
};
|
||
|
var i = {
|
||
|
value: 0
|
||
|
};
|
||
|
if (d == null) {
|
||
|
return VP8_STATUS_INVALID_PARAM
|
||
|
}
|
||
|
DefaultFeatures(d);
|
||
|
if (a == null || b == null || c.value == 0) {
|
||
|
return VP8_STATUS_INVALID_PARAM
|
||
|
}
|
||
|
if (!WebPCheckAndSkipRIFFHeader(a, b, c, f)) {
|
||
|
return VP8_STATUS_BITSTREAM_ERROR
|
||
|
}
|
||
|
if (!VP8XGetInfo(a, b, c, h, d.width, d.height, g)) {
|
||
|
return VP8_STATUS_BITSTREAM_ERROR
|
||
|
}
|
||
|
if (h.value > 0) {
|
||
|
return T
|
||
|
}
|
||
|
if (!VP8CheckAndSkipHeader(a, b, c, i, e, f)) {
|
||
|
return VP8_STATUS_BITSTREAM_ERROR
|
||
|
}
|
||
|
if (i.value == -1) {
|
||
|
return VP8_STATUS_BITSTREAM_ERROR
|
||
|
}
|
||
|
if (!i.value) {
|
||
|
e.value = c.value
|
||
|
}
|
||
|
if (!VP8GetInfo(a, b, c, e, d.width, d.height, d.has_alpha)) {
|
||
|
return VP8_STATUS_BITSTREAM_ERROR
|
||
|
}
|
||
|
return T
|
||
|
}
|
||
|
|
||
|
function WebPGetInfo(a, b, c, d, e) {
|
||
|
var f = newObjectIt(U);
|
||
|
if (GetFeatures(a, b, c, f) != T) {
|
||
|
return 0
|
||
|
}
|
||
|
if (d) {
|
||
|
d.value = f.width
|
||
|
}
|
||
|
if (e) {
|
||
|
e.value = f.height
|
||
|
}
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function WebPInitDecoderConfigInternal(a, b) {
|
||
|
if (b != N) {
|
||
|
return 0
|
||
|
}
|
||
|
if (a == null) {
|
||
|
return 0
|
||
|
}
|
||
|
DefaultFeatures(a.input);
|
||
|
WebPInitDecBuffer(a.output);
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function WebPGetFeaturesInternal(a, b, c, d) {
|
||
|
if (d != N) {
|
||
|
return VP8_STATUS_INVALID_PARAM
|
||
|
}
|
||
|
if (c == null) {
|
||
|
return VP8_STATUS_INVALID_PARAM
|
||
|
}
|
||
|
var e = {
|
||
|
value: 0
|
||
|
};
|
||
|
var b = {
|
||
|
value: b
|
||
|
};
|
||
|
return GetFeatures(a, e, b, c)
|
||
|
}
|
||
|
this.WebPDecode = function(a, b, c) {
|
||
|
var d = newObjectIt(ba);
|
||
|
var e = 'VP8StatusCode';
|
||
|
if (!c) {
|
||
|
return VP8_STATUS_INVALID_PARAM
|
||
|
}
|
||
|
var f = {
|
||
|
value: 0
|
||
|
};
|
||
|
b = {
|
||
|
value: b
|
||
|
};
|
||
|
e = GetFeatures(a, f, b, c.input);
|
||
|
if (e != T) {
|
||
|
return e
|
||
|
}
|
||
|
WebPResetDecParams(d);
|
||
|
d.output = c.output;
|
||
|
d.options_ = c.options;
|
||
|
e = DecodeInto(a, f.value, b.value, d);
|
||
|
return e
|
||
|
};
|
||
|
var dd, height;
|
||
|
var db = -1,
|
||
|
data_size = -1,
|
||
|
dd = -1,
|
||
|
height = -1,
|
||
|
params_out = -1;
|
||
|
var dc = -1
|
||
|
}
|
||
|
|
||
|
function WebPEncoder() {
|
||
|
var N = 0x0002;
|
||
|
var O = {
|
||
|
quality: float,
|
||
|
target_size: int,
|
||
|
target_PSNR: float,
|
||
|
method: int,
|
||
|
segments: int,
|
||
|
sns_strength: int,
|
||
|
filter_strength: int,
|
||
|
filter_sharpness: int,
|
||
|
filter_type: int,
|
||
|
autofilter: int,
|
||
|
pass: int,
|
||
|
show_compressed: int,
|
||
|
preprocessing: int,
|
||
|
partitions: int,
|
||
|
partition_limit: int,
|
||
|
alpha_compression: int
|
||
|
};
|
||
|
var P = {
|
||
|
WEBP_PRESET_DEFAULT: 0,
|
||
|
WEBP_PRESET_PICTURE: 1,
|
||
|
WEBP_PRESET_PHOTO: 2,
|
||
|
WEBP_PRESET_DRAWING: 3,
|
||
|
WEBP_PRESET_ICON: 4,
|
||
|
WEBP_PRESET_TEXT: 5
|
||
|
};
|
||
|
|
||
|
function WebPConfigPreset(a, b, c) {
|
||
|
return WebPConfigInitInternal(a, b, c, N)
|
||
|
}
|
||
|
var S = {
|
||
|
PSNR: Arr(4, float),
|
||
|
coded_size: int,
|
||
|
block_count: Arr(3, int),
|
||
|
header_bytes: Arr(2, int),
|
||
|
residual_bytes: ArrM(new Array(3, 4), int),
|
||
|
segment_size: Arr(4, int),
|
||
|
segment_quant: Arr(4, int),
|
||
|
segment_level: Arr(4, int),
|
||
|
alpha_data_size: int,
|
||
|
layer_data_size: int
|
||
|
};
|
||
|
var T = 0,
|
||
|
WEBP_YUV422 = 1,
|
||
|
WEBP_YUV444 = 2,
|
||
|
WEBP_YUV400 = 3,
|
||
|
WEBP_CSP_UV_MASK = 3,
|
||
|
WEBP_YUV420A = 4,
|
||
|
WEBP_YUV422A = 5,
|
||
|
WEBP_YUV444A = 6,
|
||
|
WEBP_YUV400A = 7,
|
||
|
WEBP_CSP_ALPHA_BIT = 4;
|
||
|
var U = 0,
|
||
|
VP8_ENC_ERROR_OUT_OF_MEMORY = 1,
|
||
|
VP8_ENC_ERROR_BITSTREAM_OUT_OF_MEMORY = 2,
|
||
|
VP8_ENC_ERROR_NULL_PARAMETER = 3,
|
||
|
VP8_ENC_ERROR_INVALID_CONFIGURATION = 4,
|
||
|
VP8_ENC_ERROR_BAD_DIMENSION = 5,
|
||
|
VP8_ENC_ERROR_PARTITION0_OVERFLOW = 6,
|
||
|
VP8_ENC_ERROR_PARTITION_OVERFLOW = 7,
|
||
|
VP8_ENC_ERROR_BAD_WRITE = 8;
|
||
|
var V = {
|
||
|
colorspace: 'WebPEncCSP',
|
||
|
width: int,
|
||
|
height: int,
|
||
|
y: uint8_t,
|
||
|
u: uint8_t,
|
||
|
v: uint8_t,
|
||
|
y_off: 0,
|
||
|
u_off: 0,
|
||
|
v_off: 0,
|
||
|
y_stride: int,
|
||
|
uv_stride: int,
|
||
|
a: uint8_t,
|
||
|
a_off: 0,
|
||
|
a_stride: int,
|
||
|
writer: function WebPWriterFunction() {},
|
||
|
custom_ptr: void_,
|
||
|
extra_info_type: int,
|
||
|
extra_info: uint8_t,
|
||
|
stats: newObjectIt(S),
|
||
|
stats_nozero: 1,
|
||
|
u0: uint8_t,
|
||
|
v0: uint8_t,
|
||
|
u0_off: 0,
|
||
|
v0_off: 0,
|
||
|
uv0_stride: int,
|
||
|
error_code: 'WebPEncodingError'
|
||
|
};
|
||
|
|
||
|
function WebPPictureInit(a) {
|
||
|
return WebPPictureInitInternal(a, N)
|
||
|
}
|
||
|
var Y = {
|
||
|
range_: int32_t,
|
||
|
value_: int32_t,
|
||
|
run_: int,
|
||
|
nb_bits_: int,
|
||
|
buf_: uint8_t,
|
||
|
buf_off: 0,
|
||
|
pos_: size_t,
|
||
|
max_pos_: size_t,
|
||
|
error_: int
|
||
|
};
|
||
|
|
||
|
function VP8BitWriterPos(a) {
|
||
|
return (a.pos_ + a.run_) * 8 + 8 + a.nb_bits_
|
||
|
}
|
||
|
|
||
|
function VP8BitWriterBuf(a) {
|
||
|
return a.buf_
|
||
|
}
|
||
|
|
||
|
function VP8BitWriterSize(a) {
|
||
|
return a.pos_
|
||
|
}
|
||
|
var Z = 0;
|
||
|
var ba = 1;
|
||
|
var bb = 2;
|
||
|
var bc = 64;
|
||
|
var bd = 0,
|
||
|
B_TM_PRED = 1,
|
||
|
B_VE_PRED = 2,
|
||
|
B_HE_PRED = 3,
|
||
|
B_RD_PRED = 4,
|
||
|
B_VR_PRED = 5,
|
||
|
B_LD_PRED = 6,
|
||
|
B_VL_PRED = 7,
|
||
|
B_HD_PRED = 8,
|
||
|
B_HU_PRED = 9,
|
||
|
NUM_BMODES = (B_HU_PRED + 1 - bd),
|
||
|
DC_PRED = bd,
|
||
|
V_PRED = B_VE_PRED,
|
||
|
H_PRED = B_HE_PRED,
|
||
|
TM_PRED = B_TM_PRED;
|
||
|
var be = 4,
|
||
|
MAX_NUM_PARTITIONS = 8,
|
||
|
NUM_TYPES = 4,
|
||
|
NUM_BANDS = 8,
|
||
|
NUM_CTX = 3,
|
||
|
NUM_PROBAS = 11,
|
||
|
MAX_LF_LEVELS = 64,
|
||
|
MAX_VARIABLE_LEVEL = 67;
|
||
|
var bf = 16;
|
||
|
var bg = (bf * 16);
|
||
|
var bh = (bf * 8);
|
||
|
var bi = (bg + bh);
|
||
|
var bj = (6 * 16 * bf + 12 * bf);
|
||
|
var bk = (0);
|
||
|
var bl = (bg);
|
||
|
var bm = (bl + 8);
|
||
|
var bn = 15;
|
||
|
var bo = (0 * 16 * bf);
|
||
|
var bp = (1 * 16 * bf);
|
||
|
var bq = (2 * 16 * bf);
|
||
|
var br = (3 * 16 * bf);
|
||
|
var bs = (4 * 16 * bf);
|
||
|
var bt = (4 * 16 * bf + 8 * bf);
|
||
|
var bu = (5 * 16 * bf);
|
||
|
var bv = (5 * 16 * bf + 8 * bf);
|
||
|
var bw = (6 * 16 * bf + 0);
|
||
|
var bx = (6 * 16 * bf + 4);
|
||
|
var by = (6 * 16 * bf + 8);
|
||
|
var bz = (6 * 16 * bf + 12);
|
||
|
var bA = (6 * 16 * bf + 4 * bf + 0);
|
||
|
var bB = (6 * 16 * bf + 4 * bf + 4);
|
||
|
var bC = (6 * 16 * bf + 4 * bf + 8);
|
||
|
var bD = (6 * 16 * bf + 4 * bf + 12);
|
||
|
var bE = (6 * 16 * bf + 8 * bf + 0);
|
||
|
var bF = (6 * 16 * bf + 8 * bf + 4);
|
||
|
var bG = (6 * 16 * bf + 8 * bf + 8);
|
||
|
var bH = 0x7fffffffffffff;
|
||
|
var bI = 17;
|
||
|
|
||
|
function BIAS(b) {
|
||
|
return ((b) << (bI - 8))
|
||
|
}
|
||
|
|
||
|
function QUANTDIV(n, a, B) {
|
||
|
return ((n * a + B) >> bI)
|
||
|
}
|
||
|
var bJ = ArrM(new Array(NUM_CTX, NUM_PROBAS), uint8_t);
|
||
|
var bK = ArrM(new Array(NUM_CTX, NUM_PROBAS, 2), uint64_t);
|
||
|
var bL = ArrM(new Array(NUM_CTX, (MAX_VARIABLE_LEVEL + 1)), uint16_t);
|
||
|
var bM = ArrM(new Array(be, MAX_LF_LEVELS), double);
|
||
|
var bN = {
|
||
|
num_segments_: int,
|
||
|
update_map_: int,
|
||
|
size_: int
|
||
|
};
|
||
|
var bO = {
|
||
|
segments_: Arr(3, uint8_t),
|
||
|
skip_proba_: uint8_t,
|
||
|
coeffs_: ArrM(new Array(NUM_TYPES, NUM_BANDS), bJ),
|
||
|
stats_: ArrM(new Array(NUM_TYPES, NUM_BANDS), bK),
|
||
|
level_cost_: ArrM(new Array(NUM_TYPES, NUM_BANDS), bL),
|
||
|
use_skip_proba_: int,
|
||
|
nb_skip_: int
|
||
|
};
|
||
|
var bP = {
|
||
|
simple_: int,
|
||
|
level_: int,
|
||
|
sharpness_: int,
|
||
|
i4x4_lf_delta_: int
|
||
|
};
|
||
|
var bQ = {
|
||
|
type_: 0,
|
||
|
uv_mode_: 0,
|
||
|
skip_: 0,
|
||
|
segment_: 0,
|
||
|
alpha_: uint8_t
|
||
|
};
|
||
|
var bR = {
|
||
|
q_: Arr(16, uint16_t),
|
||
|
iq_: Arr(16, uint16_t),
|
||
|
bias_: Arr(16, uint16_t),
|
||
|
zthresh_: Arr(16, uint16_t),
|
||
|
sharpen_: Arr(16, uint16_t)
|
||
|
};
|
||
|
var bS = {
|
||
|
y1_: newObjectIt(bR),
|
||
|
y2_: newObjectIt(bR),
|
||
|
uv_: newObjectIt(bR),
|
||
|
alpha_: int,
|
||
|
beta_: int,
|
||
|
quant_: int,
|
||
|
fstrength_: int,
|
||
|
lambda_i16_: int,
|
||
|
lambda_i4_: int,
|
||
|
lambda_uv_: int,
|
||
|
lambda_mode_: int,
|
||
|
lambda_trellis_: int,
|
||
|
tlambda_: int,
|
||
|
lambda_trellis_i16_: int,
|
||
|
lambda_trellis_i4_: int,
|
||
|
lambda_trellis_uv_: int
|
||
|
};
|
||
|
var bT = {
|
||
|
config_: newObjectIt(O),
|
||
|
pic_: newObjectIt(V),
|
||
|
filter_hdr_: newObjectIt(bP),
|
||
|
segment_hdr_: newObjectIt(bN),
|
||
|
profile_: int,
|
||
|
mb_w_: int,
|
||
|
mb_h_: int,
|
||
|
preds_w_: int,
|
||
|
num_parts_: int,
|
||
|
bw_: newObjectIt(Y),
|
||
|
parts_: Arr_nOI(MAX_NUM_PARTITIONS, Y),
|
||
|
has_alpha_: int,
|
||
|
alpha_data_: uint8_t,
|
||
|
alpha_data_off: 0,
|
||
|
alpha_data_size_: size_t,
|
||
|
use_layer_: int,
|
||
|
layer_bw_: Y,
|
||
|
layer_data_: uint8_t,
|
||
|
layer_data_off: 0,
|
||
|
layer_data_size_: size_t,
|
||
|
dqm_: Arr_nOI(be, bS),
|
||
|
base_quant_: int,
|
||
|
uv_alpha_: int,
|
||
|
dq_y1_dc_: int,
|
||
|
dq_y2_dc_: int,
|
||
|
dq_y2_ac_: int,
|
||
|
dq_uv_dc_: int,
|
||
|
dq_uv_ac_: int,
|
||
|
proba_: newObjectIt(bO),
|
||
|
proba_off: 0,
|
||
|
sse_: Arr(3, uint64_t),
|
||
|
sse_count_: uint64_t,
|
||
|
coded_size_: int,
|
||
|
residual_bytes_: ArrM(new Array(3, 4), int),
|
||
|
block_count_: Arr(3, int),
|
||
|
method_: int,
|
||
|
rd_opt_level_: int,
|
||
|
max_i4_header_bits_: int,
|
||
|
mb_info_: newObjectIt(bQ),
|
||
|
mb_info_off: 0,
|
||
|
preds_: uint8_t,
|
||
|
preds_off: 0,
|
||
|
nz_: uint32_t,
|
||
|
nz_off: 0,
|
||
|
yuv_in_: uint8_t,
|
||
|
yuv_in_off: 0,
|
||
|
yuv_out_: uint8_t,
|
||
|
yuv_out_off: 0,
|
||
|
yuv_out2_: uint8_t,
|
||
|
yuv_out2_off: 0,
|
||
|
yuv_p_: uint8_t,
|
||
|
yuv_p_off: 0,
|
||
|
y_top_: uint8_t,
|
||
|
y_top_off: 0,
|
||
|
uv_top_: uint8_t,
|
||
|
uv_top_off: 0,
|
||
|
y_left_: uint8_t,
|
||
|
y_left_off: 0,
|
||
|
u_left_: uint8_t,
|
||
|
u_left_off: 0,
|
||
|
v_left_: uint8_t,
|
||
|
v_left_off: 0,
|
||
|
lf_stats_: newObjectIt(bM)
|
||
|
};
|
||
|
var bU = {
|
||
|
D: score_t,
|
||
|
SD: score_t,
|
||
|
R: score_t,
|
||
|
score: score_t,
|
||
|
y_dc_levels: Arr(16, int16_t),
|
||
|
y_ac_levels: ArrM(new Array(16, 16), int16_t),
|
||
|
uv_levels: ArrM(new Array(4 + 4, 16), int16_t),
|
||
|
mode_i16: int,
|
||
|
modes_i4: Arr(16, int),
|
||
|
mode_uv: int,
|
||
|
nz: uint32_t
|
||
|
};
|
||
|
var bV = {
|
||
|
x_: int,
|
||
|
y_: int,
|
||
|
y_offset_: int,
|
||
|
uv_offset_: int,
|
||
|
y_stride_: int,
|
||
|
uv_stride_: int,
|
||
|
yuv_in_: uint8_t,
|
||
|
yuv_in_off: 0,
|
||
|
yuv_out_: uint8_t,
|
||
|
yuv_out_off: 0,
|
||
|
yuv_out2_: uint8_t,
|
||
|
yuv_out2_off: 0,
|
||
|
yuv_p_: uint8_t,
|
||
|
yuv_p_off: 0,
|
||
|
enc_: newObjectIt(bT),
|
||
|
mb_: newObjectIt(bQ),
|
||
|
mb_off: 0,
|
||
|
bw_: newObjectIt(Y),
|
||
|
preds_: uint8_t,
|
||
|
preds_off: 0,
|
||
|
nz_: uint32_t,
|
||
|
nz_off: 0,
|
||
|
i4_boundary_: Arr(37, uint8_t),
|
||
|
i4_boundary_off: 0,
|
||
|
i4_top_: uint8_t,
|
||
|
i4_top_off: 0,
|
||
|
i4_: int,
|
||
|
top_nz_: Arr(9, int),
|
||
|
left_nz_: Arr(9, int),
|
||
|
bit_count_: ArrM(Array(4, 3), uint64_t),
|
||
|
luma_bits_: uint64_t,
|
||
|
uv_bits_: uint64_t,
|
||
|
lf_stats_: newObjectIt(bM),
|
||
|
do_trellis_: int,
|
||
|
done_: int
|
||
|
};
|
||
|
var bW = 8192;
|
||
|
|
||
|
function CompressAlpha(a, b, c, d, e, f) {
|
||
|
var g = WebPZlib.compress(a.slice(b, b + c), (f ? 3 : 6));
|
||
|
d.val = g;
|
||
|
e.val = g.length;
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function VP8EncInitAlpha(a) {
|
||
|
a.has_alpha_ = (a.pic_.a != null) + 0;
|
||
|
a.alpha_data_ = null;
|
||
|
a.alpha_data_size_ = 0
|
||
|
}
|
||
|
|
||
|
function VP8EncCodeAlphaBlock(a) {}
|
||
|
|
||
|
function VP8EncFinishAlpha(a) {
|
||
|
if (a.has_alpha_) {
|
||
|
var b = a.pic_;
|
||
|
assert(b.a);
|
||
|
a.alpha_data_ = {
|
||
|
val: a.alpha_data_
|
||
|
};
|
||
|
a.alpha_data_size_ = {
|
||
|
val: a.alpha_data_size
|
||
|
};
|
||
|
if (!CompressAlpha(b.a, 0, b.width * b.height, a.alpha_data_, a.alpha_data_size_, a.config_.alpha_compression)) {
|
||
|
return 0
|
||
|
}
|
||
|
a.alpha_data_ = a.alpha_data_.val;
|
||
|
a.alpha_data_size_ = a.alpha_data_size_.val
|
||
|
}
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function VP8EncDeleteAlpha(a) {
|
||
|
a.alpha_data_ = '';
|
||
|
a.alpha_data_ = null;
|
||
|
a.alpha_data_size_ = 0;
|
||
|
a.has_alpha_ = 0
|
||
|
}
|
||
|
|
||
|
function VP8EncInitLayer(a) {
|
||
|
a.use_layer_ = (a.pic_.u0 != null) + 0;
|
||
|
a.layer_data_size_ = 0;
|
||
|
a.layer_data_ = null;
|
||
|
if (a.use_layer_) {
|
||
|
VP8BitWriterInit(a.layer_bw_, a.mb_w_ * a.mb_h_ * 3)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function VP8EncCodeLayerBlock(a) {}
|
||
|
|
||
|
function VP8EncFinishLayer(a) {
|
||
|
if (a.use_layer_) {
|
||
|
a.layer_data_ = VP8BitWriterFinish(a.layer_bw_);
|
||
|
a.layer_data_size_ = VP8BitWriterSize(a.layer_bw_)
|
||
|
}
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function VP8EncDeleteLayer(a) {
|
||
|
a.layer_data_ = ''
|
||
|
}
|
||
|
var bX = 0x9d012a;
|
||
|
var bY = 10;
|
||
|
var bZ = 20;
|
||
|
var ca = (bZ - 8);
|
||
|
var cb = (1 << 19);
|
||
|
var cc = (1 << 24);
|
||
|
|
||
|
function PutLE32(a, b, c) {
|
||
|
a[b + 0] = (c >> 0) & 0xff;
|
||
|
a[b + 1] = (c >> 8) & 0xff;
|
||
|
a[b + 2] = (c >> 16) & 0xff;
|
||
|
a[b + 3] = (c >> 24) & 0xff
|
||
|
}
|
||
|
|
||
|
function PutHeader(a, b, c, d) {
|
||
|
var e = Arr(bY, uint8_t);
|
||
|
var f = new Array('R', 'I', 'F', 'F', 0, 0, 0, 0, 'W', 'E', 'B', 'P', 'V', 'P', '8', ' ');
|
||
|
var g = uint32_t;
|
||
|
if (b >= cb) {
|
||
|
return WebPEncodingSetError(d, VP8_ENC_ERROR_PARTITION0_OVERFLOW)
|
||
|
}
|
||
|
for (var i = 0; i < f.length; ++i) {
|
||
|
f[i] = f[i] != '0' ? String(f[i]).charCodeAt(0) : 0
|
||
|
}
|
||
|
PutLE32(f, +4, c + ca);
|
||
|
PutLE32(f, +16, c);
|
||
|
if (!d.writer(f, sizeof(f) * f.length, d)) {
|
||
|
return WebPEncodingSetError(d, VP8_ENC_ERROR_BAD_WRITE)
|
||
|
}
|
||
|
g = 0 | (a << 1) | (1 << 4) | (b << 5);
|
||
|
e[0] = g & 0xff;
|
||
|
e[1] = (g >> 8) & 0xff;
|
||
|
e[2] = (g >> 16) & 0xff;
|
||
|
e[3] = (bX >> 16) & 0xff;
|
||
|
e[4] = (bX >> 8) & 0xff;
|
||
|
e[5] = (bX >> 0) & 0xff;
|
||
|
e[6] = d.width & 0xff;
|
||
|
e[7] = d.width >> 8;
|
||
|
e[8] = d.height & 0xff;
|
||
|
e[9] = d.height >> 8;
|
||
|
return d.writer(e, sizeof(e) * e.length, d)
|
||
|
}
|
||
|
|
||
|
function PutSegmentHeader(a, b) {
|
||
|
var c = b.segment_hdr_;
|
||
|
var d = b.proba_;
|
||
|
if (VP8PutBitUniform(a, (c.num_segments_ > 1))) {
|
||
|
var e = 1;
|
||
|
var s;
|
||
|
VP8PutBitUniform(a, c.update_map_);
|
||
|
if (VP8PutBitUniform(a, e)) {
|
||
|
VP8PutBitUniform(a, 1);
|
||
|
for (s = 0; s < be; ++s) {
|
||
|
VP8PutSignedValue(a, b.dqm_[s].quant_, 7)
|
||
|
}
|
||
|
for (s = 0; s < be; ++s) {
|
||
|
VP8PutSignedValue(a, b.dqm_[s].fstrength_, 6)
|
||
|
}
|
||
|
}
|
||
|
if (c.update_map_) {
|
||
|
for (s = 0; s < 3; ++s) {
|
||
|
if (VP8PutBitUniform(a, (d.segments_[s] != 255))) {
|
||
|
VP8PutValue(a, d.segments_[s], 8)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function PutFilterHeader(a, b) {
|
||
|
var c = (b.i4x4_lf_delta_ != 0) + 0;
|
||
|
VP8PutBitUniform(a, b.simple_);
|
||
|
VP8PutValue(a, b.level_, 6);
|
||
|
VP8PutValue(a, b.sharpness_, 3);
|
||
|
if (VP8PutBitUniform(a, c)) {
|
||
|
var d = (b.i4x4_lf_delta_ != 0);
|
||
|
if (VP8PutBitUniform(a, d)) {
|
||
|
VP8PutValue(a, 0, 4);
|
||
|
VP8PutSignedValue(a, b.i4x4_lf_delta_, 6);
|
||
|
VP8PutValue(a, 0, 3)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function PutQuant(a, b) {
|
||
|
VP8PutValue(a, b.base_quant_, 7);
|
||
|
VP8PutSignedValue(a, b.dq_y1_dc_, 4);
|
||
|
VP8PutSignedValue(a, b.dq_y2_dc_, 4);
|
||
|
VP8PutSignedValue(a, b.dq_y2_ac_, 4);
|
||
|
VP8PutSignedValue(a, b.dq_uv_dc_, 4);
|
||
|
VP8PutSignedValue(a, b.dq_uv_ac_, 4)
|
||
|
}
|
||
|
|
||
|
function EmitPartitionsSize(a, b) {
|
||
|
var c = Arr(3 * (MAX_NUM_PARTITIONS - 1), uint8_t);
|
||
|
var p;
|
||
|
for (p = 0; p < a.num_parts_ - 1; ++p) {
|
||
|
var d = VP8BitWriterSize(a.parts_[p]);
|
||
|
if (d >= cc) {
|
||
|
return WebPEncodingSetError(b, VP8_ENC_ERROR_PARTITION_OVERFLOW)
|
||
|
}
|
||
|
c[3 * p + 0] = (d >> 0) & 0xff;
|
||
|
c[3 * p + 1] = (d >> 8) & 0xff;
|
||
|
c[3 * p + 2] = (d >> 16) & 0xff
|
||
|
}
|
||
|
return p ? b.writer(c, 3 * p, b) : 1
|
||
|
}
|
||
|
var cd = 8;
|
||
|
|
||
|
function PutLE24(a, b, c) {
|
||
|
a[b + 0] = (c >> 0) & 0xff;
|
||
|
a[b + 1] = (c >> 8) & 0xff;
|
||
|
a[b + 2] = (c >> 16) & 0xff
|
||
|
}
|
||
|
|
||
|
function WriteExtensions(a) {
|
||
|
var b = Arr(cd, uint8_t);
|
||
|
var c = a.bw_;
|
||
|
var d = a.pic_;
|
||
|
PutLE24(b, +0, a.layer_data_size_);
|
||
|
b[3] = a.pic_.colorspace & WEBP_CSP_UV_MASK;
|
||
|
if (a.layer_data_size_ > 0) {
|
||
|
assert(a.use_layer_);
|
||
|
if (!VP8BitWriterAppend(a.parts_[a.num_parts_ - 1], a.layer_data_, a.layer_data_off, a.layer_data_size_)) {
|
||
|
return WebPEncodingSetError(d, VP8_ENC_ERROR_BITSTREAM_OUT_OF_MEMORY)
|
||
|
}
|
||
|
}
|
||
|
PutLE24(b, +4, a.alpha_data_size_);
|
||
|
if (a.alpha_data_size_ > 0) {
|
||
|
assert(a.has_alpha_);
|
||
|
if (!VP8BitWriterAppend(c, a.alpha_data_, a.alpha_data_off, a.alpha_data_size_)) {
|
||
|
return WebPEncodingSetError(d, VP8_ENC_ERROR_BITSTREAM_OUT_OF_MEMORY)
|
||
|
}
|
||
|
}
|
||
|
b[cd - 1] = 0x01;
|
||
|
if (!VP8BitWriterAppend(c, b, 0, cd)) {
|
||
|
return WebPEncodingSetError(d, VP8_ENC_ERROR_BITSTREAM_OUT_OF_MEMORY)
|
||
|
}
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function GeneratePartition0(a) {
|
||
|
var b = a.bw_;
|
||
|
var c = a.mb_w_ * a.mb_h_;
|
||
|
var d = uint64_t,
|
||
|
pos2 = uint64_t,
|
||
|
pos3 = uint64_t;
|
||
|
var e = a.has_alpha_ || a.use_layer_;
|
||
|
d = VP8BitWriterPos(b);
|
||
|
VP8BitWriterInit(b, parseInt(c * 7 / 8));
|
||
|
VP8PutBitUniform(b, e);
|
||
|
VP8PutBitUniform(b, 0);
|
||
|
PutSegmentHeader(b, a);
|
||
|
PutFilterHeader(b, a.filter_hdr_);
|
||
|
VP8PutValue(b, a.config_.partitions, 2);
|
||
|
PutQuant(b, a);
|
||
|
VP8PutBitUniform(b, 0);
|
||
|
VP8WriteProbas(b, a.proba_);
|
||
|
pos2 = VP8BitWriterPos(b);
|
||
|
VP8CodeIntraModes(a);
|
||
|
VP8BitWriterFinish(b);
|
||
|
if (e && !WriteExtensions(a)) {
|
||
|
return 0
|
||
|
}
|
||
|
pos3 = VP8BitWriterPos(b);
|
||
|
if (a.pic_.stats_nozero) {
|
||
|
a.pic_.stats.header_bytes[0] = parseInt((pos2 - d + 7) >> 3);
|
||
|
a.pic_.stats.header_bytes[1] = parseInt((pos3 - pos2 + 7) >> 3);
|
||
|
a.pic_.stats.alpha_data_size = a.alpha_data_size_;
|
||
|
a.pic_.stats.layer_data_size = a.layer_data_size_
|
||
|
}
|
||
|
return !b.error_
|
||
|
}
|
||
|
|
||
|
function VP8EncWrite(a) {
|
||
|
var b = a.pic_;
|
||
|
var c = a.bw_;
|
||
|
var d = 0;
|
||
|
var e = size_t,
|
||
|
pad = size_t;
|
||
|
var p;
|
||
|
d = GeneratePartition0(a);
|
||
|
e = bY + VP8BitWriterSize(c) + 3 * (a.num_parts_ - 1);
|
||
|
for (p = 0; p < a.num_parts_; ++p) {
|
||
|
e += VP8BitWriterSize(a.parts_[p])
|
||
|
}
|
||
|
pad = e & 1;
|
||
|
e += pad; {
|
||
|
var f = VP8BitWriterBuf(c);
|
||
|
var g = VP8BitWriterSize(c);
|
||
|
d = d && PutHeader(a.profile_, g, e, b) && b.writer(f, g, b) && EmitPartitionsSize(a, b);
|
||
|
f = ''
|
||
|
}
|
||
|
for (p = 0; p < a.num_parts_; ++p) {
|
||
|
var h = VP8BitWriterBuf(a.parts_[p]);
|
||
|
var i = VP8BitWriterSize(a.parts_[p]);
|
||
|
if (i) d = d && b.writer(h, i, b);
|
||
|
h = ''
|
||
|
}
|
||
|
if (d && pad) {
|
||
|
var j = new Array(0);
|
||
|
d = b.writer(j, 1, b)
|
||
|
}
|
||
|
a.coded_size_ = e + bZ;
|
||
|
return d
|
||
|
}
|
||
|
var ce = Arr(255 + 255 + 1, uint8_t);
|
||
|
var cf = Arr(255 + 255 + 1, uint8_t);
|
||
|
var cg = Arr(1020 + 1020 + 1, int8_t);
|
||
|
var ci = Arr(112 + 112 + 1, int8_t);
|
||
|
var cj = Arr(255 + 510 + 1, uint8_t);
|
||
|
var ck = 0;
|
||
|
|
||
|
function InitTables(a) {
|
||
|
if (!ck) {
|
||
|
var i;
|
||
|
for (i = -255; i <= 255; ++i) {
|
||
|
ce[255 + i] = (i < 0) ? -i : i;
|
||
|
cf[255 + i] = ce[255 + i] >> 1
|
||
|
}
|
||
|
for (i = -1020; i <= 1020; ++i) {
|
||
|
cg[1020 + i] = (i < -128) ? -128 : (i > 127) ? 127 : i
|
||
|
}
|
||
|
for (i = -112; i <= 112; ++i) {
|
||
|
ci[112 + i] = (i < -16) ? -16 : (i > 15) ? 15 : i
|
||
|
}
|
||
|
for (i = -255; i <= 255 + 255; ++i) {
|
||
|
cj[255 + i] = (i < 0) ? 0 : (i > 255) ? 255 : i
|
||
|
}
|
||
|
ck = 1
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function do_filter2(p, b, c) {
|
||
|
var d = p[b - 2 * c],
|
||
|
p0 = p[b - c],
|
||
|
q0 = p[b + 0],
|
||
|
q1 = p[b + c];
|
||
|
var a = 3 * (q0 - p0) + cg[1020 + d - q1];
|
||
|
var e = ci[112 + ((a + 4) >> 3)];
|
||
|
var f = ci[112 + ((a + 3) >> 3)];
|
||
|
p[b - c] = cj[255 + p0 + f];
|
||
|
p[b + 0] = cj[255 + q0 - e]
|
||
|
}
|
||
|
|
||
|
function do_filter4(p, b, c) {
|
||
|
var d = p[b - 2 * c],
|
||
|
p0 = p[b - c],
|
||
|
q0 = p[b + 0],
|
||
|
q1 = p[b + c];
|
||
|
var a = 3 * (q0 - p0);
|
||
|
var e = ci[112 + ((a + 4) >> 3)];
|
||
|
var f = ci[112 + ((a + 3) >> 3)];
|
||
|
var g = (e + 1) >> 1;
|
||
|
p[b - 2 * c] = cj[255 + d + g];
|
||
|
p[b - c] = cj[255 + p0 + f];
|
||
|
p[b + 0] = cj[255 + q0 - e];
|
||
|
p[b + c] = cj[255 + q1 - g]
|
||
|
}
|
||
|
|
||
|
function hev(p, a, b, c) {
|
||
|
var d = p[a - 2 * b],
|
||
|
p0 = p[a - b],
|
||
|
q0 = p[a + 0],
|
||
|
q1 = p[a + b];
|
||
|
return (ce[255 + d - p0] > c) || (ce[255 + q1 - q0] > c)
|
||
|
}
|
||
|
|
||
|
function needs_filter(p, a, b, c) {
|
||
|
var d = p[a - 2 * b],
|
||
|
p0 = p[a - b],
|
||
|
q0 = p[a + 0],
|
||
|
q1 = p[a + b];
|
||
|
return (2 * ce[255 + p0 - q0] + cf[255 + d - q1]) <= c
|
||
|
}
|
||
|
|
||
|
function needs_filter2(p, a, b, t, c) {
|
||
|
var d = p[a - 4 * b],
|
||
|
p2 = p[a - 3 * b],
|
||
|
p1 = p[a - 2 * b],
|
||
|
p0 = p[a - b];
|
||
|
var e = p[a + 0],
|
||
|
q1 = p[a + b],
|
||
|
q2 = p[a + 2 * b],
|
||
|
q3 = p[a + 3 * b];
|
||
|
if ((2 * ce[255 + p0 - e] + cf[255 + p1 - q1]) > t) return 0;
|
||
|
return ce[255 + d - p2] <= c && ce[255 + p2 - p1] <= c && ce[255 + p1 - p0] <= c && ce[255 + q3 - q2] <= c && ce[255 + q2 - q1] <= c && ce[255 + q1 - e] <= c
|
||
|
}
|
||
|
|
||
|
function SimpleVFilter16(p, a, b, c) {
|
||
|
var i;
|
||
|
for (i = 0; i < 16; ++i) {
|
||
|
if (needs_filter(p, a + i, b, c)) {
|
||
|
do_filter2(p, a + i, b)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function SimpleHFilter16(p, a, b, c) {
|
||
|
var i;
|
||
|
for (i = 0; i < 16; ++i) {
|
||
|
if (needs_filter(p, a + i * b, 1, c)) {
|
||
|
do_filter2(p, a + i * b, 1)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function SimpleVFilter16i(p, a, b, c) {
|
||
|
var k;
|
||
|
for (k = 3; k > 0; --k) {
|
||
|
a += 4 * b;
|
||
|
SimpleVFilter16(p, a, b, c)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function SimpleHFilter16i(p, a, b, c) {
|
||
|
var k;
|
||
|
for (k = 3; k > 0; --k) {
|
||
|
a += 4;
|
||
|
SimpleHFilter16(p, a, b, c)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function FilterLoop24(p, a, b, c, d, e, f, g) {
|
||
|
while (d-- > 0) {
|
||
|
if (needs_filter2(p, a, b, e, f)) {
|
||
|
if (hev(p, a, b, g)) {
|
||
|
do_filter2(p, a, b)
|
||
|
} else {
|
||
|
do_filter4(p, a, b)
|
||
|
}
|
||
|
}
|
||
|
a += c
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function VFilter16i(p, a, b, c, d, e) {
|
||
|
var k;
|
||
|
for (k = 3; k > 0; --k) {
|
||
|
a += 4 * b;
|
||
|
FilterLoop24(p, a, b, 1, 16, c, d, e)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function HFilter16i(p, a, b, c, d, e) {
|
||
|
var k;
|
||
|
for (k = 3; k > 0; --k) {
|
||
|
a += 4;
|
||
|
FilterLoop24(p, a, 1, b, 16, c, d, e)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function VFilter8i(u, a, v, b, c, d, e, f) {
|
||
|
FilterLoop24(u, a + 4 * c, c, 1, 8, d, e, f);
|
||
|
FilterLoop24(v, b + 4 * c, c, 1, 8, d, e, f)
|
||
|
}
|
||
|
|
||
|
function HFilter8i(u, a, v, b, c, d, e, f) {
|
||
|
FilterLoop24(u, a + 4, 1, c, 8, d, e, f);
|
||
|
FilterLoop24(v, b + 4, 1, c, 8, d, e, f)
|
||
|
}
|
||
|
|
||
|
function VP8EncVFilter16i(p, a, b, c, d, e) {
|
||
|
VFilter16i(p, a, b, c, d, e)
|
||
|
};
|
||
|
|
||
|
function VP8EncHFilter16i(p, a, b, c, d, e) {
|
||
|
HFilter16i(p, a, b, c, d, e)
|
||
|
};
|
||
|
|
||
|
function VP8EncVFilter8i(u, a, v, b, c, d, e, f) {
|
||
|
VFilter8i(u, a, v, b, c, d, e, f)
|
||
|
};
|
||
|
|
||
|
function VP8EncHFilter8i(u, a, v, b, c, d, e, f) {
|
||
|
HFilter8i(u, a, v, b, c, d, e, f)
|
||
|
};
|
||
|
|
||
|
function VP8EncSimpleVFilter16i(p, a, b, c) {
|
||
|
SimpleVFilter16i(p, a, b, c)
|
||
|
};
|
||
|
|
||
|
function VP8EncSimpleHFilter16i(p, a, b, c) {
|
||
|
SimpleHFilter16i(p, a, b, c)
|
||
|
};
|
||
|
|
||
|
function GetILevel(a, b) {
|
||
|
if (a > 0) {
|
||
|
if (a > 4) {
|
||
|
b >>= 2
|
||
|
} else {
|
||
|
b >>= 1
|
||
|
}
|
||
|
if (b > 9 - a) {
|
||
|
b = 9 - a
|
||
|
}
|
||
|
}
|
||
|
if (b < 1) b = 1;
|
||
|
return b
|
||
|
}
|
||
|
|
||
|
function DoFilter(a, b) {
|
||
|
var c = a.enc_;
|
||
|
var d = GetILevel(c.config_.filter_sharpness, b);
|
||
|
var e = 2 * b + d;
|
||
|
var f = a.yuv_out2_;
|
||
|
var g = a.yuv_out2_off + bk;
|
||
|
var h = a.yuv_out2_;
|
||
|
var i = a.yuv_out2_off + bl;
|
||
|
var j = a.yuv_out2_;
|
||
|
var k = a.yuv_out2_off + bm;
|
||
|
memcpy(f, g, a.yuv_out_, a.yuv_out_off, bi * sizeof(uint8_t));
|
||
|
if (c.filter_hdr_.simple_ == 1) {
|
||
|
VP8EncSimpleHFilter16i(f, g, bf, e);
|
||
|
VP8EncSimpleVFilter16i(f, g, bf, e)
|
||
|
} else {
|
||
|
var l = (b >= 40) ? 2 : (b >= 15) ? 1 : 0;
|
||
|
VP8EncHFilter16i(f, g, bf, e, d, l);
|
||
|
VP8EncHFilter8i(h, i, j, k, bf, e, d, l);
|
||
|
VP8EncVFilter16i(f, g, bf, e, d, l);
|
||
|
VP8EncVFilter8i(h, i, j, k, bf, e, d, l)
|
||
|
}
|
||
|
}
|
||
|
var cl = 3;
|
||
|
var cm = {
|
||
|
w: double,
|
||
|
xm: double,
|
||
|
ym: double,
|
||
|
xxm: double,
|
||
|
xym: double,
|
||
|
yym: double
|
||
|
};
|
||
|
|
||
|
function Accumulate(a, b, c, d, e, f, g, h, W, H, i) {
|
||
|
var j = (h - cl < 0) ? 0 : h - cl;
|
||
|
var k = (h + cl > H - 1) ? H - 1 : h + cl;
|
||
|
var l = (g - cl < 0) ? 0 : g - cl;
|
||
|
var m = (g + cl > W - 1) ? W - 1 : g + cl;
|
||
|
var x, y;
|
||
|
b += j * c;
|
||
|
e += j * f;
|
||
|
for (y = j; y <= k; ++y, b += c, e += f) {
|
||
|
for (x = l; x <= m; ++x) {
|
||
|
var n = a[b + x];
|
||
|
var o = d[e + x];
|
||
|
i.w += 1;
|
||
|
i.xm += n;
|
||
|
i.ym += o;
|
||
|
i.xxm += n * n;
|
||
|
i.xym += n * o;
|
||
|
i.yym += o * o
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function GetSSIM(a) {
|
||
|
var b = a.xm * a.xm;
|
||
|
var c = a.ym * a.ym;
|
||
|
var d = a.xm * a.ym;
|
||
|
var e = a.w * a.w;
|
||
|
var f = a.xxm * a.w - b;
|
||
|
var g = a.yym * a.w - c;
|
||
|
var h = a.xym * a.w - d;
|
||
|
var i = double,
|
||
|
C2 = double;
|
||
|
var j = double;
|
||
|
var k = double;
|
||
|
if (f < 0.) f = 0.;
|
||
|
if (g < 0.) g = 0.;
|
||
|
i = 6.5025 * e;
|
||
|
C2 = 58.5225 * e;
|
||
|
j = (2 * d + i) * (2 * h + C2);
|
||
|
k = (b + c + i) * (f + g + C2);
|
||
|
return (k != 0) ? j / k : 0.
|
||
|
}
|
||
|
|
||
|
function GetMBSSIM(a, b, c, d) {
|
||
|
var x, y;
|
||
|
var s = {
|
||
|
w: double,
|
||
|
xm: double,
|
||
|
ym: double,
|
||
|
xxm: double,
|
||
|
xym: double,
|
||
|
yym: double
|
||
|
};
|
||
|
for (x = 3; x < 13; x++) {
|
||
|
for (y = 3; y < 13; y++) {
|
||
|
Accumulate(a, b + bk, bf, c, d + bk, bf, x, y, 16, 16, s)
|
||
|
}
|
||
|
}
|
||
|
for (x = 1; x < 7; x++) {
|
||
|
for (y = 1; y < 7; y++) {
|
||
|
Accumulate(a, b + bl, bf, c, d + bl, bf, x, y, 8, 8, s);
|
||
|
Accumulate(a, b + bm, bf, c, d + bm, bf, x, y, 8, 8, s)
|
||
|
}
|
||
|
}
|
||
|
return GetSSIM(s)
|
||
|
}
|
||
|
|
||
|
function VP8InitFilter(a) {
|
||
|
var s, i;
|
||
|
if (!a.lf_stats_) return;
|
||
|
InitTables();
|
||
|
for (s = 0; s < be; s++) {
|
||
|
for (i = 0; i < MAX_LF_LEVELS; i++) {
|
||
|
a.lf_stats_[s][i] = 0
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function VP8StoreFilterStats(a) {
|
||
|
var d = int;
|
||
|
var s = a.mb_[a.mb_off].segment_;
|
||
|
var b = a.enc_.dqm_[s].fstrength_;
|
||
|
var c = -a.enc_.dqm_[s].quant_;
|
||
|
var e = a.enc_.dqm_[s].quant_;
|
||
|
var f = (e - c >= 4) ? 4 : 1;
|
||
|
if (!a.lf_stats_) return;
|
||
|
if (a.mb_[a.mb_off].type_ == 1 && a.mb_[a.mb_off].skip_) return;
|
||
|
a.lf_stats_[s][0] += GetMBSSIM(a.yuv_in_, a.yuv_in_off, a.yuv_out_, a.yuv_out_off);
|
||
|
for (d = c; d <= e; d += f) {
|
||
|
var g = b + d;
|
||
|
if (g <= 0 || g >= MAX_LF_LEVELS) {
|
||
|
continue
|
||
|
}
|
||
|
DoFilter(a, g);
|
||
|
a.lf_stats_[s][g] += GetMBSSIM(a.yuv_in_, a.yuv_in_off, a.yuv_out2_, a.yuv_out2_off)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function VP8AdjustFilterStrength(a) {
|
||
|
var s;
|
||
|
var b = a.enc_;
|
||
|
if (!a.lf_stats_) {
|
||
|
return
|
||
|
}
|
||
|
for (s = 0; s < be; s++) {
|
||
|
var i, best_level = 0;
|
||
|
var c = 1.00001 * a.lf_stats_[s][0];
|
||
|
for (i = 1; i < MAX_LF_LEVELS; i++) {
|
||
|
var v = a.lf_stats_[s][i];
|
||
|
if (v > c) {
|
||
|
c = v;
|
||
|
best_level = i
|
||
|
}
|
||
|
}
|
||
|
b.dqm_[s].fstrength_ = best_level
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function BitWriterResize(a, b) {
|
||
|
var c = uint8_t;
|
||
|
var d = 0;
|
||
|
var e = size_t;
|
||
|
var f = a.pos_ + b;
|
||
|
if (f <= a.max_pos_) return 1;
|
||
|
e = 2 * a.max_pos_;
|
||
|
if (e < f) e = f;
|
||
|
if (e < 1024) e = 1024;
|
||
|
c = malloc(e, uint8_t);
|
||
|
if (c == null) {
|
||
|
a.error_ = 1;
|
||
|
return 0
|
||
|
}
|
||
|
if (a.pos_ > 0) memcpy(c, d, a.buf_, a.buf_off, a.pos_);
|
||
|
a.buf_ = '';
|
||
|
a.buf_ = c;
|
||
|
a.buf_off = d;
|
||
|
a.max_pos_ = e;
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function kFlush(a) {
|
||
|
var s = 8 + a.nb_bits_;
|
||
|
var b = a.value_ >> s;
|
||
|
assert(a.nb_bits_ >= 0);
|
||
|
a.value_ -= b << s;
|
||
|
a.nb_bits_ -= 8;
|
||
|
if ((b & 0xff) != 0xff) {
|
||
|
var c = a.pos_;
|
||
|
if (c + a.run_ >= a.max_pos_) {
|
||
|
if (!BitWriterResize(a, a.run_ + 1)) {
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
if (b & 0x100) {
|
||
|
if (c > 0) a.buf_[c - 1]++
|
||
|
}
|
||
|
if (a.run_ > 0) {
|
||
|
var d = (b & 0x100) ? 0x00 : 0xff;
|
||
|
for (; a.run_ > 0; --a.run_) a.buf_[c++] = d
|
||
|
}
|
||
|
a.buf_[c++] = (b > 255 ? b - 256 : b);
|
||
|
a.pos_ = c
|
||
|
} else {
|
||
|
a.run_++
|
||
|
}
|
||
|
}
|
||
|
var cn = new Array(7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0);
|
||
|
var co = new Array(127, 127, 191, 127, 159, 191, 223, 127, 143, 159, 175, 191, 207, 223, 239, 127, 135, 143, 151, 159, 167, 175, 183, 191, 199, 207, 215, 223, 231, 239, 247, 127, 131, 135, 139, 143, 147, 151, 155, 159, 163, 167, 171, 175, 179, 183, 187, 191, 195, 199, 203, 207, 211, 215, 219, 223, 227, 231, 235, 239, 243, 247, 251, 127, 129, 131, 133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 177, 179, 181, 183, 185, 187, 189, 191, 193, 195, 197, 199, 201, 203, 205, 207, 209, 211, 213, 215, 217, 219, 221, 223, 225, 227, 229, 231, 233, 235, 237, 239, 241, 243, 245, 247, 249, 251, 253, 127);
|
||
|
|
||
|
function VP8PutBit(a, b, c) {
|
||
|
b = b ? 1 : 0;
|
||
|
var d = (a.range_ * c) >> 8;
|
||
|
if (b) {
|
||
|
a.value_ += d + 1;
|
||
|
a.range_ -= d + 1
|
||
|
} else {
|
||
|
a.range_ = d
|
||
|
}
|
||
|
if (a.range_ < 127) {
|
||
|
var e = cn[a.range_];
|
||
|
a.range_ = co[a.range_];
|
||
|
a.value_ <<= e;
|
||
|
a.nb_bits_ += e;
|
||
|
if (a.nb_bits_ > 0) kFlush(a)
|
||
|
}
|
||
|
return b
|
||
|
}
|
||
|
|
||
|
function VP8PutBitUniform(a, b) {
|
||
|
b = b ? 1 : 0;
|
||
|
var c = a.range_ >> 1;
|
||
|
if (b) {
|
||
|
a.value_ += c + 1;
|
||
|
a.range_ -= c + 1
|
||
|
} else {
|
||
|
a.range_ = c
|
||
|
}
|
||
|
if (a.range_ < 127) {
|
||
|
a.range_ = co[a.range_];
|
||
|
a.value_ <<= 1;
|
||
|
a.nb_bits_ += 1;
|
||
|
if (a.nb_bits_ > 0) kFlush(a)
|
||
|
}
|
||
|
return b
|
||
|
}
|
||
|
|
||
|
function VP8PutValue(a, b, c) {
|
||
|
var d;
|
||
|
for (d = 1 << (c - 1); d; d >>= 1) VP8PutBitUniform(a, b & d)
|
||
|
}
|
||
|
|
||
|
function VP8PutSignedValue(a, b, c) {
|
||
|
if (!VP8PutBitUniform(a, b != 0)) return;
|
||
|
if (b < 0) {
|
||
|
VP8PutValue(a, ((-b) << 1) | 1, c + 1)
|
||
|
} else {
|
||
|
VP8PutValue(a, b << 1, c + 1)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function VP8BitWriterInit(a, b) {
|
||
|
a.range_ = 255 - 1;
|
||
|
a.value_ = 0;
|
||
|
a.run_ = 0;
|
||
|
a.nb_bits_ = -8;
|
||
|
a.pos_ = 0;
|
||
|
a.max_pos_ = 0;
|
||
|
a.error_ = 0;
|
||
|
a.buf_ = null;
|
||
|
return (b > 0) ? BitWriterResize(a, b) : 1
|
||
|
}
|
||
|
|
||
|
function VP8BitWriterFinish(a) {
|
||
|
VP8PutValue(a, 0, 9 - a.nb_bits_);
|
||
|
a.nb_bits_ = 0;
|
||
|
kFlush(a);
|
||
|
return a.buf_
|
||
|
}
|
||
|
|
||
|
function VP8BitWriterAppend(a, b, c, d) {
|
||
|
assert(b);
|
||
|
if (a.nb_bits_ != -8) return 0;
|
||
|
if (!BitWriterResize(a, d)) return 0;
|
||
|
memcpy(a.buf_, a.buf_off + a.pos_, b, c, d);
|
||
|
a.pos_ += d;
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function VP8BitCost(a, b) {
|
||
|
return !a ? cp[b] : cp[255 - b]
|
||
|
}
|
||
|
|
||
|
function VP8BranchCost(a, b, c) {
|
||
|
return a * VP8BitCost(1, c) + (b - a) * VP8BitCost(0, c)
|
||
|
}
|
||
|
|
||
|
function VP8LevelCost(a, b) {
|
||
|
return cr[b] + a[b > MAX_VARIABLE_LEVEL ? MAX_VARIABLE_LEVEL : b]
|
||
|
}
|
||
|
var cp = new Array(1792, 1792, 1792, 1536, 1536, 1408, 1366, 1280, 1280, 1216, 1178, 1152, 1110, 1076, 1061, 1024, 1024, 992, 968, 951, 939, 911, 896, 878, 871, 854, 838, 820, 811, 794, 786, 768, 768, 752, 740, 732, 720, 709, 704, 690, 683, 672, 666, 655, 647, 640, 631, 622, 615, 607, 598, 592, 586, 576, 572, 564, 559, 555, 547, 541, 534, 528, 522, 512, 512, 504, 500, 494, 488, 483, 477, 473, 467, 461, 458, 452, 448, 443, 438, 434, 427, 424, 419, 415, 410, 406, 403, 399, 394, 390, 384, 384, 377, 374, 370, 366, 362, 359, 355, 351, 347, 342, 342, 336, 333, 330, 326, 323, 320, 316, 312, 308, 305, 302, 299, 296, 293, 288, 287, 283, 280, 277, 274, 272, 268, 266, 262, 256, 256, 256, 251, 248, 245, 242, 240, 237, 234, 232, 228, 226, 223, 221, 218, 216, 214, 211, 208, 205, 203, 201, 198, 196, 192, 191, 188, 187, 183, 181, 179, 176, 175, 171, 171, 168, 165, 163, 160, 159, 156, 154, 152, 150, 148, 146, 144, 142, 139, 138, 135, 133, 131, 128, 128, 125, 123, 121, 119, 117, 115, 113, 111, 110, 107, 105, 103, 102, 100, 98, 96, 94, 92, 91, 89, 86, 86, 83, 82, 80, 77, 76, 74, 73, 71, 69, 67, 66, 64, 63, 61, 59, 57, 55, 54, 52, 51, 49, 47, 46, 44, 43, 41, 40, 38, 36, 35, 33, 32, 30, 29, 27, 25, 24, 22, 21, 19, 18, 16, 15, 13, 12, 10, 9, 7, 6, 4, 3);
|
||
|
var cq = new Array(new Array(0x001, 0x000), new Array(0x007, 0x001), new Array(0x00f, 0x005), new Array(0x00f, 0x00d), new Array(0x033, 0x003), new Array(0x033, 0x003), new Array(0x033, 0x023), new Array(0x033, 0x023), new Array(0x033, 0x023), new Array(0x033, 0x023), new Array(0x0d3, 0x013), new Array(0x0d3, 0x013), new Array(0x0d3, 0x013), new Array(0x0d3, 0x013), new Array(0x0d3, 0x013), new Array(0x0d3, 0x013), new Array(0x0d3, 0x013), new Array(0x0d3, 0x013), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x0d3, 0x093), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x053), new Array(0x153, 0x153));
|
||
|
var cr = new Array(0, 256, 256, 256, 256, 432, 618, 630, 731, 640, 640, 828, 901, 948, 1021, 1101, 1174, 1221, 1294, 1042, 1085, 1115, 1158, 1202, 1245, 1275, 1318, 1337, 1380, 1410, 1453, 1497, 1540, 1570, 1613, 1280, 1295, 1317, 1332, 1358, 1373, 1395, 1410, 1454, 1469, 1491, 1506, 1532, 1547, 1569, 1584, 1601, 1616, 1638, 1653, 1679, 1694, 1716, 1731, 1775, 1790, 1812, 1827, 1853, 1868, 1890, 1905, 1727, 1733, 1742, 1748, 1759, 1765, 1774, 1780, 1800, 1806, 1815, 1821, 1832, 1838, 1847, 1853, 1878, 1884, 1893, 1899, 1910, 1916, 1925, 1931, 1951, 1957, 1966, 1972, 1983, 1989, 1998, 2004, 2027, 2033, 2042, 2048, 2059, 2065, 2074, 2080, 2100, 2106, 2115, 2121, 2132, 2138, 2147, 2153, 2178, 2184, 2193, 2199, 2210, 2216, 2225, 2231, 2251, 2257, 2266, 2272, 2283, 2289, 2298, 2304, 2168, 2174, 2183, 2189, 2200, 2206, 2215, 2221, 2241, 2247, 2256, 2262, 2273, 2279, 2288, 2294, 2319, 2325, 2334, 2340, 2351, 2357, 2366, 2372, 2392, 2398, 2407, 2413, 2424, 2430, 2439, 2445, 2468, 2474, 2483, 2489, 2500, 2506, 2515, 2521, 2541, 2547, 2556, 2562, 2573, 2579, 2588, 2594, 2619, 2625, 2634, 2640, 2651, 2657, 2666, 2672, 2692, 2698, 2707, 2713, 2724, 2730, 2739, 2745, 2540, 2546, 2555, 2561, 2572, 2578, 2587, 2593, 2613, 2619, 2628, 2634, 2645, 2651, 2660, 2666, 2691, 2697, 2706, 2712, 2723, 2729, 2738, 2744, 2764, 2770, 2779, 2785, 2796, 2802, 2811, 2817, 2840, 2846, 2855, 2861, 2872, 2878, 2887, 2893, 2913, 2919, 2928, 2934, 2945, 2951, 2960, 2966, 2991, 2997, 3006, 3012, 3023, 3029, 3038, 3044, 3064, 3070, 3079, 3085, 3096, 3102, 3111, 3117, 2981, 2987, 2996, 3002, 3013, 3019, 3028, 3034, 3054, 3060, 3069, 3075, 3086, 3092, 3101, 3107, 3132, 3138, 3147, 3153, 3164, 3170, 3179, 3185, 3205, 3211, 3220, 3226, 3237, 3243, 3252, 3258, 3281, 3287, 3296, 3302, 3313, 3319, 3328, 3334, 3354, 3360, 3369, 3375, 3386, 3392, 3401, 3407, 3432, 3438, 3447, 3453, 3464, 3470, 3479, 3485, 3505, 3511, 3520, 3526, 3537, 3543, 3552, 3558, 2816, 2822, 2831, 2837, 2848, 2854, 2863, 2869, 2889, 2895, 2904, 2910, 2921, 2927, 2936, 2942, 2967, 2973, 2982, 2988, 2999, 3005, 3014, 3020, 3040, 3046, 3055, 3061, 3072, 3078, 3087, 3093, 3116, 3122, 3131, 3137, 3148, 3154, 3163, 3169, 3189, 3195, 3204, 3210, 3221, 3227, 3236, 3242, 3267, 3273, 3282, 3288, 3299, 3305, 3314, 3320, 3340, 3346, 3355, 3361, 3372, 3378, 3387, 3393, 3257, 3263, 3272, 3278, 3289, 3295, 3304, 3310, 3330, 3336, 3345, 3351, 3362, 3368, 3377, 3383, 3408, 3414, 3423, 3429, 3440, 3446, 3455, 3461, 3481, 3487, 3496, 3502, 3513, 3519, 3528, 3534, 3557, 3563, 3572, 3578, 3589, 3595, 3604, 3610, 3630, 3636, 3645, 3651, 3662, 3668, 3677, 3683, 3708, 3714, 3723, 3729, 3740, 3746, 3755, 3761, 3781, 3787, 3796, 3802, 3813, 3819, 3828, 3834, 3629, 3635, 3644, 3650, 3661, 3667, 3676, 3682, 3702, 3708, 3717, 3723, 3734, 3740, 3749, 3755, 3780, 3786, 3795, 3801, 3812, 3818, 3827, 3833, 3853, 3859, 3868, 3874, 3885, 3891, 3900, 3906, 3929, 3935, 3944, 3950, 3961, 3967, 3976, 3982, 4002, 4008, 4017, 4023, 4034, 4040, 4049, 4055, 4080, 4086, 4095, 4101, 4112, 4118, 4127, 4133, 4153, 4159, 4168, 4174, 4185, 4191, 4200, 4206, 4070, 4076, 4085, 4091, 4102, 4108, 4117, 4123, 4143, 4149, 4158, 4164, 4175, 4181, 4190, 4196, 4221, 4227, 4236, 4242, 4253, 4259, 4268, 4274, 4294, 4300, 4309, 4315, 4326, 4332, 4341, 4347, 4370, 4376, 4385, 4391, 4402, 4408, 4417, 4423, 4443, 4449, 4458, 4464, 4475, 4481, 4490, 4496, 4521, 4527, 4536, 4542, 4553, 4559, 4568, 4574, 4594, 4600, 4609, 4615, 4626, 4632, 4641, 4647, 3515, 3521, 3530, 3536, 3547, 3553, 3562, 3568, 3588, 3594, 3603, 3609, 3620, 3626, 3635, 3641, 3666, 3672, 3681, 3687, 3698, 3704, 3713, 3719, 3739, 3745, 3754, 3760, 3771, 3777, 3786, 3792, 3815, 3821, 3830, 3836, 3847, 3853, 3862, 3868, 3888, 3894, 3903, 3909, 3920, 3926, 3935, 3941, 3966, 3972, 3981, 3987, 3998, 4004, 4013, 4019, 4039, 4045, 4054, 4060, 4071, 4077, 4086, 4092, 3956, 3962, 3971, 3977, 3988, 3994, 4003, 4009, 4029, 4035, 4044, 4050, 4061, 4067, 4076, 4082, 4107, 4113, 4122, 4128, 4139, 4145, 4154, 4160, 4180, 4186, 4195, 4201, 4212, 4218, 4227, 4233, 4256, 4262, 4271, 4277, 4288, 4294, 43
|
||
|
|
||
|
function VariableLevelCost(a, b) {
|
||
|
var c = cq[a - 1][0];
|
||
|
var d = cq[a - 1][1];
|
||
|
var e = 0;
|
||
|
var i = int;
|
||
|
for (i = 2; c; ++i) {
|
||
|
if (c & 1) {
|
||
|
e += VP8BitCost(d & 1, b[i])
|
||
|
}
|
||
|
d >>= 1;
|
||
|
c >>= 1
|
||
|
}
|
||
|
return e
|
||
|
}
|
||
|
|
||
|
function VP8CalculateLevelCosts(a) {
|
||
|
var b, band, ctx;
|
||
|
for (b = 0; b < NUM_TYPES; ++b) {
|
||
|
for (band = 0; band < NUM_BANDS; ++band) {
|
||
|
for (ctx = 0; ctx < NUM_CTX; ++ctx) {
|
||
|
var p = a.coeffs_[b][band][ctx];
|
||
|
var c = a.level_cost_[b][band][ctx];
|
||
|
var d = VP8BitCost(1, p[1]);
|
||
|
var v;
|
||
|
c[0] = VP8BitCost(0, p[1]);
|
||
|
for (v = 1; v <= MAX_VARIABLE_LEVEL; ++v) {
|
||
|
c[v] = d + VariableLevelCost(v, p)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
var cs = new Array(302, 984, 439, 642);
|
||
|
var ct = new Array(663, 919, 872, 919);
|
||
|
var cu = new Array(new Array(new Array(251, 1362, 1934, 2085, 2314, 2230, 1839, 1988, 2437, 2348), new Array(403, 680, 1507, 1519, 2060, 2005, 1992, 1914, 1924, 1733), new Array(353, 1121, 973, 1895, 2060, 1787, 1671, 1516, 2012, 1868), new Array(770, 852, 1581, 632, 1393, 1780, 1823, 1936, 1074, 1218), new Array(510, 1270, 1467, 1319, 847, 1279, 1792, 2094, 1080, 1353), new Array(488, 1322, 918, 1573, 1300, 883, 1814, 1752, 1756, 1502), new Array(425, 992, 1820, 1514, 1843, 2440, 937, 1771, 1924, 1129), new Array(363, 1248, 1257, 1970, 2194, 2385, 1569, 953, 1951, 1601), new Array(723, 1257, 1631, 964, 963, 1508, 1697, 1824, 671, 1418), new Array(635, 1038, 1573, 930, 1673, 1413, 1410, 1687, 1410, 749)), new Array(new Array(451, 613, 1345, 1702, 1870, 1716, 1728, 1766, 2190, 2310), new Array(678, 453, 1171, 1443, 1925, 1831, 2045, 1781, 1887, 1602), new Array(711, 666, 674, 1718, 1910, 1493, 1775, 1193, 2325, 2325), new Array(883, 854, 1583, 542, 1800, 1878, 1664, 2149, 1207, 1087), new Array(669, 994, 1248, 1122, 949, 1179, 1376, 1729, 1070, 1244), new Array(715, 1026, 715, 1350, 1430, 930, 1717, 1296, 1479, 1479), new Array(544, 841, 1656, 1450, 2094, 3883, 1010, 1759, 2076, 809), new Array(610, 855, 957, 1553, 2067, 1561, 1704, 824, 2066, 1226), new Array(833, 960, 1416, 819, 1277, 1619, 1501, 1617, 757, 1182), new Array(711, 964, 1252, 879, 1441, 1828, 1508, 1636, 1594, 734)), new Array(new Array(605, 764, 734, 1713, 1747, 1192, 1819, 1353, 1877, 2392), new Array(866, 641, 586, 1622, 2072, 1431, 1888, 1346, 2189, 1764), new Array(901, 851, 456, 2165, 2281, 1405, 1739, 1193, 2183, 2443), new Array(770, 1045, 952, 1078, 1342, 1191, 1436, 1063, 1303, 995), new Array(901, 1086, 727, 1170, 884, 1105, 1267, 1401, 1739, 1337), new Array(951, 1162, 595, 1488, 1388, 703, 1790, 1366, 2057, 1724), new Array(534, 986, 1273, 1987, 3273, 1485, 1024, 1399, 1583, 866), new Array(699, 1182, 695, 1978, 1726, 1986, 1326, 714, 1750, 1672), new Array(951, 1217, 1209, 920, 1062, 1441, 1548, 999, 952, 932), new Array(733, 1284, 784, 1256, 1557, 1098, 1257, 1357, 1414, 908)), new Array(new Array(316, 1075, 1653, 1220, 2145, 2051, 1730, 2131, 1884, 1790), new Array(745, 516, 1404, 894, 1599, 2375, 2013, 2105, 1475, 1381), new Array(516, 729, 1088, 1319, 1637, 3426, 1636, 1275, 1531, 1453), new Array(894, 943, 2138, 468, 1704, 2259, 2069, 1763, 1266, 1158), new Array(605, 1025, 1235, 871, 1170, 1767, 1493, 1500, 1104, 1258), new Array(739, 826, 1207, 1151, 1412, 846, 1305, 2726, 1014, 1569), new Array(558, 825, 1820, 1398, 3344, 1556, 1218, 1550, 1228, 878), new Array(429, 951, 1089, 1816, 3861, 3861, 1556, 969, 1568, 1828), new Array(883, 961, 1752, 769, 1468, 1810, 2081, 2346, 613, 1298), new Array(803, 895, 1372, 641, 1303, 1708, 1686, 1700, 1306, 1033)), new Array(new Array(439, 1267, 1270, 1579, 963, 1193, 1723, 1729, 1198, 1993), new Array(705, 725, 1029, 1153, 1176, 1103, 1821, 1567, 1259, 1574), new Array(723, 859, 802, 1253, 972, 1202, 1407, 1665, 1520, 1674), new Array(894, 960, 1254, 887, 1052, 1607, 1344, 1349, 865, 1150), new Array(833, 1312, 1337, 1205, 572, 1288, 1414, 1529, 1088, 1430), new Array(842, 1279, 1068, 1861, 862, 688, 1861, 1630, 1039, 1381), new Array(766, 938, 1279, 1546, 3338, 1550, 1031, 1542, 1288, 640), new Array(715, 1090, 835, 1609, 1100, 1100, 1603, 1019, 1102, 1617), new Array(894, 1813, 1500, 1188, 789, 1194, 1491, 1919, 617, 1333), new Array(610, 1076, 1644, 1281, 1283, 975, 1179, 1688, 1434, 889)), new Array(new Array(544, 971, 1146, 1849, 1221, 740, 1857, 1621, 1683, 2430), new Array(723, 705, 961, 1371, 1426, 821, 2081, 2079, 1839, 1380), new Array(783, 857, 703, 2145, 1419, 814, 1791, 1310, 1609, 2206), new Array(997, 1000, 1153, 792, 1229, 1162, 1810, 1418, 942, 979), new Array(901, 1226, 883, 1289, 793, 715, 1904, 1649, 1319, 3108), new Array(979, 1478, 782, 2216, 1454, 455, 3092, 1591, 1997, 1664), new Array(663, 1110, 1504, 1114, 1522, 3311, 676, 1522, 1530, 1024), new Array(605, 1138, 1153, 1314, 1569, 1315, 1157, 804, 1574, 1320), new Array(770, 1216, 1218, 1227, 869, 1384, 1232, 1375, 83
|
||
|
var cv = {
|
||
|
first: int,
|
||
|
last: int,
|
||
|
coeffs: int16_t,
|
||
|
coeffs_off: 0,
|
||
|
coeff_type: int,
|
||
|
prob: newObjectIt(bJ),
|
||
|
stats: newObjectIt(bK),
|
||
|
cost: newObjectIt(bL)
|
||
|
};
|
||
|
var cw = new Array(0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 0);
|
||
|
var cx = new Array(173, 148, 140);
|
||
|
var cy = new Array(176, 155, 140, 135);
|
||
|
var cz = new Array(180, 157, 141, 134, 130);
|
||
|
var cA = new Array(254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129);
|
||
|
|
||
|
function ResetStats(a, b) {
|
||
|
var c = a.proba_;
|
||
|
if (b) VP8CalculateLevelCosts(c);
|
||
|
c.nb_skip_ = 0
|
||
|
}
|
||
|
|
||
|
function CalcSkipProba(a, b) {
|
||
|
return parseInt(b ? (b - a) * 255 / b : 255)
|
||
|
}
|
||
|
|
||
|
function FinalizeSkipProba(a) {
|
||
|
var b = a.proba_;
|
||
|
var c = a.mb_w_ * a.mb_h_;
|
||
|
var d = b.nb_skip_;
|
||
|
var e = int;
|
||
|
b.skip_proba_ = CalcSkipProba(d, c);
|
||
|
b.use_skip_proba_ = (b.skip_proba_ < 250) + 0;
|
||
|
e = 256;
|
||
|
if (b.use_skip_proba_) {
|
||
|
e += d * VP8BitCost(1, b.skip_proba_) + (c - d) * VP8BitCost(0, b.skip_proba_);
|
||
|
e += 8 * 256
|
||
|
}
|
||
|
return e
|
||
|
}
|
||
|
|
||
|
function ResetTokenStats(a) {
|
||
|
var b = a.proba_;
|
||
|
b.stats = newObjectIt(bK)
|
||
|
}
|
||
|
|
||
|
function Record(a, b) {
|
||
|
b[0] += parseInt(a + 0);
|
||
|
b[1] += 1;
|
||
|
return a
|
||
|
}
|
||
|
|
||
|
function RecordCoeffs(a, b) {
|
||
|
var n = b.first;
|
||
|
var s = b.stats[cw[n]][a];
|
||
|
if (!Record(b.last >= 0, s[0])) {
|
||
|
return 0
|
||
|
}
|
||
|
while (1) {
|
||
|
var v = b.coeffs[n++];
|
||
|
if (!Record(v != 0, s[1])) {
|
||
|
s = b.stats[cw[n]][0];
|
||
|
continue
|
||
|
}
|
||
|
if (!Record(2 < (v + 1), s[2])) {
|
||
|
s = b.stats[cw[n]][1]
|
||
|
} else {
|
||
|
v = Math.abs(v);
|
||
|
if (v > MAX_VARIABLE_LEVEL) v = MAX_VARIABLE_LEVEL; {
|
||
|
var c = cq[v - 1][1];
|
||
|
var d = cq[v - 1][0];
|
||
|
var i;
|
||
|
for (i = 0;
|
||
|
(d >>= 1) != 0; ++i) {
|
||
|
var e = 2 << i;
|
||
|
if (d & 1) Record(!!(c & e), s[3 + i])
|
||
|
}
|
||
|
}
|
||
|
s = b.stats[cw[n]][2]
|
||
|
}
|
||
|
if (n == 16 || !Record(n <= b.last, s[0])) {
|
||
|
return 1
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function CalcTokenProba(a, b) {
|
||
|
return a ? parseInt(((b - a) * 255 + b / 2) / b) : 255
|
||
|
}
|
||
|
|
||
|
function FinalizeTokenProbas(a) {
|
||
|
var d = a.proba_;
|
||
|
var e = 0;
|
||
|
var t, b, c, p;
|
||
|
for (t = 0; t < NUM_TYPES; ++t) {
|
||
|
for (b = 0; b < NUM_BANDS; ++b) {
|
||
|
for (c = 0; c < NUM_CTX; ++c) {
|
||
|
for (p = 0; p < NUM_PROBAS; ++p) {
|
||
|
var f = d.stats_[t][b][c][p];
|
||
|
var g = dz[t][b][c][p];
|
||
|
var h = dw[t][b][c][p];
|
||
|
var i = CalcTokenProba(f[0], f[1]);
|
||
|
var j = VP8BranchCost(f[0], f[1], h) + VP8BitCost(0, g);
|
||
|
var k = VP8BranchCost(f[0], f[1], i) + VP8BitCost(1, g) + 8 * 256;
|
||
|
var l = (j > k) + 0;
|
||
|
e += VP8BitCost(l, g);
|
||
|
if (l) {
|
||
|
d.coeffs_[t][b][c][p] = i;
|
||
|
e += 8 * 256
|
||
|
} else {
|
||
|
d.coeffs_[t][b][c][p] = h
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return e
|
||
|
}
|
||
|
|
||
|
function InitResidual(a, b, c, d) {
|
||
|
d.coeff_type = b;
|
||
|
d.prob = c.proba_.coeffs_[b];
|
||
|
d.stats = c.proba_.stats_[b];
|
||
|
d.cost = c.proba_.level_cost_[b];
|
||
|
d.first = a
|
||
|
}
|
||
|
|
||
|
function SetResidualCoeffs(a, b) {
|
||
|
var n;
|
||
|
b.last = -1;
|
||
|
for (n = 15; n >= b.first; --n) {
|
||
|
if (a[n]) {
|
||
|
b.last = n;
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
b.coeffs = a
|
||
|
}
|
||
|
|
||
|
function GetResidualCost(a, b) {
|
||
|
var n = b.first;
|
||
|
var p = b.prob[cw[n]][a];
|
||
|
var t = b.cost[cw[n]][a];
|
||
|
var c = int;
|
||
|
c = VP8BitCost(b.last >= 0, p[0]);
|
||
|
if (b.last < 0) {
|
||
|
return c
|
||
|
}
|
||
|
while (n <= b.last) {
|
||
|
var v = b.coeffs[n++];
|
||
|
if (v == 0) {
|
||
|
p = b.prob[cw[n]][0];
|
||
|
t = b.cost[cw[n]][0];
|
||
|
continue
|
||
|
} else if (2 >= (v + 1)) {
|
||
|
c += VP8LevelCost(t, 1);
|
||
|
p = b.prob[cw[n]][1];
|
||
|
t = b.cost[cw[n]][1]
|
||
|
} else {
|
||
|
c += VP8LevelCost(t, Math.abs(v));
|
||
|
p = b.prob[cw[n]][2];
|
||
|
t = b.cost[cw[n]][2]
|
||
|
}
|
||
|
if (n < 16) {
|
||
|
c += VP8BitCost(n <= b.last, p[0])
|
||
|
}
|
||
|
}
|
||
|
return c
|
||
|
}
|
||
|
var cB = newObjectIt(cv);
|
||
|
|
||
|
function VP8GetCostLuma4(a, b) {
|
||
|
var x = (a.i4_ & 3) + 0,
|
||
|
y = (a.i4_ >> 2) + 0;
|
||
|
var c = (cB);
|
||
|
var R = 0;
|
||
|
var d = int;
|
||
|
InitResidual(0, 3, a.enc_, c);
|
||
|
d = a.top_nz_[x] + a.left_nz_[y];
|
||
|
SetResidualCoeffs(b, c);
|
||
|
R += GetResidualCost(d, c);
|
||
|
return R
|
||
|
}
|
||
|
var cC = newObjectIt(cv);
|
||
|
|
||
|
function VP8GetCostLuma16(a, b) {
|
||
|
var c = (cC);
|
||
|
var x, y = int;
|
||
|
var R = 0;
|
||
|
VP8IteratorNzToBytes(a);
|
||
|
InitResidual(0, 1, a.enc_, c);
|
||
|
SetResidualCoeffs(b.y_dc_levels, c);
|
||
|
R += GetResidualCost(a.top_nz_[8] + a.left_nz_[8], c);
|
||
|
InitResidual(1, 0, a.enc_, c);
|
||
|
for (y = 0; y < 4; ++y) {
|
||
|
for (x = 0; x < 4; ++x) {
|
||
|
var d = a.top_nz_[x] + a.left_nz_[y];
|
||
|
SetResidualCoeffs(b.y_ac_levels[x + y * 4], c);
|
||
|
R += GetResidualCost(d, c);
|
||
|
a.top_nz_[x] = a.left_nz_[y] = (c.last >= 0) + 0
|
||
|
}
|
||
|
}
|
||
|
return R
|
||
|
}
|
||
|
var cD = newObjectIt(cv);
|
||
|
|
||
|
function VP8GetCostUV(a, b) {
|
||
|
var c = (cD);
|
||
|
var d, x, y;
|
||
|
var R = 0;
|
||
|
VP8IteratorNzToBytes(a);
|
||
|
InitResidual(0, 2, a.enc_, c);
|
||
|
for (d = 0; d <= 2; d += 2) {
|
||
|
for (y = 0; y < 2; ++y) {
|
||
|
for (x = 0; x < 2; ++x) {
|
||
|
var e = a.top_nz_[4 + d + x] + a.left_nz_[4 + d + y];
|
||
|
SetResidualCoeffs(b.uv_levels[d * 2 + x + y * 2], c);
|
||
|
R += GetResidualCost(e, c);
|
||
|
a.top_nz_[4 + d + x] = a.left_nz_[4 + d + y] = (c.last >= 0) + 0
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return R
|
||
|
}
|
||
|
|
||
|
function PutCoeffs(a, b, d) {
|
||
|
var n = d.first;
|
||
|
var p = d.prob[cw[n]][b];
|
||
|
if (!VP8PutBit(a, d.last >= 0, p[0])) {
|
||
|
return 0
|
||
|
}
|
||
|
while (n < 16) {
|
||
|
var c = d.coeffs[n++];
|
||
|
var e = (c < 0) + 0;
|
||
|
var v = e ? -c : c;
|
||
|
if (!VP8PutBit(a, v != 0, p[1])) {
|
||
|
p = d.prob[cw[n]][0];
|
||
|
continue
|
||
|
}
|
||
|
if (!VP8PutBit(a, v > 1, p[2])) {
|
||
|
p = d.prob[cw[n]][1]
|
||
|
} else {
|
||
|
if (!VP8PutBit(a, v > 4, p[3])) {
|
||
|
if (VP8PutBit(a, v != 2, p[4])) VP8PutBit(a, v == 4, p[5])
|
||
|
} else if (!VP8PutBit(a, v > 10, p[6])) {
|
||
|
if (!VP8PutBit(a, v > 6, p[7])) {
|
||
|
VP8PutBit(a, v == 6, 159)
|
||
|
} else {
|
||
|
VP8PutBit(a, v >= 9, 165);
|
||
|
VP8PutBit(a, !(v & 1), 145)
|
||
|
}
|
||
|
} else {
|
||
|
var f = int;
|
||
|
var g;
|
||
|
var h = 0;
|
||
|
if (v < 3 + (8 << 1)) {
|
||
|
VP8PutBit(a, 0, p[8]);
|
||
|
VP8PutBit(a, 0, p[9]);
|
||
|
v -= 3 + (8 << 0);
|
||
|
f = 1 << 2;
|
||
|
g = cx;
|
||
|
h = 0
|
||
|
} else if (v < 3 + (8 << 2)) {
|
||
|
VP8PutBit(a, 0, p[8]);
|
||
|
VP8PutBit(a, 1, p[9]);
|
||
|
v -= 3 + (8 << 1);
|
||
|
f = 1 << 3;
|
||
|
g = cy;
|
||
|
h = 0
|
||
|
} else if (v < 3 + (8 << 3)) {
|
||
|
VP8PutBit(a, 1, p[8]);
|
||
|
VP8PutBit(a, 0, p[10]);
|
||
|
v -= 3 + (8 << 2);
|
||
|
f = 1 << 4;
|
||
|
g = cz;
|
||
|
h = 0
|
||
|
} else {
|
||
|
VP8PutBit(a, 1, p[8]);
|
||
|
VP8PutBit(a, 1, p[10]);
|
||
|
v -= 3 + (8 << 3);
|
||
|
f = 1 << 10;
|
||
|
g = cA;
|
||
|
h = 0
|
||
|
}
|
||
|
while (f) {
|
||
|
VP8PutBit(a, !!(v & f), g[h++]);
|
||
|
f >>= 1
|
||
|
}
|
||
|
}
|
||
|
p = d.prob[cw[n]][2]
|
||
|
}
|
||
|
VP8PutBitUniform(a, e);
|
||
|
if (n == 16 || !VP8PutBit(a, n <= d.last, p[0])) {
|
||
|
return 1
|
||
|
}
|
||
|
}
|
||
|
return 1
|
||
|
}
|
||
|
var cE = newObjectIt(cv);
|
||
|
|
||
|
function CodeResiduals(a, b, c) {
|
||
|
var x, y, ch;
|
||
|
var d = (cE);
|
||
|
var e = uint64_t,
|
||
|
pos2 = uint64_t,
|
||
|
pos3 = uint64_t;
|
||
|
var f = (b.mb_[b.mb_off].type_ == 1) + 0;
|
||
|
var g = b.mb_[b.mb_off].segment_;
|
||
|
VP8IteratorNzToBytes(b);
|
||
|
e = VP8BitWriterPos(a);
|
||
|
if (f) {
|
||
|
InitResidual(0, 1, b.enc_, d);
|
||
|
SetResidualCoeffs(c.y_dc_levels, d);
|
||
|
b.top_nz_[8] = b.left_nz_[8] = PutCoeffs(a, b.top_nz_[8] + b.left_nz_[8], d);
|
||
|
InitResidual(1, 0, b.enc_, d)
|
||
|
} else {
|
||
|
InitResidual(0, 3, b.enc_, d)
|
||
|
}
|
||
|
for (y = 0; y < 4; ++y) {
|
||
|
for (x = 0; x < 4; ++x) {
|
||
|
var h = b.top_nz_[x] + b.left_nz_[y];
|
||
|
SetResidualCoeffs(c.y_ac_levels[x + y * 4], d);
|
||
|
b.top_nz_[x] = b.left_nz_[y] = PutCoeffs(a, h, d)
|
||
|
}
|
||
|
}
|
||
|
pos2 = VP8BitWriterPos(a);
|
||
|
InitResidual(0, 2, b.enc_, d);
|
||
|
for (ch = 0; ch <= 2; ch += 2) {
|
||
|
for (y = 0; y < 2; ++y) {
|
||
|
for (x = 0; x < 2; ++x) {
|
||
|
var h = b.top_nz_[4 + ch + x] + b.left_nz_[4 + ch + y];
|
||
|
SetResidualCoeffs(c.uv_levels[ch * 2 + x + y * 2], d);
|
||
|
b.top_nz_[4 + ch + x] = b.left_nz_[4 + ch + y] = PutCoeffs(a, h, d)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
pos3 = VP8BitWriterPos(a);
|
||
|
b.luma_bits_ = pos2 - e;
|
||
|
b.uv_bits_ = pos3 - pos2;
|
||
|
b.bit_count_[g][f] += b.luma_bits_;
|
||
|
b.bit_count_[g][2] += b.uv_bits_;
|
||
|
VP8IteratorBytesToNz(b)
|
||
|
}
|
||
|
var cF = newObjectIt(cv);
|
||
|
|
||
|
function RecordResiduals(a, b) {
|
||
|
var x, y, ch;
|
||
|
var c = (cF);
|
||
|
VP8IteratorNzToBytes(a);
|
||
|
if (a.mb_[a.mb_off].type_ == 1) {
|
||
|
InitResidual(0, 1, a.enc_, c);
|
||
|
SetResidualCoeffs(b.y_dc_levels, c);
|
||
|
a.top_nz_[8] = a.left_nz_[8] = RecordCoeffs(a.top_nz_[8] + a.left_nz_[8], c);
|
||
|
InitResidual(1, 0, a.enc_, c)
|
||
|
} else {
|
||
|
InitResidual(0, 3, a.enc_, c)
|
||
|
}
|
||
|
for (y = 0; y < 4; ++y) {
|
||
|
for (x = 0; x < 4; ++x) {
|
||
|
var d = a.top_nz_[x] + a.left_nz_[y];
|
||
|
SetResidualCoeffs(b.y_ac_levels[x + y * 4], c);
|
||
|
a.top_nz_[x] = a.left_nz_[y] = RecordCoeffs(d, c)
|
||
|
}
|
||
|
}
|
||
|
InitResidual(0, 2, a.enc_, c);
|
||
|
for (ch = 0; ch <= 2; ch += 2) {
|
||
|
for (y = 0; y < 2; ++y) {
|
||
|
for (x = 0; x < 2; ++x) {
|
||
|
var d = a.top_nz_[4 + ch + x] + a.left_nz_[4 + ch + y];
|
||
|
SetResidualCoeffs(b.uv_levels[ch * 2 + x + y * 2], c);
|
||
|
a.top_nz_[4 + ch + x] = a.left_nz_[4 + ch + y] = RecordCoeffs(d, c)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
VP8IteratorBytesToNz(a)
|
||
|
}
|
||
|
|
||
|
function ResetSSE(a) {
|
||
|
memset_(a.sse_, 0, 0, sizeof(a.sse_) * 3);
|
||
|
a.sse_count_ = 0
|
||
|
}
|
||
|
|
||
|
function StoreSSE(a) {
|
||
|
var b = a.enc_;
|
||
|
var c = a.yuv_in_;
|
||
|
var d = a.yuv_in_off;
|
||
|
var e = a.yuv_out_;
|
||
|
var f = a.yuv_out_off;
|
||
|
b.sse_[0] += dM(c, d + bk, e, f + bk);
|
||
|
b.sse_[1] += dN(c, d + bl, e, f + bl);
|
||
|
b.sse_[2] += dN(c, d + bm, e, f + bm);
|
||
|
b.sse_count_ += 16 * 16
|
||
|
}
|
||
|
|
||
|
function StoreSideInfo(a) {
|
||
|
var c = a.enc_;
|
||
|
var d = a.mb_[a.mb_off];
|
||
|
var e = c.pic_;
|
||
|
if (e.stats_nozero) {
|
||
|
StoreSSE(a);
|
||
|
c.block_count_[0] += (d.type_ == 0) + 0;
|
||
|
c.block_count_[1] += (d.type_ == 1) + 0;
|
||
|
c.block_count_[2] += (d.skip_ != 0) + 0
|
||
|
}
|
||
|
if (e.extra_info) {
|
||
|
switch (e.extra_info_type) {
|
||
|
case 1:
|
||
|
e.extra_info[a.x_ + a.y_ * c.mb_w_] = d.type_;
|
||
|
break;
|
||
|
case 2:
|
||
|
e.extra_info[a.x_ + a.y_ * c.mb_w_] = d.segment_;
|
||
|
break;
|
||
|
case 3:
|
||
|
e.extra_info[a.x_ + a.y_ * c.mb_w_] = c.dqm_[d.segment_].quant_;
|
||
|
break;
|
||
|
case 4:
|
||
|
e.extra_info[a.x_ + a.y_ * c.mb_w_] = (d.type_ == 1) ? a.preds_[a.preds_off + 0] : 0xff;
|
||
|
break;
|
||
|
case 5:
|
||
|
e.extra_info[a.x_ + a.y_ * c.mb_w_] = d.uv_mode_;
|
||
|
break;
|
||
|
case 6:
|
||
|
{
|
||
|
var b = parseInt((a.luma_bits_ + a.uv_bits_ + 7) >> 3);
|
||
|
e.extra_info[a.x_ + a.y_ * c.mb_w_] = (b > 255) ? 255 : b;
|
||
|
break
|
||
|
}
|
||
|
default:
|
||
|
info = 0;
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function ResetAfterSkip(a) {
|
||
|
if (a.mb_[a.mb_off].type_ == 1) {
|
||
|
a.nz_[a.nz_off] = 0;
|
||
|
a.left_nz_[8] = 0
|
||
|
} else {
|
||
|
a.nz_[a.nz_off] &= (1 << 24)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function VP8EncLoop(a) {
|
||
|
var i, s, p;
|
||
|
var b = newObjectIt(bV);
|
||
|
var c = newObjectIt(bU);
|
||
|
var d = (!a.proba_.use_skip_proba_) + 0;
|
||
|
var e = a.rd_opt_level_;
|
||
|
var f = 5;
|
||
|
var g = parseInt(a.mb_w_ * a.mb_h_ * f / a.num_parts_);
|
||
|
for (p = 0; p < a.num_parts_; ++p) {
|
||
|
VP8BitWriterInit(a.parts_[+p], g)
|
||
|
}
|
||
|
ResetStats(a, (e != 0));
|
||
|
ResetSSE(a);
|
||
|
VP8IteratorInit(a, b);
|
||
|
VP8InitFilter(b);
|
||
|
do {
|
||
|
VP8IteratorImport(b);
|
||
|
if (!VP8Decimate(b, c, e) || (!a.proba_.use_skip_proba_)) {
|
||
|
CodeResiduals(b.bw_, b, c)
|
||
|
} else {
|
||
|
ResetAfterSkip(b)
|
||
|
}
|
||
|
if (a.has_alpha_) {
|
||
|
VP8EncCodeAlphaBlock(b)
|
||
|
}
|
||
|
if (a.use_layer_) {
|
||
|
VP8EncCodeLayerBlock(b)
|
||
|
}
|
||
|
StoreSideInfo(b);
|
||
|
VP8StoreFilterStats(b);
|
||
|
VP8IteratorExport(b)
|
||
|
} while (VP8IteratorNext(b, b.yuv_out_, b.yuv_out_off));
|
||
|
VP8AdjustFilterStrength(b);
|
||
|
for (p = 0; p < a.num_parts_; ++p) {
|
||
|
VP8BitWriterFinish(a.parts_[+p])
|
||
|
}
|
||
|
if (a.pic_.stats_nozero) {
|
||
|
for (i = 0; i <= 2; ++i) {
|
||
|
for (s = 0; s < be; ++s) {
|
||
|
a.residual_bytes_[i][s] = parseInt((b.bit_count_[s][i] + 7) >> 3)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return 1
|
||
|
}
|
||
|
var cG = (15 + 20 + 10);
|
||
|
|
||
|
function OneStatPass(a, q, b, c, d) {
|
||
|
var e = newObjectIt(bV);
|
||
|
var f = 0;
|
||
|
var g = 0;
|
||
|
var h = c * 384;
|
||
|
if (q < 0.) {
|
||
|
q = 0
|
||
|
} else if (q > 100.) {
|
||
|
q = 100
|
||
|
}
|
||
|
VP8SetSegmentParams(a, q);
|
||
|
ResetStats(a, b != 0);
|
||
|
ResetTokenStats(a);
|
||
|
VP8IteratorInit(a, e);
|
||
|
var i = newObjectIt(bU);
|
||
|
do {
|
||
|
var j = (i);
|
||
|
VP8IteratorImport(e);
|
||
|
if (VP8Decimate(e, j, b)) {
|
||
|
a.proba_.nb_skip_++
|
||
|
}
|
||
|
RecordResiduals(e, j);
|
||
|
f += j.R;
|
||
|
g += j.D
|
||
|
} while (VP8IteratorNext(e, e.yuv_out_, e.yuv_out_off) && --c > 0);
|
||
|
f += FinalizeSkipProba(a);
|
||
|
f += FinalizeTokenProbas(a);
|
||
|
f += a.segment_hdr_.size_;
|
||
|
f = ((f + 1024) >> 11) + cG;
|
||
|
if (d) {
|
||
|
d.f = parseFloat(10. * (Math.LOG10E * Math.log(255. * 255. * h / g)))
|
||
|
}
|
||
|
return parseInt(f)
|
||
|
}
|
||
|
var cH = new Array(20, 15, 10, 8, 6, 4, 2, 1, 0);
|
||
|
|
||
|
function VP8StatLoop(a) {
|
||
|
var b = (a.config_.target_size > 0 || a.config_.target_PSNR > 0) + 0;
|
||
|
var c = (a.method_ < 2 && !b) + 0;
|
||
|
var q = parseFloat(a.config_.quality);
|
||
|
var d = int;
|
||
|
var e = int;
|
||
|
e = a.mb_w_ * a.mb_h_;
|
||
|
if (c && e > 100) e = 100;
|
||
|
if (!b) {
|
||
|
for (d = 0; d < a.config_.pass; ++d) {
|
||
|
var f = (a.method_ > 2) + 0;
|
||
|
OneStatPass(a, q, f, e, null)
|
||
|
}
|
||
|
return 1
|
||
|
}
|
||
|
for (d = 0; d < a.config_.pass && (cH[d] > 0); ++d) {
|
||
|
var f = 1;
|
||
|
var g = {
|
||
|
f: float
|
||
|
};
|
||
|
var h = int;
|
||
|
var i = OneStatPass(a, q, f, e, g);
|
||
|
if (a.config_.target_PSNR > 0) {
|
||
|
h = (g.f < a.config_.target_PSNR)
|
||
|
} else {
|
||
|
h = (i < a.config_.target_size)
|
||
|
}
|
||
|
if (h) {
|
||
|
q += cH[d]
|
||
|
} else {
|
||
|
q -= cH[d]
|
||
|
}
|
||
|
}
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function InitLeft(a) {
|
||
|
var b = a.enc_;
|
||
|
b.y_left_[b.y_left_off - 1] = b.u_left_[b.u_left_off - 1] = b.v_left_[b.v_left_off - 1] = (a.y_) > 0 ? 129 : 127;
|
||
|
memset_(b.y_left_, b.y_left_off + 0, 129, 16);
|
||
|
memset_(b.u_left_, b.u_left_off + 0, 129, 8);
|
||
|
memset_(b.v_left_, b.v_left_off + 0, 129, 8);
|
||
|
a.left_nz_[8] = 0
|
||
|
}
|
||
|
|
||
|
function InitTop(a) {
|
||
|
var b = a.enc_;
|
||
|
var c = b.mb_w_ * 16;
|
||
|
memset_(b.y_top_, 0, 127, 2 * c);
|
||
|
memset_(b.nz_, b.nz_off + 0, 0, b.mb_w_ * sizeof(b.nz_))
|
||
|
}
|
||
|
|
||
|
function VP8IteratorReset(a) {
|
||
|
var b = a.enc_;
|
||
|
a.x_ = 0;
|
||
|
a.y_ = 0;
|
||
|
a.y_offset_ = 0;
|
||
|
a.uv_offset_ = 0;
|
||
|
a.mb_ = b.mb_info_;
|
||
|
a.mb_off = b.mb_info_off;
|
||
|
a.preds_ = b.preds_;
|
||
|
a.preds_off = b.preds_off;
|
||
|
a.nz_ = b.nz_;
|
||
|
a.nz_off = b.nz_off;
|
||
|
a.bw_ = b.parts_[0];
|
||
|
a.done_ = b.mb_w_ * b.mb_h_;
|
||
|
InitTop(a);
|
||
|
InitLeft(a);
|
||
|
a.bit_count_ = ArrM(Array(4, 3), 0);
|
||
|
a.do_trellis_ = 0
|
||
|
}
|
||
|
|
||
|
function VP8IteratorInit(a, b) {
|
||
|
b.enc_ = a;
|
||
|
b.y_stride_ = a.pic_.y_stride;
|
||
|
b.uv_stride_ = a.pic_.uv_stride;
|
||
|
b.yuv_in_ = a.yuv_in_;
|
||
|
b.yuv_out_ = a.yuv_out_;
|
||
|
b.yuv_out2_ = a.yuv_out2_;
|
||
|
b.yuv_p_ = a.yuv_p_;
|
||
|
b.lf_stats_ = a.lf_stats_;
|
||
|
VP8IteratorReset(b)
|
||
|
}
|
||
|
|
||
|
function VP8IteratorImport(a) {
|
||
|
var b = a.enc_;
|
||
|
var x = a.x_,
|
||
|
y = a.y_;
|
||
|
var c = b.pic_;
|
||
|
var d = c.y;
|
||
|
var e = c.y_off + (y * c.y_stride + x) * 16;
|
||
|
var f = c.u;
|
||
|
var g = c.u_off + (y * c.uv_stride + x) * 8;
|
||
|
var j = c.v;
|
||
|
var k = c.v_off + (y * c.uv_stride + x) * 8;
|
||
|
var l = a.yuv_in_;
|
||
|
var m = a.yuv_in_off + bk;
|
||
|
var n = a.yuv_in_;
|
||
|
var o = a.yuv_in_off + bl;
|
||
|
var p = a.yuv_in_;
|
||
|
var q = a.yuv_in_off + bm;
|
||
|
var w = (c.width - x * 16);
|
||
|
var h = (c.height - y * 16);
|
||
|
var i;
|
||
|
if (w > 16) w = 16;
|
||
|
if (h > 16) h = 16;
|
||
|
for (i = 0; i < h; ++i) {
|
||
|
memcpy(l, m, d, e, w);
|
||
|
if (w < 16) memset_(l, m + w, l[m + w - 1], 16 - w);
|
||
|
m += bf;
|
||
|
e += c.y_stride
|
||
|
}
|
||
|
for (i = h; i < 16; ++i) {
|
||
|
memcpy(l, m, l, m - bf, 16);
|
||
|
m += bf
|
||
|
}
|
||
|
w = parseInt((w + 1) / 2);
|
||
|
h = parseInt((h + 1) / 2);
|
||
|
for (i = 0; i < h; ++i) {
|
||
|
memcpy(n, o, f, g, w);
|
||
|
memcpy(p, q, j, k, w);
|
||
|
if (w < 8) {
|
||
|
memset_(n, o + w, n[o + w - 1], 8 - w);
|
||
|
memset_(p, q + w, p[q + w - 1], 8 - w)
|
||
|
}
|
||
|
o += bf;
|
||
|
q += bf;
|
||
|
g += c.uv_stride;
|
||
|
k += c.uv_stride
|
||
|
}
|
||
|
for (i = h; i < 8; ++i) {
|
||
|
memcpy(n, o, n, o - bf, 8);
|
||
|
memcpy(p, q, p, q - bf, 8);
|
||
|
o += bf;
|
||
|
q += bf
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function VP8IteratorExport(a) {
|
||
|
var b = a.enc_;
|
||
|
if (b.config_.show_compressed) {
|
||
|
var x = a.x_,
|
||
|
y = a.y_;
|
||
|
var c = a.yuv_out_;
|
||
|
var d = a.yuv_out_off + bk;
|
||
|
var e = a.yuv_out_;
|
||
|
var f = a.yuv_out_off + bl;
|
||
|
var g = a.yuv_out_;
|
||
|
var j = a.yuv_out_off + bm;
|
||
|
var k = b.pic_;
|
||
|
var l = k.y;
|
||
|
var m = k.y_off + (y * k.y_stride + x) * 16;
|
||
|
var n = k.u;
|
||
|
var o = k.u_off + (y * k.uv_stride + x) * 8;
|
||
|
var p = k.v;
|
||
|
var q = k.v_off + (y * k.uv_stride + x) * 8;
|
||
|
var w = (k.width - x * 16);
|
||
|
var h = (k.height - y * 16);
|
||
|
var i;
|
||
|
if (w > 16) w = 16;
|
||
|
if (h > 16) h = 16;
|
||
|
for (i = 0; i < h; ++i) {
|
||
|
memcpy(l, m + i * k.y_stride, c, d + i * bf, w)
|
||
|
} {
|
||
|
var r = parseInt((w + 1) / 2);
|
||
|
var s = parseInt((h + 1) / 2);
|
||
|
for (i = 0; i < s; ++i) {
|
||
|
memcpy(n, o + i * k.uv_stride, e, f + i * bf, r);
|
||
|
memcpy(p, q + i * k.uv_stride, g, j + i * bf, r)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function BIT(a, n) {
|
||
|
return (!!((a) & (1 << (n)))) + 0
|
||
|
}
|
||
|
|
||
|
function VP8IteratorNzToBytes(a) {
|
||
|
var b = a.nz_[a.nz_off + 0],
|
||
|
lnz = a.nz_[a.nz_off - 1];
|
||
|
a.top_nz_[0] = BIT(b, 12);
|
||
|
a.top_nz_[1] = BIT(b, 13);
|
||
|
a.top_nz_[2] = BIT(b, 14);
|
||
|
a.top_nz_[3] = BIT(b, 15);
|
||
|
a.top_nz_[4] = BIT(b, 18);
|
||
|
a.top_nz_[5] = BIT(b, 19);
|
||
|
a.top_nz_[6] = BIT(b, 22);
|
||
|
a.top_nz_[7] = BIT(b, 23);
|
||
|
a.top_nz_[8] = BIT(b, 24);
|
||
|
a.left_nz_[0] = BIT(lnz, 3);
|
||
|
a.left_nz_[1] = BIT(lnz, 7);
|
||
|
a.left_nz_[2] = BIT(lnz, 11);
|
||
|
a.left_nz_[3] = BIT(lnz, 15);
|
||
|
a.left_nz_[4] = BIT(lnz, 17);
|
||
|
a.left_nz_[5] = BIT(lnz, 19);
|
||
|
a.left_nz_[6] = BIT(lnz, 21);
|
||
|
a.left_nz_[7] = BIT(lnz, 23)
|
||
|
}
|
||
|
|
||
|
function VP8IteratorBytesToNz(a) {
|
||
|
var b = 0;
|
||
|
b |= (a.top_nz_[0] << 12) | (a.top_nz_[1] << 13);
|
||
|
b |= (a.top_nz_[2] << 14) | (a.top_nz_[3] << 15);
|
||
|
b |= (a.top_nz_[4] << 18) | (a.top_nz_[5] << 19);
|
||
|
b |= (a.top_nz_[6] << 22) | (a.top_nz_[7] << 23);
|
||
|
b |= (a.top_nz_[8] << 24);
|
||
|
b |= (a.left_nz_[0] << 3) | (a.left_nz_[1] << 7);
|
||
|
b |= (a.left_nz_[2] << 11);
|
||
|
b |= (a.left_nz_[4] << 17) | (a.left_nz_[6] << 21);
|
||
|
a.nz_[a.nz_off] = b
|
||
|
}
|
||
|
|
||
|
function VP8IteratorNext(a, b, c) {
|
||
|
var d = a.enc_;
|
||
|
if (b) {
|
||
|
var x = a.x_,
|
||
|
y = a.y_;
|
||
|
var e = b;
|
||
|
var f = c + bk;
|
||
|
var g = b;
|
||
|
var h = c + bl;
|
||
|
if (x < d.mb_w_ - 1) {
|
||
|
var i;
|
||
|
for (i = 0; i < 16; ++i) {
|
||
|
d.y_left_[d.y_left_off + i] = e[f + 15 + i * bf]
|
||
|
}
|
||
|
for (i = 0; i < 8; ++i) {
|
||
|
d.u_left_[d.u_left_off + i] = g[h + 7 + i * bf];
|
||
|
d.v_left_[d.v_left_off + i] = g[h + 15 + i * bf]
|
||
|
}
|
||
|
d.y_left_[d.y_left_off - 1] = d.y_top_[d.y_top_off + x * 16 + 15];
|
||
|
d.u_left_[d.u_left_off - 1] = d.uv_top_[d.uv_top_off + x * 16 + 0 + 7];
|
||
|
d.v_left_[d.v_left_off - 1] = d.uv_top_[d.uv_top_off + x * 16 + 8 + 7]
|
||
|
}
|
||
|
if (y < d.mb_h_ - 1) {
|
||
|
memcpy(d.y_top_, d.y_top_off + x * 16, e, f + 15 * bf, 16);
|
||
|
memcpy(d.uv_top_, d.uv_top_off + x * 16, g, h + 7 * bf, 8 + 8)
|
||
|
}
|
||
|
}
|
||
|
a.mb_off++;
|
||
|
a.preds_off += 4;
|
||
|
a.nz_off++;
|
||
|
a.x_++;
|
||
|
if (a.x_ == d.mb_w_) {
|
||
|
a.x_ = 0;
|
||
|
a.y_++;
|
||
|
a.bw_ = d.parts_[a.y_ & (d.num_parts_ - 1)];
|
||
|
a.preds_ = d.preds_;
|
||
|
a.preds_off = d.preds_off + a.y_ * 4 * d.preds_w_;
|
||
|
a.nz_ = d.nz_;
|
||
|
a.nz_off = d.nz_off;
|
||
|
InitLeft(a)
|
||
|
}
|
||
|
return (0 < --a.done_)
|
||
|
}
|
||
|
|
||
|
function VP8SetIntra16Mode(a, b) {
|
||
|
var y;
|
||
|
var c = a.preds_;
|
||
|
var d = a.preds_off;
|
||
|
for (y = 0; y < 4; ++y) {
|
||
|
memset_(c, d, b, 4);
|
||
|
d += a.enc_.preds_w_
|
||
|
}
|
||
|
a.mb_[a.mb_off].type_ = 1
|
||
|
}
|
||
|
|
||
|
function VP8SetIntra4Mode(a, b) {
|
||
|
var x, y;
|
||
|
var c = a.preds_;
|
||
|
var d = a.preds_off;
|
||
|
for (y = 0; y < 4; ++y) {
|
||
|
for (x = 0; x < 4; ++x) {
|
||
|
c[d + x] = b[x + y * 4]
|
||
|
}
|
||
|
d += a.enc_.preds_w_
|
||
|
}
|
||
|
a.mb_[a.mb_off].type_ = 0
|
||
|
}
|
||
|
|
||
|
function VP8SetIntraUVMode(a, b) {
|
||
|
a.mb_[a.mb_off].uv_mode_ = b
|
||
|
}
|
||
|
|
||
|
function VP8SetSkip(a, b) {
|
||
|
a.mb_[a.mb_off].skip_ = b
|
||
|
}
|
||
|
|
||
|
function VP8SetSegment(a, b) {
|
||
|
a.mb_[a.mb_off].segment_ = b
|
||
|
}
|
||
|
var cI = new Array(17, 21, 25, 29, 13, 17, 21, 25, 9, 13, 17, 21, 5, 9, 13, 17);
|
||
|
|
||
|
function VP8IteratorStartI4(a) {
|
||
|
var b = a.enc_;
|
||
|
var i;
|
||
|
a.i4_ = 0;
|
||
|
a.i4_top_ = a.i4_boundary_;
|
||
|
a.i4_top_off = +cI[0];
|
||
|
for (i = 0; i < 17; ++i) {
|
||
|
a.i4_boundary_[i] = b.y_left_[b.y_left_off + 15 - i]
|
||
|
}
|
||
|
for (i = 0; i < 16; ++i) {
|
||
|
a.i4_boundary_[17 + i] = b.y_top_[b.y_top_off + a.x_ * 16 + i]
|
||
|
}
|
||
|
if (a.x_ < b.mb_w_ - 1) {
|
||
|
for (i = 16; i < 16 + 4; ++i) {
|
||
|
a.i4_boundary_[17 + i] = b.y_top_[b.y_top_off + a.x_ * 16 + i]
|
||
|
}
|
||
|
} else {
|
||
|
for (i = 16; i < 16 + 4; ++i) {
|
||
|
a.i4_boundary_[17 + i] = a.i4_boundary_[17 + 15]
|
||
|
}
|
||
|
}
|
||
|
VP8IteratorNzToBytes(a)
|
||
|
}
|
||
|
|
||
|
function VP8IteratorRotateI4(a, b, c) {
|
||
|
var d = b;
|
||
|
var e = c + di[a.i4_];
|
||
|
var f = a.i4_top_;
|
||
|
var g = a.i4_top_off;
|
||
|
var i;
|
||
|
for (i = 0; i <= 3; ++i) {
|
||
|
f[g - 4 + i] = d[e + i + 3 * bf]
|
||
|
}
|
||
|
if ((a.i4_ & 3) != 3) {
|
||
|
for (i = 0; i <= 2; ++i) {
|
||
|
f[g + i] = d[e + 3 + (2 - i) * bf]
|
||
|
}
|
||
|
} else {
|
||
|
for (i = 0; i <= 3; ++i) {
|
||
|
f[g + i] = f[g + i + 4]
|
||
|
}
|
||
|
}
|
||
|
a.i4_++;
|
||
|
if (a.i4_ == 16) {
|
||
|
return 0
|
||
|
}
|
||
|
a.i4_top_ = a.i4_boundary_;
|
||
|
a.i4_top_off = +cI[a.i4_];
|
||
|
return 1
|
||
|
}
|
||
|
var bc = 64;
|
||
|
var cJ = 6;
|
||
|
|
||
|
function ClipAlpha(a) {
|
||
|
return a < 0 ? 0 : a > 255 ? 255 : a
|
||
|
}
|
||
|
|
||
|
function SmoothSegmentMap(a) {
|
||
|
var n, x, y = int;
|
||
|
var b = 0;
|
||
|
var w = a.mb_w_;
|
||
|
var h = a.mb_h_;
|
||
|
var c = 5;
|
||
|
var d = malloc(w * h * sizeof(uint8_t), uint8_t);
|
||
|
var e = a.mb_info_;
|
||
|
if (d == null) return;
|
||
|
for (y = 1; y < h - 1; ++y) {
|
||
|
for (x = 1; x < w - 1; ++x) {
|
||
|
var f = Arr(be, 0);
|
||
|
b = (x + w * y);
|
||
|
var g = e[b].segment_;
|
||
|
f[e[b - w - 1].segment_]++;
|
||
|
f[e[b - w + 0].segment_]++;
|
||
|
f[e[b - w + 1].segment_]++;
|
||
|
f[e[b - 1].segment_]++;
|
||
|
f[e[b + 1].segment_]++;
|
||
|
f[e[b + w - 1].segment_]++;
|
||
|
f[e[b + w + 0].segment_]++;
|
||
|
f[e[b + w + 1].segment_]++;
|
||
|
for (n = 0; n < be; ++n) {
|
||
|
if (f[n] >= c) {
|
||
|
e[b].segment_ = n
|
||
|
}
|
||
|
}
|
||
|
d[x + y * w] = g
|
||
|
}
|
||
|
}
|
||
|
for (y = 1; y < h - 1; ++y) {
|
||
|
for (x = 1; x < w - 1; ++x) {
|
||
|
var e = a.mb_info_[x + w * y];
|
||
|
e.segment_ = d[x + y * w]
|
||
|
}
|
||
|
}
|
||
|
d = ''
|
||
|
}
|
||
|
|
||
|
function GetProba(a, b) {
|
||
|
var c = int;
|
||
|
var d = a + b;
|
||
|
if (d == 0) return 255;
|
||
|
c = parseInt((255 * a + d / 2) / d);
|
||
|
return c
|
||
|
}
|
||
|
|
||
|
function SetSegmentProbas(a) {
|
||
|
var p = Arr(be, 0);
|
||
|
var n = int;
|
||
|
for (n = 0; n < a.mb_w_ * a.mb_h_; ++n) {
|
||
|
var b = a.mb_info_[n];
|
||
|
p[b.segment_]++
|
||
|
}
|
||
|
if (a.pic_.stats_nozero) {
|
||
|
for (n = 0; n < be; ++n) {
|
||
|
a.pic_.stats.segment_size[n] = p[n]
|
||
|
}
|
||
|
}
|
||
|
if (a.segment_hdr_.num_segments_ > 1) {
|
||
|
var c = a.proba_.segments_;
|
||
|
c[0] = GetProba(p[0] + p[1], p[2] + p[3]);
|
||
|
c[1] = GetProba(p[0], p[1]);
|
||
|
c[2] = GetProba(p[2], p[3]);
|
||
|
a.segment_hdr_.update_map_ = (c[0] != 255) || (c[1] != 255) || (c[2] != 255) + 0;
|
||
|
a.segment_hdr_.size_ = p[0] * (VP8BitCost(0, c[0]) + VP8BitCost(0, c[1])) + p[1] * (VP8BitCost(0, c[0]) + VP8BitCost(1, c[1])) + p[2] * (VP8BitCost(1, c[0]) + VP8BitCost(0, c[2])) + p[3] * (VP8BitCost(1, c[0]) + VP8BitCost(1, c[2]))
|
||
|
} else {
|
||
|
a.segment_hdr_.update_map_ = 0;
|
||
|
a.segment_hdr_.size_ = 0
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function clip(v, m, M) {
|
||
|
return v < m ? m : v > M ? M : v
|
||
|
}
|
||
|
|
||
|
function SetSegmentAlphas(a, b, c) {
|
||
|
var d = a.segment_hdr_.num_segments_;
|
||
|
var e = b[0],
|
||
|
maxx = b[0];
|
||
|
var n = int;
|
||
|
if (d > 1) {
|
||
|
for (n = 0; n < d; ++n) {
|
||
|
if (e > b[n]) e = b[n];
|
||
|
if (maxx < b[n]) maxx = b[n]
|
||
|
}
|
||
|
}
|
||
|
if (maxx == e) maxx = e + 1;
|
||
|
assert(c <= maxx && c >= e);
|
||
|
for (n = 0; n < d; ++n) {
|
||
|
var f = parseInt(255 * (b[n] - c) / (maxx - e));
|
||
|
var g = parseInt(255 * (b[n] - e) / (maxx - e));
|
||
|
a.dqm_[n].alpha_ = clip(f, -127, 127);
|
||
|
a.dqm_[n].beta_ = clip(g, 0, 255)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function AssignSegments(b, c) {
|
||
|
var d = b.segment_hdr_.num_segments_;
|
||
|
var e = Arr(be, int);
|
||
|
var f = int;
|
||
|
var g = Arr(256, int);
|
||
|
var a, n, k;
|
||
|
var h = 0,
|
||
|
max_a = 255,
|
||
|
range_a = int;
|
||
|
var i = Arr(be, int),
|
||
|
dist_accum = Arr(be, int);
|
||
|
for (n = 0; n < 256 && c[n] == 0; ++n) {}
|
||
|
h = n;
|
||
|
for (n = 255; n > h && c[n] == 0; --n) {}
|
||
|
max_a = n;
|
||
|
range_a = max_a - h;
|
||
|
for (n = 1, k = 0; n < 2 * d; n += 2) {
|
||
|
e[k++] = parseInt(h + (n * range_a) / (2 * d))
|
||
|
}
|
||
|
for (k = 0; k < cJ; ++k) {
|
||
|
var j = int;
|
||
|
var l = int;
|
||
|
for (n = 0; n < d; ++n) {
|
||
|
i[n] = 0;
|
||
|
dist_accum[n] = 0
|
||
|
}
|
||
|
var n = 0;
|
||
|
for (a = h; a <= max_a; ++a) {
|
||
|
if (c[a]) {
|
||
|
while (n < d - 1 && Math.abs(a - e[n + 1]) < Math.abs(a - e[n])) {
|
||
|
n++
|
||
|
}
|
||
|
g[a] = n;
|
||
|
dist_accum[n] += a * c[a];
|
||
|
i[n] += c[a]
|
||
|
}
|
||
|
}
|
||
|
l = 0;
|
||
|
f = 0;
|
||
|
j = 0;
|
||
|
for (n = 0; n < d; ++n) {
|
||
|
if (i[n]) {
|
||
|
var m = parseInt((dist_accum[n] + i[n] / 2) / i[n]);
|
||
|
l += Math.abs(e[n] - m);
|
||
|
e[n] = m;
|
||
|
f += m * i[n];
|
||
|
j += i[n]
|
||
|
}
|
||
|
}
|
||
|
f = parseInt((f + j / 2) / j);
|
||
|
if (l < 5) break
|
||
|
}
|
||
|
for (n = 0; n < b.mb_w_ * b.mb_h_; ++n) {
|
||
|
var o = b.mb_info_[n];
|
||
|
var a = o.alpha_;
|
||
|
o.segment_ = g[a];
|
||
|
o.alpha_ = e[g[a]]
|
||
|
}
|
||
|
if (d > 1) {
|
||
|
var p = (b.config_.preprocessing & 1);
|
||
|
if (p) SmoothSegmentMap(b)
|
||
|
}
|
||
|
SetSegmentProbas(b);
|
||
|
SetSegmentAlphas(b, e, f)
|
||
|
}
|
||
|
var cK = 2;
|
||
|
var cL = 2;
|
||
|
var cM = 2;
|
||
|
|
||
|
function MBAnalyzeBestIntra16Mode(a) {
|
||
|
var b = (a.enc_.method_ >= 3) ? cK : 4;
|
||
|
var c;
|
||
|
var d = -1;
|
||
|
var e = 0;
|
||
|
VP8MakeLuma16Preds(a);
|
||
|
for (c = 0; c < b; ++c) {
|
||
|
var f = dE(a.yuv_in_, a.yuv_in_off + bk, a.yuv_p_, a.yuv_p_off + df[c], 0, 16);
|
||
|
if (f > d) {
|
||
|
d = f;
|
||
|
e = c
|
||
|
}
|
||
|
}
|
||
|
VP8SetIntra16Mode(a, e);
|
||
|
return d
|
||
|
}
|
||
|
|
||
|
function MBAnalyzeBestIntra4Mode(a, b) {
|
||
|
var c = Arr(16, int);
|
||
|
var d = (a.enc_.method_ >= 3) ? cL : NUM_BMODES;
|
||
|
var e = 0;
|
||
|
VP8IteratorStartI4(a);
|
||
|
do {
|
||
|
var f;
|
||
|
var g = -1;
|
||
|
var h = a.yuv_in_;
|
||
|
var i = a.yuv_in_off + bk + di[a.i4_];
|
||
|
VP8MakeIntra4Preds(a);
|
||
|
for (f = 0; f < d; ++f) {
|
||
|
var j = dE(h, i, a.yuv_p_, a.yuv_p_off + dh[f], 0, 1);
|
||
|
if (j > g) {
|
||
|
g = j;
|
||
|
c[a.i4_] = f
|
||
|
}
|
||
|
}
|
||
|
e += g
|
||
|
} while (VP8IteratorRotateI4(a, a.yuv_in_, a.yuv_in_off + bk));
|
||
|
if (e > b) {
|
||
|
VP8SetIntra4Mode(a, c);
|
||
|
b = ClipAlpha(e)
|
||
|
}
|
||
|
return b
|
||
|
}
|
||
|
|
||
|
function MBAnalyzeBestUVMode(a) {
|
||
|
var b = -1;
|
||
|
var c = 0;
|
||
|
var d = (a.enc_.method_ >= 3) ? cM : 4;
|
||
|
var e;
|
||
|
VP8MakeChroma8Preds(a);
|
||
|
for (e = 0; e < d; ++e) {
|
||
|
var f = dE(a.yuv_in_, a.yuv_in_off + bl, a.yuv_p_, a.yuv_p_off + dg[e], 16, 16 + 4 + 4);
|
||
|
if (f > b) {
|
||
|
b = f;
|
||
|
c = e
|
||
|
}
|
||
|
}
|
||
|
VP8SetIntraUVMode(a, c);
|
||
|
return b
|
||
|
}
|
||
|
|
||
|
function MBAnalyze(a, b, c) {
|
||
|
var d = a.enc_;
|
||
|
var e, best_uv_alpha = int;
|
||
|
VP8SetIntra16Mode(a, 0);
|
||
|
VP8SetSkip(a, 0);
|
||
|
VP8SetSegment(a, 0);
|
||
|
e = MBAnalyzeBestIntra16Mode(a);
|
||
|
if (d.method_ != 3) {
|
||
|
e = MBAnalyzeBestIntra4Mode(a, e)
|
||
|
}
|
||
|
best_uv_alpha = MBAnalyzeBestUVMode(a);
|
||
|
e = parseInt((e + best_uv_alpha + 1) / 2);
|
||
|
b[e]++;
|
||
|
c += best_uv_alpha;
|
||
|
a.mb_[a.mb_off].alpha_ = e;
|
||
|
return c
|
||
|
}
|
||
|
|
||
|
function VP8EncAnalyze(a) {
|
||
|
var b = Arr(256, 0);
|
||
|
var c = newObjectIt(bV);
|
||
|
VP8IteratorInit(a, c);
|
||
|
a.uv_alpha_ = 0;
|
||
|
do {
|
||
|
VP8IteratorImport(c);
|
||
|
a.uv_alpha_ = MBAnalyze(c, b, a.uv_alpha_)
|
||
|
} while (VP8IteratorNext(c, c.yuv_in_, c.yuv_in_off));
|
||
|
a.uv_alpha_ /= a.mb_w_ * a.mb_h_;
|
||
|
a.uv_alpha_ = parseInt(a.uv_alpha_);
|
||
|
AssignSegments(a, b);
|
||
|
return 1
|
||
|
}
|
||
|
var cN = 1;
|
||
|
var cO = 1;
|
||
|
var cP = 0;
|
||
|
var cQ = 1;
|
||
|
var cR = 64;
|
||
|
var cS = 30;
|
||
|
var cT = 100;
|
||
|
var cU = 0.9;
|
||
|
|
||
|
function MULT_8B(a, b) {
|
||
|
return (((a) * (b) + 128) >> 8)
|
||
|
}
|
||
|
|
||
|
function clip(v, m, M) {
|
||
|
return v < m ? m : v > M ? M : v
|
||
|
}
|
||
|
var cV = new Array(0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15);
|
||
|
var cW = new Array(4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 91, 93, 95, 96, 98, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 143, 145, 148, 151, 154, 157);
|
||
|
var cX = new Array(4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 234, 239, 245, 249, 254, 259, 264, 269, 274, 279, 284);
|
||
|
var cY = new Array(8, 8, 9, 10, 12, 13, 15, 17, 18, 20, 21, 23, 24, 26, 27, 29, 31, 32, 34, 35, 37, 38, 40, 41, 43, 44, 46, 48, 49, 51, 52, 54, 55, 57, 58, 60, 62, 63, 65, 66, 68, 69, 71, 72, 74, 75, 77, 79, 80, 82, 83, 85, 86, 88, 89, 93, 96, 99, 102, 105, 108, 111, 114, 117, 120, 124, 127, 130, 133, 136, 139, 142, 145, 148, 151, 155, 158, 161, 164, 167, 170, 173, 176, 179, 184, 189, 193, 198, 203, 207, 212, 217, 221, 226, 230, 235, 240, 244, 249, 254, 258, 263, 268, 274, 280, 286, 292, 299, 305, 311, 317, 323, 330, 336, 342, 348, 354, 362, 370, 379, 385, 393, 401, 409, 416, 424, 432, 440);
|
||
|
var cZ = new Array(0, 10, 20, 30, 10, 20, 30, 30, 20, 30, 30, 30, 30, 30, 30, 30);
|
||
|
var da = new Array(new Array(96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96), new Array(96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96), new Array(96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96));
|
||
|
var db = new Array(0, 30, 60, 90, 30, 60, 90, 90, 60, 90, 90, 90, 90, 90, 90, 90);
|
||
|
|
||
|
function ExpandMatrix(m, a) {
|
||
|
var i;
|
||
|
var b = 0;
|
||
|
for (i = 2; i < 16; ++i) {
|
||
|
m.q_[i] = m.q_[1]
|
||
|
}
|
||
|
for (i = 0; i < 16; ++i) {
|
||
|
var j = cV[i];
|
||
|
var c = da[a][j];
|
||
|
m.iq_[j] = parseInt((1 << bI) / m.q_[j]);
|
||
|
m.bias_[j] = BIAS(c);
|
||
|
m.zthresh_[j] = ((256 - c) * m.q_[j] + 127) >> 8;
|
||
|
m.sharpen_[j] = (db[j] * m.q_[j]) >> 11;
|
||
|
b += m.q_[j]
|
||
|
}
|
||
|
return (b + 8) >> 4
|
||
|
}
|
||
|
|
||
|
function SetupMatrices(a) {
|
||
|
var i;
|
||
|
var b = (a.method_ >= 4) ? a.config_.sns_strength : 0;
|
||
|
var c = a.segment_hdr_.num_segments_;
|
||
|
for (i = 0; i < c; ++i) {
|
||
|
var m = a.dqm_[i];
|
||
|
var q = m.quant_;
|
||
|
var d = int,
|
||
|
q16 = int,
|
||
|
quv = int;
|
||
|
m.y1_.q_[0] = cW[clip(q + a.dq_y1_dc_, 0, 127)];
|
||
|
m.y1_.q_[1] = cX[clip(q, 0, 127)];
|
||
|
m.y2_.q_[0] = cW[clip(q + a.dq_y2_dc_, 0, 127)] * 2;
|
||
|
m.y2_.q_[1] = cY[clip(q + a.dq_y2_ac_, 0, 127)];
|
||
|
m.uv_.q_[0] = cW[clip(q + a.dq_uv_dc_, 0, 117)];
|
||
|
m.uv_.q_[1] = cX[clip(q + a.dq_uv_ac_, 0, 127)];
|
||
|
d = ExpandMatrix(m.y1_, 0);
|
||
|
q16 = ExpandMatrix(m.y2_, 1);
|
||
|
quv = ExpandMatrix(m.uv_, 2); {
|
||
|
m.lambda_i4_ = (3 * d * d) >> 7;
|
||
|
m.lambda_i16_ = (3 * q16 * q16);
|
||
|
m.lambda_uv_ = (3 * quv * quv) >> 6;
|
||
|
m.lambda_mode_ = (1 * d * d) >> 7;
|
||
|
m.lambda_trellis_i4_ = (7 * d * d) >> 3;
|
||
|
m.lambda_trellis_i16_ = (q16 * q16) >> 2;
|
||
|
m.lambda_trellis_uv_ = (quv * quv) << 1;
|
||
|
m.tlambda_ = (b * d) >> 5
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
var dc = 3;
|
||
|
|
||
|
function SetupFilterStrength(a) {
|
||
|
var i;
|
||
|
var b = a.config_.filter_strength;
|
||
|
for (i = 0; i < be; ++i) {
|
||
|
var c = parseInt(b * 256 * a.dqm_[i].quant_ / 128);
|
||
|
var f = parseInt(c / (256 + a.dqm_[i].beta_));
|
||
|
a.dqm_[i].fstrength_ = (f < dc) ? 0 : (f > 63) ? 63 : f
|
||
|
}
|
||
|
a.filter_hdr_.level_ = a.dqm_[0].fstrength_;
|
||
|
a.filter_hdr_.simple_ = (a.config_.filter_type == 0) + 0;
|
||
|
a.filter_hdr_.sharpness_ = a.config_.filter_sharpness
|
||
|
}
|
||
|
var dd = (6);
|
||
|
var de = (-4);
|
||
|
|
||
|
function QualityToCompression(q) {
|
||
|
var c = q / 100.;
|
||
|
return (c < 0.75) ? c * (2. / 3.) : 2. * c - 1.
|
||
|
}
|
||
|
|
||
|
function VP8SetSegmentParams(a, b) {
|
||
|
var i;
|
||
|
var d, dq_uv_dc = int;
|
||
|
var e = a.config_.segments;
|
||
|
var f = cU * a.config_.sns_strength / 100. / 128.;
|
||
|
var g = QualityToCompression(b);
|
||
|
for (i = 0; i < e; ++i) {
|
||
|
var h = (1. - f * a.dqm_[i].alpha_) / 3.;
|
||
|
var c = Math.pow(g, h);
|
||
|
var q = parseInt((127. * (1. - c)));
|
||
|
assert(h > 0.);
|
||
|
a.dqm_[i].quant_ = clip(q, 0, 127)
|
||
|
}
|
||
|
a.base_quant_ = a.dqm_[0].quant_;
|
||
|
for (i = e; i < be; ++i) {
|
||
|
a.dqm_[i].quant_ = a.base_quant_
|
||
|
}
|
||
|
d = parseInt((a.uv_alpha_ - cR) * (dd - de) / (cT - cS));
|
||
|
d = parseInt(d * a.config_.sns_strength / 100);
|
||
|
d = clip(d, de, dd);
|
||
|
dq_uv_dc = parseInt(-4 * a.config_.sns_strength / 100);
|
||
|
dq_uv_dc = clip(dq_uv_dc, -15, 15);
|
||
|
a.dq_y1_dc_ = 0;
|
||
|
a.dq_y2_dc_ = 0;
|
||
|
a.dq_y2_ac_ = 0;
|
||
|
a.dq_uv_dc_ = dq_uv_dc;
|
||
|
a.dq_uv_ac_ = d;
|
||
|
SetupMatrices(a);
|
||
|
SetupFilterStrength(a)
|
||
|
}
|
||
|
var df = new Array(bo, bp, bq, br);
|
||
|
var dg = new Array(bs, bt, bu, bv);
|
||
|
var dh = new Array(bw, bx, by, bz, bA, bB, bC, bD, bE, bF);
|
||
|
|
||
|
function VP8MakeLuma16Preds(a) {
|
||
|
var b = a.enc_;
|
||
|
var c = a.x_ ? b.y_left_ : null;
|
||
|
var d = a.x_ ? b.y_left_off : null;
|
||
|
var e = a.y_ ? b.y_top_ : null;
|
||
|
var f = a.y_ ? b.y_top_off + a.x_ * 16 : null;
|
||
|
dK(a.yuv_p_, a.yuv_p_off, c, d, e, f)
|
||
|
}
|
||
|
|
||
|
function VP8MakeChroma8Preds(a) {
|
||
|
var b = a.enc_;
|
||
|
var c = a.x_ ? b.u_left_ : null;
|
||
|
var d = a.x_ ? b.u_left_off : null;
|
||
|
var e = a.y_ ? b.uv_top_ : null;
|
||
|
var f = a.y_ ? b.uv_top_off + a.x_ * 16 : null;
|
||
|
dL(a.yuv_p_, a.yuv_p_off, c, d, e, f)
|
||
|
}
|
||
|
|
||
|
function VP8MakeIntra4Preds(a) {
|
||
|
dJ(a.yuv_p_, a.yuv_p_off, a.i4_top_, a.i4_top_off)
|
||
|
}
|
||
|
var di = new Array(0 + 0 * bf, 4 + 0 * bf, 8 + 0 * bf, 12 + 0 * bf, 0 + 4 * bf, 4 + 4 * bf, 8 + 4 * bf, 12 + 4 * bf, 0 + 8 * bf, 4 + 8 * bf, 8 + 8 * bf, 12 + 8 * bf, 0 + 12 * bf, 4 + 12 * bf, 8 + 12 * bf, 12 + 12 * bf, 0 + 0 * bf, 4 + 0 * bf, 0 + 4 * bf, 4 + 4 * bf, 8 + 0 * bf, 12 + 0 * bf, 8 + 4 * bf, 12 + 4 * bf);
|
||
|
var dj = new Array(38, 32, 20, 9, 32, 28, 17, 7, 20, 17, 10, 4, 9, 7, 4, 2);
|
||
|
var dk = new Array(30, 27, 19, 11, 27, 24, 17, 10, 19, 17, 12, 8, 11, 10, 8, 6);
|
||
|
|
||
|
function InitScore(a) {
|
||
|
a.D = 0;
|
||
|
a.SD = 0;
|
||
|
a.R = 0;
|
||
|
a.nz = 0;
|
||
|
a.score = bH
|
||
|
}
|
||
|
|
||
|
function CopyScore(a, b) {
|
||
|
a.D = (b.D);
|
||
|
a.SD = (b.SD);
|
||
|
a.R = (b.R);
|
||
|
a.nz = (b.nz);
|
||
|
a.score = (b.score)
|
||
|
}
|
||
|
|
||
|
function AddScore(a, b) {
|
||
|
a.D += b.D;
|
||
|
a.SD += b.SD;
|
||
|
a.R += b.R;
|
||
|
a.nz |= b.nz;
|
||
|
a.score += b.score
|
||
|
}
|
||
|
var dl = {
|
||
|
prev: int,
|
||
|
level: int,
|
||
|
sign: int,
|
||
|
cost: score_t,
|
||
|
error: score_t,
|
||
|
ctx: int
|
||
|
};
|
||
|
var dm = 0;
|
||
|
var dn = 1;
|
||
|
var dp = (dm + 1 + dn);
|
||
|
|
||
|
function SetRDScore(a, b) {
|
||
|
b.score = b.R * a + 256 * (b.D + b.SD)
|
||
|
}
|
||
|
|
||
|
function RDScoreTrellis(a, b, c) {
|
||
|
return b * a + 256 * c
|
||
|
}
|
||
|
|
||
|
function TrellisQuantizeBlock(a, b, c, d, e, f, g) {
|
||
|
var h = a.enc_.proba_.coeffs_[e];
|
||
|
var i = a.enc_.proba_.level_cost_[e];
|
||
|
var k = (e == 0) ? 1 : 0;
|
||
|
var l = ArrM(new Array(17, dp), dl);
|
||
|
var o = new Array(-1, -1, -1);
|
||
|
var q = score_t;
|
||
|
var r;
|
||
|
var s = k - 1;
|
||
|
var n = int,
|
||
|
m = int,
|
||
|
p = int,
|
||
|
nz = int; {
|
||
|
var t = score_t;
|
||
|
var u = score_t;
|
||
|
var v = parseInt(f.q_[1] * f.q_[1] / 4);
|
||
|
var w = h[cw[k]][d][0];
|
||
|
u = 0;
|
||
|
for (n = k; n < 16; ++n) {
|
||
|
var j = cV[n];
|
||
|
var x = b[j] * b[j];
|
||
|
u += dk[j] * x;
|
||
|
if (x > v) s = n
|
||
|
}
|
||
|
if (s < 15) ++s;
|
||
|
t = VP8BitCost(0, w);
|
||
|
q = RDScoreTrellis(g, t, u);
|
||
|
n = k - 1;
|
||
|
for (m = -dm; m <= dn; ++m) {
|
||
|
l[n + 1][m + dm].cost = 0;
|
||
|
l[n + 1][m + dm].error = u;
|
||
|
l[n + 1][m + dm].ctx = d
|
||
|
}
|
||
|
}
|
||
|
for (n = k; n <= s; ++n) {
|
||
|
var j = cV[n];
|
||
|
var Q = f.q_[j];
|
||
|
var y = f.iq_[j];
|
||
|
var B = BIAS(0x00);
|
||
|
var z = (b[j] < 0) + 0;
|
||
|
var A = (z ? -b[j] : b[j]) + f.sharpen_[j];
|
||
|
var C;
|
||
|
if (A > 2047) A = 2047;
|
||
|
C = QUANTDIV(A, y, B);
|
||
|
for (m = -dm; m <= dn; ++m) {
|
||
|
var D = l[n + 1][m + dm];
|
||
|
var E, new_error;
|
||
|
var F = bH;
|
||
|
var G = C + m;
|
||
|
var w;
|
||
|
D.sign = z;
|
||
|
D.level = G;
|
||
|
D.ctx = (G == 0) ? 0 : (G == 1) ? 1 : 2;
|
||
|
if (G >= 2048 || G < 0) {
|
||
|
D.cost = bH;
|
||
|
continue
|
||
|
}
|
||
|
w = h[cw[n + 1]][D.ctx][0];
|
||
|
new_error = A - G * Q;
|
||
|
E = dk[j] * (A * A - new_error * new_error);
|
||
|
for (p = -dm; p <= dn; ++p) {
|
||
|
var H = l[n - 1 + 1][p + dm];
|
||
|
var I = H.ctx;
|
||
|
var J = i[cw[n]][I];
|
||
|
var K = H.error - E;
|
||
|
var t = score_t,
|
||
|
base_cost = score_t,
|
||
|
score = score_t;
|
||
|
if (H.cost >= bH) {
|
||
|
continue
|
||
|
}
|
||
|
base_cost = H.cost + VP8LevelCost(J, G);
|
||
|
t = base_cost;
|
||
|
if (G && n < 15) {
|
||
|
t += VP8BitCost(1, w)
|
||
|
}
|
||
|
score = RDScoreTrellis(g, t, K);
|
||
|
if (score < F) {
|
||
|
F = score;
|
||
|
D.cost = t;
|
||
|
D.error = K;
|
||
|
D.prev = p
|
||
|
}
|
||
|
if (G) {
|
||
|
t = base_cost;
|
||
|
if (n < 15) t += VP8BitCost(0, w);
|
||
|
score = RDScoreTrellis(g, t, K);
|
||
|
if (score < q) {
|
||
|
q = score;
|
||
|
o[0] = n;
|
||
|
o[1] = m;
|
||
|
o[2] = p
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
memset_(b, +k, 0, (16 - k) * sizeof(b));
|
||
|
memset_(c, +k, 0, (16 - k) * sizeof(c));
|
||
|
if (o[0] == -1) {
|
||
|
return 0
|
||
|
}
|
||
|
n = o[0];
|
||
|
r = o[1];
|
||
|
l[n + 1][r + dm].prev = o[2];
|
||
|
nz = 0;
|
||
|
for (; n >= k; --n) {
|
||
|
var L = l[n + 1][r + dm];
|
||
|
var j = cV[n];
|
||
|
c[n] = L.sign ? -L.level : L.level;
|
||
|
nz |= (L.level != 0);
|
||
|
b[j] = c[n] * f.q_[j];
|
||
|
r = L.prev
|
||
|
}
|
||
|
return nz
|
||
|
}
|
||
|
|
||
|
function ReconstructIntra16(a, b, c, d, e) {
|
||
|
var f = a.enc_;
|
||
|
var g = a.yuv_p_;
|
||
|
var h = a.yuv_p_off + df[e];
|
||
|
var i = a.yuv_in_;
|
||
|
var j = a.yuv_in_off + bk;
|
||
|
var k = f.dqm_[a.mb_[a.mb_off].segment_];
|
||
|
var l = 0;
|
||
|
var n = int;
|
||
|
var m = ArrM(Array(16, 16), int16_t),
|
||
|
dc_tmp = Arr(16, int16_t);
|
||
|
for (n = 0; n < 16; ++n) {
|
||
|
dG(i, j + di[n], g, h + di[n], m[n])
|
||
|
}
|
||
|
dI(m, dc_tmp);
|
||
|
l |= dS(dc_tmp, b.y_dc_levels, 0, k.y2_) << 24;
|
||
|
if (cO && a.do_trellis_) {
|
||
|
var x, y;
|
||
|
VP8IteratorNzToBytes(a);
|
||
|
for (y = 0, n = 0; y < 4; ++y) {
|
||
|
for (x = 0; x < 4; ++x) {
|
||
|
var o = a.top_nz_[x] + a.left_nz_[y];
|
||
|
var p = TrellisQuantizeBlock(a, m[n], b.y_ac_levels[n], o, 0, k.y1_, k.lambda_trellis_i16_);
|
||
|
a.top_nz_[x] = a.left_nz_[y] = p;
|
||
|
l |= p << n;
|
||
|
++n
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
for (n = 0; n < 16; ++n) {
|
||
|
l |= dS(m[n], b.y_ac_levels[n], 1, k.y1_) << n
|
||
|
}
|
||
|
}
|
||
|
dH(dc_tmp, m);
|
||
|
for (n = 0; n < 16; n += 2) {
|
||
|
dF(g, h + di[n], m[n], 0, c, d + di[n], 1)
|
||
|
}
|
||
|
return l
|
||
|
}
|
||
|
|
||
|
function ReconstructIntra4(a, b, c, d, e, f, g) {
|
||
|
var h = a.enc_;
|
||
|
var i = a.yuv_p_;
|
||
|
var j = a.yuv_p_off + dh[g];
|
||
|
var k = h.dqm_[a.mb_[a.mb_off].segment_];
|
||
|
var l = 0;
|
||
|
var m = Arr(16, int16_t);
|
||
|
dG(c, d, i, j, m);
|
||
|
if (cN && a.do_trellis_) {
|
||
|
var x = a.i4_ & 3,
|
||
|
y = a.i4_ >> 2;
|
||
|
var n = a.top_nz_[x] + a.left_nz_[y];
|
||
|
l = TrellisQuantizeBlock(a, m, b, n, 3, k.y1_, k.lambda_trellis_i4_)
|
||
|
} else {
|
||
|
l = dS(m, b, 0, k.y1_)
|
||
|
}
|
||
|
dF(i, j, m, 0, e, f, 0);
|
||
|
return l
|
||
|
}
|
||
|
|
||
|
function ReconstructUV(a, b, c, d, e) {
|
||
|
var f = a.enc_;
|
||
|
var g = a.yuv_p_;
|
||
|
var h = a.yuv_p_off + dg[e];
|
||
|
var i = a.yuv_in_;
|
||
|
var j = a.yuv_in_off + bl;
|
||
|
var k = f.dqm_[a.mb_[a.mb_off].segment_];
|
||
|
var l = 0;
|
||
|
var n;
|
||
|
var m = ArrM(new Array(8, 16), int16_t);
|
||
|
for (n = 0; n < 8; ++n) {
|
||
|
dG(i, j + di[16 + n], g, h + di[16 + n], m[n])
|
||
|
}
|
||
|
if (cP && a.do_trellis_) {
|
||
|
var o, x, y;
|
||
|
for (o = 0; o <= 2; o += 2) {
|
||
|
n = 0;
|
||
|
for (y = 0; y < 2; ++y) {
|
||
|
for (x = 0; x < 2; ++x) {
|
||
|
var p = a.top_nz_[4 + o + x] + a.left_nz_[4 + o + y];
|
||
|
var q = TrellisQuantizeBlock(a, m[n], b.uv_levels[n], p, 2, k.uv_, k.lambda_trellis_uv_);
|
||
|
a.top_nz_[4 + o + x] = a.left_nz_[4 + o + y] = q;
|
||
|
l |= q << n;
|
||
|
++n
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
for (n = 0; n < 8; ++n) {
|
||
|
l |= dS(m[n], b.uv_levels[n], 0, k.uv_) << n
|
||
|
}
|
||
|
}
|
||
|
for (n = 0; n < 8; n += 1) {
|
||
|
dF(g, h + di[16 + n], m[n], 0, c, d + di[16 + n], 0)
|
||
|
}
|
||
|
return (l << 16)
|
||
|
}
|
||
|
|
||
|
function SwapPtr(a, c, b, d) {}
|
||
|
|
||
|
function SwapOut(a) {
|
||
|
var b = (a.yuv_out_);
|
||
|
var c = (a.yuv_out_off);
|
||
|
a.yuv_out_ = (a.yuv_out2_);
|
||
|
a.yuv_out_off = (a.yuv_out2_off);
|
||
|
a.yuv_out2_ = (b);
|
||
|
a.yuv_out2_off = (c)
|
||
|
}
|
||
|
var dq = newObjectIt(bU);
|
||
|
|
||
|
function PickBestIntra16(a, b) {
|
||
|
var c = a.enc_;
|
||
|
var d = c.dqm_[a.mb_[a.mb_off].segment_];
|
||
|
var e = d.lambda_i16_;
|
||
|
var f = d.tlambda_;
|
||
|
var g = a.yuv_in_;
|
||
|
var h = a.yuv_in_off + bk;
|
||
|
var i = (dq);
|
||
|
var j;
|
||
|
b.mode_i16 = -1;
|
||
|
for (j = 0; j < 4; ++j) {
|
||
|
var k = a.yuv_out2_;
|
||
|
var l = a.yuv_out2_off + bk;
|
||
|
var m = int;
|
||
|
m = ReconstructIntra16(a, i, k, l, j);
|
||
|
i.D = dM(g, h, k, l);
|
||
|
i.SD = f ? MULT_8B(f, dR(g, h, k, l, dj)) : 0;
|
||
|
i.R = VP8GetCostLuma16(a, i);
|
||
|
i.R += ct[j];
|
||
|
SetRDScore(e, i);
|
||
|
if (j == 0 || i.score < b.score) {
|
||
|
CopyScore(b, i);
|
||
|
b.mode_i16 = j;
|
||
|
b.nz = m;
|
||
|
memcpyArrM(b.y_ac_levels, 0, i.y_ac_levels, 0, i.y_ac_levels.length);
|
||
|
memcpy(b.y_dc_levels, 0, i.y_dc_levels, 0, i.y_dc_levels.length);
|
||
|
SwapOut(a)
|
||
|
}
|
||
|
}
|
||
|
SetRDScore(d.lambda_mode_, b);
|
||
|
VP8SetIntra16Mode(a, b.mode_i16)
|
||
|
}
|
||
|
|
||
|
function GetCostModeI4(a, b) {
|
||
|
var c = a.enc_.preds_w_;
|
||
|
var x = (a.i4_ & 3),
|
||
|
y = a.i4_ >> 2;
|
||
|
var d = (x == 0) ? a.preds_[a.preds_off + y * c - 1] : b[a.i4_ - 1];
|
||
|
var e = (y == 0) ? a.preds_[a.preds_off - c + x] : b[a.i4_ - 4];
|
||
|
return cu[e][d]
|
||
|
}
|
||
|
var dr = newObjectIt(bU);
|
||
|
var ds = newObjectIt(bU);
|
||
|
var dt = newObjectIt(bU);
|
||
|
|
||
|
function PickBestIntra4(a, b) {
|
||
|
var c = a.enc_;
|
||
|
var d = c.dqm_[a.mb_[a.mb_off].segment_];
|
||
|
var e = d.lambda_i4_;
|
||
|
var f = d.tlambda_;
|
||
|
var g = a.yuv_in_;
|
||
|
var h = a.yuv_in_off + bk;
|
||
|
var i = a.yuv_out2_;
|
||
|
var j = a.yuv_out2_off + bk;
|
||
|
var k = 0;
|
||
|
var l = (dr);
|
||
|
if (c.max_i4_header_bits_ == 0) {
|
||
|
return 0
|
||
|
}
|
||
|
InitScore(l);
|
||
|
l.score = 211;
|
||
|
VP8IteratorStartI4(a);
|
||
|
do {
|
||
|
var m = (ds);
|
||
|
var n;
|
||
|
var o = -1;
|
||
|
var p = g;
|
||
|
var q = h + di[a.i4_];
|
||
|
var r = GetCostModeI4(a, b.modes_i4);
|
||
|
var s = (i);
|
||
|
var t = (j + di[a.i4_]);
|
||
|
var u = (a.yuv_p_);
|
||
|
var v = (a.yuv_p_off + bG);
|
||
|
InitScore(m);
|
||
|
VP8MakeIntra4Preds(a);
|
||
|
for (n = 0; n < NUM_BMODES; ++n) {
|
||
|
var w = (dt);
|
||
|
var x = Arr(16, int16_t);
|
||
|
w.nz = ReconstructIntra4(a, x, p, q, u, v, n) << a.i4_;
|
||
|
w.D = dP(p, q, u, v);
|
||
|
w.SD = f ? MULT_8B(f, dQ(p, q, u, v, dj)) : 0;
|
||
|
w.R = VP8GetCostLuma4(a, x);
|
||
|
w.R += r[n];
|
||
|
SetRDScore(e, w);
|
||
|
if (o < 0 || w.score < m.score) {
|
||
|
CopyScore(m, w);
|
||
|
o = n;
|
||
|
var y = (u);
|
||
|
var z = (v);
|
||
|
u = (s);
|
||
|
v = (t);
|
||
|
s = (y);
|
||
|
t = (z);
|
||
|
memcpy(l.y_ac_levels[a.i4_], 0, x, 0, sizeof(x) * 16)
|
||
|
}
|
||
|
}
|
||
|
SetRDScore(d.lambda_mode_, m);
|
||
|
AddScore(l, m);
|
||
|
k += r[o];
|
||
|
if (l.score >= b.score || k > c.max_i4_header_bits_) {
|
||
|
return 0
|
||
|
}
|
||
|
if (t != j + di[a.i4_]) dT(s, t, i, j + di[a.i4_]);
|
||
|
b.modes_i4[a.i4_] = o;
|
||
|
a.top_nz_[a.i4_ & 3] = a.left_nz_[a.i4_ >> 2] = (m.nz ? 1 : 0)
|
||
|
} while (VP8IteratorRotateI4(a, i, j));
|
||
|
CopyScore(b, l);
|
||
|
VP8SetIntra4Mode(a, b.modes_i4);
|
||
|
SwapOut(a);
|
||
|
memcpyArrM(b.y_ac_levels, 0, l.y_ac_levels, 0, b.y_ac_levels.length);
|
||
|
return 1
|
||
|
}
|
||
|
var du = newObjectIt(bU);
|
||
|
var dv = newObjectIt(bU);
|
||
|
|
||
|
function PickBestUV(a, b) {
|
||
|
var c = a.enc_;
|
||
|
var d = c.dqm_[a.mb_[a.mb_off].segment_];
|
||
|
var e = d.lambda_uv_;
|
||
|
var f = a.yuv_in_;
|
||
|
var g = a.yuv_in_off + bl;
|
||
|
var h = a.yuv_out2_;
|
||
|
var i = a.yuv_out2_off + bl;
|
||
|
var j = a.yuv_out_;
|
||
|
var k = a.yuv_out_off + bl;
|
||
|
var l = (du);
|
||
|
var m;
|
||
|
b.mode_uv = -1;
|
||
|
InitScore(l);
|
||
|
for (m = 0; m < 4; ++m) {
|
||
|
var n = (dv);
|
||
|
n.nz = ReconstructUV(a, n, h, i, m);
|
||
|
n.D = dO(f, g, h, i);
|
||
|
n.SD = 0;
|
||
|
n.R = VP8GetCostUV(a, n);
|
||
|
n.R += cs[m];
|
||
|
SetRDScore(e, n);
|
||
|
if (m == 0 || n.score < l.score) {
|
||
|
CopyScore(l, n);
|
||
|
b.mode_uv = m;
|
||
|
memcpyArrM(b.uv_levels, 0, n.uv_levels, 0, b.uv_levels.length);
|
||
|
memcpy(j, k, h, i, bh)
|
||
|
}
|
||
|
}
|
||
|
VP8SetIntraUVMode(a, b.mode_uv);
|
||
|
AddScore(b, l)
|
||
|
}
|
||
|
|
||
|
function SimpleQuantize(a, b) {
|
||
|
var c = a.enc_;
|
||
|
var d = (a.mb_[a.mb_off].type_ == 1);
|
||
|
var e = 0;
|
||
|
if (d) {
|
||
|
e = ReconstructIntra16(a, b, a.yuv_out_, a.yuv_out_off + bk, a.preds_[a.preds_off + 0])
|
||
|
} else {
|
||
|
VP8IteratorStartI4(a);
|
||
|
do {
|
||
|
var f = a.preds_[a.preds_off + (a.i4_ & 3) + (a.i4_ >> 2) * c.preds_w_];
|
||
|
var g = a.yuv_in_;
|
||
|
var h = a.yuv_in_off + bk + di[a.i4_];
|
||
|
var i = a.yuv_out_;
|
||
|
var j = a.yuv_out_off + bk + di[a.i4_];
|
||
|
VP8MakeIntra4Preds(a);
|
||
|
e |= ReconstructIntra4(a, b.y_ac_levels[a.i4_], g, h, i, j, f) << a.i4_
|
||
|
} while (VP8IteratorRotateI4(a, a.yuv_out_, a.yuv_out_off + bk))
|
||
|
}
|
||
|
e |= ReconstructUV(a, b, a.yuv_out_, a.yuv_out_off + bl, a.mb_[a.mb_off].uv_mode_);
|
||
|
b.nz = e
|
||
|
}
|
||
|
|
||
|
function VP8Decimate(a, b, c) {
|
||
|
var d = int;
|
||
|
InitScore(b);
|
||
|
VP8MakeLuma16Preds(a);
|
||
|
VP8MakeChroma8Preds(a);
|
||
|
if (c > 0) {
|
||
|
a.do_trellis_ = (c > 2) + 0;
|
||
|
PickBestIntra16(a, b);
|
||
|
if (a.enc_.method_ >= 2) {
|
||
|
PickBestIntra4(a, b)
|
||
|
}
|
||
|
PickBestUV(a, b);
|
||
|
if (c == 2) {
|
||
|
a.do_trellis_ = 1;
|
||
|
SimpleQuantize(a, b)
|
||
|
}
|
||
|
} else {
|
||
|
a.do_trellis_ = (a.enc_.method_ == 2) + 0;
|
||
|
SimpleQuantize(a, b)
|
||
|
}
|
||
|
d = (b.nz == 0) + 0;
|
||
|
VP8SetSkip(a, d);
|
||
|
return d
|
||
|
}
|
||
|
var dw = new Array(new Array(new Array(new Array(128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128), new Array(128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128), new Array(128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128)), new Array(new Array(253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128), new Array(189, 129, 242, 255, 227, 213, 255, 219, 128, 128, 128), new Array(106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128)), new Array(new Array(1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128), new Array(181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128), new Array(78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128)), new Array(new Array(1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128), new Array(184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128), new Array(77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128)), new Array(new Array(1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128), new Array(170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128), new Array(37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128)), new Array(new Array(1, 204, 254, 255, 245, 255, 128, 128, 128, 128, 128), new Array(207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128), new Array(102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128)), new Array(new Array(1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128), new Array(177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128), new Array(80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128)), new Array(new Array(1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128), new Array(246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128), new Array(255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128))), new Array(new Array(new Array(198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62), new Array(131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1), new Array(68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128)), new Array(new Array(1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128), new Array(184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128), new Array(81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128)), new Array(new Array(1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128), new Array(99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128), new Array(23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128)), new Array(new Array(1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128), new Array(109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128), new Array(44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128)), new Array(new Array(1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128), new Array(94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128), new Array(22, 100, 174, 245, 186, 161, 255, 199, 128, 128, 128)), new Array(new Array(1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128), new Array(124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128), new Array(35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128)), new Array(new Array(1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128), new Array(121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128), new Array(45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128)), new Array(new Array(1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128), new Array(203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128), new Array(137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128))), new Array(new Array(new Array(253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128), new Array(175, 13, 224, 243, 193, 185, 249, 198, 255, 255, 128), new Array(73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128)), new Array(new Array(1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128), new Array(239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128), new Array(155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128)), new Array(new Array(1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128), new Array(201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128), new Array(69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128)), new Array(new Array(1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128), new Array(223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128), new A
|
||
|
|
||
|
function VP8DefaultProbas(a) {
|
||
|
var b = a.proba_;
|
||
|
for (var i = 0; i < b.segments_.length; ++i) b.segments_[i] = 255;
|
||
|
b.coeffs_ = newObjectIt(dw);
|
||
|
b.use_skip_proba_ = 0
|
||
|
}
|
||
|
var dx = new Array(new Array(new Array(231, 120, 48, 89, 115, 113, 120, 152, 112), new Array(152, 179, 64, 126, 170, 118, 46, 70, 95), new Array(175, 69, 143, 80, 85, 82, 72, 155, 103), new Array(56, 58, 10, 171, 218, 189, 17, 13, 152), new Array(114, 26, 17, 163, 44, 195, 21, 10, 173), new Array(121, 24, 80, 195, 26, 62, 44, 64, 85), new Array(144, 71, 10, 38, 171, 213, 144, 34, 26), new Array(170, 46, 55, 19, 136, 160, 33, 206, 71), new Array(63, 20, 8, 114, 114, 208, 12, 9, 226), new Array(81, 40, 11, 96, 182, 84, 29, 16, 36)), new Array(new Array(134, 183, 89, 137, 98, 101, 106, 165, 148), new Array(72, 187, 100, 130, 157, 111, 32, 75, 80), new Array(66, 102, 167, 99, 74, 62, 40, 234, 128), new Array(41, 53, 9, 178, 241, 141, 26, 8, 107), new Array(74, 43, 26, 146, 73, 166, 49, 23, 157), new Array(65, 38, 105, 160, 51, 52, 31, 115, 128), new Array(104, 79, 12, 27, 217, 255, 87, 17, 7), new Array(87, 68, 71, 44, 114, 51, 15, 186, 23), new Array(47, 41, 14, 110, 182, 183, 21, 17, 194), new Array(66, 45, 25, 102, 197, 189, 23, 18, 22)), new Array(new Array(88, 88, 147, 150, 42, 46, 45, 196, 205), new Array(43, 97, 183, 117, 85, 38, 35, 179, 61), new Array(39, 53, 200, 87, 26, 21, 43, 232, 171), new Array(56, 34, 51, 104, 114, 102, 29, 93, 77), new Array(39, 28, 85, 171, 58, 165, 90, 98, 64), new Array(34, 22, 116, 206, 23, 34, 43, 166, 73), new Array(107, 54, 32, 26, 51, 1, 81, 43, 31), new Array(68, 25, 106, 22, 64, 171, 36, 225, 114), new Array(34, 19, 21, 102, 132, 188, 16, 76, 124), new Array(62, 18, 78, 95, 85, 57, 50, 48, 51)), new Array(new Array(193, 101, 35, 159, 215, 111, 89, 46, 111), new Array(60, 148, 31, 172, 219, 228, 21, 18, 111), new Array(112, 113, 77, 85, 179, 255, 38, 120, 114), new Array(40, 42, 1, 196, 245, 209, 10, 25, 109), new Array(88, 43, 29, 140, 166, 213, 37, 43, 154), new Array(61, 63, 30, 155, 67, 45, 68, 1, 209), new Array(100, 80, 8, 43, 154, 1, 51, 26, 71), new Array(142, 78, 78, 16, 255, 128, 34, 197, 171), new Array(41, 40, 5, 102, 211, 183, 4, 1, 221), new Array(51, 50, 17, 168, 209, 192, 23, 25, 82)), new Array(new Array(138, 31, 36, 171, 27, 166, 38, 44, 229), new Array(67, 87, 58, 169, 82, 115, 26, 59, 179), new Array(63, 59, 90, 180, 59, 166, 93, 73, 154), new Array(40, 40, 21, 116, 143, 209, 34, 39, 175), new Array(47, 15, 16, 183, 34, 223, 49, 45, 183), new Array(46, 17, 33, 183, 6, 98, 15, 32, 183), new Array(57, 46, 22, 24, 128, 1, 54, 17, 37), new Array(65, 32, 73, 115, 28, 128, 23, 128, 205), new Array(40, 3, 9, 115, 51, 192, 18, 6, 223), new Array(87, 37, 9, 115, 59, 77, 64, 21, 47)), new Array(new Array(104, 55, 44, 218, 9, 54, 53, 130, 226), new Array(64, 90, 70, 205, 40, 41, 23, 26, 57), new Array(54, 57, 112, 184, 5, 41, 38, 166, 213), new Array(30, 34, 26, 133, 152, 116, 10, 32, 134), new Array(39, 19, 53, 221, 26, 114, 32, 73, 255), new Array(31, 9, 65, 234, 2, 15, 1, 118, 73), new Array(75, 32, 12, 51, 192, 255, 160, 43, 51), new Array(88, 31, 35, 67, 102, 85, 55, 186, 85), new Array(56, 21, 23, 111, 59, 205, 45, 37, 192), new Array(55, 38, 70, 124, 73, 102, 1, 34, 98)), new Array(new Array(125, 98, 42, 88, 104, 85, 117, 175, 82), new Array(95, 84, 53, 89, 128, 100, 113, 101, 45), new Array(75, 79, 123, 47, 51, 128, 81, 171, 1), new Array(57, 17, 5, 71, 102, 57, 53, 41, 49), new Array(38, 33, 13, 121, 57, 73, 26, 1, 85), new Array(41, 10, 67, 138, 77, 110, 90, 47, 114), new Array(115, 21, 2, 10, 102, 255, 166, 23, 6), new Array(101, 29, 16, 10, 85, 128, 101, 196, 26), new Array(57, 18, 10, 102, 102, 213, 34, 20, 43), new Array(117, 20, 15, 36, 163, 128, 68, 1, 26)), new Array(new Array(102, 61, 71, 37, 34, 53, 31, 243, 192), new Array(69, 60, 71, 38, 73, 119, 28, 222, 37), new Array(68, 45, 128, 34, 1, 47, 11, 245, 171), new Array(62, 17, 19, 70, 146, 85, 55, 62, 70), new Array(37, 43, 37, 154, 100, 163, 85, 160, 1), new Array(63, 9, 92, 136, 28, 64, 32, 201, 85), new Array(75, 15, 9, 9, 64, 255, 184, 119, 16), new Array(86, 6, 28, 5, 64, 255, 25, 248, 1), new Array(56, 8, 17, 132, 137, 255, 55, 116, 128), new Array(58, 15, 20, 82, 135, 57, 26, 121, 40)), new A
|
||
|
|
||
|
function PutI4Mode(a, b, c) {
|
||
|
if (VP8PutBit(a, b != bd, c[0])) {
|
||
|
if (VP8PutBit(a, b != B_TM_PRED, c[1])) {
|
||
|
if (VP8PutBit(a, b != B_VE_PRED, c[2])) {
|
||
|
if (!VP8PutBit(a, b >= B_LD_PRED, c[3])) {
|
||
|
if (VP8PutBit(a, b != B_HE_PRED, c[4])) {
|
||
|
VP8PutBit(a, b != B_RD_PRED, c[5])
|
||
|
}
|
||
|
} else {
|
||
|
if (VP8PutBit(a, b != B_LD_PRED, c[6])) {
|
||
|
if (VP8PutBit(a, b != B_VL_PRED, c[7])) {
|
||
|
VP8PutBit(a, b != B_HD_PRED, c[8])
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return b
|
||
|
}
|
||
|
|
||
|
function PutI16Mode(a, b) {
|
||
|
if (VP8PutBit(a, (b == TM_PRED || b == H_PRED), 156)) {
|
||
|
VP8PutBit(a, b == TM_PRED, 128)
|
||
|
} else {
|
||
|
VP8PutBit(a, b == V_PRED, 163)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function PutUVMode(a, b) {
|
||
|
if (VP8PutBit(a, b != DC_PRED, 142)) {
|
||
|
if (VP8PutBit(a, b != V_PRED, 114)) {
|
||
|
VP8PutBit(a, b != H_PRED, 183)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function PutSegment(a, s, p, b) {
|
||
|
if (VP8PutBit(a, s >= 2, p[b + 0])) b += 1;
|
||
|
VP8PutBit(a, s & 1, p[b + 1])
|
||
|
}
|
||
|
var dy = newObjectIt(bV);
|
||
|
|
||
|
function VP8CodeIntraModes(a) {
|
||
|
var b = a.bw_;
|
||
|
var c = (dy);
|
||
|
VP8IteratorInit(a, c);
|
||
|
do {
|
||
|
var d = c.mb_[c.mb_off];
|
||
|
var e = c.preds_;
|
||
|
var f = c.preds_off;
|
||
|
if (a.segment_hdr_.update_map_) {
|
||
|
PutSegment(b, d.segment_, a.proba_.segments_, 0)
|
||
|
}
|
||
|
if (a.proba_.use_skip_proba_) {
|
||
|
VP8PutBit(b, d.skip_, a.proba_.skip_proba_)
|
||
|
}
|
||
|
if (VP8PutBit(b, (d.type_ != 0), 145)) {
|
||
|
PutI16Mode(b, e[f + 0])
|
||
|
} else {
|
||
|
var g = a.preds_w_;
|
||
|
var h = e;
|
||
|
var i = f - g;
|
||
|
var x, y;
|
||
|
for (y = 0; y < 4; ++y) {
|
||
|
var j = e[f - 1];
|
||
|
for (x = 0; x < 4; ++x) {
|
||
|
var k = dx[h[i + x]][j];
|
||
|
j = PutI4Mode(b, e[f + x], k)
|
||
|
}
|
||
|
i = f;
|
||
|
f += g
|
||
|
}
|
||
|
}
|
||
|
PutUVMode(b, d.uv_mode_)
|
||
|
} while (VP8IteratorNext(c, 0, 0))
|
||
|
}
|
||
|
var dz = new Array(new Array(new Array(new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(223, 241, 252, 255, 255, 255, 255, 255, 255, 255, 255), new Array(249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255), new Array(234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255), new Array(250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255), new Array(254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255))), new Array(new Array(new Array(217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(225, 252, 241, 253, 255, 255, 254, 255, 255, 255, 255), new Array(234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255)), new Array(new Array(255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255), new Array(250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255))), new Array(new Array(new Array(186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255), new Array(234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255), new Array(251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255)), new Array(new Array(255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255), new Array(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)), new Array(new Array(255, 254, 255, 255, 255, 255, 255, 255, 255, 255,
|
||
|
|
||
|
function VP8WriteProbas(a, d) {
|
||
|
var t, b, c, p;
|
||
|
for (t = 0; t < NUM_TYPES; ++t) {
|
||
|
for (b = 0; b < NUM_BANDS; ++b) {
|
||
|
for (c = 0; c < NUM_CTX; ++c) {
|
||
|
for (p = 0; p < NUM_PROBAS; ++p) {
|
||
|
var e = d.coeffs_[t][b][c][p];
|
||
|
var f = (e != dw[t][b][c][p]) + 0;
|
||
|
if (VP8PutBit(a, f, dz[t][b][c][p])) {
|
||
|
VP8PutValue(a, e, 8)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (VP8PutBitUniform(a, d.use_skip_proba_)) {
|
||
|
VP8PutValue(a, d.skip_proba_, 8)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function ClipAlpha(a) {
|
||
|
return a < 0 ? 0 : a > 255 ? 255 : a
|
||
|
}
|
||
|
|
||
|
function VP8GetAlpha(a) {
|
||
|
var b = 0,
|
||
|
den = 0,
|
||
|
val = 0;
|
||
|
var k;
|
||
|
var c = int;
|
||
|
for (k = 0; k < bc; ++k) {
|
||
|
if (a[k + 1]) {
|
||
|
val += a[k + 1];
|
||
|
b += val * (k + 1);
|
||
|
den += (k + 1) * (k + 1)
|
||
|
}
|
||
|
}
|
||
|
c = den ? parseInt(10 * b / den - 5) : 0;
|
||
|
return ClipAlpha(c)
|
||
|
}
|
||
|
|
||
|
function CollectHistogram(a, b, c, d, e, f) {
|
||
|
var g = Arr(bc + 1, 0);
|
||
|
var h = Arr(16, int16_t);
|
||
|
var j, k;
|
||
|
for (j = e; j < f; ++j) {
|
||
|
dG(a, b + di[j], c, d + di[j], h);
|
||
|
for (k = 0; k < 16; ++k) {
|
||
|
var v = Math.abs(h[k]) >> 2;
|
||
|
h[k] = (v > bc) ? bc : v
|
||
|
}
|
||
|
for (k = 0; k < 16; ++k) {
|
||
|
g[h[k]]++
|
||
|
}
|
||
|
}
|
||
|
return VP8GetAlpha(g)
|
||
|
}
|
||
|
var cj = Arr((255 + 510 + 1), uint8_t);
|
||
|
var ck = 0;
|
||
|
|
||
|
function InitTables(a) {
|
||
|
if (!ck) {
|
||
|
var i;
|
||
|
for (i = -255; i <= 255 + 255; ++i) {
|
||
|
cj[255 + i] = (i < 0) ? 0 : (i > 255) ? 255 : i
|
||
|
}
|
||
|
ck = 1
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function clip_8b(v) {
|
||
|
return (!(v & ~0xff)) ? v : v < 0 ? 0 : 255
|
||
|
}
|
||
|
var dA = 20091 + (1 << 16);
|
||
|
var dB = 35468;
|
||
|
|
||
|
function MUL(a, b) {
|
||
|
return (((a) * (b)) >> 16)
|
||
|
}
|
||
|
var C = Arr(4 * 4, int),
|
||
|
dD, tmp_off;
|
||
|
tmp_off = 0;
|
||
|
|
||
|
function ITransformOne(e, f, g, h, j, k) {
|
||
|
var C = Arr(4 * 4, int),
|
||
|
dD, tmp_off;
|
||
|
tmp_off = 0;
|
||
|
var i;
|
||
|
dD = C;
|
||
|
for (i = 0; i < 4; ++i) {
|
||
|
var a = g[h + 0] + g[h + 8];
|
||
|
var b = g[h + 0] - g[h + 8];
|
||
|
var c = ((g[h + 4] * dB) >> 16) - ((g[h + 12] * dA) >> 16);
|
||
|
var d = ((g[h + 4] * dA) >> 16) + ((g[h + 12] * dB) >> 16);
|
||
|
dD[tmp_off + 0] = a + d;
|
||
|
dD[tmp_off + 1] = b + c;
|
||
|
dD[tmp_off + 2] = b - c;
|
||
|
dD[tmp_off + 3] = a - d;
|
||
|
tmp_off += 4;
|
||
|
h++
|
||
|
}
|
||
|
tmp_off = 0;
|
||
|
for (i = 0; i < 4; ++i) {
|
||
|
var l = dD[tmp_off + 0] + 4;
|
||
|
var a = l + dD[tmp_off + 8];
|
||
|
var b = l - dD[tmp_off + 8];
|
||
|
var c = ((dD[tmp_off + 4] * dB) >> 16) - ((dD[tmp_off + 12] * dA) >> 16);
|
||
|
var d = ((dD[tmp_off + 4] * dA) >> 16) + ((dD[tmp_off + 12] * dB) >> 16);
|
||
|
j[k + 0 + i * bf] = clip_8b(e[f + 0 + i * bf] + ((a + d) >> 3));
|
||
|
j[k + 1 + i * bf] = clip_8b(e[f + 1 + i * bf] + ((b + c) >> 3));
|
||
|
j[k + 2 + i * bf] = clip_8b(e[f + 2 + i * bf] + ((b - c) >> 3));
|
||
|
j[k + 3 + i * bf] = clip_8b(e[f + 3 + i * bf] + ((a - d) >> 3));
|
||
|
tmp_off++
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function ITransform(a, b, c, d, e, f, g) {
|
||
|
ITransformOne(a, b, c, d, e, f);
|
||
|
if (g) {
|
||
|
ITransformOne(a, b + 4, c, d + 16, e, f + 4)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function FTransform(a, b, c, d, e) {
|
||
|
var i;
|
||
|
for (i = 0; i < 4; ++i) {
|
||
|
var f = a[b + 0] - c[d + 0];
|
||
|
var g = a[b + 1] - c[d + 1];
|
||
|
var h = a[b + 2] - c[d + 2];
|
||
|
var j = a[b + 3] - c[d + 3];
|
||
|
var k = (f + j) << 3;
|
||
|
var l = (g + h) << 3;
|
||
|
var m = (g - h) << 3;
|
||
|
var n = (f - j) << 3;
|
||
|
dD[0 + i * 4] = (k + l) + 0;
|
||
|
dD[1 + i * 4] = (m * 2217 + n * 5352 + 14500) >> 12;
|
||
|
dD[2 + i * 4] = (k - l) + 0;
|
||
|
dD[3 + i * 4] = (n * 2217 - m * 5352 + 7500) >> 12;
|
||
|
b += bf, d += bf
|
||
|
}
|
||
|
for (i = 0; i < 4; ++i) {
|
||
|
var k = (dD[0 + i] + dD[12 + i]);
|
||
|
var l = (dD[4 + i] + dD[8 + i]);
|
||
|
var m = (dD[4 + i] - dD[8 + i]);
|
||
|
var n = (dD[0 + i] - dD[12 + i]);
|
||
|
e[0 + i] = (k + l + 7) >> 4;
|
||
|
e[4 + i] = ((m * 2217 + n * 5352 + 12000) >> 16) + (n != 0) + 0;
|
||
|
e[8 + i] = (k - l + 7) >> 4;
|
||
|
e[12 + i] = ((n * 2217 - m * 5352 + 51000) >> 16)
|
||
|
}
|
||
|
return e
|
||
|
}
|
||
|
var dC = 0;
|
||
|
|
||
|
function ITransformWHT(a, b) {
|
||
|
dC = 0;
|
||
|
var i;
|
||
|
for (i = 0; i < 4; ++i) {
|
||
|
var c = a[0 + i] + a[12 + i];
|
||
|
var d = a[4 + i] + a[8 + i];
|
||
|
var e = a[4 + i] - a[8 + i];
|
||
|
var f = a[0 + i] - a[12 + i];
|
||
|
dD[0 + i] = c + d;
|
||
|
dD[8 + i] = c - d;
|
||
|
dD[4 + i] = f + e;
|
||
|
dD[12 + i] = f - e
|
||
|
}
|
||
|
for (i = 0; i < 4; ++i) {
|
||
|
var g = dD[0 + i * 4] + 3;
|
||
|
var c = g + dD[3 + i * 4];
|
||
|
var d = dD[1 + i * 4] + dD[2 + i * 4];
|
||
|
var e = dD[1 + i * 4] - dD[2 + i * 4];
|
||
|
var f = g - dD[3 + i * 4];
|
||
|
b[dC + 0][0] = (c + d) >> 3;
|
||
|
b[dC + 1][0] = (f + e) >> 3;
|
||
|
b[dC + 2][0] = (c - d) >> 3;
|
||
|
b[dC + 3][0] = (f - e) >> 3;
|
||
|
dC += 4
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function FTransformWHT(a, b) {
|
||
|
var c = 0;
|
||
|
var i;
|
||
|
for (i = 0; i < 4; ++i) {
|
||
|
var d = (a[c + 0][0] + a[c + 2][0]) << 2;
|
||
|
var e = (a[c + 1][0] + a[c + 3][0]) << 2;
|
||
|
var f = (a[c + 1][0] - a[c + 3][0]) << 2;
|
||
|
var g = (a[c + 0][0] - a[c + 2][0]) << 2;
|
||
|
dD[0 + i * 4] = (d + e) + (d != 0) + 0;
|
||
|
dD[1 + i * 4] = g + f;
|
||
|
dD[2 + i * 4] = g - f;
|
||
|
dD[3 + i * 4] = d - e;
|
||
|
c += 4
|
||
|
}
|
||
|
for (i = 0; i < 4; ++i) {
|
||
|
var d = (dD[0 + i] + dD[8 + i]);
|
||
|
var e = (dD[4 + i] + dD[12 + i]);
|
||
|
var f = (dD[4 + i] - dD[12 + i]);
|
||
|
var g = (dD[0 + i] - dD[8 + i]);
|
||
|
var h = d + e;
|
||
|
var j = g + f;
|
||
|
var k = g - f;
|
||
|
var l = d - e;
|
||
|
b[0 + i] = (h + (h > 0) + 3) >> 3;
|
||
|
b[4 + i] = (j + (j > 0) + 3) >> 3;
|
||
|
b[8 + i] = (k + (k > 0) + 3) >> 3;
|
||
|
b[12 + i] = (l + (l > 0) + 3) >> 3
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function Fill(a, b, c, d) {
|
||
|
var j;
|
||
|
for (j = 0; j < d; ++j) {
|
||
|
memset_(a, b + j * bf, c, d)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function VerticalPred(a, b, c, d, e) {
|
||
|
var j;
|
||
|
if (c) {
|
||
|
for (j = 0; j < e; ++j) memcpy(b, a + j * bf, c, d, e)
|
||
|
} else {
|
||
|
Fill(b, a, 127, e)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function HorizontalPred(a, b, c, d, e) {
|
||
|
if (c) {
|
||
|
var j;
|
||
|
for (j = 0; j < e; ++j) {
|
||
|
memset_(b, a + j * bf, c[d + j], e)
|
||
|
}
|
||
|
} else {
|
||
|
Fill(b, a, 129, e)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function TrueMotion(a, b, c, d, e, f, g) {
|
||
|
var y;
|
||
|
if (c) {
|
||
|
if (e) {
|
||
|
var h = cj;
|
||
|
var i = +255 - c[d - 1];
|
||
|
for (y = 0; y < g; ++y) {
|
||
|
var j = h;
|
||
|
var k = i + c[d + y];
|
||
|
var x;
|
||
|
for (x = 0; x < g; ++x) {
|
||
|
b[a + x] = j[k + e[f + x]]
|
||
|
}
|
||
|
a += bf
|
||
|
}
|
||
|
} else {
|
||
|
HorizontalPred(a, b, c, d, g)
|
||
|
}
|
||
|
} else {
|
||
|
if (e) {
|
||
|
VerticalPred(a, b, e, f, g)
|
||
|
} else {
|
||
|
Fill(b, a, 129, g)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function DCMode(a, b, c, d, e, f, g, h, i) {
|
||
|
var k = 0;
|
||
|
var j;
|
||
|
if (e) {
|
||
|
for (j = 0; j < g; ++j) k += e[f + j];
|
||
|
if (c) {
|
||
|
for (j = 0; j < g; ++j) k += c[d + j]
|
||
|
} else {
|
||
|
k += k
|
||
|
}
|
||
|
k = (k + h) >> i
|
||
|
} else if (c) {
|
||
|
for (j = 0; j < g; ++j) k += c[d + j];
|
||
|
k += k;
|
||
|
k = (k + h) >> i
|
||
|
} else {
|
||
|
k = 0x80
|
||
|
}
|
||
|
Fill(b, a, k, g)
|
||
|
}
|
||
|
|
||
|
function IntraChromaPreds(a, b, c, d, e, f) {
|
||
|
DCMode(bs + b, a, c, d, e, f, 8, 8, 4);
|
||
|
VerticalPred(bu + b, a, e, f, 8);
|
||
|
HorizontalPred(bv + b, a, c, d, 8);
|
||
|
TrueMotion(bt + b, a, c, d, e, f, 8);
|
||
|
b += 8;
|
||
|
if (e) f += 8;
|
||
|
if (c) d += 16;
|
||
|
DCMode(bs + b, a, c, d, e, f, 8, 8, 4);
|
||
|
VerticalPred(bu + b, a, e, f, 8);
|
||
|
HorizontalPred(bv + b, a, c, d, 8);
|
||
|
TrueMotion(bt + b, a, c, d, e, f, 8)
|
||
|
}
|
||
|
|
||
|
function Intra16Preds(a, b, c, d, e, f) {
|
||
|
DCMode(bo + b, a, c, d, e, f, 16, 16, 5);
|
||
|
VerticalPred(bq + b, a, e, f, 16);
|
||
|
HorizontalPred(br + b, a, c, d, 16);
|
||
|
TrueMotion(bp + b, a, c, d, e, f, 16)
|
||
|
}
|
||
|
|
||
|
function AVG3(a, b, c) {
|
||
|
return (((a) + 2 * (b) + (c) + 2) >> 2)
|
||
|
};
|
||
|
|
||
|
function AVG2(a, b) {
|
||
|
return (((a) + (b) + 1) >> 1)
|
||
|
};
|
||
|
|
||
|
function VE4(a, b, c, d) {
|
||
|
var e = new Array();
|
||
|
e.push(AVG3(c[d - 1], c[d + 0], c[d + 1]));
|
||
|
e.push(AVG3(c[d + 0], c[d + 1], c[d + 2]));
|
||
|
e.push(AVG3(c[d + 1], c[d + 2], c[d + 3]));
|
||
|
e.push(AVG3(c[d + 2], c[d + 3], c[d + 4]));
|
||
|
var i;
|
||
|
for (i = 0; i < 4; ++i) {
|
||
|
memcpy(b, a + i * bf, e, 0, 4)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function HE4(a, b, c, d) {
|
||
|
var X = c[d - 1];
|
||
|
var I = c[d - 2];
|
||
|
var J = c[d - 3];
|
||
|
var K = c[d - 4];
|
||
|
var L = c[d - 5];
|
||
|
b[a + 0 + 0 * bf] = b[a + 1 + 0 * bf] = b[a + 2 + 0 * bf] = b[a + 3 + 0 * bf] = AVG3(X, I, J);
|
||
|
b[a + 0 + 1 * bf] = b[a + 1 + 1 * bf] = b[a + 2 + 1 * bf] = b[a + 3 + 1 * bf] = AVG3(I, J, K);
|
||
|
b[a + 0 + 2 * bf] = b[a + 1 + 2 * bf] = b[a + 2 + 2 * bf] = b[a + 3 + 2 * bf] = AVG3(J, K, L);
|
||
|
b[a + 0 + 3 * bf] = b[a + 1 + 3 * bf] = b[a + 2 + 3 * bf] = b[a + 3 + 3 * bf] = AVG3(K, L, L)
|
||
|
}
|
||
|
|
||
|
function DC4(a, b, c, d) {
|
||
|
var e = 4;
|
||
|
var i;
|
||
|
for (i = 0; i < 4; ++i) e += c[d + i] + c[d - 5 + i];
|
||
|
Fill(b, a, e >> 3, 4)
|
||
|
}
|
||
|
|
||
|
function RD4(a, b, c, d) {
|
||
|
var X = c[d - 1];
|
||
|
var I = c[d - 2];
|
||
|
var J = c[d - 3];
|
||
|
var K = c[d - 4];
|
||
|
var L = c[d - 5];
|
||
|
var A = c[d + 0];
|
||
|
var B = c[d + 1];
|
||
|
var C = c[d + 2];
|
||
|
var D = c[d + 3];
|
||
|
b[a + (0) + (3) * bf] = AVG3(J, K, L);
|
||
|
b[a + (0) + (2) * bf] = b[a + (1) + (3) * bf] = AVG3(I, J, K);
|
||
|
b[a + (0) + (1) * bf] = b[a + (1) + (2) * bf] = b[a + (2) + (3) * bf] = AVG3(X, I, J);
|
||
|
b[a + (0) + (0) * bf] = b[a + (1) + (1) * bf] = b[a + (2) + (2) * bf] = b[a + (3) + (3) * bf] = AVG3(A, X, I);
|
||
|
b[a + (1) + (0) * bf] = b[a + (2) + (1) * bf] = b[a + (3) + (2) * bf] = AVG3(B, A, X);
|
||
|
b[a + (2) + (0) * bf] = b[a + (3) + (1) * bf] = AVG3(C, B, A);
|
||
|
b[a + (3) + (0) * bf] = AVG3(D, C, B)
|
||
|
}
|
||
|
|
||
|
function LD4(a, b, c, d) {
|
||
|
var A = c[d + 0];
|
||
|
var B = c[d + 1];
|
||
|
var C = c[d + 2];
|
||
|
var D = c[d + 3];
|
||
|
var E = c[d + 4];
|
||
|
var F = c[d + 5];
|
||
|
var G = c[d + 6];
|
||
|
var H = c[d + 7];
|
||
|
b[a + (0) + (0) * bf] = AVG3(A, B, C);
|
||
|
b[a + (1) + (0) * bf] = b[a + (0) + (1) * bf] = AVG3(B, C, D);
|
||
|
b[a + (2) + (0) * bf] = b[a + (1) + (1) * bf] = b[a + (0) + (2) * bf] = AVG3(C, D, E);
|
||
|
b[a + (3) + (0) * bf] = b[a + (2) + (1) * bf] = b[a + (1) + (2) * bf] = b[a + (0) + (3) * bf] = AVG3(D, E, F);
|
||
|
b[a + (3) + (1) * bf] = b[a + (2) + (2) * bf] = b[a + (1) + (3) * bf] = AVG3(E, F, G);
|
||
|
b[a + (3) + (2) * bf] = b[a + (2) + (3) * bf] = AVG3(F, G, H);
|
||
|
b[a + (3) + (3) * bf] = AVG3(G, H, H)
|
||
|
}
|
||
|
|
||
|
function VR4(a, b, c, d) {
|
||
|
var X = c[d - 1];
|
||
|
var I = c[d - 2];
|
||
|
var J = c[d - 3];
|
||
|
var K = c[d - 4];
|
||
|
var A = c[d + 0];
|
||
|
var B = c[d + 1];
|
||
|
var C = c[d + 2];
|
||
|
var D = c[d + 3];
|
||
|
b[a + (0) + (0) * bf] = b[a + (1) + (2) * bf] = AVG2(X, A);
|
||
|
b[a + (1) + (0) * bf] = b[a + (2) + (2) * bf] = AVG2(A, B);
|
||
|
b[a + (2) + (0) * bf] = b[a + (3) + (2) * bf] = AVG2(B, C);
|
||
|
b[a + (3) + (0) * bf] = AVG2(C, D);
|
||
|
b[a + (0) + (3) * bf] = AVG3(K, J, I);
|
||
|
b[a + (0) + (2) * bf] = AVG3(J, I, X);
|
||
|
b[a + (0) + (1) * bf] = b[a + (1) + (3) * bf] = AVG3(I, X, A);
|
||
|
b[a + (1) + (1) * bf] = b[a + (2) + (3) * bf] = AVG3(X, A, B);
|
||
|
b[a + (2) + (1) * bf] = b[a + (3) + (3) * bf] = AVG3(A, B, C);
|
||
|
b[a + (3) + (1) * bf] = AVG3(B, C, D)
|
||
|
}
|
||
|
|
||
|
function VL4(a, b, c, d) {
|
||
|
var A = c[d + 0];
|
||
|
var B = c[d + 1];
|
||
|
var C = c[d + 2];
|
||
|
var D = c[d + 3];
|
||
|
var E = c[d + 4];
|
||
|
var F = c[d + 5];
|
||
|
var G = c[d + 6];
|
||
|
var H = c[d + 7];
|
||
|
b[a + (0) + (0) * bf] = AVG2(A, B);
|
||
|
b[a + (1) + (0) * bf] = b[a + (0) + (2) * bf] = AVG2(B, C);
|
||
|
b[a + (2) + (0) * bf] = b[a + (1) + (2) * bf] = AVG2(C, D);
|
||
|
b[a + (3) + (0) * bf] = b[a + (2) + (2) * bf] = AVG2(D, E);
|
||
|
b[a + (0) + (1) * bf] = AVG3(A, B, C);
|
||
|
b[a + (1) + (1) * bf] = b[a + (0) + (3) * bf] = AVG3(B, C, D);
|
||
|
b[a + (2) + (1) * bf] = b[a + (1) + (3) * bf] = AVG3(C, D, E);
|
||
|
b[a + (3) + (1) * bf] = b[a + (2) + (3) * bf] = AVG3(D, E, F);
|
||
|
b[a + (3) + (2) * bf] = AVG3(E, F, G);
|
||
|
b[a + (3) + (3) * bf] = AVG3(F, G, H)
|
||
|
}
|
||
|
|
||
|
function HU4(a, b, c, d) {
|
||
|
var I = c[d - 2];
|
||
|
var J = c[d - 3];
|
||
|
var K = c[d - 4];
|
||
|
var L = c[d - 5];
|
||
|
b[a + (0) + (0) * bf] = AVG2(I, J);
|
||
|
b[a + (2) + (0) * bf] = b[a + (0) + (1) * bf] = AVG2(J, K);
|
||
|
b[a + (2) + (1) * bf] = b[a + (0) + (2) * bf] = AVG2(K, L);
|
||
|
b[a + (1) + (0) * bf] = AVG3(I, J, K);
|
||
|
b[a + (3) + (0) * bf] = b[a + (1) + (1) * bf] = AVG3(J, K, L);
|
||
|
b[a + (3) + (1) * bf] = b[a + (1) + (2) * bf] = AVG3(K, L, L);
|
||
|
b[a + (3) + (2) * bf] = b[a + (2) + (2) * bf] = b[a + (0) + (3) * bf] = b[a + (1) + (3) * bf] = b[a + (2) + (3) * bf] = b[a + (3) + (3) * bf] = L
|
||
|
}
|
||
|
|
||
|
function HD4(a, b, c, d) {
|
||
|
var X = c[d - 1];
|
||
|
var I = c[d - 2];
|
||
|
var J = c[d - 3];
|
||
|
var K = c[d - 4];
|
||
|
var L = c[d - 5];
|
||
|
var A = c[d + 0];
|
||
|
var B = c[d + 1];
|
||
|
var C = c[d + 2];
|
||
|
b[a + (0) + (0) * bf] = b[a + (2) + (1) * bf] = AVG2(I, X);
|
||
|
b[a + (0) + (1) * bf] = b[a + (2) + (2) * bf] = AVG2(J, I);
|
||
|
b[a + (0) + (2) * bf] = b[a + (2) + (3) * bf] = AVG2(K, J);
|
||
|
b[a + (0) + (3) * bf] = AVG2(L, K);
|
||
|
b[a + (3) + (0) * bf] = AVG3(A, B, C);
|
||
|
b[a + (2) + (0) * bf] = AVG3(X, A, B);
|
||
|
b[a + (1) + (0) * bf] = b[a + (3) + (1) * bf] = AVG3(I, X, A);
|
||
|
b[a + (1) + (1) * bf] = b[a + (3) + (2) * bf] = AVG3(J, I, X);
|
||
|
b[a + (1) + (2) * bf] = b[a + (3) + (3) * bf] = AVG3(K, J, I);
|
||
|
b[a + (1) + (3) * bf] = AVG3(L, K, J)
|
||
|
}
|
||
|
|
||
|
function TM4(a, b, c, d) {
|
||
|
var x, y;
|
||
|
var e = cj;
|
||
|
var f = +255 - c[d - 1];
|
||
|
for (y = 0; y < 4; ++y) {
|
||
|
var g = e;
|
||
|
var h = f + c[d - 2 - y];
|
||
|
for (x = 0; x < 4; ++x) {
|
||
|
b[a + x] = g[h + c[d + x]]
|
||
|
}
|
||
|
a += bf
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function Intra4Preds(a, b, c, d) {
|
||
|
DC4(bw + b, a, c, d);
|
||
|
TM4(bx + b, a, c, d);
|
||
|
VE4(by + b, a, c, d);
|
||
|
HE4(bz + b, a, c, d);
|
||
|
RD4(bA + b, a, c, d);
|
||
|
VR4(bB + b, a, c, d);
|
||
|
LD4(bC + b, a, c, d);
|
||
|
VL4(bD + b, a, c, d);
|
||
|
HD4(bE + b, a, c, d);
|
||
|
HU4(bF + b, a, c, d)
|
||
|
}
|
||
|
|
||
|
function GetSSE(a, c, b, d, w, h) {
|
||
|
var e = 0;
|
||
|
var y, x;
|
||
|
for (y = 0; y < h; ++y) {
|
||
|
for (x = 0; x < w; ++x) {
|
||
|
var f = a[c + x] - b[d + x];
|
||
|
e += f * f
|
||
|
}
|
||
|
c += bf;
|
||
|
d += bf
|
||
|
}
|
||
|
return e
|
||
|
}
|
||
|
|
||
|
function SSE16x16(a, c, b, d) {
|
||
|
return GetSSE(a, c, b, d, 16, 16)
|
||
|
}
|
||
|
|
||
|
function SSE16x8(a, c, b, d) {
|
||
|
return GetSSE(a, c, b, d, 16, 8)
|
||
|
}
|
||
|
|
||
|
function SSE8x8(a, c, b, d) {
|
||
|
return GetSSE(a, c, b, d, 8, 8)
|
||
|
}
|
||
|
|
||
|
function SSE4x4(a, c, b, d) {
|
||
|
return GetSSE(a, c, b, d, 4, 4)
|
||
|
}
|
||
|
var dD = Arr(16, int);
|
||
|
|
||
|
function TTransform(a, b, w) {
|
||
|
var c = 0;
|
||
|
var i;
|
||
|
var d = 0;
|
||
|
for (i = 0; i < 4; ++i) {
|
||
|
var e = (a[b + 0] + a[b + 2]) << 2;
|
||
|
var f = (a[b + 1] + a[b + 3]) << 2;
|
||
|
var g = (a[b + 1] - a[b + 3]) << 2;
|
||
|
var h = (a[b + 0] - a[b + 2]) << 2;
|
||
|
dD[0 + i * 4] = e + f + (e != 0) + 0;
|
||
|
dD[1 + i * 4] = h + g;
|
||
|
dD[2 + i * 4] = h - g;
|
||
|
dD[3 + i * 4] = e - f;
|
||
|
b += bf
|
||
|
}
|
||
|
for (i = 0; i < 4; ++i) {
|
||
|
var e = (dD[0 + i] + dD[8 + i]);
|
||
|
var f = (dD[4 + i] + dD[12 + i]);
|
||
|
var g = (dD[4 + i] - dD[12 + i]);
|
||
|
var h = (dD[0 + i] - dD[8 + i]);
|
||
|
var j = e + f;
|
||
|
var k = h + g;
|
||
|
var l = h - g;
|
||
|
var m = e - f;
|
||
|
c += w[d + 0] * ((Math.abs(j) + 3) >> 3);
|
||
|
c += w[d + 4] * ((Math.abs(k) + 3) >> 3);
|
||
|
c += w[d + 8] * ((Math.abs(l) + 3) >> 3);
|
||
|
c += w[d + 12] * ((Math.abs(m) + 3) >> 3);
|
||
|
++d
|
||
|
}
|
||
|
return c
|
||
|
}
|
||
|
|
||
|
function Disto4x4(a, c, b, d, w) {
|
||
|
var e = TTransform(a, c, w);
|
||
|
var f = TTransform(b, d, w);
|
||
|
return (Math.abs(f - e) + 8) >> 4
|
||
|
}
|
||
|
|
||
|
function Disto16x16(a, c, b, d, w) {
|
||
|
var D = 0;
|
||
|
var x, y = int;
|
||
|
for (y = 0; y < 16 * bf; y += 4 * bf) {
|
||
|
for (x = 0; x < 16; x += 4) {
|
||
|
D += Disto4x4(a, c + x + y, b, d + x + y, w)
|
||
|
}
|
||
|
}
|
||
|
return D
|
||
|
}
|
||
|
|
||
|
function QuantizeBlock(a, b, n, c) {
|
||
|
var d = -1;
|
||
|
for (; n < 16; ++n) {
|
||
|
var j = cV[n];
|
||
|
var e = (a[j] < 0);
|
||
|
var f = (e ? -a[j] : a[j]) + c.sharpen_[j];
|
||
|
if (f > 2047) f = 2047;
|
||
|
if (f > c.zthresh_[j]) {
|
||
|
var Q = c.q_[j];
|
||
|
var g = c.iq_[j];
|
||
|
var B = c.bias_[j];
|
||
|
b[n] = QUANTDIV(f, g, B);
|
||
|
if (e) b[n] = -b[n];
|
||
|
a[j] = b[n] * Q;
|
||
|
if (b[n]) d = n
|
||
|
} else {
|
||
|
b[n] = 0;
|
||
|
a[j] = 0
|
||
|
}
|
||
|
}
|
||
|
return (d >= 0) + 0
|
||
|
}
|
||
|
|
||
|
function Copy(a, b, c, d, e) {
|
||
|
var y;
|
||
|
for (y = 0; y < e; ++y) {
|
||
|
memcpy(c, d, a, b, e);
|
||
|
b += bf;
|
||
|
d += bf
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function Copy4x4(a, b, c, d) {
|
||
|
Copy(a, b, c, d, 4)
|
||
|
}
|
||
|
|
||
|
function Copy8x8(a, b, c, d) {
|
||
|
Copy(a, b, c, d, 8)
|
||
|
}
|
||
|
|
||
|
function Copy16x16(a, b, c, d) {
|
||
|
Copy(a, b, c, d, 16)
|
||
|
}
|
||
|
var dE;
|
||
|
var dF;
|
||
|
var dG;
|
||
|
var dH;
|
||
|
var dI;
|
||
|
var dJ;
|
||
|
var dK;
|
||
|
var dL;
|
||
|
var dM;
|
||
|
var dN;
|
||
|
var dO;
|
||
|
var dP;
|
||
|
var dQ;
|
||
|
var dR;
|
||
|
var dS;
|
||
|
var dT;
|
||
|
var dU;
|
||
|
var dV;
|
||
|
|
||
|
function VP8EncDspInit(a) {
|
||
|
InitTables();
|
||
|
dE = CollectHistogram;
|
||
|
dF = ITransform;
|
||
|
dG = FTransform;
|
||
|
dH = ITransformWHT;
|
||
|
dI = FTransformWHT;
|
||
|
dJ = Intra4Preds;
|
||
|
dK = Intra16Preds;
|
||
|
dL = IntraChromaPreds;
|
||
|
dM = SSE16x16;
|
||
|
dN = SSE8x8;
|
||
|
dO = SSE16x8;
|
||
|
dP = SSE4x4;
|
||
|
dQ = Disto4x4;
|
||
|
dR = Disto16x16;
|
||
|
dS = QuantizeBlock;
|
||
|
dT = Copy4x4;
|
||
|
dU = Copy8x8;
|
||
|
dV = Copy16x16
|
||
|
}
|
||
|
|
||
|
function WebPConfigInitInternal(a, b, c, d) {
|
||
|
if (d != N) {
|
||
|
return 0
|
||
|
}
|
||
|
if (a == null) return 0;
|
||
|
a.quality = c;
|
||
|
a.target_size = 0;
|
||
|
a.target_PSNR = 0.;
|
||
|
a.method = 3;
|
||
|
a.sns_strength = 50;
|
||
|
a.filter_strength = 20;
|
||
|
a.filter_sharpness = 0;
|
||
|
a.filter_type = 0;
|
||
|
a.partitions = 0;
|
||
|
a.segments = 4;
|
||
|
a.pass = 1;
|
||
|
a.show_compressed = 0;
|
||
|
a.preprocessing = 0;
|
||
|
a.autofilter = 0;
|
||
|
a.alpha_compression = 0;
|
||
|
a.partition_limit = 0;
|
||
|
if (ea) {
|
||
|
a.quality = ea.quality ? ea.quality : c;
|
||
|
a.target_size = ea.target_size ? ea.target_size : 0;
|
||
|
a.target_PSNR = ea.target_PSNR ? ea.target_PSNR : 0.;
|
||
|
a.method = ea.method ? ea.method : 0;
|
||
|
a.sns_strength = ea.sns_strength ? ea.sns_strength : 50;
|
||
|
a.filter_strength = ea.filter_strength ? ea.filter_strength : 20;
|
||
|
a.filter_sharpness = ea.filter_sharpness ? ea.filter_sharpness : 0;
|
||
|
a.filter_type = ea.filter_type ? ea.filter_type : 0;
|
||
|
a.partitions = ea.partitions ? ea.partitions : 0;
|
||
|
a.segments = ea.segments ? ea.segments : 4;
|
||
|
a.pass = ea.pass ? ea.pass : 1;
|
||
|
a.show_compressed = ea.show_compressed ? ea.show_compressed : 0;
|
||
|
a.preprocessing = ea.preprocessing ? ea.preprocessing : 0;
|
||
|
a.autofilter = ea.autofilter ? ea.autofilter : 0;
|
||
|
a.alpha_compression = ea.alpha_compression ? ea.alpha_compression : 0;
|
||
|
a.partition_limit = ea.partition_limit ? ea.partition_limit : 0;
|
||
|
b = ea.Preset ? ea.preset : P.WEBP_PRESET_DEFAULT
|
||
|
}
|
||
|
switch (b) {
|
||
|
case P.WEBP_PRESET_PICTURE:
|
||
|
a.sns_strength = 80;
|
||
|
a.filter_sharpness = 4;
|
||
|
a.filter_strength = 35;
|
||
|
break;
|
||
|
case P.WEBP_PRESET_PHOTO:
|
||
|
a.sns_strength = 80;
|
||
|
a.filter_sharpness = 3;
|
||
|
a.filter_strength = 30;
|
||
|
break;
|
||
|
case P.WEBP_PRESET_DRAWING:
|
||
|
a.sns_strength = 25;
|
||
|
a.filter_sharpness = 6;
|
||
|
a.filter_strength = 10;
|
||
|
break;
|
||
|
case P.WEBP_PRESET_ICON:
|
||
|
a.sns_strength = 0;
|
||
|
a.filter_strength = 0;
|
||
|
break;
|
||
|
case P.WEBP_PRESET_TEXT:
|
||
|
a.sns_strength = 0;
|
||
|
a.filter_strength = 0;
|
||
|
a.segments = 2;
|
||
|
break;
|
||
|
case P.WEBP_PRESET_DEFAULT:
|
||
|
default:
|
||
|
break
|
||
|
}
|
||
|
return WebPValidateConfig(a)
|
||
|
}
|
||
|
|
||
|
function WebPValidateConfig(a) {
|
||
|
if (a == null) return 0;
|
||
|
if (a.quality < 0 || a.quality > 100) return 0;
|
||
|
if (a.target_size < 0) return 0;
|
||
|
if (a.target_PSNR < 0) return 0;
|
||
|
if (a.method < 0 || a.method > 6) return 0;
|
||
|
if (a.segments < 1 || a.segments > 4) return 0;
|
||
|
if (a.sns_strength < 0 || a.sns_strength > 100) return 0;
|
||
|
if (a.filter_strength < 0 || a.filter_strength > 100) return 0;
|
||
|
if (a.filter_sharpness < 0 || a.filter_sharpness > 7) return 0;
|
||
|
if (a.filter_type < 0 || a.filter_type > 1) return 0;
|
||
|
if (a.autofilter < 0 || a.autofilter > 1) return 0;
|
||
|
if (a.pass < 1 || a.pass > 10) return 0;
|
||
|
if (a.show_compressed < 0 || a.show_compressed > 1) return 0;
|
||
|
if (a.preprocessing < 0 || a.preprocessing > 1) return 0;
|
||
|
if (a.partitions < 0 || a.partitions > 3) return 0;
|
||
|
if (a.partition_limit < 0 || a.partition_limit > 100) return 0;
|
||
|
if (a.alpha_compression < 0) return 0;
|
||
|
return 1
|
||
|
}
|
||
|
var dW = 16384;
|
||
|
this.WebPGetEncoderVersion = function(a) {
|
||
|
return (Z << 16) | (ba << 8) | bb
|
||
|
};
|
||
|
|
||
|
function DummyWriter(a, b, c) {
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function WebPPictureInitInternal(d, e) {
|
||
|
if (e != N) {
|
||
|
return 0
|
||
|
}
|
||
|
if (d) {
|
||
|
d = newObjectIt(V);
|
||
|
d.writer = function DummyWriter(a, b, c) {};
|
||
|
WebPEncodingSetError(d, U)
|
||
|
}
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function ResetSegmentHeader(a) {
|
||
|
var b = a.segment_hdr_;
|
||
|
b.num_segments_ = a.config_.segments;
|
||
|
b.update_map_ = (b.num_segments_ > 1) + 0;
|
||
|
b.size_ = 0
|
||
|
}
|
||
|
|
||
|
function ResetFilterHeader(a) {
|
||
|
var b = a.filter_hdr_;
|
||
|
b.simple_ = 1;
|
||
|
b.level_ = 0;
|
||
|
b.sharpness_ = 0;
|
||
|
b.i4x4_lf_delta_ = 0
|
||
|
}
|
||
|
|
||
|
function ResetBoundaryPredictions(a) {
|
||
|
var i;
|
||
|
var b = a.preds_;
|
||
|
var c = a.preds_off - a.preds_w_;
|
||
|
var d = a.preds_;
|
||
|
var e = a.preds_off - 1;
|
||
|
for (i = -1; i < 4 * a.mb_w_; ++i) {
|
||
|
b[c + i] = bd
|
||
|
}
|
||
|
for (i = 0; i < 4 * a.mb_h_; ++i) {
|
||
|
d[e + i * a.preds_w_] = bd
|
||
|
}
|
||
|
a.nz_[1 - 1] = 0
|
||
|
}
|
||
|
|
||
|
function MapConfigToTools(a) {
|
||
|
var b = a.config_.method;
|
||
|
var c = 100 - a.config_.partition_limit;
|
||
|
a.method_ = b;
|
||
|
a.rd_opt_level_ = (b >= 6) ? 3 : (b >= 5) ? 2 : (b >= 3) ? 1 : 0;
|
||
|
a.max_i4_header_bits_ = parseInt(256 * 16 * 16 * (c * c) / (100 * 100))
|
||
|
}
|
||
|
|
||
|
function InitEncoder(a, b) {
|
||
|
var c = (a.filter_strength > 0) || (a.autofilter > 0);
|
||
|
var d = (b.width + 15) >> 4;
|
||
|
var e = (b.height + 15) >> 4;
|
||
|
var f = 4 * d + 1;
|
||
|
var g = 4 * e + 1;
|
||
|
var h = f * g * sizeof(uint8_t);
|
||
|
var i = d * 16;
|
||
|
var j = (d + 1) * sizeof(uint32_t);
|
||
|
var k = (3 * bi + bj) * sizeof(uint8_t);
|
||
|
var l = d * e * sizeof(bQ);
|
||
|
var m = (2 * i + 16 + 16 + 16 + 8 + 1 + 2 * bn) * sizeof(uint8_t);
|
||
|
var n = a.autofilter ? sizeof(bM) + bn : 0;
|
||
|
var o = newObjectIt(bT);
|
||
|
var p = uint8_t;
|
||
|
var q = sizeof(bT) + bn + k + l + h + m + j + n;
|
||
|
p = malloc(q, uint8_t);
|
||
|
if (p == null) {
|
||
|
WebPEncodingSetError(b, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
||
|
return null
|
||
|
}
|
||
|
o.num_parts_ = 1 << a.partitions;
|
||
|
o.mb_w_ = d;
|
||
|
o.mb_h_ = e;
|
||
|
o.preds_w_ = f;
|
||
|
o.yuv_in_ = membuild(uint8_t, bi);
|
||
|
o.yuv_out_ = membuild(uint8_t, bi);
|
||
|
o.yuv_out2_ = membuild(uint8_t, bi);
|
||
|
o.yuv_p_ = membuild(uint8_t, bj);
|
||
|
o.mb_info_ = Arr_nOI(l, bQ);
|
||
|
o.preds_ = Arr((f * g * sizeof(uint8_t) + 1 + o.preds_w_), uint8_t);
|
||
|
o.preds_off = +1 + o.preds_w_;
|
||
|
o.nz_ = Arr(1 + j, uint8_t);
|
||
|
o.nz_off = 1;
|
||
|
o.lf_stats_ = n ? newObjectIt(bM) : null;
|
||
|
o.y_top_ = Arr((2 * i + (16) + (16 + 16) + (16) + (8)), uint8_t);
|
||
|
o.y_top_off = 0;
|
||
|
o.uv_top_ = o.y_top_;
|
||
|
o.uv_top_off = o.y_top_off + i;
|
||
|
o.y_left_ = o.uv_top_;
|
||
|
o.y_left_off = (2 * i) + (16);
|
||
|
o.u_left_ = o.y_left_;
|
||
|
o.u_left_off = o.y_left_off + (16 + 16);
|
||
|
o.v_left_ = o.u_left_;
|
||
|
o.v_left_off = o.u_left_off + (16);
|
||
|
o.config_ = a;
|
||
|
o.profile_ = c ? ((a.filter_type == 1) ? 0 : 1) : 2;
|
||
|
o.pic_ = b;
|
||
|
MapConfigToTools(o);
|
||
|
VP8EncDspInit();
|
||
|
VP8DefaultProbas(o);
|
||
|
ResetSegmentHeader(o);
|
||
|
ResetFilterHeader(o);
|
||
|
ResetBoundaryPredictions(o);
|
||
|
VP8EncInitAlpha(o);
|
||
|
VP8EncInitLayer(o);
|
||
|
return o
|
||
|
}
|
||
|
|
||
|
function DeleteEncoder(a) {
|
||
|
if (a) {
|
||
|
VP8EncDeleteAlpha(a);
|
||
|
VP8EncDeleteLayer(a);
|
||
|
a = ''
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function GetPSNR(a, b) {
|
||
|
return a ? 10. * (Math.LOG10E * Math.log(255. * 255. * b / a)) : 99.
|
||
|
}
|
||
|
|
||
|
function FinalizePSNR(a) {
|
||
|
var b = a.pic_.stats;
|
||
|
var c = a.sse_count_;
|
||
|
var d = a.sse_;
|
||
|
b.PSNR[0] = parseFloat(GetPSNR(d[0], c));
|
||
|
b.PSNR[1] = parseFloat(GetPSNR(d[1], c / 4));
|
||
|
b.PSNR[2] = parseFloat(GetPSNR(d[2], c / 4));
|
||
|
b.PSNR[3] = parseFloat(GetPSNR(d[0] + d[1] + d[2], c * 3 / 2))
|
||
|
}
|
||
|
|
||
|
function StoreStats(a) {
|
||
|
var b = a.pic_.stats;
|
||
|
var c = a.pic_.stats_nozero;
|
||
|
if (c) {
|
||
|
var i, s;
|
||
|
for (i = 0; i < be; ++i) {
|
||
|
b.segment_level[i] = a.dqm_[i].fstrength_;
|
||
|
b.segment_quant[i] = a.dqm_[i].quant_;
|
||
|
for (s = 0; s <= 2; ++s) {
|
||
|
b.residual_bytes[s][i] = a.residual_bytes_[s][i]
|
||
|
}
|
||
|
}
|
||
|
FinalizePSNR(a);
|
||
|
b.coded_size = a.coded_size_;
|
||
|
for (i = 0; i < 3; ++i) {
|
||
|
b.block_count[i] = a.block_count_[i]
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function WebPEncodingSetError(a, b) {
|
||
|
assert(b <= VP8_ENC_ERROR_BAD_WRITE);
|
||
|
assert(b >= U);
|
||
|
a.error_code = b;
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
function WebPEncode(a, b) {
|
||
|
var c = newObjectIt(bT);
|
||
|
var d = int;
|
||
|
if (b == null) return 0;
|
||
|
WebPEncodingSetError(b, U);
|
||
|
if (a == null) return WebPEncodingSetError(b, VP8_ENC_ERROR_NULL_PARAMETER);
|
||
|
if (!WebPValidateConfig(a)) return WebPEncodingSetError(b, VP8_ENC_ERROR_INVALID_CONFIGURATION);
|
||
|
if (b.width <= 0 || b.height <= 0) return WebPEncodingSetError(b, VP8_ENC_ERROR_BAD_DIMENSION);
|
||
|
if (b.y == null || b.u == null || b.v == null) return WebPEncodingSetError(b, VP8_ENC_ERROR_NULL_PARAMETER);
|
||
|
if (b.width >= dW || b.height >= dW) return WebPEncodingSetError(b, VP8_ENC_ERROR_BAD_DIMENSION);
|
||
|
c = InitEncoder(a, b);
|
||
|
if (c == null) return 0;
|
||
|
d = VP8EncAnalyze(c) && VP8StatLoop(c) && VP8EncLoop(c) && VP8EncFinishAlpha(c) && VP8EncFinishLayer(c) && VP8EncWrite(c);
|
||
|
StoreStats(c);
|
||
|
DeleteEncoder(c);
|
||
|
return d
|
||
|
}
|
||
|
|
||
|
function WebPPictureAlloc(a) {
|
||
|
if (a.extra_info_type) AllocExtraInfo(a);
|
||
|
if (a) {
|
||
|
var b = a.colorspace & WEBP_CSP_UV_MASK;
|
||
|
var c = a.colorspace & WEBP_CSP_ALPHA_BIT;
|
||
|
var d = a.width;
|
||
|
var e = a.height;
|
||
|
var f = d;
|
||
|
var g = parseInt((d + 1) / 2);
|
||
|
var h = parseInt((e + 1) / 2);
|
||
|
var i = g;
|
||
|
var j = 0;
|
||
|
var k = int,
|
||
|
a_stride = int;
|
||
|
var l = uint64_t,
|
||
|
uv_size = uint64_t,
|
||
|
uv0_size = uint64_t,
|
||
|
a_size = uint64_t,
|
||
|
total_size = uint64_t;
|
||
|
var m = uint8_t;
|
||
|
var n = 0;
|
||
|
switch (b) {
|
||
|
case T:
|
||
|
break;
|
||
|
case WEBP_YUV400:
|
||
|
break;
|
||
|
case WEBP_YUV422:
|
||
|
j = g;
|
||
|
break;
|
||
|
case WEBP_YUV444:
|
||
|
j = d;
|
||
|
break;
|
||
|
default:
|
||
|
return 0
|
||
|
}
|
||
|
uv0_size = e * j;
|
||
|
k = c ? d : 0;
|
||
|
a_stride = k;
|
||
|
l = f * e;
|
||
|
uv_size = i * h;
|
||
|
a_size = a_stride * e;
|
||
|
total_size = l + a_size + 2 * uv_size + 2 * uv0_size;
|
||
|
if (d <= 0 || e <= 0 || g < 0 || h < 0 || l >= (64 * 64 * 64 * 16 << 40) || total_size != total_size) {
|
||
|
return 0
|
||
|
}
|
||
|
a.y_stride = f;
|
||
|
a.uv_stride = i;
|
||
|
a.a_stride = a_stride;
|
||
|
a.uv0_stride = j;
|
||
|
WebPPictureFree(a);
|
||
|
a.y = malloc(total_size, uint8_t);
|
||
|
a.y_off = 0;
|
||
|
if (a.y == null) return 0;
|
||
|
a.u = a.y;
|
||
|
a.u_off = a.y_off + l;
|
||
|
a.v = a.u;
|
||
|
a.v_off = a.u_off + uv_size;
|
||
|
m = malloc(total_size, uint8_t);
|
||
|
if (m == null) return 0;
|
||
|
a.y = m;
|
||
|
a.y_off = n;
|
||
|
n += l;
|
||
|
a.u = m;
|
||
|
a.u_off = n;
|
||
|
n += uv_size;
|
||
|
a.v = m;
|
||
|
a.v_off = n;
|
||
|
n += uv_size;
|
||
|
if (a_size) {
|
||
|
a.a = malloc(a_size, uint8_t);
|
||
|
a.a_off = 0
|
||
|
}
|
||
|
if (uv0_size) {
|
||
|
a.u0 = m;
|
||
|
a.u0_off = n;
|
||
|
n += uv0_size;
|
||
|
a.v0 = m;
|
||
|
a.v0_off = n;
|
||
|
n += uv0_size
|
||
|
}
|
||
|
}
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function WebPPictureGrabSpecs(a, b) {
|
||
|
if (a) b = a;
|
||
|
b.y = b.u = b.v = null;
|
||
|
b.y_off = b.u_off = b.v_off = null;
|
||
|
b.u0 = b.v0 = null;
|
||
|
b.u0_off = b.v0_off = null;
|
||
|
b.a = null;
|
||
|
b.a_off = null
|
||
|
}
|
||
|
|
||
|
function WebPPictureFree(a) {
|
||
|
if (a) {
|
||
|
a.y = '';
|
||
|
a.y = a.u = a.v = null;
|
||
|
a.y_off = a.u_off = a.v_off = 0;
|
||
|
WebPPictureGrabSpecs(null, a)
|
||
|
}
|
||
|
}
|
||
|
var dX = {
|
||
|
mem: uint8_t,
|
||
|
mem_off: 0,
|
||
|
max_size: size_t,
|
||
|
size: size_t,
|
||
|
size_off: 0
|
||
|
};
|
||
|
|
||
|
function InitMemoryWriter(a) {
|
||
|
a.mem = null;
|
||
|
a.mem_off = 0;
|
||
|
a.size = 0;
|
||
|
a.max_size = 0
|
||
|
}
|
||
|
|
||
|
function WebPMemoryWrite(a, b, c) {
|
||
|
var w = c.custom_ptr;
|
||
|
var d = size_t;
|
||
|
if (w == null) {
|
||
|
alert('w is null');
|
||
|
return 1
|
||
|
}
|
||
|
d = (w.size) + b;
|
||
|
if (d > w.max_size) {
|
||
|
var e = uint8_t;
|
||
|
var f = 0;
|
||
|
var g = w.max_size * 2;
|
||
|
if (g < d) g = d;
|
||
|
if (g < 8192) g = 8192;
|
||
|
e = malloc(g, uint8_t);
|
||
|
if (e == null) {
|
||
|
return 0
|
||
|
}
|
||
|
if ((w.size) > 0) {
|
||
|
memcpy(e, f, w.mem, 0, w.size)
|
||
|
}
|
||
|
w.mem = '';
|
||
|
w.mem = e;
|
||
|
w.max_size = g
|
||
|
}
|
||
|
if (b) {
|
||
|
memcpy((w.mem), +(w.size), a, 0, b);
|
||
|
w.size += b
|
||
|
}
|
||
|
return 1
|
||
|
}
|
||
|
var dY = 16;
|
||
|
|
||
|
function clip_uv(v) {
|
||
|
v = (v + (257 << (dY + 2 - 1))) >> (dY + 2);
|
||
|
return ((v & ~0xff) == 0) ? v : (v < 0) ? 0 : 255
|
||
|
}
|
||
|
|
||
|
function rgb_to_y(r, g, b) {
|
||
|
var a = (1 << (dY - 1)) + (16 << dY);
|
||
|
var c = 16839 * r + 33059 * g + 6420 * b;
|
||
|
return (c + a) >> dY
|
||
|
}
|
||
|
|
||
|
function rgb_to_u(r, g, b) {
|
||
|
return clip_uv(-9719 * r - 19081 * g + 28800 * b)
|
||
|
}
|
||
|
|
||
|
function rgb_to_v(r, g, b) {
|
||
|
return clip_uv(+28800 * r - 24116 * g - 4684 * b)
|
||
|
}
|
||
|
|
||
|
function MakeGray(a) {
|
||
|
var y;
|
||
|
var b = (a.width + 1) >> 1;
|
||
|
for (y = 0; y < ((a.height + 1) >> 1); ++y) {
|
||
|
memset_(a.u, a.u_off + y * a.uv_stride, 128, b);
|
||
|
memset_(a.v, a.v_off + y * a.uv_stride, 128, b)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function Import(h, i, j, k, l, m) {
|
||
|
var n = h.colorspace & WEBP_CSP_UV_MASK;
|
||
|
var x, y = int;
|
||
|
var o = i;
|
||
|
var p = +(l ? 2 : 0);
|
||
|
var q = i;
|
||
|
var s = +1;
|
||
|
var t = i;
|
||
|
var u = +(l ? 0 : 2);
|
||
|
var v = h.width;
|
||
|
var w = h.height;
|
||
|
|
||
|
function SUM4(a, b) {
|
||
|
return (a[b + 0] + a[b + k] + a[b + j] + a[b + j + k])
|
||
|
}
|
||
|
|
||
|
function SUM2H(a, b) {
|
||
|
return (2 * a[b + 0] + 2 * a[b + k])
|
||
|
}
|
||
|
|
||
|
function SUM2V(a, b) {
|
||
|
return (2 * a[b + 0] + 2 * a[b + j])
|
||
|
}
|
||
|
|
||
|
function SUM1(a, b) {
|
||
|
return (4 * a[b + 0])
|
||
|
}
|
||
|
|
||
|
function RGB_TO_UV(x, y, a) {
|
||
|
var c = (2 * (k * (x) + (y) * j));
|
||
|
var d = (x) + (y) * h.uv_stride;
|
||
|
var r = a(o, p + c);
|
||
|
var g = a(q, s + c);
|
||
|
var b = a(t, u + c);
|
||
|
h.u[h.u_off + d] = rgb_to_u(r, g, b);
|
||
|
h.v[h.v_off + d] = rgb_to_v(r, g, b)
|
||
|
}
|
||
|
|
||
|
function RGB_TO_UV0(a, c, y, d) {
|
||
|
var e = (k * (a) + (y) * j);
|
||
|
var f = (c) + (y) * h.uv0_stride;
|
||
|
var r = d(o, p + e);
|
||
|
var g = d(q, s + e);
|
||
|
var b = d(t, u + e);
|
||
|
h.u0[h.u0_off + f] = rgb_to_u(r, g, b);
|
||
|
h.v0[h.v0_off + f] = rgb_to_v(r, g, b)
|
||
|
}
|
||
|
for (y = 0; y < w; ++y) {
|
||
|
for (x = 0; x < v; ++x) {
|
||
|
var z = k * x + y * j;
|
||
|
h.y[h.y_off + x + y * h.y_stride] = rgb_to_y(o[p + z], q[s + z], t[u + z])
|
||
|
}
|
||
|
}
|
||
|
if (n != WEBP_YUV400) {
|
||
|
for (y = 0; y < (w >> 1); ++y) {
|
||
|
for (x = 0; x < (v >> 1); ++x) {
|
||
|
RGB_TO_UV(x, y, SUM4)
|
||
|
}
|
||
|
if (h.width & 1) {
|
||
|
RGB_TO_UV(x, y, SUM2V)
|
||
|
}
|
||
|
}
|
||
|
if (w & 1) {
|
||
|
for (x = 0; x < (v >> 1); ++x) {
|
||
|
RGB_TO_UV(x, y, SUM2H)
|
||
|
}
|
||
|
if (v & 1) {
|
||
|
RGB_TO_UV(x, y, SUM1)
|
||
|
}
|
||
|
}
|
||
|
if (n == WEBP_YUV422) {
|
||
|
for (y = 0; y < w; ++y) {
|
||
|
for (x = 0; x < (v >> 1); ++x) {
|
||
|
RGB_TO_UV0(2 * x, x, y, SUM2H)
|
||
|
}
|
||
|
if (v & 1) {
|
||
|
RGB_TO_UV0(2 * x, x, y, SUM1)
|
||
|
}
|
||
|
}
|
||
|
} else if (n == WEBP_YUV444) {
|
||
|
for (y = 0; y < w; ++y) {
|
||
|
for (x = 0; x < v; ++x) {
|
||
|
RGB_TO_UV0(x, x, y, SUM1)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
MakeGray(h)
|
||
|
}
|
||
|
if (m) {
|
||
|
var A = i;
|
||
|
var B = +3;
|
||
|
assert(k >= 4);
|
||
|
for (y = 0; y < w; ++y) {
|
||
|
for (x = 0; x < v; ++x) {
|
||
|
h.a[h.a_off + x + y * h.a_stride] = A[B + k * x + y * j]
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function WebPPictureImportRGB(a, b, c) {
|
||
|
a.colorspace &= ~WEBP_CSP_ALPHA_BIT;
|
||
|
if (!WebPPictureAlloc(a)) return 0;
|
||
|
return Import(a, b, c, 3, 0, 0)
|
||
|
}
|
||
|
|
||
|
function WebPPictureImportBGR(a, b, c) {
|
||
|
a.colorspace &= ~WEBP_CSP_ALPHA_BIT;
|
||
|
if (!WebPPictureAlloc(a)) return 0;
|
||
|
return Import(a, b, c, 3, 1, 0)
|
||
|
}
|
||
|
|
||
|
function WebPPictureImportRGBA(a, b, c) {
|
||
|
a.colorspace |= WEBP_CSP_ALPHA_BIT;
|
||
|
if (!WebPPictureAlloc(a)) return 0;
|
||
|
return Import(a, b, c, 4, 0, 1)
|
||
|
}
|
||
|
|
||
|
function WebPPictureImportBGRA(a, b, c) {
|
||
|
a.colorspace |= WEBP_CSP_ALPHA_BIT;
|
||
|
if (!WebPPictureAlloc(a)) return 0;
|
||
|
return Import(a, b, c, 4, 1, 1)
|
||
|
}
|
||
|
var dZ, pic_tmp;
|
||
|
|
||
|
function Encode(e, f, g, h, j, k, l) {
|
||
|
var m = 0;
|
||
|
var n = newObjectIt(V);
|
||
|
var o = newObjectIt(O);
|
||
|
var p = newObjectIt(dX);
|
||
|
var q = int;
|
||
|
n.extra_info_type = ea.extra_info_type ? ea.extra_info_type : 0;
|
||
|
if (!WebPConfigPreset(o, P.WEBP_PRESET_DEFAULT, k) || !WebPPictureInit(n)) {
|
||
|
return 0
|
||
|
}
|
||
|
n.width = f;
|
||
|
n.height = g;
|
||
|
n.writer = function(a, b, c, d) {
|
||
|
return WebPMemoryWrite(a, b, c, d)
|
||
|
};
|
||
|
n.custom_ptr = p;
|
||
|
p.mem = l.output;
|
||
|
p.size = m;
|
||
|
InitMemoryWriter(p);
|
||
|
q = j(n, e, h) && WebPEncode(o, n);
|
||
|
if (q) pic_stats = newObjectIt(n.stats);
|
||
|
else pic_stats = null;
|
||
|
if (q) pic_tmp = newObjectIt(n);
|
||
|
else pic_tmp = null;
|
||
|
WebPPictureFree(n);
|
||
|
if (!q) {
|
||
|
l = '';
|
||
|
l = null;
|
||
|
return 0
|
||
|
}
|
||
|
var r = new Array();
|
||
|
for (var i = 0; i < p.size; ++i) r.push(String.fromCharCode(p.mem[i]));
|
||
|
r = r.join("");
|
||
|
l.output = r;
|
||
|
m = p.size;
|
||
|
return m
|
||
|
}
|
||
|
this.WebPEncodeRGB = function(a, w, h, b, q, c) {
|
||
|
return Encode(a, w, h, b, WebPPictureImportRGB, q, c)
|
||
|
};
|
||
|
this.WebPEncodeBGR = function(a, w, h, b, q, c) {
|
||
|
return Encode(a, w, h, b, WebPPictureImportBGR, q, c)
|
||
|
};
|
||
|
this.WebPEncodeRGBA = function(a, w, h, b, q, c) {
|
||
|
return Encode(a, w, h, b, WebPPictureImportRGBA, q, c)
|
||
|
};
|
||
|
this.WebPEncodeBGRA = function(a, w, h, b, q, c) {
|
||
|
return Encode(a, w, h, b, WebPPictureImportBGRA, q, c)
|
||
|
};
|
||
|
var ea = null;
|
||
|
this.WebPEncodeConfig = function(a) {
|
||
|
ea = a
|
||
|
};
|
||
|
|
||
|
function AllocExtraInfo(a) {
|
||
|
var b = parseInt((a.width + 15) / 16);
|
||
|
var c = parseInt((a.height + 15) / 16);
|
||
|
a.extra_info = malloc(b * c * sizeof(a.extra_info), uint8_t)
|
||
|
}
|
||
|
this.ReturnExtraInfo = function() {
|
||
|
function l(b, l) {
|
||
|
b = b + '';
|
||
|
var a = '',
|
||
|
i;
|
||
|
var c = l - (typeof b.length !== 'undefined' ? b.length : 1);
|
||
|
c = l < 0 ? 0 : c;
|
||
|
for (i = 0; i < c; ++i) a += ' ';
|
||
|
return a + b
|
||
|
};
|
||
|
|
||
|
function PrintByteCount(a, b, c) {
|
||
|
var s, str = '';
|
||
|
var d = 0;
|
||
|
for (s = 0; s < 4; ++s) {
|
||
|
str += "| " + l(a[s], 7) + " ";
|
||
|
d += a[s];
|
||
|
if (c) c[s] += a[s]
|
||
|
}
|
||
|
return str + "| " + l(d, 7) + " (" + ((100. * d / b).toFixed(1)) + "%)\n"
|
||
|
};
|
||
|
|
||
|
function PrintPercents(a, b) {
|
||
|
var s, str = '';
|
||
|
for (s = 0; s < 4; ++s) {
|
||
|
str += "| " + l(parseInt(100 * a[s] / b), 3) + "%"
|
||
|
}
|
||
|
return str + "| " + l(b, 7) + "\n"
|
||
|
};
|
||
|
|
||
|
function PrintValues(a) {
|
||
|
var s, str = '';
|
||
|
for (s = 0; s < 4; ++s) {
|
||
|
str += "| " + l(a[s], 7) + " "
|
||
|
}
|
||
|
return str + "|\n"
|
||
|
};
|
||
|
if (!pic_stats) return '';
|
||
|
var e = pic_stats;
|
||
|
var f = e.block_count[0];
|
||
|
var g = e.block_count[1];
|
||
|
var h = e.block_count[2];
|
||
|
var j = f + g;
|
||
|
str = "" + l(e.coded_size, 7) + " bytes Y-U-V-All-PSNR " + (e.PSNR[0].toFixed(2)) + " " + (e.PSNR[1].toFixed(2)) + " " + (e.PSNR[2].toFixed(2)) + " " + (e.PSNR[3].toFixed(2)) + " dB\n";
|
||
|
if (j > 0) {
|
||
|
var k = new Array(0, 0, 0, 0);
|
||
|
str += "block count: intra4: " + f + "\n" + " intra16: " + g + " (-> " + ((100. * g / j).toFixed(2)) + "%)\n" + " skipped block: " + h + " (" + ((100. * h / j).toFixed(2)) + "%)\n" + "bytes used: header: " + l(e.header_bytes[0], 6) + " (" + ((100. * e.header_bytes[0] / e.coded_size).toFixed(1)) + "%)\n" + " mode-partition: " + l(e.header_bytes[1], 6) + " (" + ((100. * e.header_bytes[1] / e.coded_size).toFixed(1)) + "%)\n" + " Residuals bytes |segment 1|segment 2|segment 3|segment 4| total\n" + " intra4-coeffs: " + PrintByteCount(e.residual_bytes[0], e.coded_size, k) + "" + " intra16-coeffs: " + PrintByteCount(e.residual_bytes[1], e.coded_size, k) + "" + " chroma coeffs: " + PrintByteCount(e.residual_bytes[2], e.coded_size, k) + "" + " macroblocks: " + PrintPercents(e.segment_size, j) + "" + " quantizer: " + PrintValues(e.segment_quant) + "" + " filter level: " + PrintValues(e.segment_level) + "" + "------------------+---------+---------+---------+---------+-----------------\n" + " segments total: " + PrintByteCount(k, e.coded_size, null) + ""
|
||
|
}
|
||
|
str += "";
|
||
|
if (pic_tmp.extra_info) {
|
||
|
var m = parseInt((pic_tmp.width + 15) / 16);
|
||
|
var n = parseInt((pic_tmp.height + 15) / 16);
|
||
|
var o = pic_tmp.extra_info_type;
|
||
|
var x, y;
|
||
|
for (y = 0; y < n; ++y) {
|
||
|
for (x = 0; x < m; ++x) {
|
||
|
var c = pic_tmp.extra_info[x + y * m];
|
||
|
if (o == 1) {
|
||
|
var p = "+.";
|
||
|
str += p[c % 2]
|
||
|
} else if (o == 2) {
|
||
|
var q = ".-*X";
|
||
|
str += q[c % 4]
|
||
|
} else if (o == 3) {
|
||
|
str += l(c, 2) + " "
|
||
|
} else if (o == 6 || o == 7) {
|
||
|
str += l(c, 3) + " "
|
||
|
} else {
|
||
|
str += "0x" + (c < 16 ? "0" : "") + c.toString(16) + " "
|
||
|
}
|
||
|
}
|
||
|
str += "\n"
|
||
|
}
|
||
|
}
|
||
|
return str
|
||
|
}
|
||
|
}
|