transformOne method
Implementation
void transformOne(InputBuffer src, InputBuffer dst) {
final C = Int32List(4 * 4);
var si = 0;
var di = 0;
var tmp = 0;
for (var i = 0; i < 4; ++i) {
// vertical pass
final a = src[si] + src[si + 8]; // [-4096, 4094]
final b = src[si] - src[si + 8]; // [-4095, 4095]
final c =
_mul(src[si + 4], kC2) - _mul(src[si + 12], kC1); // [-3783, 3783]
final d =
_mul(src[si + 4], kC1) + _mul(src[si + 12], kC2); // [-3785, 3781]
C[tmp++] = a + d; // [-7881, 7875]
C[tmp++] = b + c; // [-7878, 7878]
C[tmp++] = b - c; // [-7878, 7878]
C[tmp++] = a - d; // [-7877, 7879]
si++;
}
// Each pass is expanding the dynamic range by ~3.85 (upper bound).
// The exact value is (2. + (kC1 + kC2) / 65536).
// After the second pass, maximum interval is [-3794, 3794], assuming
// an input in [-2048, 2047] interval. We then need to add a dst value
// in the [0, 255] range.
// In the worst case scenario, the input to clip_8b() can be as large as
// [-60713, 60968].
tmp = 0;
for (var i = 0; i < 4; ++i) {
// horizontal pass
final dc = C[tmp] + 4;
final a = dc + C[tmp + 8];
final b = dc - C[tmp + 8];
final c = _mul(C[tmp + 4], kC2) - _mul(C[tmp + 12], kC1);
final d = _mul(C[tmp + 4], kC1) + _mul(C[tmp + 12], kC2);
_store(dst, di, 0, 0, a + d);
_store(dst, di, 1, 0, b + c);
_store(dst, di, 2, 0, b - c);
_store(dst, di, 3, 0, a - d);
tmp++;
di += VP8.BPS;
}
}