안드로이드 개발 질문/답변
(글 수 45,052)
static public int[] decodeYUV420SP(byte[] yuv420sp, int width, int height) {
final int frameSize = width * height;
String tag = "decodeTUV";
for (int j = 0, yp = 0; j < height; j++) {
int uvp = (frameSize + (j >> 1) * width), u = 0, v = 0;
for (int i = 0; i < width; i++, yp++) {
int y = (0xff & ((int) yuv420sp[yp])) - 16;
if (y < 0) y = 0;
if ((i & 1) == 0) {
v = (0xff & yuv420sp[uvp++]) - 128;
u = (0xff & yuv420sp[uvp++]) - 128;
}
int y1192 = 1192 * y;
int r = (y1192 + 1634 * v);
int g = (y1192 - 833 * v - 400 * u);
int b = (y1192 + 2066 * u);
if (r < 0) r = 0; else if (r > 262143) r = 262143;
if (g < 0) g = 0; else if (g > 262143) g = 262143;
if (b < 0) b = 0; else if (b > 262143) b = 262143;
rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff);
}
}
return rgb;
}
이 위에 함수를 jni로 만들려고 아래의 C언어로 변환했는데요 뻑이나네요..
무엇이 틀렸는지좀 잡아주시면 감사하겠습니다.(__)
jint* Java_com_camerapreview08_decodeYUV_decode(JNIEnv *env,jobject thiz,char* yuv420sp,jint width,jint height)
{
int frameSize = width * height;
int rgb[width*height];
int i=0,j=0,u=0,v=0,yp=0;
int uvp =0;
int y=0;
int y1192=0,r=0,g=0,b=0;
uvp = frameSize+(j>>1)*width;
for (j = 0, yp = 0; j < height; j++) {
uvp = (frameSize + (j >> 1) * width);
u = 0;
v = 0;
for (i = 0; i < width; i++, yp++) {
y = (0xff & ((int) yuv420sp[yp])) - 16;
if (y < 0) y = 0;
if ((i & 1) == 0) {
v = (0xff & yuv420sp[uvp++]) - 128;
u = (0xff & yuv420sp[uvp++]) - 128;
}
y1192 = 1192 * y;
r = (y1192 + 1634 * v);
g = (y1192 - 833 * v - 400 * u);
b = (y1192 + 2066 * u);
if (r < 0) r = 0; else if (r > 262143) r = 262143;
if (g < 0) g = 0; else if (g > 262143) g = 262143;
if (b < 0) b = 0; else if (b > 262143) b = 262143;
rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff);
}
}
return rgb;
}
final int frameSize = width * height;
String tag = "decodeTUV";
for (int j = 0, yp = 0; j < height; j++) {
int uvp = (frameSize + (j >> 1) * width), u = 0, v = 0;
for (int i = 0; i < width; i++, yp++) {
int y = (0xff & ((int) yuv420sp[yp])) - 16;
if (y < 0) y = 0;
if ((i & 1) == 0) {
v = (0xff & yuv420sp[uvp++]) - 128;
u = (0xff & yuv420sp[uvp++]) - 128;
}
int y1192 = 1192 * y;
int r = (y1192 + 1634 * v);
int g = (y1192 - 833 * v - 400 * u);
int b = (y1192 + 2066 * u);
if (r < 0) r = 0; else if (r > 262143) r = 262143;
if (g < 0) g = 0; else if (g > 262143) g = 262143;
if (b < 0) b = 0; else if (b > 262143) b = 262143;
rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff);
}
}
return rgb;
}
이 위에 함수를 jni로 만들려고 아래의 C언어로 변환했는데요 뻑이나네요..
무엇이 틀렸는지좀 잡아주시면 감사하겠습니다.(__)
jint* Java_com_camerapreview08_decodeYUV_decode(JNIEnv *env,jobject thiz,char* yuv420sp,jint width,jint height)
{
int frameSize = width * height;
int rgb[width*height];
int i=0,j=0,u=0,v=0,yp=0;
int uvp =0;
int y=0;
int y1192=0,r=0,g=0,b=0;
uvp = frameSize+(j>>1)*width;
for (j = 0, yp = 0; j < height; j++) {
uvp = (frameSize + (j >> 1) * width);
u = 0;
v = 0;
for (i = 0; i < width; i++, yp++) {
y = (0xff & ((int) yuv420sp[yp])) - 16;
if (y < 0) y = 0;
if ((i & 1) == 0) {
v = (0xff & yuv420sp[uvp++]) - 128;
u = (0xff & yuv420sp[uvp++]) - 128;
}
y1192 = 1192 * y;
r = (y1192 + 1634 * v);
g = (y1192 - 833 * v - 400 * u);
b = (y1192 + 2066 * u);
if (r < 0) r = 0; else if (r > 262143) r = 262143;
if (g < 0) g = 0; else if (g > 262143) g = 262143;
if (b < 0) b = 0; else if (b > 262143) b = 262143;
rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff);
}
}
return rgb;
}




함수 type이 서로 안맞는 것 같은데...
javah를 이용하시면 자바에서 선언한 함수명에 맞게 C헤더 파일을 만들어줍니다.