1e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin/*
2e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * Copyright (C) 2013 The Android Open Source Project
3e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin *
4e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
5e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * you may not use this file except in compliance with the License.
6e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * You may obtain a copy of the License at
7e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin *
8e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
9e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin *
10e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * Unless required by applicable law or agreed to in writing, software
11e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
12e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * See the License for the specific language governing permissions and
14e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * limitations under the License.
15e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin */
16e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
17e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#ifndef ANDROID_SERVERS_CAMERA_PHOTOGRAPHY_CAMERADEVICECLIENT_H
18e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#define ANDROID_SERVERS_CAMERA_PHOTOGRAPHY_CAMERADEVICECLIENT_H
19e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
207b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <camera/camera2/ICameraDeviceUser.h>
217b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <camera/camera2/ICameraDeviceCallbacks.h>
227b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala
23e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include "CameraService.h"
247b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "common/FrameProcessorBase.h"
257b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "common/Camera2ClientBase.h"
26e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
27e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinnamespace android {
28e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
29e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstruct CameraDeviceClientBase :
30e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        public CameraService::BasicClient, public BnCameraDeviceUser
31e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin{
32e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    typedef ICameraDeviceCallbacks TCamCallbacks;
33e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
34e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    const sp<ICameraDeviceCallbacks>& getRemoteCallback() {
35e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return mRemoteCallback;
36e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
37e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
38e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinprotected:
39e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    CameraDeviceClientBase(const sp<CameraService>& cameraService,
40e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            const sp<ICameraDeviceCallbacks>& remoteCallback,
41e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            const String16& clientPackageName,
42e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int cameraId,
43e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int cameraFacing,
44e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int clientPid,
45e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            uid_t clientUid,
46e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int servicePid);
47e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
48e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    sp<ICameraDeviceCallbacks> mRemoteCallback;
49e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin};
50e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
51e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin/**
52e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * Implements the binder ICameraDeviceUser API,
53e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * meant for HAL3-public implementation of
54e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * android.hardware.photography.CameraDevice
55e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin */
56e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinclass CameraDeviceClient :
57e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        public Camera2ClientBase<CameraDeviceClientBase>,
587b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala        public camera2::FrameProcessorBase::FilteredListener
59e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin{
60e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinpublic:
61e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    /**
62e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     * ICameraDeviceUser interface (see ICameraDeviceUser for details)
63e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     */
64e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
65e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // Note that the callee gets a copy of the metadata.
66e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    virtual int           submitRequest(sp<CaptureRequest> request,
67e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                        bool streaming = false);
68e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    virtual status_t      cancelRequest(int requestId);
69e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
70e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // Returns -EBUSY if device is not idle
71e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    virtual status_t      deleteStream(int streamId);
72e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
73e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    virtual status_t      createStream(
74e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int width,
75e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int height,
76e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int format,
77e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            const sp<IGraphicBufferProducer>& bufferProducer);
78e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
79e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // Create a request object from a template.
80e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    virtual status_t      createDefaultRequest(int templateId,
81e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                               /*out*/
82e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                               CameraMetadata* request);
83e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
84e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // Get the static metadata for the camera
85e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // -- Caller owns the newly allocated metadata
86099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin    virtual status_t      getCameraInfo(/*out*/CameraMetadata* info);
87e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
882ab500c632569e2f131a1a2288459933da70c4eeZhijun He    // Wait until all the submitted requests have finished processing
892ab500c632569e2f131a1a2288459933da70c4eeZhijun He    virtual status_t      waitUntilIdle();
90abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
91abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    // Flush all active and pending requests as fast as possible
92abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    virtual status_t      flush();
93abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
94e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    /**
95e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     * Interface used by CameraService
96e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     */
97e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
98e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    CameraDeviceClient(const sp<CameraService>& cameraService,
99e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            const sp<ICameraDeviceCallbacks>& remoteCallback,
100e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            const String16& clientPackageName,
101e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int cameraId,
102e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int cameraFacing,
103e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int clientPid,
104e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            uid_t clientUid,
105e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int servicePid);
106e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    virtual ~CameraDeviceClient();
107e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
108e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    virtual status_t      initialize(camera_module_t *module);
109e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
110e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    virtual status_t      dump(int fd, const Vector<String16>& args);
111e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
112e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    /**
113f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Device listener interface
114f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     */
115f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
116f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    virtual void notifyIdle();
117f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    virtual void notifyError();
118f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    virtual void notifyShutter(int requestId, nsecs_t timestamp);
119f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
120f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    /**
121e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     * Interface used by independent components of CameraDeviceClient.
122e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     */
123e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinprotected:
124e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    /** FilteredListener implementation **/
125f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    virtual void          onFrameAvailable(int32_t requestId,
126e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                           const CameraMetadata& frame);
127e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    virtual void          detachDevice();
128e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
129f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin    // Calculate the ANativeWindow transform from android.sensor.orientation
130f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin    status_t              getRotationTransformLocked(/*out*/int32_t* transform);
131f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin
132e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinprivate:
133e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    /** ICameraDeviceUser interface-related private members */
134e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
135e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    /** Preview callback related members */
1367b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala    sp<camera2::FrameProcessorBase> mFrameProcessor;
137e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    static const int32_t FRAME_PROCESSOR_LISTENER_MIN_ID = 0;
138e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    static const int32_t FRAME_PROCESSOR_LISTENER_MAX_ID = 0x7fffffffL;
139e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
140e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    /** Utility members */
141e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    bool enforceRequestPermissions(CameraMetadata& metadata);
142e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
143e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // IGraphicsBufferProducer binder -> Stream ID
144e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    KeyedVector<sp<IBinder>, int> mStreamMap;
145e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
146e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // Stream ID
147e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    Vector<int> mStreamingRequestList;
148e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
149e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    int32_t mRequestIdCounter;
150e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin};
151e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
152e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}; // namespace android
153e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
154e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#endif
155