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