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