출력이 첨부한 파일처럼 나오네요...


코드는...


//java


public class MainActivity extends Activity {

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

MyView vw = new MyView(this);

setContentView(vw);

}


protected class MyView extends View {

public MyView(Context context) {

super(context);

}


public void onDraw(Canvas canvas) {

BufferedInputStream bis ;

       bis = new BufferedInputStream(this.getResources().openRawResource(R.raw.yuv422));

       

       byte[] data = new byte[352*288*2];

       

       try {

while(bis.read(data) != -1){}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

       

       int sz = 352*288;

       

       int[] rgb = new int [sz];

       Yuv422toRgb(rgb, data, 352, 288);

       

Bitmap bit = Bitmap.createBitmap(rgb, 352, 288, Config.ARGB_8888);


canvas.drawBitmap(bit, 0, 0, null);

}

}

    public native void Yuv422toRgb(int[] rgb, byte[] data, int w, int h);


    static {

    System.loadLibrary("Yuv");

    }

}


//c


#include <jni.h>

JNIEXPORT void JNICALL
Java_com_canvas_MainActivity_Yuv422toRgb(JNIEnv * env, jobject obj,
jintArray rgb, jbyteArray data, jint w, jint h) {

int y1, y2, u, v, cb, cr, r, g, b, r2, g2, b2;
int i, sz = w * h;
int tmp[sz];
jint c_rgb[sz];

jboolean isCopy;
jbyte* c_data = (*env)->GetByteArrayElements(env, data, &isCopy);

for (i = 0; i < sz; i = i + 2) {
y1 = c_data[i * 2 + 1];
y2 = c_data[i * 2 + 3];
u = c_data[i * 2];
v = c_data[i * 2 + 2];
cb = change(u);
cr = change(v);

v = v - 128;
u = u - 128;

r = 1.164 * (y1 - 16) + 1.596 * cr;
g = 1.164 * (y1 - 16) - 0.813 * cr - 0.391 * cb;
b = 1.164 * (y1 - 16) + 2.018 * cb;
r2 = 1.164 * (y2 - 16) + 1.596 * cr;
g2 = 1.164 * (y2 - 16) - 0.813 * cr - 0.391 * cb;
b2 = 1.164 * (y2 - 16) + 2.018 * cb;

c_rgb[i] = 0xff000000 + (r << 16) + (g << 8) + b;
c_rgb[i + 1] = 0xff000000 + (r2 << 16) + (g2 << 8) + b2;
}

(*env)->SetIntArrayRegion(env, rgb, 0, sz, c_rgb);
}

void convert(int i) {
if (i > 255)
i = 255;
}

int change(int uv) {
if (uv < 128)
uv + 128;
else
uv - 128;
return uv;
}

이렇게 짰습니다 ㅠㅜ
이미지는 첨부된 yuv 파일을 이용했구요.

색깔이 저리 나오는 걸 보면 변환 혹은 yuv 추출을 잘못한 것 같은데 ㅠㅜ
어디가 잘못 된건지 감이 잘 안 잡히네요...
rgb 변환 공식은 위에 적혀있는 것 외에 여러가지로 사용해봤는데 다 안되더군요 ㅜㅠ