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