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 25struct camera_frame_metadata; 26 27namespace android { 28 29namespace hardware { 30 31 32class ICameraService; 33class ICameraServiceListener; 34 35enum { 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 42struct 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 */ 72struct 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 virtual status_t writeToParcel(android::Parcel* parcel) const; 84 virtual status_t readFromParcel(const android::Parcel* parcel); 85 86 CameraStatus(String8 id, int32_t s) : cameraId(id), status(s) {} 87 CameraStatus() : status(ICameraServiceListener::STATUS_PRESENT) {} 88}; 89 90} // namespace hardware 91 92using hardware::CameraInfo; 93 94 95template <typename TCam> 96struct CameraTraits { 97}; 98 99template <typename TCam, typename TCamTraits = CameraTraits<TCam> > 100class CameraBase : public IBinder::DeathRecipient 101{ 102public: 103 typedef typename TCamTraits::TCamListener TCamListener; 104 typedef typename TCamTraits::TCamUser TCamUser; 105 typedef typename TCamTraits::TCamCallbacks TCamCallbacks; 106 typedef typename TCamTraits::TCamConnectService TCamConnectService; 107 108 static sp<TCam> connect(int cameraId, 109 const String16& clientPackageName, 110 int clientUid, int clientPid); 111 virtual void disconnect(); 112 113 void setListener(const sp<TCamListener>& listener); 114 115 static int getNumberOfCameras(); 116 117 static status_t getCameraInfo(int cameraId, 118 /*out*/ 119 struct hardware::CameraInfo* cameraInfo); 120 121 sp<TCamUser> remote(); 122 123 // Status is set to 'UNKNOWN_ERROR' after successful (re)connection 124 status_t getStatus(); 125 126protected: 127 CameraBase(int cameraId); 128 virtual ~CameraBase(); 129 130 //////////////////////////////////////////////////////// 131 // TCamCallbacks implementation 132 //////////////////////////////////////////////////////// 133 virtual void notifyCallback(int32_t msgType, int32_t ext, 134 int32_t ext2); 135 136 //////////////////////////////////////////////////////// 137 // Common instance variables 138 //////////////////////////////////////////////////////// 139 Mutex mLock; 140 141 virtual void binderDied(const wp<IBinder>& who); 142 143 // helper function to obtain camera service handle 144 static const sp<::android::hardware::ICameraService> getCameraService(); 145 146 sp<TCamUser> mCamera; 147 status_t mStatus; 148 149 sp<TCamListener> mListener; 150 151 const int mCameraId; 152 153 typedef CameraBase<TCam> CameraBaseT; 154}; 155 156}; // namespace android 157 158#endif 159