summaryrefslogtreecommitdiff
path: root/appl/wm/mpeg/remap2.b
diff options
context:
space:
mode:
Diffstat (limited to 'appl/wm/mpeg/remap2.b')
-rw-r--r--appl/wm/mpeg/remap2.b80
1 files changed, 80 insertions, 0 deletions
diff --git a/appl/wm/mpeg/remap2.b b/appl/wm/mpeg/remap2.b
new file mode 100644
index 00000000..5bae164f
--- /dev/null
+++ b/appl/wm/mpeg/remap2.b
@@ -0,0 +1,80 @@
+implement Remap;
+
+include "sys.m";
+include "mpegio.m";
+
+Mpegi, YCbCr: import Mpegio;
+
+CLOFF: con 255;
+
+width, height, w4: int;
+out: array of byte;
+elum: array of int;
+clamp4 := array[CLOFF + 256 + CLOFF] of int;
+
+init(m: ref Mpegi)
+{
+ width = m.width;
+ height = m.height;
+ w4 = width >> 2;
+ out = array[w4 * height] of byte;
+ elum = array[width + 1] of int;
+ for (i := 0; i < CLOFF; i++)
+ clamp4[i] = 0;
+ for (i = 0; i < 256; i++)
+ clamp4[i + CLOFF] = i >> 6;
+ for (i = CLOFF + 256; i < CLOFF + 256 + CLOFF; i++)
+ clamp4[i] = 255 >> 6;
+}
+
+remap(p: ref Mpegio->YCbCr): array of byte
+{
+ Y := p.Y;
+ for (e := 0; e <= width; e++)
+ elum[e] = 0;
+ m := 0;
+ n := 0;
+ for (i := 0; i < height; i++) {
+ el := 0;
+ ex := 0;
+ for (k := 0; k < w4; k++) {
+ y := (256 - int Y[n++]) + elum[ex];
+ l := clamp4[y + CLOFF] << 6;
+ b := l;
+ y -= l;
+ t := (3 * y) >> 4;
+ elum[ex] = t + el;
+ elum[ex + 1] += t;
+ el = y - 3 * t;
+ ex++;
+ y = (256 - int Y[n++]) + elum[ex];
+ l = clamp4[y + CLOFF];
+ b |= l << 4;
+ y -= l << 6;
+ t = (3 * y) >> 4;
+ elum[ex] = t + el;
+ elum[ex + 1] += t;
+ el = y - 3 * t;
+ ex++;
+ y = (256 - int Y[n++]) + elum[ex];
+ l = clamp4[y + CLOFF];
+ b |= l << 2;
+ y -= l << 6;
+ t = (3 * y) >> 4;
+ elum[ex] = t + el;
+ elum[ex + 1] += t;
+ el = y - 3 * t;
+ ex++;
+ y = (256 - int Y[n++]) + elum[ex];
+ l = clamp4[y + CLOFF];
+ out[m++] = byte (b | l);
+ y -= l << 6;
+ t = (3 * y) >> 4;
+ elum[ex] = t + el;
+ elum[ex + 1] += t;
+ el = y - 3 * t;
+ ex++;
+ }
+ }
+ return out;
+}