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