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