Camera2Source.java revision 0a160acf297b583e12a9710c929c4ba9a38f7353
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; 250a160acf297b583e12a9710c929c4ba9a38f7353Eino-Ville Talvalaimport android.hardware.camera2.CameraCaptureSession; 26227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.hardware.camera2.CameraManager; 2769b94f7c5520f3fa817a7bb1e4d1205b593e6c47Igor Murashkinimport android.hardware.camera2.CaptureFailure; 28227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.hardware.camera2.CaptureRequest; 29227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.hardware.camera2.CaptureResult; 30db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkinimport android.hardware.camera2.TotalCaptureResult; 31227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.os.Handler; 32227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.renderscript.Allocation; 33227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.renderscript.Element; 34227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.renderscript.RenderScript; 35227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.renderscript.ScriptIntrinsicYuvToRGB; 36227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.renderscript.Type; 37227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.util.Log; 38227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.view.Surface; 39bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkinimport com.android.ex.camera2.blocking.BlockingCameraManager; 40bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkinimport com.android.ex.camera2.blocking.BlockingCameraManager.BlockingOpenException; 410a160acf297b583e12a9710c929c4ba9a38f7353Eino-Ville Talvalaimport com.android.ex.camera2.blocking.BlockingSessionListener; 42227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.Filter; 43227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.Frame; 44227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.FrameImage2D; 45227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.FrameType; 46227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.FrameValue; 47227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.MffContext; 48227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.OutputPort; 49227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.Signature; 50227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 51227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport java.util.ArrayList; 52227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport java.util.List; 53227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 54227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendrickspublic class Camera2Source extends Filter implements Allocation.OnBufferAvailableListener { 55227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 56227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks private boolean mNewFrameAvailable = false; 57227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks private FrameType mOutputType; 58227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks private static final String TAG = "Camera2Source"; 59227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks private CameraManager mCameraManager; 60227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks private CameraDevice mCamera; 610a160acf297b583e12a9710c929c4ba9a38f7353Eino-Ville Talvala private CameraCaptureSession mCameraSession; 62227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks private RenderScript mRS; 63227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks private Surface mSurface; 6469b94f7c5520f3fa817a7bb1e4d1205b593e6c47Igor Murashkin private CameraCharacteristics mProperties; 65227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks private CameraTestThread mLooperThread; 66227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks private int mHeight = 480; 67227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks private int mWidth = 640; 68227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks private Allocation mAllocationIn; 69227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks private ScriptIntrinsicYuvToRGB rgbConverter; 70227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks private Allocation mAllocationOut; 71227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks private Bitmap mBitmap; 72227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 730a160acf297b583e12a9710c929c4ba9a38f7353Eino-Ville Talvala private static final long SESSION_TIMEOUT_MS = 2000; 740a160acf297b583e12a9710c929c4ba9a38f7353Eino-Ville Talvala 75227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks class MyCameraListener extends CameraManager.AvailabilityListener { 76227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 77227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks @Override 78227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public void onCameraAvailable(String cameraId) { 79227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks // TODO Auto-generated method stub 80227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks Log.v(TAG, "camera available to open"); 81227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 82227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 83227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks @Override 84227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public void onCameraUnavailable(String cameraId) { 85227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks // TODO Auto-generated method stub 86227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks Log.v(TAG, "camera unavailable to open"); 87227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 88227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 89227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 90227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 910a160acf297b583e12a9710c929c4ba9a38f7353Eino-Ville Talvala class MyCaptureListener extends CameraCaptureSession.CaptureListener { 92227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 93227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks @Override 940a160acf297b583e12a9710c929c4ba9a38f7353Eino-Ville Talvala public void onCaptureCompleted(CameraCaptureSession camera, CaptureRequest request, 95db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin TotalCaptureResult result) { 96227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks // TODO Auto-generated method stub 97227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks Log.v(TAG, "in onCaptureComplete"); 98227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 99227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 100227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 101227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks @Override 1020a160acf297b583e12a9710c929c4ba9a38f7353Eino-Ville Talvala public void onCaptureFailed(CameraCaptureSession camera, CaptureRequest request, 10369b94f7c5520f3fa817a7bb1e4d1205b593e6c47Igor Murashkin CaptureFailure failure) { 104227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks // TODO Auto-generated method stub 105227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks Log.v(TAG, "onCaptureFailed is being called"); 106227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 107227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 108227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 109227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 110227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public Camera2Source(MffContext context, String name) { 111227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks super(context, name); 112227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mOutputType = FrameType.image2D(FrameType.ELEMENT_RGBA8888, FrameType.WRITE_GPU); 113227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 114227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks Context ctx = context.getApplicationContext(); 115227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mCameraManager = (CameraManager) ctx.getSystemService(Context.CAMERA_SERVICE); 116227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 117227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mRS = RenderScript.create(context.getApplicationContext()); 118227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 119227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 120227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks @Override 121227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public Signature getSignature() { 122227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return new Signature() 123227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks .addOutputPort("timestamp", Signature.PORT_OPTIONAL, FrameType.single(long.class)) 124227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks .addOutputPort("video", Signature.PORT_REQUIRED, mOutputType) 125227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks .addOutputPort("orientation", Signature.PORT_REQUIRED, 126227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks FrameType.single(float.class)) 127227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks .disallowOtherPorts(); 128227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 129227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 130227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks @Override 131227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks protected void onClose() { 132227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks Log.v(TAG, "onClose being called"); 133227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks try { 134227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mCamera.close(); 135227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mSurface.release(); 136227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mLooperThread.close(); 137227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } catch (Exception e) { 138227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks // TODO Auto-generated catch block 139227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks e.printStackTrace(); 140227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 141227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 142227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 143227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks @Override 144227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks protected void onOpen() { 145bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin mLooperThread = new CameraTestThread(); 146bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin Handler mHandler; 147bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin try { 148bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin mHandler = mLooperThread.start(); 149bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin } catch (Exception e) { 150bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin // TODO Auto-generated catch block 151bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin e.printStackTrace(); 152bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin throw new RuntimeException(e); 153bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin } 154bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin 155227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks try { 156227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks String backCameraId = "0"; 157bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin BlockingCameraManager blkManager = new BlockingCameraManager(mCameraManager); 158bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin mCamera = blkManager.openCamera(backCameraId, /*listener*/null, mHandler); 159227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } catch (CameraAccessException e) { 160227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks e.printStackTrace(); 161227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks throw new RuntimeException(e); 162bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin } catch (BlockingOpenException e) { 163bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin e.printStackTrace(); 164bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin throw new RuntimeException(e); 165227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 166227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 167227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks Element ele = Element.createPixel(mRS, Element.DataType.UNSIGNED_8, 168227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks Element.DataKind.PIXEL_YUV); 169227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 170227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks rgbConverter = ScriptIntrinsicYuvToRGB.create(mRS,ele); 171227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks Type.Builder yuvBuilder = new Type.Builder(mRS,ele); 172227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 173227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks yuvBuilder.setYuvFormat(ImageFormat.YUV_420_888); 174227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks yuvBuilder.setX(mWidth); 175227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks yuvBuilder.setY(mHeight); 176227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mAllocationIn = Allocation.createTyped(mRS, yuvBuilder.create(), 177227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks Allocation.USAGE_SCRIPT | Allocation.USAGE_IO_INPUT); 178227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mSurface = mAllocationIn.getSurface(); 179227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mAllocationIn.setOnBufferAvailableListener(this); 180227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks rgbConverter.setInput(mAllocationIn); 181227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 182227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888); 183227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mAllocationOut = Allocation.createFromBitmap(mRS, mBitmap); 184227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 185227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 186227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks Log.v(TAG, "mcamera: " + mCamera); 187227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 188227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks List<Surface> surfaces = new ArrayList<Surface>(); 189227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks surfaces.add(mSurface); 190227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks CaptureRequest.Builder mCaptureRequest = null; 191227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks try { 1920a160acf297b583e12a9710c929c4ba9a38f7353Eino-Ville Talvala BlockingSessionListener blkSession = new BlockingSessionListener(); 1930a160acf297b583e12a9710c929c4ba9a38f7353Eino-Ville Talvala 1940a160acf297b583e12a9710c929c4ba9a38f7353Eino-Ville Talvala mCamera.createCaptureSession(surfaces, blkSession, mHandler); 195227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mCaptureRequest = mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 196227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mCaptureRequest.addTarget(mSurface); 1970a160acf297b583e12a9710c929c4ba9a38f7353Eino-Ville Talvala 1980a160acf297b583e12a9710c929c4ba9a38f7353Eino-Ville Talvala mCameraSession = blkSession.waitAndGetSession(SESSION_TIMEOUT_MS); 1990a160acf297b583e12a9710c929c4ba9a38f7353Eino-Ville Talvala 200227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } catch (CameraAccessException e) { 201227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks e.printStackTrace(); 202227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks throw new RuntimeException(e); 203227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 204bd7f343c7510aa512ceb6d6833ca0e4f2aa2a1d2Igor Murashkin 205227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks try { 2060a160acf297b583e12a9710c929c4ba9a38f7353Eino-Ville Talvala mCameraSession.setRepeatingRequest(mCaptureRequest.build(), new MyCaptureListener(), 207227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mHandler); 208227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } catch (CameraAccessException e) { 209227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks e.printStackTrace(); 210227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks throw new RuntimeException(e); 211227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 212227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mProperties = null; 213227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks try { 21469b94f7c5520f3fa817a7bb1e4d1205b593e6c47Igor Murashkin mProperties = mCameraManager.getCameraCharacteristics(mCamera.getId()); 215227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } catch (CameraAccessException e) { 216227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks e.printStackTrace(); 217227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks throw new RuntimeException(e); 218227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 219227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 220227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 221227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 222227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks @Override 223227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks protected void onProcess() { 224227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks Log.v(TAG, "on Process"); 225227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks if (nextFrame()) { 226227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks OutputPort outPort = getConnectedOutputPort("video"); 227227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 228227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks // Create a 2D frame that will hold the output 229227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int[] dims = new int[] { 230227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mWidth, mHeight 231227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks }; 232227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks FrameImage2D outputFrame = Frame.create(mOutputType, dims).asFrameImage2D(); 233227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks rgbConverter.forEach(mAllocationOut); 234227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mAllocationOut.copyTo(mBitmap); 235227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks outputFrame.setBitmap(mBitmap); 236227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks outPort.pushFrame(outputFrame); 237227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks outputFrame.release(); 238227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 239227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks OutputPort orientationPort = getConnectedOutputPort("orientation"); 240227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks FrameValue orientationFrame = orientationPort.fetchAvailableFrame(null).asFrameValue(); 241227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 242227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks // FIXME: Hardcoded value because ORIENTATION returns null, Qualcomm 243227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks // bug 24469b94f7c5520f3fa817a7bb1e4d1205b593e6c47Igor Murashkin Integer orientation = mProperties.get(CameraCharacteristics.SENSOR_ORIENTATION); 245227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks float temp; 246227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks if (orientation != null) { 247227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks temp = orientation.floatValue(); 248227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } else { 249227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks temp = 90.0f; 250227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 251227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks orientationFrame.setValue(temp); 252227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks orientationPort.pushFrame(orientationFrame); 253227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 254227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 255227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 256227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks private synchronized boolean nextFrame() { 257227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks boolean frameAvailable = mNewFrameAvailable; 258227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks if (frameAvailable) { 259227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mNewFrameAvailable = false; 260227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } else { 261227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks enterSleepState(); 262227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 263227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return frameAvailable; 264227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 265227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 266227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public void onBufferAvailable(Allocation a) { 267227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks Log.v(TAG, "on Buffer Available"); 268227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks a.ioReceive(); 269227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks synchronized (this) { 270227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mNewFrameAvailable = true; 271227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 272227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks wakeUp(); 273227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 274227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 275227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 276227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks} 277