Camera2Source.java revision bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2
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;
36bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkinimport com.android.ex.camera2.blocking.BlockingCameraManager;
37bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkinimport com.android.ex.camera2.blocking.BlockingCameraManager.BlockingOpenException;
38227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.Filter;
39227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.Frame;
40227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.FrameImage2D;
41227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.FrameType;
42227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.FrameValue;
43227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.MffContext;
44227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.OutputPort;
45227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.Signature;
46227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
47227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport java.util.ArrayList;
48227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport java.util.List;
49227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
50227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendrickspublic class Camera2Source extends Filter implements Allocation.OnBufferAvailableListener {
51227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
52227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private boolean mNewFrameAvailable = false;
53227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private FrameType mOutputType;
54227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private static final String TAG = "Camera2Source";
55227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private CameraManager mCameraManager;
56227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private CameraDevice mCamera;
57227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private RenderScript mRS;
58227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private Surface mSurface;
59227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private CameraProperties mProperties;
60227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private CameraTestThread mLooperThread;
61227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private int mHeight = 480;
62227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private int mWidth = 640;
63227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private Allocation mAllocationIn;
64227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private ScriptIntrinsicYuvToRGB rgbConverter;
65227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private Allocation mAllocationOut;
66227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private Bitmap mBitmap;
67227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
68227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    class MyCameraListener extends CameraManager.AvailabilityListener {
69227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
70227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        @Override
71227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public void onCameraAvailable(String cameraId) {
72227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            // TODO Auto-generated method stub
73227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            Log.v(TAG, "camera available to open");
74227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
75227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
76227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        @Override
77227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public void onCameraUnavailable(String cameraId) {
78227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            // TODO Auto-generated method stub
79227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            Log.v(TAG, "camera unavailable to open");
80227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
81227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
82227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
83227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
84227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    class MyCaptureListener extends CameraDevice.CaptureListener {
85227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
86227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        @Override
87227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public void onCaptureCompleted(CameraDevice camera, CaptureRequest request,
88227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                CaptureResult result) {
89227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            // TODO Auto-generated method stub
90227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            Log.v(TAG, "in onCaptureComplete");
91227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
92227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
93227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
94227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        @Override
95227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public void onCaptureFailed(CameraDevice camera, CaptureRequest request) {
96227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            // TODO Auto-generated method stub
97227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            Log.v(TAG, "onCaptureFailed is being called");
98227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
99227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
100227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
101227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
102227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public Camera2Source(MffContext context, String name) {
103227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        super(context, name);
104227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mOutputType = FrameType.image2D(FrameType.ELEMENT_RGBA8888, FrameType.WRITE_GPU);
105227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
106227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Context ctx = context.getApplicationContext();
107227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mCameraManager = (CameraManager) ctx.getSystemService(Context.CAMERA_SERVICE);
108227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
109227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mRS = RenderScript.create(context.getApplicationContext());
110227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
111227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
112227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    @Override
113227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public Signature getSignature() {
114227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return new Signature()
115227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                .addOutputPort("timestamp", Signature.PORT_OPTIONAL, FrameType.single(long.class))
116227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                .addOutputPort("video", Signature.PORT_REQUIRED, mOutputType)
117227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                .addOutputPort("orientation", Signature.PORT_REQUIRED,
118227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                        FrameType.single(float.class))
119227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                .disallowOtherPorts();
120227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
121227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
122227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    @Override
123227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    protected void onClose() {
124227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Log.v(TAG, "onClose being called");
125227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        try {
126227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mCamera.close();
127227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mSurface.release();
128227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mLooperThread.close();
129227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        } catch (Exception e) {
130227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            // TODO Auto-generated catch block
131227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            e.printStackTrace();
132227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
133227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
134227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
135227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    @Override
136227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    protected void onOpen() {
137bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin        mLooperThread = new CameraTestThread();
138bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin        Handler mHandler;
139bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin        try {
140bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin            mHandler = mLooperThread.start();
141bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin        } catch (Exception e) {
142bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin            // TODO Auto-generated catch block
143bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin            e.printStackTrace();
144bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin            throw new RuntimeException(e);
145bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin        }
146bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin
147227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        try {
148227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            String backCameraId = "0";
149bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin            BlockingCameraManager blkManager = new BlockingCameraManager(mCameraManager);
150bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin            mCamera = blkManager.openCamera(backCameraId, /*listener*/null, mHandler);
151227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        } catch (CameraAccessException e) {
152227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            e.printStackTrace();
153227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            throw new RuntimeException(e);
154bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin        } catch (BlockingOpenException e) {
155bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin            e.printStackTrace();
156bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin            throw new RuntimeException(e);
157227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
158227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
159227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Element ele = Element.createPixel(mRS, Element.DataType.UNSIGNED_8,
160227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                Element.DataKind.PIXEL_YUV);
161227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
162227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        rgbConverter = ScriptIntrinsicYuvToRGB.create(mRS,ele);
163227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Type.Builder yuvBuilder = new Type.Builder(mRS,ele);
164227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
165227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        yuvBuilder.setYuvFormat(ImageFormat.YUV_420_888);
166227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        yuvBuilder.setX(mWidth);
167227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        yuvBuilder.setY(mHeight);
168227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mAllocationIn = Allocation.createTyped(mRS, yuvBuilder.create(),
169227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                Allocation.USAGE_SCRIPT | Allocation.USAGE_IO_INPUT);
170227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mSurface = mAllocationIn.getSurface();
171227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mAllocationIn.setOnBufferAvailableListener(this);
172227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        rgbConverter.setInput(mAllocationIn);
173227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
174227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
175227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mAllocationOut = Allocation.createFromBitmap(mRS, mBitmap);
176227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
177227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
178227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Log.v(TAG, "mcamera: " + mCamera);
179227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
180227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        List<Surface> surfaces = new ArrayList<Surface>();
181227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        surfaces.add(mSurface);
182227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        CaptureRequest.Builder mCaptureRequest = null;
183227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        try {
184227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mCamera.configureOutputs(surfaces);
185227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mCaptureRequest = mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
186227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mCaptureRequest.addTarget(mSurface);
187227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        } catch (CameraAccessException e) {
188227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            e.printStackTrace();
189227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            throw new RuntimeException(e);
190227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
191bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin
192227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        try {
193227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mCamera.setRepeatingRequest(mCaptureRequest.build(), new MyCaptureListener(),
194227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                    mHandler);
195227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        } catch (CameraAccessException e) {
196227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            e.printStackTrace();
197227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            throw new RuntimeException(e);
198227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
199227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mProperties = null;
200227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        try {
201227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mProperties = mCamera.getProperties();
202227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        } catch (CameraAccessException e) {
203227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            e.printStackTrace();
204227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            throw new RuntimeException(e);
205227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
206227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
207227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
208227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
209227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    @Override
210227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    protected void onProcess() {
211227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Log.v(TAG, "on Process");
212227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        if (nextFrame()) {
213227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            OutputPort outPort = getConnectedOutputPort("video");
214227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
215227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            // Create a 2D frame that will hold the output
216227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            int[] dims = new int[] {
217227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                    mWidth, mHeight
218227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            };
219227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            FrameImage2D outputFrame = Frame.create(mOutputType, dims).asFrameImage2D();
220227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            rgbConverter.forEach(mAllocationOut);
221227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mAllocationOut.copyTo(mBitmap);
222227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            outputFrame.setBitmap(mBitmap);
223227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            outPort.pushFrame(outputFrame);
224227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            outputFrame.release();
225227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
226227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            OutputPort orientationPort = getConnectedOutputPort("orientation");
227227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            FrameValue orientationFrame = orientationPort.fetchAvailableFrame(null).asFrameValue();
228227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
229227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            // FIXME: Hardcoded value because ORIENTATION returns null, Qualcomm
230227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            // bug
231227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            Integer orientation = mProperties.get(CameraProperties.SENSOR_ORIENTATION);
232227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            float temp;
233227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            if (orientation != null) {
234227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                temp = orientation.floatValue();
235227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            } else {
236227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                temp = 90.0f;
237227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            }
238227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            orientationFrame.setValue(temp);
239227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            orientationPort.pushFrame(orientationFrame);
240227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
241227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
242227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
243227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private synchronized boolean nextFrame() {
244227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        boolean frameAvailable = mNewFrameAvailable;
245227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        if (frameAvailable) {
246227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mNewFrameAvailable = false;
247227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        } else {
248227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            enterSleepState();
249227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
250227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return frameAvailable;
251227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
252227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
253227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public void onBufferAvailable(Allocation a) {
254227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Log.v(TAG, "on Buffer Available");
255227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        a.ioReceive();
256227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        synchronized (this) {
257227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mNewFrameAvailable = true;
258227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
259227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        wakeUp();
260227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
261227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
262227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
263227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks}
264