Fixed this years ago and never submitted a patch, silly dropoff fot 10 bit files. -Steve Reference: /n/sources/patch/applied/yuv-10bit-oops Date: Tue Sep 25 15:00:29 CES 2007 Signed-off-by: steve@quintile.net --- /sys/src/cmd/jpg/readyuv.c Tue Sep 25 14:59:13 2007 +++ /sys/src/cmd/jpg/readyuv.c Tue Sep 25 14:59:09 2007 @@ -6,27 +6,12 @@ #include #include "imagefile.h" -/* - * ITU/CCIR Rec601 states: - * - * R = y + 1.402 * Cr - * B = Y + 1.77305 * Cb - * G = Y - 0.72414 * Cr - 0.34414 * Cb - * - * using 8 bit traffic - * Y = 16 + 219 * Y - * Cr = 128 + 224 * Cr - * Cb = 128 + 224 * Cb - * or, if 10bit is used - * Y = 64 + 876 * Y - * Cr = 512 + 896 * Cr - * Cb = 512 + 896 * Cb - */ enum { pixels = 720, r601pal = 576, - r601ntsc = 486 + r601ntsc = 486, + Shift = 13 }; @@ -75,7 +60,7 @@ static int clip(int x) { - x >>= 18; + x >>= (Shift+2); // +2 as we assume all input images are 10 bit if (x > 255) return 0xff; @@ -95,6 +80,7 @@ uchar *buf, *r, *g, *b; int y1, y2, cb, cr, c, l, w, base; int bits, lines, pixels; + int F1, F2, F3, F4; frm = nil; buf = nil; @@ -161,7 +147,7 @@ base = l * pixels * 2; for (w = 0; w < pixels * 2; w++) - frm[base + w] |= buf[w / 4] >> lsbtab[w % 4]; + frm[base + w] |= (buf[w / 4] >> lsbtab[w % 4]) & 3; } mux = frm; @@ -170,22 +156,36 @@ g = a->chans[1]; b = a->chans[2]; + if(pixels * lines != 414720){ // 625 + F1 = floor(1.402 * (1 << Shift)); + F2 = floor(0.34414 * (1 << Shift)); + F3 = floor(0.71414 * (1 << Shift)); + F4 = floor(1.772 * (1 << Shift)); + } + else{ // 525 + F1 = floor(1.5748 * (1 << Shift)); + F2 = floor(0.1874 * (1 << Shift)); + F3 = floor(0.4681 * (1 << Shift)); + F4 = floor(1.8560 * (1 << Shift)); + } + /* * Fixme: fixed colourspace conversion at present */ while (mux < end) { + cb = *mux++ - 512; - y1 = (*mux++ - 64) * 76310; + y1 = (int)*mux++ << Shift; cr = *mux++ - 512; - y2 = (*mux++ - 64) * 76310; + y2 = (int)*mux++ << Shift; - *r++ = clip((104635 * cr) + y1); - *g++ = clip((-25690 * cb + -53294 * cr) + y1); - *b++ = clip((132278 * cb) + y1); - - *r++ = clip((104635 * cr) + y2); - *g++ = clip((-25690 * cb + -53294 * cr) + y2); - *b++ = clip((132278 * cb) + y2); + *r++ = clip(y1 + F1*cr); + *g++ = clip(y1 - F2*cb - F3*cr); + *b++ = clip((y1 + F4*cb)); + + *r++ = clip(y2 + F1*cr); + *g++ = clip(y2 - F2*cb - F3*cr); + *b++ = clip((y2 + F4*cb)); } free(frm); free(buf);