transformOne method

void transformOne(
  1. InputBuffer src,
  2. InputBuffer dst
)

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;
  }
}