Skip to content

Commit b13ad07

Browse files
committed
Render the preview frame on the TextureView
Signed-off-by: Umair Khan <[email protected]>
1 parent 78da4a6 commit b13ad07

File tree

2 files changed

+61
-2
lines changed

2 files changed

+61
-2
lines changed

src/in/omerjerk/processing/video/android/Capture.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import android.content.Context;
77
import android.hardware.Camera;
8+
import android.hardware.Camera.Size;
89
import android.view.Gravity;
910
import android.util.Log;
1011
import android.view.SurfaceHolder;
@@ -23,6 +24,7 @@ public class Capture extends PImage implements PConstants {
2324
private PApplet context;
2425

2526
private Camera mCamera;
27+
private Size previewSize;
2628

2729
private static ArrayList<String> camerasList = new ArrayList<String>();
2830

@@ -59,7 +61,9 @@ private void createPreviewWindow() {
5961

6062
try {
6163
mCamera = Camera.open(selectedCamera);
62-
final WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
64+
previewSize = mCamera.getParameters().getPreviewSize();
65+
init(previewSize.width, previewSize.height, ARGB);
66+
final WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
6367
context.runOnUiThread(new Runnable() {
6468
@Override
6569
public void run() {
@@ -98,7 +102,8 @@ public String[] list() {
98102

99103
@Override
100104
public void onPreviewFrame(byte[] frame, Camera camera) {
101-
log("Received Camera frame");
105+
log("preview frame received");
106+
pixels = Utils.convertYUV420_NV21toRGB8888(frame, previewSize.width, previewSize.height);
102107
}
103108
};
104109

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package in.omerjerk.processing.video.android;
2+
3+
public class Utils {
4+
/**
5+
* Converts YUV420 NV21 to RGB8888
6+
*
7+
* @param data byte array on YUV420 NV21 format.
8+
* @param width pixels width
9+
* @param height pixels height
10+
* @return a RGB8888 pixels int array. Where each int is a pixels ARGB.
11+
*/
12+
public static int[] convertYUV420_NV21toRGB8888(byte [] data, int width, int height) {
13+
int size = width*height;
14+
int offset = size;
15+
int[] pixels = new int[size];
16+
int u, v, y1, y2, y3, y4;
17+
18+
// i percorre os Y and the final pixels
19+
// k percorre os pixles U e V
20+
for(int i=0, k=0; i < size; i+=2, k+=2) {
21+
y1 = data[i ]&0xff;
22+
y2 = data[i+1]&0xff;
23+
y3 = data[width+i ]&0xff;
24+
y4 = data[width+i+1]&0xff;
25+
26+
u = data[offset+k ]&0xff;
27+
v = data[offset+k+1]&0xff;
28+
u = u-128;
29+
v = v-128;
30+
31+
pixels[i ] = convertYUVtoRGB(y1, u, v);
32+
pixels[i+1] = convertYUVtoRGB(y2, u, v);
33+
pixels[width+i ] = convertYUVtoRGB(y3, u, v);
34+
pixels[width+i+1] = convertYUVtoRGB(y4, u, v);
35+
36+
if (i!=0 && (i+2)%width==0)
37+
i+=width;
38+
}
39+
40+
return pixels;
41+
}
42+
43+
private static int convertYUVtoRGB(int y, int u, int v) {
44+
int r,g,b;
45+
46+
r = y + (int)1.402f*v;
47+
g = y - (int)(0.344f*u +0.714f*v);
48+
b = y + (int)1.772f*u;
49+
r = r>255? 255 : r<0 ? 0 : r;
50+
g = g>255? 255 : g<0 ? 0 : g;
51+
b = b>255? 255 : b<0 ? 0 : b;
52+
return 0xff000000 | (b<<16) | (g<<8) | r;
53+
}
54+
}

0 commit comments

Comments
 (0)