144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin/*
244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * Copyright (C) 2013 The Android Open Source Project
344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin *
444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * you may not use this file except in compliance with the License.
644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * You may obtain a copy of the License at
744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin *
844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin *
1044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * Unless required by applicable law or agreed to in writing, software
1144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
1244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * See the License for the specific language governing permissions and
1444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * limitations under the License.
1544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin */
1644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
1744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#ifndef ANDROID_SERVERS_CAMERA_CAMERA2CLIENT_BASE_H
1844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#define ANDROID_SERVERS_CAMERA_CAMERA2CLIENT_BASE_H
1944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
207b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "common/CameraDeviceBase.h"
21cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei#include "camera/CaptureResult.h"
2244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
2344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinnamespace android {
2444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
2544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinclass IMemory;
2644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
277b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass CameraService;
287b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala
2944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase>
3044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinclass Camera2ClientBase :
3144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        public TClientBase,
3244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        public CameraDeviceBase::NotificationListener
3344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin{
3444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinpublic:
3544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    typedef typename TClientBase::TCamCallbacks TCamCallbacks;
3644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
3744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    /**
389efdf956cc2eef63fef609375901d6c8df6351b6Ruben Brunk     * Base binder interface (see ICamera/ICameraDeviceUser for details)
3944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin     */
40d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual status_t       connect(const sp<TCamCallbacks>& callbacks);
41d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status disconnect();
4244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
4344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    /**
4444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin     * Interface used by CameraService
4544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin     */
4644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
4744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    // TODO: too many params, move into a ClientArgs<T>
4844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Camera2ClientBase(const sp<CameraService>& cameraService,
4944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin                      const sp<TCamCallbacks>& remoteCallback,
5044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin                      const String16& clientPackageName,
512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala                      const String8& cameraId,
5244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin                      int cameraFacing,
5344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin                      int clientPid,
5444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin                      uid_t clientUid,
5544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin                      int servicePid);
5644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    virtual ~Camera2ClientBase();
5744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala    virtual status_t      initialize(sp<CameraProviderManager> manager);
59c4003965258404a19b99280ac0f475e2f290bf27Eino-Ville Talvala    virtual status_t      dumpClient(int fd, const Vector<String16>& args);
6044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
6144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    /**
6244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin     * CameraDeviceBase::NotificationListener implementation
6344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin     */
6444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
65d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual void          notifyError(int32_t errorCode,
66cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                      const CaptureResultExtras& resultExtras);
67f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    virtual void          notifyIdle();
68cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual void          notifyShutter(const CaptureResultExtras& resultExtras,
69cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                        nsecs_t timestamp);
7044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    virtual void          notifyAutoFocus(uint8_t newState, int triggerId);
7144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    virtual void          notifyAutoExposure(uint8_t newState, int triggerId);
7244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    virtual void          notifyAutoWhitebalance(uint8_t newState,
7344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin                                                 int triggerId);
744d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    virtual void          notifyPrepared(int streamId);
759d06601e54848f076b7472a376c672215cd70c46Shuzhen Wang    virtual void          notifyRequestQueueEmpty();
76e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen    virtual void          notifyRepeatingRequestError(long lastFrameNumber);
7744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
7844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    int                   getCameraId() const;
7944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    const sp<CameraDeviceBase>&
8044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin                          getCameraDevice();
81cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    int                   getCameraDeviceVersion() const;
8244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    const sp<CameraService>&
8344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin                          getCameraService();
8444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
8544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    /**
8644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin     * Interface used by independent components of CameraClient2Base.
8744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin     */
8844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
8944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    // Simple class to ensure that access to TCamCallbacks is serialized
9044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    // by requiring mRemoteCallbackLock to be locked before access to
9144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    // mRemoteCallback is possible.
9244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    class SharedCameraCallbacks {
9344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin      public:
9444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        class Lock {
9544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin          public:
968b0b971b1416738f22488a80be726d1ec12552a8Chih-Hung Hsieh            explicit Lock(SharedCameraCallbacks &client);
9744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin            ~Lock();
9844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin            sp<TCamCallbacks> &mRemoteCallback;
9944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin          private:
10044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin            SharedCameraCallbacks &mSharedClient;
10144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        };
1028b0b971b1416738f22488a80be726d1ec12552a8Chih-Hung Hsieh        explicit SharedCameraCallbacks(const sp<TCamCallbacks>& client);
10344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        SharedCameraCallbacks& operator=(const sp<TCamCallbacks>& client);
10444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        void clear();
10544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin      private:
10644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        sp<TCamCallbacks> mRemoteCallback;
10744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        mutable Mutex mRemoteCallbackLock;
10844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    } mSharedCameraCallbacks;
10944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
11044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinprotected:
11144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
112b9d2f3333369183344aa89c7be1e643a44296d48Eino-Ville Talvala    // The PID provided in the constructor call
113b9d2f3333369183344aa89c7be1e643a44296d48Eino-Ville Talvala    pid_t mInitialClientPid;
114b9d2f3333369183344aa89c7be1e643a44296d48Eino-Ville Talvala
115e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    virtual sp<IBinder> asBinderWrapper() {
11606b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen        return IInterface::asBinder(this);
117e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
118e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
11944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    virtual status_t      dumpDevice(int fd, const Vector<String16>& args);
12044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
12144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    /** Binder client interface-related private members */
12244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
12344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    // Mutex that must be locked by methods implementing the binder client
12444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    // interface. Ensures serialization between incoming client calls.
12544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    // All methods in this class hierarchy that append 'L' to the name assume
12644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    // that mBinderSerializationLock is locked when they're called
12744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    mutable Mutex         mBinderSerializationLock;
12844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
129d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    /** CameraDeviceBase instance wrapping HAL3+ entry */
13044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
131cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    const int mDeviceVersion;
13244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    sp<CameraDeviceBase>  mDevice;
13344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
13444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    /** Utility members */
13544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
13644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    // Verify that caller is the owner of the camera
13744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    status_t              checkPid(const char *checkLocation) const;
13844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
13944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    virtual void          detachDevice();
140412fe56cd7cf7d73bc5d2bcc3f635bc650d18de9Eino-Ville Talvala
141412fe56cd7cf7d73bc5d2bcc3f635bc650d18de9Eino-Ville Talvala    bool                  mDeviceActive;
1422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala
1432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalaprivate:
1442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala    template<typename TProviderPtr>
1452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala    status_t              initializeImpl(TProviderPtr providerPtr);
14644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin};
14744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
14844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin}; // namespace android
14944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
15044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#endif
151