Camera2Source.java revision 227b47625d7482b5b47ad0e4c70ce0a246236ade
1227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks/*
2227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Copyright 2013 The Android Open Source Project
3227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *
4227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Licensed under the Apache License, Version 2.0 (the "License");
5227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * you may not use this file except in compliance with the License.
6227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * You may obtain a copy of the License at
7227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *
8227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *      http://www.apache.org/licenses/LICENSE-2.0
9227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *
10227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Unless required by applicable law or agreed to in writing, software
11227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * distributed under the License is distributed on an "AS IS" BASIS,
12227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * See the License for the specific language governing permissions and
14227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * limitations under the License.
15227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks */
16227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
17227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendrickspackage androidx.media.filterfw.samples.simplecamera;
18227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
19227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.content.Context;
20227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.graphics.Bitmap;
21227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.graphics.ImageFormat;
22227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.hardware.camera2.CameraAccessException;
23227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.hardware.camera2.CameraDevice;
24227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.hardware.camera2.CameraManager;
25227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.hardware.camera2.CameraProperties;
26227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.hardware.camera2.CaptureRequest;
27227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.hardware.camera2.CaptureResult;
28227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.os.Handler;
29227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.renderscript.Allocation;
30227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.renderscript.Element;
31227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.renderscript.RenderScript;
32227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.renderscript.ScriptIntrinsicYuvToRGB;
33227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.renderscript.Type;
34227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.util.Log;
35227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.view.Surface;
36227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.Filter;
37227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.Frame;
38227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.FrameImage2D;
39227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.FrameType;
40227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.FrameValue;
41227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.MffContext;
42227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.OutputPort;
43227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.Signature;
44227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
45227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport java.util.ArrayList;
46227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport java.util.List;
47227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
48227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendrickspublic class Camera2Source extends Filter implements Allocation.OnBufferAvailableListener {
49227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
50227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private boolean mNewFrameAvailable = false;
51227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private FrameType mOutputType;
52227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private static final String TAG = "Camera2Source";
53227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private CameraManager mCameraManager;
54227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private CameraDevice mCamera;
55227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private RenderScript mRS;
56227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private Surface mSurface;
57227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private CameraProperties mProperties;
58227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private CameraTestThread mLooperThread;
59227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private int mHeight = 480;
60227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private int mWidth = 640;
61227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private Allocation mAllocationIn;
62227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private ScriptIntrinsicYuvToRGB rgbConverter;
63227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private Allocation mAllocationOut;
64227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private Bitmap mBitmap;
65227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
66227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    class MyCameraListener extends CameraManager.AvailabilityListener {
67227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
68227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        @Override
69227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public void onCameraAvailable(String cameraId) {
70227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            // TODO Auto-generated method stub
71227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            Log.v(TAG, "camera available to open");
72227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
73227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
74227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        @Override
75227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public void onCameraUnavailable(String cameraId) {
76227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            // TODO Auto-generated method stub
77227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            Log.v(TAG, "camera unavailable to open");
78227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
79227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
80227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
81227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
82227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    class MyCaptureListener extends CameraDevice.CaptureListener {
83227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
84227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        @Override
85227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public void onCaptureCompleted(CameraDevice camera, CaptureRequest request,
86227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                CaptureResult result) {
87227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            // TODO Auto-generated method stub
88227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            Log.v(TAG, "in onCaptureComplete");
89227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
90227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
91227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
92227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        @Override
93227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public void onCaptureFailed(CameraDevice camera, CaptureRequest request) {
94227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            // TODO Auto-generated method stub
95227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            Log.v(TAG, "onCaptureFailed is being called");
96227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
97227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
98227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
99227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
100227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public Camera2Source(MffContext context, String name) {
101227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        super(context, name);
102227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mOutputType = FrameType.image2D(FrameType.ELEMENT_RGBA8888, FrameType.WRITE_GPU);
103227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
104227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Context ctx = context.getApplicationContext();
105227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mCameraManager = (CameraManager) ctx.getSystemService(Context.CAMERA_SERVICE);
106227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
107227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mRS = RenderScript.create(context.getApplicationContext());
108227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
109227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
110227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    @Override
111227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public Signature getSignature() {
112227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return new Signature()
113227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                .addOutputPort("timestamp", Signature.PORT_OPTIONAL, FrameType.single(long.class))
114227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                .addOutputPort("video", Signature.PORT_REQUIRED, mOutputType)
115227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                .addOutputPort("orientation", Signature.PORT_REQUIRED,
116227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                        FrameType.single(float.class))
117227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                .disallowOtherPorts();
118227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
119227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
120227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    @Override
121227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    protected void onClose() {
122227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Log.v(TAG, "onClose being called");
123227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        try {
124227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mCamera.close();
125227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mSurface.release();
126227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mLooperThread.close();
127227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        } catch (Exception e) {
128227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            // TODO Auto-generated catch block
129227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            e.printStackTrace();
130227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
131227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
132227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
133227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    @Override
134227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    protected void onOpen() {
135227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        try {
136227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            String backCameraId = "0";
137227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mCamera = mCameraManager.openCamera(backCameraId);
138227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        } catch (CameraAccessException e) {
139227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            e.printStackTrace();
140227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            throw new RuntimeException(e);
141227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
142227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
143227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Element ele = Element.createPixel(mRS, Element.DataType.UNSIGNED_8,
144227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                Element.DataKind.PIXEL_YUV);
145227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
146227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        rgbConverter = ScriptIntrinsicYuvToRGB.create(mRS,ele);
147227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Type.Builder yuvBuilder = new Type.Builder(mRS,ele);
148227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
149227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        yuvBuilder.setYuvFormat(ImageFormat.YUV_420_888);
150227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        yuvBuilder.setX(mWidth);
151227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        yuvBuilder.setY(mHeight);
152227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mAllocationIn = Allocation.createTyped(mRS, yuvBuilder.create(),
153227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                Allocation.USAGE_SCRIPT | Allocation.USAGE_IO_INPUT);
154227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mSurface = mAllocationIn.getSurface();
155227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mAllocationIn.setOnBufferAvailableListener(this);
156227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        rgbConverter.setInput(mAllocationIn);
157227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
158227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
159227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mAllocationOut = Allocation.createFromBitmap(mRS, mBitmap);
160227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
161227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
162227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Log.v(TAG, "mcamera: " + mCamera);
163227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
164227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        List<Surface> surfaces = new ArrayList<Surface>();
165227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        surfaces.add(mSurface);
166227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        CaptureRequest.Builder mCaptureRequest = null;
167227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        try {
168227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mCamera.configureOutputs(surfaces);
169227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mCaptureRequest = mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
170227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mCaptureRequest.addTarget(mSurface);
171227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        } catch (CameraAccessException e) {
172227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            e.printStackTrace();
173227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            throw new RuntimeException(e);
174227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
175227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mLooperThread = new CameraTestThread();
176227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Handler mHandler;
177227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        try {
178227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mHandler = mLooperThread.start();
179227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        } catch (Exception e) {
180227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            // TODO Auto-generated catch block
181227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            e.printStackTrace();
182227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            throw new RuntimeException(e);
183227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
184227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        try {
185227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mCamera.setRepeatingRequest(mCaptureRequest.build(), new MyCaptureListener(),
186227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                    mHandler);
187227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        } catch (CameraAccessException e) {
188227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            e.printStackTrace();
189227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            throw new RuntimeException(e);
190227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
191227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mProperties = null;
192227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        try {
193227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mProperties = mCamera.getProperties();
194227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        } catch (CameraAccessException e) {
195227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            e.printStackTrace();
196227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            throw new RuntimeException(e);
197227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
198227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
199227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
200227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
201227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    @Override
202227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    protected void onProcess() {
203227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Log.v(TAG, "on Process");
204227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        if (nextFrame()) {
205227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            OutputPort outPort = getConnectedOutputPort("video");
206227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
207227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            // Create a 2D frame that will hold the output
208227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            int[] dims = new int[] {
209227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                    mWidth, mHeight
210227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            };
211227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            FrameImage2D outputFrame = Frame.create(mOutputType, dims).asFrameImage2D();
212227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            rgbConverter.forEach(mAllocationOut);
213227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mAllocationOut.copyTo(mBitmap);
214227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            outputFrame.setBitmap(mBitmap);
215227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            outPort.pushFrame(outputFrame);
216227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            outputFrame.release();
217227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
218227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            OutputPort orientationPort = getConnectedOutputPort("orientation");
219227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            FrameValue orientationFrame = orientationPort.fetchAvailableFrame(null).asFrameValue();
220227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
221227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            // FIXME: Hardcoded value because ORIENTATION returns null, Qualcomm
222227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            // bug
223227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            Integer orientation = mProperties.get(CameraProperties.SENSOR_ORIENTATION);
224227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            float temp;
225227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            if (orientation != null) {
226227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                temp = orientation.floatValue();
227227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            } else {
228227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                temp = 90.0f;
229227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            }
230227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            orientationFrame.setValue(temp);
231227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            orientationPort.pushFrame(orientationFrame);
232227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
233227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
234227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
235227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private synchronized boolean nextFrame() {
236227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        boolean frameAvailable = mNewFrameAvailable;
237227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        if (frameAvailable) {
238227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mNewFrameAvailable = false;
239227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        } else {
240227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            enterSleepState();
241227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
242227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return frameAvailable;
243227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
244227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
245227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public void onBufferAvailable(Allocation a) {
246227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Log.v(TAG, "on Buffer Available");
247227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        a.ioReceive();
248227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        synchronized (this) {
249227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mNewFrameAvailable = true;
250227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
251227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        wakeUp();
252227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
253227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
254227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
255227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks}
256