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