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