1 package com.example.hellohalide; 2 3 import android.hardware.Camera; 4 import android.util.Log; 5 import java.io.IOException; 6 import android.view.SurfaceHolder; 7 import android.view.SurfaceView; 8 import android.view.Surface; 9 import android.content.Context; 10 import android.graphics.Canvas; 11 import android.graphics.ImageFormat; 12 13 /** A basic Camera preview class */ 14 public class CameraPreview extends SurfaceView 15 implements SurfaceHolder.Callback, Camera.PreviewCallback { 16 private static final String TAG = "CameraPreview"; 17 18 private Camera mCamera; 19 private SurfaceView mFiltered; 20 private byte[] mPreviewData; 21 private int mCameraOrientation; 22 23 // Link to native Halide code 24 static { 25 System.loadLibrary("HelloAndroid"); 26 } processFrame(byte[] src, int w, int h, int orientation, Surface dst)27 private static native void processFrame(byte[] src, int w, int h, int orientation, Surface dst); 28 CameraPreview(Context context, SurfaceView filtered)29 public CameraPreview(Context context, SurfaceView filtered) { 30 super(context); 31 mFiltered = filtered; 32 mFiltered.getHolder().setFormat(ImageFormat.YV12); 33 mPreviewData = null; 34 35 // Install a SurfaceHolder.Callback so we get notified when the 36 // underlying surface is created and destroyed. 37 getHolder().addCallback(this); 38 } 39 onPreviewFrame(byte[] data, Camera camera)40 public void onPreviewFrame(byte[] data, Camera camera) { 41 if (camera != mCamera) { 42 Log.d(TAG, "Unknown Camera!"); 43 return; 44 } 45 if (mFiltered.getHolder().getSurface().isValid()) { 46 Camera.Size s = camera.getParameters().getPreviewSize(); 47 processFrame(data, s.width, s.height, mCameraOrientation, mFiltered.getHolder().getSurface()); 48 } else { 49 Log.d(TAG, "Invalid Surface!"); 50 } 51 52 // re-enqueue this buffer 53 camera.addCallbackBuffer(data); 54 } 55 startPreview(SurfaceHolder holder)56 private void startPreview(SurfaceHolder holder) { 57 if (mCamera == null) { 58 return; 59 } 60 try { 61 configureCamera(); 62 mCamera.setPreviewCallbackWithBuffer(this); 63 mCamera.setPreviewDisplay(holder); 64 mCamera.startPreview(); 65 } catch (Exception e){ 66 Log.d(TAG, "Error starting camera preview: " + e.getMessage()); 67 } 68 } 69 stopPreview()70 private void stopPreview() { 71 if (mCamera == null) { 72 return; 73 } 74 try { 75 mCamera.stopPreview(); 76 } catch (Exception e){ 77 // ignore: tried to stop a non-existent preview 78 Log.d(TAG, "tried to stop a non-existent preview"); 79 } 80 } configureCamera()81 private void configureCamera() { 82 Camera.Parameters p = mCamera.getParameters(); 83 Camera.Size s = p.getPreviewSize(); 84 Log.d(TAG, "Camera Preview Size: " + s.width + "x" + s.height); 85 p.setPreviewFormat(ImageFormat.YV12); 86 if (mPreviewData == null) { 87 int stride = ((s.width + 15) / 16) * 16; 88 int y_size = stride * s.height; 89 int c_stride = ((stride/2 + 15) / 16) * 16; 90 int c_size = c_stride * s.height/2; 91 int size = y_size + c_size * 2; 92 mPreviewData = new byte[size]; 93 } 94 mCamera.addCallbackBuffer(mPreviewData); 95 mCamera.setParameters(p); 96 } 97 surfaceCreated(SurfaceHolder holder)98 public void surfaceCreated(SurfaceHolder holder) { 99 Log.d(TAG, "surfaceCreated"); 100 startPreview(holder); 101 } 102 surfaceDestroyed(SurfaceHolder holder)103 public void surfaceDestroyed(SurfaceHolder holder) { 104 Log.d(TAG, "surfaceDestroyed"); 105 stopPreview(); 106 } 107 surfaceChanged(SurfaceHolder holder, int format, int w, int h)108 public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 109 Log.d(TAG, "surfaceChanged"); 110 stopPreview(); 111 configureCamera(); 112 startPreview(holder); 113 } 114 setCamera(Camera c)115 public void setCamera(Camera c) { 116 if (mCamera != null) { 117 mCamera.stopPreview(); 118 } 119 mCamera = c; 120 android.hardware.Camera.CameraInfo info = 121 new android.hardware.Camera.CameraInfo(); 122 // Assume that we opened camera 0 123 android.hardware.Camera.getCameraInfo(0, info); 124 mCameraOrientation = info.orientation; 125 if (mCamera != null) { 126 startPreview(getHolder()); 127 } 128 } 129 } 130