package com.android.droidgraph.hardware; import java.nio.ByteBuffer; import javax.microedition.khronos.opengles.GL10; import android.hardware.Camera; import android.hardware.Camera.CameraInfo; // ---------------------------------------------------------------------- public class DGCamera implements Camera.PreviewCallback { Camera mCamera; int numberOfCameras; int cameraCurrentlyLocked; // The first rear facing camera int defaultCameraId; byte[] glCameraFrame = new byte[256 * 256]; // size of a texture must be a // power of 2 int[] cameraTexture; public DGCamera() { synchronized (this) { mCamera = Camera.open(); Camera.Parameters p = mCamera.getParameters(); p.setPreviewSize(240, 160); mCamera.setParameters(p); mCamera.startPreview(); mCamera.setPreviewCallback(this); mCamera.addCallbackBuffer(glCameraFrame); } // Find the total number of cameras available numberOfCameras = Camera.getNumberOfCameras(); // Find the ID of the default camera CameraInfo cameraInfo = new CameraInfo(); for (int i = 0; i < numberOfCameras; i++) { Camera.getCameraInfo(i, cameraInfo); if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) { defaultCameraId = i; } } } public void start() { resume(); } protected void resume() { // Open the default i.e. the first rear facing camera. mCamera = Camera.open(); cameraCurrentlyLocked = defaultCameraId; } public void stop() { pause(); } protected void pause() { // Because the Camera object is a shared resource, it's very // important to release it when the activity is paused. if (mCamera != null) { mCamera.release(); mCamera = null; } } /** * Generates a texture from the black and white array filled by the * onPreviewFrame method. */ void bindCameraTexture(GL10 gl) { synchronized (this) { if (cameraTexture == null) cameraTexture = new int[1]; else gl.glDeleteTextures(1, cameraTexture, 0); gl.glGenTextures(1, cameraTexture, 0); int tex = cameraTexture[0]; gl.glBindTexture(GL10.GL_TEXTURE_2D, tex); gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_LUMINANCE, 256, 256, 0, GL10.GL_LUMINANCE, GL10.GL_UNSIGNED_BYTE, ByteBuffer.wrap(glCameraFrame)); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); } } @Override public void onPreviewFrame(byte[] yuvs, Camera camera) { int bwCounter = 0; int yuvsCounter = 0; for (int y = 0; y < 160; y++) { System.arraycopy(yuvs, yuvsCounter, glCameraFrame, bwCounter, 240); yuvsCounter = yuvsCounter + 240; bwCounter = bwCounter + 256; } } }