diff options
Diffstat (limited to 'appl/wm/mpeg/remap1.b')
| -rw-r--r-- | appl/wm/mpeg/remap1.b | 116 |
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; +} |
