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