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