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;
41fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvalaimport com.android.ex.camera2.blocking.BlockingSessionCallback;
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
75fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvala    class MyCameraListener extends CameraManager.AvailabilityCallback {
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
91fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvala    class MyCaptureCallback extends CameraCaptureSession.CaptureCallback {
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 {
192fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvala            BlockingSessionCallback blkSession = new BlockingSessionCallback();
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 {
206fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvala            mCameraSession.setRepeatingRequest(mCaptureRequest.build(), new MyCaptureCallback(),
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