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 207b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <camera/camera2/ICameraDeviceUser.h> 217b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <camera/camera2/ICameraDeviceCallbacks.h> 227b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala 23e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include "CameraService.h" 247b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "common/FrameProcessorBase.h" 257b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "common/Camera2ClientBase.h" 26e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 27e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinnamespace android { 28e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 29e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstruct CameraDeviceClientBase : 30e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin public CameraService::BasicClient, public BnCameraDeviceUser 31e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin{ 32e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin typedef ICameraDeviceCallbacks TCamCallbacks; 33e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 34e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const sp<ICameraDeviceCallbacks>& getRemoteCallback() { 35e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return mRemoteCallback; 36e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 37e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 38e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinprotected: 39e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CameraDeviceClientBase(const sp<CameraService>& cameraService, 40e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const sp<ICameraDeviceCallbacks>& remoteCallback, 41e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const String16& clientPackageName, 42e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int cameraId, 43e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int cameraFacing, 44e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int clientPid, 45e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin uid_t clientUid, 46e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int servicePid); 47e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 48e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin sp<ICameraDeviceCallbacks> mRemoteCallback; 49e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}; 50e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 51e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin/** 52e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * Implements the binder ICameraDeviceUser API, 53e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * meant for HAL3-public implementation of 54e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * android.hardware.photography.CameraDevice 55e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin */ 56e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinclass CameraDeviceClient : 57e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin public Camera2ClientBase<CameraDeviceClientBase>, 587b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala public camera2::FrameProcessorBase::FilteredListener 59e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin{ 60e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinpublic: 61e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin /** 62e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * ICameraDeviceUser interface (see ICameraDeviceUser for details) 63e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin */ 64e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 65e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // Note that the callee gets a copy of the metadata. 66e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin virtual int submitRequest(sp<CaptureRequest> request, 67e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin bool streaming = false); 68e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin virtual status_t cancelRequest(int requestId); 69e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 70e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // Returns -EBUSY if device is not idle 71e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin virtual status_t deleteStream(int streamId); 72e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 73e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin virtual status_t createStream( 74e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int width, 75e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int height, 76e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int format, 77e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const sp<IGraphicBufferProducer>& bufferProducer); 78e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 79e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // Create a request object from a template. 80e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin virtual status_t createDefaultRequest(int templateId, 81e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin /*out*/ 82e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CameraMetadata* request); 83e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 84e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // Get the static metadata for the camera 85e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // -- Caller owns the newly allocated metadata 86099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin virtual status_t getCameraInfo(/*out*/CameraMetadata* info); 87e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 882ab500c632569e2f131a1a2288459933da70c4eeZhijun He // Wait until all the submitted requests have finished processing 892ab500c632569e2f131a1a2288459933da70c4eeZhijun He virtual status_t waitUntilIdle(); 90abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 91abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala // Flush all active and pending requests as fast as possible 92abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala virtual status_t flush(); 93abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 94e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin /** 95e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * Interface used by CameraService 96e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin */ 97e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 98e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CameraDeviceClient(const sp<CameraService>& cameraService, 99e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const sp<ICameraDeviceCallbacks>& remoteCallback, 100e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const String16& clientPackageName, 101e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int cameraId, 102e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int cameraFacing, 103e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int clientPid, 104e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin uid_t clientUid, 105e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int servicePid); 106e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin virtual ~CameraDeviceClient(); 107e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 108e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin virtual status_t initialize(camera_module_t *module); 109e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 110e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin virtual status_t dump(int fd, const Vector<String16>& args); 111e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 112e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin /** 113f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Device listener interface 114f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 115f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 116f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala virtual void notifyIdle(); 117f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala virtual void notifyError(); 118f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala virtual void notifyShutter(int requestId, nsecs_t timestamp); 119f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 120f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** 121e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * Interface used by independent components of CameraDeviceClient. 122e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin */ 123e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinprotected: 124e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin /** FilteredListener implementation **/ 125f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala virtual void onFrameAvailable(int32_t requestId, 126e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const CameraMetadata& frame); 127e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin virtual void detachDevice(); 128e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 129f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin // Calculate the ANativeWindow transform from android.sensor.orientation 130f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin status_t getRotationTransformLocked(/*out*/int32_t* transform); 131f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin 132e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinprivate: 133e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin /** ICameraDeviceUser interface-related private members */ 134e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 135e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin /** Preview callback related members */ 1367b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala sp<camera2::FrameProcessorBase> mFrameProcessor; 137e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin static const int32_t FRAME_PROCESSOR_LISTENER_MIN_ID = 0; 138e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin static const int32_t FRAME_PROCESSOR_LISTENER_MAX_ID = 0x7fffffffL; 139e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 140e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin /** Utility members */ 141e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin bool enforceRequestPermissions(CameraMetadata& metadata); 142e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 143e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // IGraphicsBufferProducer binder -> Stream ID 144e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin KeyedVector<sp<IBinder>, int> mStreamMap; 145e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 146e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // Stream ID 147e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin Vector<int> mStreamingRequestList; 148e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 149e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int32_t mRequestIdCounter; 150e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}; 151e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 152e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}; // namespace android 153e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 154e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#endif 155