165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/* 2d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * Copyright (C) 2008 The Android Open Source Project 3d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * 4d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * Licensed under the Apache License, Version 2.0 (the "License"); 5d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * you may not use this file except in compliance with the License. 6d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * You may obtain a copy of the License at 7d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * 8d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * http://www.apache.org/licenses/LICENSE-2.0 9d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * 10d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * Unless required by applicable law or agreed to in writing, software 11d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * distributed under the License is distributed on an "AS IS" BASIS, 12d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * See the License for the specific language governing permissions and 14d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * limitations under the License. 15d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk */ 1665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 1765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#ifndef ANDROID_SERVERS_CAMERA_CAMERASERVICE_H 1865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define ANDROID_SERVERS_CAMERA_CAMERASERVICE_H 1965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 20634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <utils/Vector.h> 21b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk#include <utils/KeyedVector.h> 22ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala#include <binder/AppOpsManager.h> 235462fc9a38fa8c9dff434cd53fa5fb1782ae3042Mathias Agopian#include <binder/BinderService.h> 24ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala#include <binder/IAppOpsCallback.h> 2565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <camera/ICameraService.h> 268951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#include <hardware/camera.h> 2765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 28c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/ICamera.h> 29c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/ICameraClient.h> 30c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/IProCameraUser.h> 31c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/IProCameraCallbacks.h> 327b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <camera/camera2/ICameraDeviceUser.h> 337b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <camera/camera2/ICameraDeviceCallbacks.h> 34d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk#include <camera/VendorTagDescriptor.h> 35cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei#include <camera/CaptureResult.h> 36b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk#include <camera/CameraParameters.h> 37c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin 38bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#include <camera/ICameraServiceListener.h> 39bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin 4065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/* This needs to be increased if we can have more cameras */ 4165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define MAX_CAMERAS 2 4265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 4365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopiannamespace android { 4465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 455e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaextern volatile int32_t gLogLevel; 465e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 4765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass MemoryHeapBase; 4865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass MediaPlayer; 4965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 505462fc9a38fa8c9dff434cd53fa5fb1782ae3042Mathias Agopianclass CameraService : 515462fc9a38fa8c9dff434cd53fa5fb1782ae3042Mathias Agopian public BinderService<CameraService>, 52ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin public BnCameraService, 53cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin public IBinder::DeathRecipient, 54cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin public camera_module_callbacks_t 5565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{ 565462fc9a38fa8c9dff434cd53fa5fb1782ae3042Mathias Agopian friend class BinderService<CameraService>; 5765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic: 585e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala class Client; 59634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin class BasicClient; 60634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 61634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin // Implementation of BinderService<T> 625462fc9a38fa8c9dff434cd53fa5fb1782ae3042Mathias Agopian static char const* getServiceName() { return "media.camera"; } 6365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 6465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian CameraService(); 6565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual ~CameraService(); 6665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 67634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin ///////////////////////////////////////////////////////////////////// 68cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin // HAL Callbacks 69cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin virtual void onDeviceStatusChanged(int cameraId, 70cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin int newStatus); 71cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin 72cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin ///////////////////////////////////////////////////////////////////// 73634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin // ICameraService 7465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual int32_t getNumberOfCameras(); 7565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual status_t getCameraInfo(int cameraId, 7665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian struct CameraInfo* cameraInfo); 772b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He virtual status_t getCameraCharacteristics(int cameraId, 782b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He CameraMetadata* cameraInfo); 79d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk virtual status_t getCameraVendorTagDescriptor(/*out*/ sp<VendorTagDescriptor>& desc); 80ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala 810f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk virtual status_t connect(const sp<ICameraClient>& cameraClient, int cameraId, 820f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk const String16& clientPackageName, int clientUid, 830f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk /*out*/ 840f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk sp<ICamera>& device); 850f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk 86b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He virtual status_t connectLegacy(const sp<ICameraClient>& cameraClient, int cameraId, 87b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He int halVersion, const String16& clientPackageName, int clientUid, 88b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He /*out*/ 89b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He sp<ICamera>& device); 90b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He 910f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk virtual status_t connectPro(const sp<IProCameraCallbacks>& cameraCb, 920f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk int cameraId, const String16& clientPackageName, int clientUid, 930f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk /*out*/ 940f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk sp<IProCameraUser>& device); 950f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk 960f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk virtual status_t connectDevice( 97e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const sp<ICameraDeviceCallbacks>& cameraCb, 98e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int cameraId, 99e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const String16& clientPackageName, 1000f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk int clientUid, 1010f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk /*out*/ 1020f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk sp<ICameraDeviceUser>& device); 103ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin 104bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin virtual status_t addListener(const sp<ICameraServiceListener>& listener); 105bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin virtual status_t removeListener( 106bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin const sp<ICameraServiceListener>& listener); 107bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin 10865d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin virtual status_t getLegacyParameters( 10965d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin int cameraId, 11065d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin /*out*/ 11165d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin String16* parameters); 11265d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin 11365d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin // OK = supports api of that version, -EOPNOTSUPP = does not support 11465d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin virtual status_t supportsCameraApi( 11565d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin int cameraId, int apiVersion); 11665d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin 117634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin // Extra permissions checks 11865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual status_t onTransact(uint32_t code, const Parcel& data, 11965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Parcel* reply, uint32_t flags); 120634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 121634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin virtual status_t dump(int fd, const Vector<String16>& args); 122634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 123634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin ///////////////////////////////////////////////////////////////////// 124634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin // Client functionality 125634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin virtual void removeClientByRemote(const wp<IBinder>& remoteBinder); 12665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 12765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian enum sound_kind { 12865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian SOUND_SHUTTER = 0, 12965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian SOUND_RECORDING = 1, 13065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian NUM_SOUNDS 13165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian }; 13265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 13365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void loadSound(); 13465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void playSound(sound_kind kind); 13565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void releaseSound(); 13665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 13798e24724fb77445d4d015a5fec4ecbd5b49abc9bIgor Murashkin ///////////////////////////////////////////////////////////////////// 13898e24724fb77445d4d015a5fec4ecbd5b49abc9bIgor Murashkin // CameraDeviceFactory functionality 13998e24724fb77445d4d015a5fec4ecbd5b49abc9bIgor Murashkin int getDeviceVersion(int cameraId, int* facing = NULL); 14098e24724fb77445d4d015a5fec4ecbd5b49abc9bIgor Murashkin 141f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala ///////////////////////////////////////////////////////////////////// 142f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala // Shared utilities 143f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala static status_t filterOpenErrorCode(status_t err); 144f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala static status_t filterGetInfoErrorCode(status_t err); 145634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 146634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin ///////////////////////////////////////////////////////////////////// 147634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin // CameraClient functionality 148634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 149634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin // returns plain pointer of client. Note that mClientLock should be acquired to 150634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin // prevent the client from destruction. The result can be NULL. 151e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin virtual BasicClient* getClientByIdUnsafe(int cameraId); 152634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin virtual Mutex* getClientLockById(int cameraId); 153634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 154634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin class BasicClient : public virtual RefBase { 155634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin public: 156f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala virtual status_t initialize(camera_module_t *module) = 0; 157f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala virtual void disconnect(); 158634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 159e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // because we can't virtually inherit IInterface, which breaks 160e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // virtual inheritance 161e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin virtual sp<IBinder> asBinderWrapper() = 0; 162e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 163e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin // Return the remote callback binder object (e.g. IProCameraCallbacks) 164f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala sp<IBinder> getRemote() { 16544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return mRemoteBinder; 166634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 167634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 168f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala virtual status_t dump(int fd, const Vector<String16>& args) = 0; 169e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 170634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin protected: 171634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin BasicClient(const sp<CameraService>& cameraService, 172634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin const sp<IBinder>& remoteCallback, 173ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala const String16& clientPackageName, 174634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin int cameraId, 175634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin int cameraFacing, 176634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin int clientPid, 177ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala uid_t clientUid, 178634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin int servicePid); 179634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 180634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin virtual ~BasicClient(); 181634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 182634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin // the instance is in the middle of destruction. When this is set, 183634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin // the instance should not be accessed from callback. 184634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin // CameraService's mClientLock should be acquired to access this. 185634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin // - subclasses should set this to true in their destructors. 186634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin bool mDestructionStarted; 187634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 188634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin // these are initialized in the constructor. 189634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp<CameraService> mCameraService; // immutable after constructor 190634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin int mCameraId; // immutable after constructor 191634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin int mCameraFacing; // immutable after constructor 192ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala const String16 mClientPackageName; 193634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin pid_t mClientPid; 194ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala uid_t mClientUid; // immutable after constructor 195634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin pid_t mServicePid; // immutable after constructor 196634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 197634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin // - The app-side Binder interface to receive callbacks from us 198e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin sp<IBinder> mRemoteBinder; // immutable after constructor 199ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala 200ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala // permissions management 201ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala status_t startCameraOps(); 202ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala status_t finishCameraOps(); 203ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala 204ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala // Notify client about a fatal error 205cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei virtual void notifyError( 206cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ICameraDeviceCallbacks::CameraErrorCode errorCode, 207cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei const CaptureResultExtras& resultExtras) = 0; 208ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala private: 209ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala AppOpsManager mAppOpsManager; 210ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala 211ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala class OpsCallback : public BnAppOpsCallback { 212ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala public: 213ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala OpsCallback(wp<BasicClient> client); 214ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala virtual void opChanged(int32_t op, const String16& packageName); 215ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala 216ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala private: 217ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala wp<BasicClient> mClient; 218ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala 219ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala }; // class OpsCallback 220ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala 221ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala sp<OpsCallback> mOpsCallback; 222ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala // Track whether startCameraOps was called successfully, to avoid 223ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala // finishing what we didn't start. 224ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala bool mOpsActive; 225ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala 226ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala // IAppOpsCallback interface, indirected through opListener 227ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala virtual void opChanged(int32_t op, const String16& packageName); 228ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala }; // class BasicClient 229634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 230634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin class Client : public BnCamera, public BasicClient 23165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian { 23265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian public: 23344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin typedef ICameraClient TCamCallbacks; 23444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 23565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // ICamera interface (see ICamera for details) 2365e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual void disconnect(); 2375e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t connect(const sp<ICameraClient>& client) = 0; 2385e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t lock() = 0; 2395e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t unlock() = 0; 2401ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala virtual status_t setPreviewTarget(const sp<IGraphicBufferProducer>& bufferProducer)=0; 2415e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual void setPreviewCallbackFlag(int flag) = 0; 2423ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala virtual status_t setPreviewCallbackTarget( 2433ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala const sp<IGraphicBufferProducer>& callbackProducer) = 0; 2445e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t startPreview() = 0; 2455e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual void stopPreview() = 0; 2465e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual bool previewEnabled() = 0; 2475e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t storeMetaDataInBuffers(bool enabled) = 0; 2485e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t startRecording() = 0; 2495e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual void stopRecording() = 0; 2505e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual bool recordingEnabled() = 0; 2515e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual void releaseRecordingFrame(const sp<IMemory>& mem) = 0; 2525e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t autoFocus() = 0; 2535e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t cancelAutoFocus() = 0; 2545e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t takePicture(int msgType) = 0; 2555e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t setParameters(const String8& params) = 0; 2565e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual String8 getParameters() const = 0; 2575e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) = 0; 2585e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 2595e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // Interface used by CameraService 2605e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala Client(const sp<CameraService>& cameraService, 2615e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala const sp<ICameraClient>& cameraClient, 262ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala const String16& clientPackageName, 2635e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala int cameraId, 2645e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala int cameraFacing, 265ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin int clientPid, 266ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala uid_t clientUid, 267ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin int servicePid); 2685e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala ~Client(); 26965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 27065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // return our camera client 27144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin const sp<ICameraClient>& getRemoteCallback() { 27244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return mRemoteCallback; 2735e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala } 2745e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 275e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin virtual sp<IBinder> asBinderWrapper() { 276e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return asBinder(); 277e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 278e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 2795e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala protected: 280d8973a71a3d1dd670e5dcdf6e94ec0cd45444eecKeun young Park static Mutex* getClientLockFromCookie(void* user); 281d8973a71a3d1dd670e5dcdf6e94ec0cd45444eecKeun young Park // convert client from cookie. Client lock should be acquired before getting Client. 282d8973a71a3d1dd670e5dcdf6e94ec0cd45444eecKeun young Park static Client* getClientFromCookie(void* user); 2835e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 284cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei virtual void notifyError(ICameraDeviceCallbacks::CameraErrorCode errorCode, 285cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei const CaptureResultExtras& resultExtras); 286ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala 287634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin // Initialized in constructor 2880ed3ec00d0242c9dc77532fe0cf0082645b6662cJamie Gennis 289634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin // - The app-side Binder interface to receive callbacks from us 29044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin sp<ICameraClient> mRemoteCallback; 291ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala 292ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala }; // class Client 293634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 294634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin class ProClient : public BnProCameraUser, public BasicClient { 295634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin public: 29644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin typedef IProCameraCallbacks TCamCallbacks; 29744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 298634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin ProClient(const sp<CameraService>& cameraService, 299634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin const sp<IProCameraCallbacks>& remoteCallback, 300ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala const String16& clientPackageName, 301634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin int cameraId, 302634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin int cameraFacing, 303634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin int clientPid, 304ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala uid_t clientUid, 305634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin int servicePid); 306634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 307634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin virtual ~ProClient(); 308634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 309634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin const sp<IProCameraCallbacks>& getRemoteCallback() { 310634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return mRemoteCallback; 311634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 312634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 313634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin /*** 314634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin IProCamera implementation 315634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin ***/ 316e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin virtual status_t connect(const sp<IProCameraCallbacks>& callbacks) 317e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin = 0; 318e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin virtual status_t exclusiveTryLock() = 0; 319e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin virtual status_t exclusiveLock() = 0; 320e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin virtual status_t exclusiveUnlock() = 0; 321634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 322e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin virtual bool hasExclusiveLock() = 0; 323634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 324634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin // Note that the callee gets a copy of the metadata. 325634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin virtual int submitRequest(camera_metadata_t* metadata, 326e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin bool streaming = false) = 0; 327e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin virtual status_t cancelRequest(int requestId) = 0; 328634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 329bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin // Callbacks from camera service 330e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin virtual void onExclusiveLockStolen() = 0; 331bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin 332634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin protected: 333cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei virtual void notifyError(ICameraDeviceCallbacks::CameraErrorCode errorCode, 334cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei const CaptureResultExtras& resultExtras); 33565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 336ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala sp<IProCameraCallbacks> mRemoteCallback; 337ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala }; // class ProClient 33865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 3395e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaprivate: 340634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 341634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin // Delay-load the Camera HAL module 342634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin virtual void onFirstRef(); 343634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 344e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin // Step 1. Check if we can connect, before we acquire the service lock. 3450f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk status_t validateConnect(int cameraId, 346e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin /*inout*/ 347e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin int& clientUid) const; 348e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin 349e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin // Step 2. Check if we can connect, after we acquire the service lock. 350e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin bool canConnectUnsafe(int cameraId, 351e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin const String16& clientPackageName, 352e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin const sp<IBinder>& remoteCallback, 353e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin /*out*/ 354e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin sp<BasicClient> &client); 355e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin 356e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin // When connection is successful, initialize client and track its death 3570f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk status_t connectFinishUnsafe(const sp<BasicClient>& client, 358e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const sp<IBinder>& remoteCallback); 359e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin 360634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin virtual sp<BasicClient> getClientByRemote(const wp<IBinder>& cameraClient); 361634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 3625e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala Mutex mServiceLock; 363e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // either a Client or CameraDeviceClient 364e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin wp<BasicClient> mClient[MAX_CAMERAS]; // protected by mServiceLock 3655e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala Mutex mClientLock[MAX_CAMERAS]; // prevent Client destruction inside callbacks 3665e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala int mNumberOfCameras; 36765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 368634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin typedef wp<ProClient> weak_pro_client_ptr; 369634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin Vector<weak_pro_client_ptr> mProClientList[MAX_CAMERAS]; 370634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 371ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin // needs to be called with mServiceLock held 372e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin sp<BasicClient> findClientUnsafe(const wp<IBinder>& cameraClient, int& outIndex); 373634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp<ProClient> findProClientUnsafe( 374634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin const wp<IBinder>& cameraCallbacksRemote); 375ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin 3765e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // atomics to record whether the hardware is allocated to some client. 3775e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala volatile int32_t mBusy[MAX_CAMERAS]; 3785e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala void setCameraBusy(int cameraId); 3795e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala void setCameraFree(int cameraId); 380d8973a71a3d1dd670e5dcdf6e94ec0cd45444eecKeun young Park 3815e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // sounds 3825e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala MediaPlayer* newMediaPlayer(const char *file); 3835e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 3845e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala Mutex mSoundLock; 3855e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala sp<MediaPlayer> mSoundPlayer[NUM_SOUNDS]; 3865e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala int mSoundRef; // reference count (release all MediaPlayer when 0) 3878951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 3888951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev camera_module_t *mModule; 389ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin 390bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin Vector<sp<ICameraServiceListener> > 391bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin mListenerList; 392bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin 393bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin // guard only mStatusList and the broadcasting of ICameraServiceListener 394cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin mutable Mutex mStatusMutex; 395bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin ICameraServiceListener::Status 396bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin mStatusList[MAX_CAMERAS]; 397bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin 398cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin // Read the current status (locks mStatusMutex) 399cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin ICameraServiceListener::Status 400cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin getStatus(int cameraId) const; 401cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin 40293747b9c7724f690b3068300514c05629e0b0a3eIgor Murashkin typedef Vector<ICameraServiceListener::Status> StatusVector; 403bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin // Broadcast the new status if it changed (locks the service mutex) 404bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin void updateStatus( 405bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin ICameraServiceListener::Status status, 40693747b9c7724f690b3068300514c05629e0b0a3eIgor Murashkin int32_t cameraId, 40793747b9c7724f690b3068300514c05629e0b0a3eIgor Murashkin const StatusVector *rejectSourceStates = NULL); 408bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin 409ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin // IBinder::DeathRecipient implementation 410bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin virtual void binderDied(const wp<IBinder> &who); 411634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 412634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin // Helpers 413bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin 414bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin bool isValidCameraId(int cameraId); 415d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 416d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk bool setUpVendorTags(); 417b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk 418b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk /** 419b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk * A mapping of camera ids to CameraParameters returned by that camera device. 420b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk * 421b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk * This cache is used to generate CameraCharacteristic metadata when using 422b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk * the HAL1 shim. 423b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk */ 424b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk KeyedVector<int, CameraParameters> mShimParams; 425b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk 426b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk /** 427b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk * Initialize and cache the metadata used by the HAL1 shim for a given cameraId. 428b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk * 429b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk * Returns OK on success, or a negative error code. 430b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk */ 431b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk status_t initializeShimMetadata(int cameraId); 432b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk 433b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk /** 43465d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin * Get the cached CameraParameters for the camera. If they haven't been 43565d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin * cached yet, then initialize them for the first time. 43665d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin * 43765d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin * Returns OK on success, or a negative error code. 43865d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin */ 43965d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin status_t getLegacyParametersLazy(int cameraId, /*out*/CameraParameters* parameters); 44065d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin 44165d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin /** 442b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk * Generate the CameraCharacteristics metadata required by the Camera2 API 443b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk * from the available HAL1 CameraParameters and CameraInfo. 444b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk * 445b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk * Returns OK on success, or a negative error code. 446b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk */ 447b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk status_t generateShimMetadata(int cameraId, /*out*/CameraMetadata* cameraInfo); 448b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk 449b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk /** 450b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk * Connect a new camera client. This should only be used while holding the 451b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk * mutex for mServiceLock. 452b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk * 453b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk * Returns OK on success, or a negative error code. 454b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk */ 455a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin status_t connectHelperLocked( 456a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin /*out*/ 457a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin sp<Client>& client, 458a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin /*in*/ 459a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin const sp<ICameraClient>& cameraClient, 460a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin int cameraId, 461a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin const String16& clientPackageName, 462a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin int clientUid, 463a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin int callingPid, 464a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin int halVersion = CAMERA_HAL_API_VERSION_UNSPECIFIED, 465a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin bool legacyMode = false); 46665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; 46765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 46865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} // namespace android 46965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 47065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#endif 471