1e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin/* 2e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * Copyright (C) 2013 The Android Open Source Project 3e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * 4e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * Licensed under the Apache License, Version 2.0 (the "License"); 5e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * you may not use this file except in compliance with the License. 6e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * You may obtain a copy of the License at 7e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * 8e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * http://www.apache.org/licenses/LICENSE-2.0 9e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * 10e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * Unless required by applicable law or agreed to in writing, software 11e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * distributed under the License is distributed on an "AS IS" BASIS, 12e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * See the License for the specific language governing permissions and 14e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * limitations under the License. 15e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin */ 16e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 17e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#ifndef ANDROID_SERVERS_CAMERA_PHOTOGRAPHY_CAMERADEVICECLIENT_H 18e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#define ANDROID_SERVERS_CAMERA_PHOTOGRAPHY_CAMERADEVICECLIENT_H 19e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 20d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/camera2/BnCameraDeviceUser.h> 21d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/camera2/ICameraDeviceCallbacks.h> 22b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh#include <camera/camera2/OutputConfiguration.h> 23d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <camera/camera2/SubmitInfo.h> 247b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala 25e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include "CameraService.h" 267b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "common/FrameProcessorBase.h" 277b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "common/Camera2ClientBase.h" 28e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 29e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinnamespace android { 30e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 31d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalastruct CameraDeviceClientBase : 32d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala public CameraService::BasicClient, 33d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala public hardware::camera2::BnCameraDeviceUser 34e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin{ 35d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala typedef hardware::camera2::ICameraDeviceCallbacks TCamCallbacks; 36e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 37d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala const sp<hardware::camera2::ICameraDeviceCallbacks>& getRemoteCallback() { 38e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return mRemoteCallback; 39e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 40e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 41e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinprotected: 42e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CameraDeviceClientBase(const sp<CameraService>& cameraService, 43d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala const sp<hardware::camera2::ICameraDeviceCallbacks>& remoteCallback, 44e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const String16& clientPackageName, 452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const String8& cameraId, 46e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int cameraFacing, 47e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int clientPid, 48e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin uid_t clientUid, 49e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int servicePid); 50e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 51d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<hardware::camera2::ICameraDeviceCallbacks> mRemoteCallback; 52e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}; 53e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 54e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin/** 55e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * Implements the binder ICameraDeviceUser API, 56e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * meant for HAL3-public implementation of 57e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * android.hardware.photography.CameraDevice 58e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin */ 59e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinclass CameraDeviceClient : 60e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin public Camera2ClientBase<CameraDeviceClientBase>, 617b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala public camera2::FrameProcessorBase::FilteredListener 62e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin{ 63e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinpublic: 64e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin /** 65e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * ICameraDeviceUser interface (see ICameraDeviceUser for details) 66e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin */ 67e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 68e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // Note that the callee gets a copy of the metadata. 69d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala virtual binder::Status submitRequest( 70d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala const hardware::camera2::CaptureRequest& request, 71d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala bool streaming = false, 72d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*out*/ 73bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala hardware::camera2::utils::SubmitInfo *submitInfo = nullptr) override; 7490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei // List of requests are copied. 75d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala virtual binder::Status submitRequestList( 76d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala const std::vector<hardware::camera2::CaptureRequest>& requests, 77d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala bool streaming = false, 78d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*out*/ 79bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala hardware::camera2::utils::SubmitInfo *submitInfo = nullptr) override; 80d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala virtual binder::Status cancelRequest(int requestId, 81d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*out*/ 82bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala int64_t* lastFrameNumber = NULL) override; 83e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 84bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala virtual binder::Status beginConfigure() override; 85b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk 86bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala virtual binder::Status endConfigure(int operatingMode) override; 87b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk 88e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // Returns -EBUSY if device is not idle 89bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala virtual binder::Status deleteStream(int streamId) override; 90e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 91d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala virtual binder::Status createStream( 92d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala const hardware::camera2::params::OutputConfiguration &outputConfiguration, 93d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*out*/ 94bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala int32_t* newStreamId = NULL) override; 95e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 96618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen // Create an input stream of width, height, and format. 97d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala virtual binder::Status createInputStream(int width, int height, int format, 98d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*out*/ 99bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala int32_t* newStreamId = NULL) override; 100618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen 101618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen // Get the buffer producer of the input stream 102d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala virtual binder::Status getInputSurface( 103d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*out*/ 104bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala view::Surface *inputSurface) override; 105618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen 106e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // Create a request object from a template. 107d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala virtual binder::Status createDefaultRequest(int templateId, 108d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*out*/ 109bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala hardware::camera2::impl::CameraMetadataNative* request) override; 110e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 111e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // Get the static metadata for the camera 112e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // -- Caller owns the newly allocated metadata 113d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala virtual binder::Status getCameraInfo( 114d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*out*/ 115bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala hardware::camera2::impl::CameraMetadataNative* cameraCharacteristics) override; 116e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 1172ab500c632569e2f131a1a2288459933da70c4eeZhijun He // Wait until all the submitted requests have finished processing 118bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala virtual binder::Status waitUntilIdle() override; 119abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 120abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala // Flush all active and pending requests as fast as possible 121d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala virtual binder::Status flush( 122d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*out*/ 123bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala int64_t* lastFrameNumber = NULL) override; 124abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 1254d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // Prepare stream by preallocating its buffers 126bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala virtual binder::Status prepare(int32_t streamId) override; 1274d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 128b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala // Tear down stream resources by freeing its unused buffers 129bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala virtual binder::Status tearDown(int32_t streamId) override; 130b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala 131c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk // Prepare stream by preallocating up to maxCount of its buffers 132bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala virtual binder::Status prepare2(int32_t maxCount, int32_t streamId) override; 133c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk 134758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang // Finalize the output configurations with surfaces not added before. 135758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang virtual binder::Status finalizeOutputConfigurations(int32_t streamId, 136bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala const hardware::camera2::params::OutputConfiguration &outputConfiguration) override; 1375d677d1f0879d5101e38df480a38228a64d63959Zhijun He 138e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin /** 139e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * Interface used by CameraService 140e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin */ 141e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 142e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CameraDeviceClient(const sp<CameraService>& cameraService, 143d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala const sp<hardware::camera2::ICameraDeviceCallbacks>& remoteCallback, 144e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const String16& clientPackageName, 1452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const String8& cameraId, 146e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int cameraFacing, 147e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int clientPid, 148e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin uid_t clientUid, 149e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int servicePid); 150e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin virtual ~CameraDeviceClient(); 151e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 1522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala virtual status_t initialize(sp<CameraProviderManager> manager) override; 153e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 154e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin virtual status_t dump(int fd, const Vector<String16>& args); 155e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 156c4003965258404a19b99280ac0f475e2f290bf27Eino-Ville Talvala virtual status_t dumpClient(int fd, const Vector<String16>& args); 157c4003965258404a19b99280ac0f475e2f290bf27Eino-Ville Talvala 158e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin /** 159f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Device listener interface 160f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 161f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 162f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala virtual void notifyIdle(); 163d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala virtual void notifyError(int32_t errorCode, 164cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei const CaptureResultExtras& resultExtras); 165cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei virtual void notifyShutter(const CaptureResultExtras& resultExtras, nsecs_t timestamp); 1664d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala virtual void notifyPrepared(int streamId); 1679d06601e54848f076b7472a376c672215cd70c46Shuzhen Wang virtual void notifyRequestQueueEmpty(); 168e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen virtual void notifyRepeatingRequestError(long lastFrameNumber); 169f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 170f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** 171e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * Interface used by independent components of CameraDeviceClient. 172e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin */ 173e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinprotected: 174e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin /** FilteredListener implementation **/ 175cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei virtual void onResultAvailable(const CaptureResult& result); 176e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin virtual void detachDevice(); 177e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 178f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin // Calculate the ANativeWindow transform from android.sensor.orientation 179f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin status_t getRotationTransformLocked(/*out*/int32_t* transform); 180f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin 181e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinprivate: 1820129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang // StreamSurfaceId encapsulates streamId + surfaceId for a particular surface. 1830129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang // streamId specifies the index of the stream the surface belongs to, and the 1840129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang // surfaceId specifies the index of the surface within the stream. (one stream 1850129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang // could contain multiple surfaces.) 1860129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang class StreamSurfaceId final { 1870129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang public: 1880129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang StreamSurfaceId() { 1890129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang mStreamId = -1; 1900129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang mSurfaceId = -1; 1910129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang } 1920129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang StreamSurfaceId(int32_t streamId, int32_t surfaceId) { 1930129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang mStreamId = streamId; 1940129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang mSurfaceId = surfaceId; 1950129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang } 1960129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang int32_t streamId() const { 1970129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang return mStreamId; 1980129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang } 1990129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang int32_t surfaceId() const { 2000129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang return mSurfaceId; 2010129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang } 2020129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang 2030129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang private: 2040129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang int32_t mStreamId; 2050129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang int32_t mSurfaceId; 2060129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang 2070129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang }; // class StreamSurfaceId 2080129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang 209758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang // OutputStreamInfo describes the property of a camera stream. 210758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang class OutputStreamInfo { 211758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang public: 212758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang int width; 213758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang int height; 214758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang int format; 215758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang android_dataspace dataSpace; 216758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang int32_t consumerUsage; 21788fd00509164dc46a98ff2921c956e2d37919117Shuzhen Wang bool finalized = false; 218758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang OutputStreamInfo() : 219758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang width(-1), height(-1), format(-1), dataSpace(HAL_DATASPACE_UNKNOWN), 220758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang consumerUsage(0) {} 221758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang OutputStreamInfo(int _width, int _height, int _format, android_dataspace _dataSpace, 222758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang int32_t _consumerUsage) : 223758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang width(_width), height(_height), format(_format), 224758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang dataSpace(_dataSpace), consumerUsage(_consumerUsage) {} 225758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang }; 226758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang 2270129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wangprivate: 228e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin /** ICameraDeviceUser interface-related private members */ 229e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 230e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin /** Preview callback related members */ 2317b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala sp<camera2::FrameProcessorBase> mFrameProcessor; 232e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin static const int32_t FRAME_PROCESSOR_LISTENER_MIN_ID = 0; 233e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin static const int32_t FRAME_PROCESSOR_LISTENER_MAX_ID = 0x7fffffffL; 234e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 2352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala template<typename TProviderPtr> 2362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status_t initializeImpl(TProviderPtr providerPtr); 2372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 238e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin /** Utility members */ 239d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala binder::Status checkPidStatus(const char* checkLocation); 240e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin bool enforceRequestPermissions(CameraMetadata& metadata); 241e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 242bba75576c3bc5a90cd8e14bd053ab2d74a6c7e9dRuben Brunk // Find the square of the euclidean distance between two points 243bba75576c3bc5a90cd8e14bd053ab2d74a6c7e9dRuben Brunk static int64_t euclidDistSquare(int32_t x0, int32_t y0, int32_t x1, int32_t y1); 244bba75576c3bc5a90cd8e14bd053ab2d74a6c7e9dRuben Brunk 2455d677d1f0879d5101e38df480a38228a64d63959Zhijun He // Create an output stream with surface deferred for future. 2465d677d1f0879d5101e38df480a38228a64d63959Zhijun He binder::Status createDeferredSurfaceStreamLocked( 2475d677d1f0879d5101e38df480a38228a64d63959Zhijun He const hardware::camera2::params::OutputConfiguration &outputConfiguration, 248758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang bool isShared, 2495d677d1f0879d5101e38df480a38228a64d63959Zhijun He int* newStreamId = NULL); 2505d677d1f0879d5101e38df480a38228a64d63959Zhijun He 2515d677d1f0879d5101e38df480a38228a64d63959Zhijun He // Set the stream transform flags to automatically rotate the camera stream for preview use 2525d677d1f0879d5101e38df480a38228a64d63959Zhijun He // cases. 2535d677d1f0879d5101e38df480a38228a64d63959Zhijun He binder::Status setStreamTransformLocked(int streamId); 2545d677d1f0879d5101e38df480a38228a64d63959Zhijun He 255bba75576c3bc5a90cd8e14bd053ab2d74a6c7e9dRuben Brunk // Find the closest dimensions for a given format in available stream configurations with 256bba75576c3bc5a90cd8e14bd053ab2d74a6c7e9dRuben Brunk // a width <= ROUNDING_WIDTH_CAP 25777a77f6ef6f04dba8caa54bda937cb276cace9adRuben Brunk static const int32_t ROUNDING_WIDTH_CAP = 1920; 258bba75576c3bc5a90cd8e14bd053ab2d74a6c7e9dRuben Brunk static bool roundBufferDimensionNearest(int32_t width, int32_t height, int32_t format, 2593d82c0d9ed2b3e956ad699a9ca2c8a70c9d24678Eino-Ville Talvala android_dataspace dataSpace, const CameraMetadata& info, 2603d82c0d9ed2b3e956ad699a9ca2c8a70c9d24678Eino-Ville Talvala /*out*/int32_t* outWidth, /*out*/int32_t* outHeight); 261bba75576c3bc5a90cd8e14bd053ab2d74a6c7e9dRuben Brunk 2626d7af0e93c8442f98b3f3683a3e03d9b4b9856dbEman Copty //check if format is not custom format 2636d7af0e93c8442f98b3f3683a3e03d9b4b9856dbEman Copty static bool isPublicFormat(int32_t format); 2646d7af0e93c8442f98b3f3683a3e03d9b4b9856dbEman Copty 265758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang // Create a Surface from an IGraphicBufferProducer. Returns error if 266758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang // IGraphicBufferProducer's property doesn't match with streamInfo 267758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang binder::Status createSurfaceFromGbp(OutputStreamInfo& streamInfo, bool isStreamInfoValid, 268758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang sp<Surface>& surface, const sp<IGraphicBufferProducer>& gbp); 269758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang 2700129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang // IGraphicsBufferProducer binder -> Stream ID + Surface ID for output streams 2710129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang KeyedVector<sp<IBinder>, StreamSurfaceId> mStreamMap; 272e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 273618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen struct InputStreamConfiguration { 274618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen bool configured; 275618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen int32_t width; 276618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen int32_t height; 277618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen int32_t format; 278618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen int32_t id; 279618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen } mInputStream; 280618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen 281e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen // Streaming request ID 282e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen int32_t mStreamingRequestId; 283c9ca6788c65ed3f578d1a1ed0ba7c268254dcb4bShuzhen Wang Mutex mStreamingRequestIdLock; 284e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen static const int32_t REQUEST_ID_NONE = -1; 285e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 286e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int32_t mRequestIdCounter; 287412fe56cd7cf7d73bc5d2bcc3f635bc650d18de9Eino-Ville Talvala 2885d677d1f0879d5101e38df480a38228a64d63959Zhijun He // The list of output streams whose surfaces are deferred. We have to track them separately 2895d677d1f0879d5101e38df480a38228a64d63959Zhijun He // as there are no surfaces available and can not be put into mStreamMap. Once the deferred 2905d677d1f0879d5101e38df480a38228a64d63959Zhijun He // Surface is configured, the stream id will be moved to mStreamMap. 2915d677d1f0879d5101e38df480a38228a64d63959Zhijun He Vector<int32_t> mDeferredStreams; 2920129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang 293758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang // stream ID -> outputStreamInfo mapping 294758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang std::unordered_map<int32_t, OutputStreamInfo> mStreamInfoMap; 295758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang 2960129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang static const int32_t MAX_SURFACES_PER_STREAM = 2; 297e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}; 298e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 299e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}; // namespace android 300e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 301e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#endif 302