Skip to content

Commit f95800e

Browse files
committed
fix jni yuvdecoder color
1 parent bf0bfde commit f95800e

File tree

1 file changed

+34
-12
lines changed

1 file changed

+34
-12
lines changed

library/jni/yuv-decoder.c

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,23 @@ JNIEXPORT void JNICALL Java_jp_co_cyberagent_android_gpuimage_GPUImageNativeLibr
3636
Cr = yuv[cOff + 1];
3737
if(Cr < 0) Cr += 127; else Cr -= 128;
3838
}
39-
R = Y + Cr + (Cr >> 3) + (Cr >> 6);
40-
if(R < 0) R = 0; else if(R > 255) R = 255;
41-
G = Y - (Cb >> 1) + (Cb >> 4) + (Cb >> 5) - Cr + (Cr >> 2) + (Cr >> 3) + (Cr >> 5) + + (Cr >> 6);
42-
if(G < 0) G = 0; else if(G > 255) G = 255;
43-
B = Y + (Cb << 1) + (Cb >> 5);
44-
if(B < 0) B = 0; else if(B > 255) B = 255;
39+
//==============================
40+
//R = 1.164Y + 2.018Cr;
41+
//G = 1.164Y - 0.813Cb - 0.391Cr;
42+
//B = 1.164Y + 1.596Cb;
43+
//==============================
44+
//===== Approximation ==========
45+
// R = 1.1640625Y + 2.015625Cr
46+
// G = 1.1640625Y - 0.8125Cb - 0.375Cr
47+
// B = 1.1640625Y + 1.59375Cb
48+
//==============================
49+
Y = Y + (Y >> 3) + (Y >> 5) + (Y >> 7);
50+
R = Y + (Cr << 1) + (Cr >> 6);
51+
if(R < 0) R = 0; else if(R > 255) R = 255;
52+
G = Y - Cb + (Cb >> 3) + (Cb >> 4) - (Cr >> 1) + (Cr >> 3);
53+
if(G < 0) G = 0; else if(G > 255) G = 255;
54+
B = Y + Cb + (Cb >> 1) + (Cb >> 4) + (Cb >> 5);
55+
if(B < 0) B = 0; else if(B > 255) B = 255;
4556
rgbData[pixPtr++] = 0xff000000 + (R << 16) + (G << 8) + B;
4657
}
4758
}
@@ -84,12 +95,23 @@ JNIEXPORT void JNICALL Java_jp_co_cyberagent_android_gpuimage_GPUImageNativeLibr
8495
Cr = yuv[cOff + 1];
8596
if(Cr < 0) Cr += 127; else Cr -= 128;
8697
}
87-
R = Y + Cr + (Cr >> 3) + (Cr >> 6);
88-
if(R < 0) R = 0; else if(R > 255) R = 255;
89-
G = Y - (Cb >> 1) + (Cb >> 4) + (Cb >> 5) - Cr + (Cr >> 2) + (Cr >> 3) + (Cr >> 5) + + (Cr >> 6);
90-
if(G < 0) G = 0; else if(G > 255) G = 255;
91-
B = Y + (Cb << 1) + (Cb >> 5);
92-
if(B < 0) B = 0; else if(B > 255) B = 255;
98+
//==============================
99+
//R = 1.164Y + 2.018Cr;
100+
//G = 1.164Y - 0.813Cb - 0.391Cr;
101+
//B = 1.164Y + 1.596Cb;
102+
//==============================
103+
//===== Approximation ==========
104+
// R = 1.1640625Y + 2.015625Cr
105+
// G = 1.1640625Y - 0.8125Cb - 0.375Cr
106+
// B = 1.1640625Y + 1.59375Cb
107+
//==============================
108+
Y = Y + (Y >> 3) + (Y >> 5) + (Y >> 7);
109+
R = Y + (Cr << 1) + (Cr >> 6);
110+
if(R < 0) R = 0; else if(R > 255) R = 255;
111+
G = Y - Cb + (Cb >> 3) + (Cb >> 4) - (Cr >> 1) + (Cr >> 3);
112+
if(G < 0) G = 0; else if(G > 255) G = 255;
113+
B = Y + Cb + (Cb >> 1) + (Cb >> 4) + (Cb >> 5);
114+
if(B < 0) B = 0; else if(B > 255) B = 255;
93115
rgbData[pixPtr++] = 0xff000000 + (B << 16) + (G << 8) + R;
94116
}
95117
}

0 commit comments

Comments
 (0)