1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2013 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #ifndef ANDROID_HARDWARE_CAMERA_BASE_H 18*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_HARDWARE_CAMERA_BASE_H 19*ec779b8eSAndroid Build Coastguard Worker 20*ec779b8eSAndroid Build Coastguard Worker #include <android/content/AttributionSourceState.h> 21*ec779b8eSAndroid Build Coastguard Worker #include <android/hardware/ICameraServiceListener.h> 22*ec779b8eSAndroid Build Coastguard Worker 23*ec779b8eSAndroid Build Coastguard Worker #include <utils/Mutex.h> 24*ec779b8eSAndroid Build Coastguard Worker #include <binder/BinderService.h> 25*ec779b8eSAndroid Build Coastguard Worker 26*ec779b8eSAndroid Build Coastguard Worker struct camera_frame_metadata; 27*ec779b8eSAndroid Build Coastguard Worker 28*ec779b8eSAndroid Build Coastguard Worker namespace android { 29*ec779b8eSAndroid Build Coastguard Worker 30*ec779b8eSAndroid Build Coastguard Worker namespace hardware { 31*ec779b8eSAndroid Build Coastguard Worker 32*ec779b8eSAndroid Build Coastguard Worker 33*ec779b8eSAndroid Build Coastguard Worker class ICameraService; 34*ec779b8eSAndroid Build Coastguard Worker class ICameraServiceListener; 35*ec779b8eSAndroid Build Coastguard Worker 36*ec779b8eSAndroid Build Coastguard Worker enum { 37*ec779b8eSAndroid Build Coastguard Worker /** The facing of the camera is opposite to that of the screen. */ 38*ec779b8eSAndroid Build Coastguard Worker CAMERA_FACING_BACK = 0, 39*ec779b8eSAndroid Build Coastguard Worker /** The facing of the camera is the same as that of the screen. */ 40*ec779b8eSAndroid Build Coastguard Worker CAMERA_FACING_FRONT = 1, 41*ec779b8eSAndroid Build Coastguard Worker }; 42*ec779b8eSAndroid Build Coastguard Worker 43*ec779b8eSAndroid Build Coastguard Worker struct CameraInfo : public android::Parcelable { 44*ec779b8eSAndroid Build Coastguard Worker /** 45*ec779b8eSAndroid Build Coastguard Worker * The direction that the camera faces to. It should be CAMERA_FACING_BACK 46*ec779b8eSAndroid Build Coastguard Worker * or CAMERA_FACING_FRONT. 47*ec779b8eSAndroid Build Coastguard Worker */ 48*ec779b8eSAndroid Build Coastguard Worker int facing; 49*ec779b8eSAndroid Build Coastguard Worker 50*ec779b8eSAndroid Build Coastguard Worker /** 51*ec779b8eSAndroid Build Coastguard Worker * The orientation of the camera image. The value is the angle that the 52*ec779b8eSAndroid Build Coastguard Worker * camera image needs to be rotated clockwise so it shows correctly on the 53*ec779b8eSAndroid Build Coastguard Worker * display in its natural orientation. It should be 0, 90, 180, or 270. 54*ec779b8eSAndroid Build Coastguard Worker * 55*ec779b8eSAndroid Build Coastguard Worker * For example, suppose a device has a naturally tall screen. The 56*ec779b8eSAndroid Build Coastguard Worker * back-facing camera sensor is mounted in landscape. You are looking at 57*ec779b8eSAndroid Build Coastguard Worker * the screen. If the top side of the camera sensor is aligned with the 58*ec779b8eSAndroid Build Coastguard Worker * right edge of the screen in natural orientation, the value should be 59*ec779b8eSAndroid Build Coastguard Worker * 90. If the top side of a front-facing camera sensor is aligned with the 60*ec779b8eSAndroid Build Coastguard Worker * right of the screen, the value should be 270. 61*ec779b8eSAndroid Build Coastguard Worker */ 62*ec779b8eSAndroid Build Coastguard Worker int orientation; 63*ec779b8eSAndroid Build Coastguard Worker 64*ec779b8eSAndroid Build Coastguard Worker virtual status_t writeToParcel(android::Parcel* parcel) const; 65*ec779b8eSAndroid Build Coastguard Worker virtual status_t readFromParcel(const android::Parcel* parcel); 66*ec779b8eSAndroid Build Coastguard Worker }; 67*ec779b8eSAndroid Build Coastguard Worker 68*ec779b8eSAndroid Build Coastguard Worker /** 69*ec779b8eSAndroid Build Coastguard Worker * Basic status information about a camera device - its id and its current 70*ec779b8eSAndroid Build Coastguard Worker * state. 71*ec779b8eSAndroid Build Coastguard Worker */ 72*ec779b8eSAndroid Build Coastguard Worker struct CameraStatus : public android::Parcelable { 73*ec779b8eSAndroid Build Coastguard Worker /** 74*ec779b8eSAndroid Build Coastguard Worker * The app-visible id of the camera device 75*ec779b8eSAndroid Build Coastguard Worker */ 76*ec779b8eSAndroid Build Coastguard Worker std::string cameraId; 77*ec779b8eSAndroid Build Coastguard Worker 78*ec779b8eSAndroid Build Coastguard Worker /** 79*ec779b8eSAndroid Build Coastguard Worker * Its current status, one of the ICameraService::STATUS_* fields 80*ec779b8eSAndroid Build Coastguard Worker */ 81*ec779b8eSAndroid Build Coastguard Worker int32_t status; 82*ec779b8eSAndroid Build Coastguard Worker 83*ec779b8eSAndroid Build Coastguard Worker /** 84*ec779b8eSAndroid Build Coastguard Worker * Unavailable physical camera names for a multi-camera device 85*ec779b8eSAndroid Build Coastguard Worker */ 86*ec779b8eSAndroid Build Coastguard Worker std::vector<std::string> unavailablePhysicalIds; 87*ec779b8eSAndroid Build Coastguard Worker 88*ec779b8eSAndroid Build Coastguard Worker /** 89*ec779b8eSAndroid Build Coastguard Worker * Client package name if camera is open, otherwise not applicable 90*ec779b8eSAndroid Build Coastguard Worker */ 91*ec779b8eSAndroid Build Coastguard Worker std::string clientPackage; 92*ec779b8eSAndroid Build Coastguard Worker 93*ec779b8eSAndroid Build Coastguard Worker /** 94*ec779b8eSAndroid Build Coastguard Worker * The id of the device owning the camera. For virtual cameras, this is the id of the virtual 95*ec779b8eSAndroid Build Coastguard Worker * device owning the camera. For real cameras, this is the default device id, i.e., 96*ec779b8eSAndroid Build Coastguard Worker * kDefaultDeviceId. 97*ec779b8eSAndroid Build Coastguard Worker */ 98*ec779b8eSAndroid Build Coastguard Worker int32_t deviceId; 99*ec779b8eSAndroid Build Coastguard Worker 100*ec779b8eSAndroid Build Coastguard Worker virtual status_t writeToParcel(android::Parcel* parcel) const; 101*ec779b8eSAndroid Build Coastguard Worker virtual status_t readFromParcel(const android::Parcel* parcel); 102*ec779b8eSAndroid Build Coastguard Worker CameraStatusCameraStatus103*ec779b8eSAndroid Build Coastguard Worker CameraStatus(std::string id, int32_t s, const std::vector<std::string>& unavailSubIds, 104*ec779b8eSAndroid Build Coastguard Worker const std::string& clientPkg, int32_t devId) : cameraId(id), status(s), 105*ec779b8eSAndroid Build Coastguard Worker unavailablePhysicalIds(unavailSubIds), clientPackage(clientPkg), deviceId(devId) {} CameraStatusCameraStatus106*ec779b8eSAndroid Build Coastguard Worker CameraStatus() : status(ICameraServiceListener::STATUS_PRESENT) {} 107*ec779b8eSAndroid Build Coastguard Worker }; 108*ec779b8eSAndroid Build Coastguard Worker 109*ec779b8eSAndroid Build Coastguard Worker } // namespace hardware 110*ec779b8eSAndroid Build Coastguard Worker 111*ec779b8eSAndroid Build Coastguard Worker using content::AttributionSourceState; 112*ec779b8eSAndroid Build Coastguard Worker using hardware::CameraInfo; 113*ec779b8eSAndroid Build Coastguard Worker 114*ec779b8eSAndroid Build Coastguard Worker template <typename TCam> 115*ec779b8eSAndroid Build Coastguard Worker struct CameraTraits { 116*ec779b8eSAndroid Build Coastguard Worker }; 117*ec779b8eSAndroid Build Coastguard Worker 118*ec779b8eSAndroid Build Coastguard Worker template <typename TCam, typename TCamTraits = CameraTraits<TCam> > 119*ec779b8eSAndroid Build Coastguard Worker class CameraBase : public IBinder::DeathRecipient 120*ec779b8eSAndroid Build Coastguard Worker { 121*ec779b8eSAndroid Build Coastguard Worker public: 122*ec779b8eSAndroid Build Coastguard Worker typedef typename TCamTraits::TCamListener TCamListener; 123*ec779b8eSAndroid Build Coastguard Worker typedef typename TCamTraits::TCamUser TCamUser; 124*ec779b8eSAndroid Build Coastguard Worker typedef typename TCamTraits::TCamCallbacks TCamCallbacks; 125*ec779b8eSAndroid Build Coastguard Worker typedef typename TCamTraits::TCamConnectService TCamConnectService; 126*ec779b8eSAndroid Build Coastguard Worker 127*ec779b8eSAndroid Build Coastguard Worker static sp<TCam> connect(int cameraId, 128*ec779b8eSAndroid Build Coastguard Worker int targetSdkVersion, int rotationOverride, bool forceSlowJpegMode, 129*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState &clientAttribution, 130*ec779b8eSAndroid Build Coastguard Worker int32_t devicePolicy); 131*ec779b8eSAndroid Build Coastguard Worker virtual void disconnect(); 132*ec779b8eSAndroid Build Coastguard Worker 133*ec779b8eSAndroid Build Coastguard Worker void setListener(const sp<TCamListener>& listener); 134*ec779b8eSAndroid Build Coastguard Worker 135*ec779b8eSAndroid Build Coastguard Worker static int getNumberOfCameras(const AttributionSourceState& clientAttribution, 136*ec779b8eSAndroid Build Coastguard Worker int32_t devicePolicy); 137*ec779b8eSAndroid Build Coastguard Worker 138*ec779b8eSAndroid Build Coastguard Worker static status_t getCameraInfo(int cameraId, 139*ec779b8eSAndroid Build Coastguard Worker int rotationOverride, 140*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& clientAttribution, 141*ec779b8eSAndroid Build Coastguard Worker int32_t devicePolicy, 142*ec779b8eSAndroid Build Coastguard Worker /*out*/ 143*ec779b8eSAndroid Build Coastguard Worker struct hardware::CameraInfo* cameraInfo); 144*ec779b8eSAndroid Build Coastguard Worker 145*ec779b8eSAndroid Build Coastguard Worker sp<TCamUser> remote(); 146*ec779b8eSAndroid Build Coastguard Worker 147*ec779b8eSAndroid Build Coastguard Worker // Status is set to 'UNKNOWN_ERROR' after successful (re)connection 148*ec779b8eSAndroid Build Coastguard Worker status_t getStatus(); 149*ec779b8eSAndroid Build Coastguard Worker 150*ec779b8eSAndroid Build Coastguard Worker protected: 151*ec779b8eSAndroid Build Coastguard Worker CameraBase(int cameraId); 152*ec779b8eSAndroid Build Coastguard Worker virtual ~CameraBase(); 153*ec779b8eSAndroid Build Coastguard Worker 154*ec779b8eSAndroid Build Coastguard Worker //////////////////////////////////////////////////////// 155*ec779b8eSAndroid Build Coastguard Worker // TCamCallbacks implementation 156*ec779b8eSAndroid Build Coastguard Worker //////////////////////////////////////////////////////// 157*ec779b8eSAndroid Build Coastguard Worker virtual void notifyCallback(int32_t msgType, int32_t ext, 158*ec779b8eSAndroid Build Coastguard Worker int32_t ext2); 159*ec779b8eSAndroid Build Coastguard Worker 160*ec779b8eSAndroid Build Coastguard Worker //////////////////////////////////////////////////////// 161*ec779b8eSAndroid Build Coastguard Worker // Common instance variables 162*ec779b8eSAndroid Build Coastguard Worker //////////////////////////////////////////////////////// 163*ec779b8eSAndroid Build Coastguard Worker Mutex mLock; 164*ec779b8eSAndroid Build Coastguard Worker 165*ec779b8eSAndroid Build Coastguard Worker virtual void binderDied(const wp<IBinder>& who); 166*ec779b8eSAndroid Build Coastguard Worker 167*ec779b8eSAndroid Build Coastguard Worker // helper function to obtain camera service handle 168*ec779b8eSAndroid Build Coastguard Worker static const sp<::android::hardware::ICameraService> getCameraService(); 169*ec779b8eSAndroid Build Coastguard Worker 170*ec779b8eSAndroid Build Coastguard Worker sp<TCamUser> mCamera; 171*ec779b8eSAndroid Build Coastguard Worker status_t mStatus; 172*ec779b8eSAndroid Build Coastguard Worker 173*ec779b8eSAndroid Build Coastguard Worker sp<TCamListener> mListener; 174*ec779b8eSAndroid Build Coastguard Worker 175*ec779b8eSAndroid Build Coastguard Worker const int mCameraId; 176*ec779b8eSAndroid Build Coastguard Worker 177*ec779b8eSAndroid Build Coastguard Worker typedef CameraBase<TCam> CameraBaseT; 178*ec779b8eSAndroid Build Coastguard Worker }; 179*ec779b8eSAndroid Build Coastguard Worker 180*ec779b8eSAndroid Build Coastguard Worker } // namespace android 181*ec779b8eSAndroid Build Coastguard Worker 182*ec779b8eSAndroid Build Coastguard Worker #endif 183