안녕하세요. ^^
android camera를 이용해 몇가지 기능을 구현 하려고 하는데
onpreviewframe 의 raw 데이터 편집에 난항을 겪고 있어 도움을 요청 드립니다. ㅠ

먼저 Camera의preview 콜백을 override한 onPreviewFrame(byte[] data, Camera camera) 에서
YUV420SP 형식의 byte[] 를 받아 RGB로 변환 하는데 까지는 성공 하였습니다.

 

public void decodeYUV420SP(int[] rgba, byte[] yuv420sp, int width, int height) 
{
     final int frameSize = width * 
height;
      
     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);
             
// rgba, divide 2^10 ( >> 
10)
             
rgba[yp] = ((r << 14) & 0xff000000) | ((g << 6) & 0xff0000) 
| ((b >> 2) | 0xff00);  

         
}
     }
 }

RGB를 편집하고 다시 YUV420SP 형식으로 인코딩을 해야 하는데
이 부분에서 막히고 있습니다.

 

public void encodeYUV420SP(byte[] yuv420sp, int[] rgba, int width, int height) 
{
    final int frameSize = width * 
height;
     
    int[] U, 
V;
    U = new int[frameSize];
    V = new 
int[frameSize];
     
    final int 
uvwidth = width / 2;
     
    int r, 
g, b, y, u, v;
    for (int j = 0 ; j < height ; j++) 
{
        int index = width * 
j;
        for (int i = 0 ; i < width ; 
i++) {
            r 
=  (rgba[index] & 0xff000000) >> 
24;
            g 
=  (rgba[index] & 0xff0000) >> 
16;
            b 
=  (rgba[index] & 0xff00) >> 
8;
             

            // rgb to 
yuv
            y = ( 
66 * r + 129 * g +  25 * b + 128) >> 8 +  
16;
            u = 
(-38 * r -  74 * g + 112 * b + 128) >> 8 + 
128;
            v = 
(112 * r -  94 * g -  18 * b + 128) >> 8 + 
128;
             

            // clip 
y
            
yuv420sp[index++] = (byte)((y < 0) ? 0 : ((y > 255) ? 255 : 
y));
            
U[index] = 
u;
            
V[index++] = v;
        
}
    }
     
    // 
sub-sampling
    for (int j = 0 ; j < height ; j+=2) 
{
        int uvp = frameSize + uvwidth * 
(j >> 1);
        int uv0 = width * 
j;
        for (int i = 0 ; i < width ; 
i+=2, uv0+=2) 
{
            u = 
(U[uv0] + U[uv0 + 1] + U[uv0 + width] + U[uv0 + width + 1]) >> 
2;
            v = 
(V[uv0] + V[uv0 + 1] + V[uv0 + width] + V[uv0 + width + 1]) >> 
2;
            
yuv420sp[uvp++] = (byte)((u < 0) ? 0 : ((u > 255) ? 255 : 
u));    // 
u
            
yuv420sp[uvp++] = (byte)((v < 0) ? 0 : ((v > 255) ? 255 : 
v));    // v
        
}
    }
}


raw 데이터의 RGB를 YUV420SP로 변환 하는 기능은 아래 포스트를 작성 하신 darkblitz 님의 소스를 활용을 했는데
http://darkblitz.tistory.com/273
계속 인덱스 오류가 납니다.
오류 나는 곳은 index나 uvp 변수가 rgba 또는 yuvsp 의 배열 크기 보다 값이 크기 때문인데..
어떻게 수정해야 하는지 막막합니다.
(RGB와 YUV의 bit 포멧에 대한 이해도가 떨어져서 그런거 같습니다. ㅠ)