• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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