안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요. ^^
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 포멧에 대한 이해도가 떨어져서 그런거 같습니다. ㅠ)



