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     virtual status_t writeToParcel(android::Parcel* parcel) const;
84     virtual status_t readFromParcel(const android::Parcel* parcel);
85 
CameraStatusCameraStatus86     CameraStatus(String8 id, int32_t s) : cameraId(id), status(s) {}
CameraStatusCameraStatus87     CameraStatus() : status(ICameraServiceListener::STATUS_PRESENT) {}
88 };
89 
90 } // namespace hardware
91 
92 using hardware::CameraInfo;
93 
94 
95 template <typename TCam>
96 struct CameraTraits {
97 };
98 
99 template <typename TCam, typename TCamTraits = CameraTraits<TCam> >
100 class CameraBase : public IBinder::DeathRecipient
101 {
102 public:
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 
126 protected:
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