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
20d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/camera2/BnCameraDeviceUser.h>
21d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/camera2/ICameraDeviceCallbacks.h>
22b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh#include <camera/camera2/OutputConfiguration.h>
23d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <camera/camera2/SubmitInfo.h>
247b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala
25e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include "CameraService.h"
267b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "common/FrameProcessorBase.h"
277b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "common/Camera2ClientBase.h"
28e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
29e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinnamespace android {
30e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
31d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalastruct CameraDeviceClientBase :
32d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala         public CameraService::BasicClient,
33d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala         public hardware::camera2::BnCameraDeviceUser
34e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin{
35d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    typedef hardware::camera2::ICameraDeviceCallbacks TCamCallbacks;
36e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
37d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    const sp<hardware::camera2::ICameraDeviceCallbacks>& getRemoteCallback() {
38e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return mRemoteCallback;
39e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
40e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
41e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinprotected:
42e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    CameraDeviceClientBase(const sp<CameraService>& cameraService,
43d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            const sp<hardware::camera2::ICameraDeviceCallbacks>& remoteCallback,
44e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            const String16& clientPackageName,
452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala            const String8& cameraId,
46e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int cameraFacing,
47e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int clientPid,
48e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            uid_t clientUid,
49e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int servicePid);
50e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
51d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    sp<hardware::camera2::ICameraDeviceCallbacks> mRemoteCallback;
52e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin};
53e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
54e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin/**
55e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * Implements the binder ICameraDeviceUser API,
56e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * meant for HAL3-public implementation of
57e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * android.hardware.photography.CameraDevice
58e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin */
59e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinclass CameraDeviceClient :
60e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        public Camera2ClientBase<CameraDeviceClientBase>,
617b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala        public camera2::FrameProcessorBase::FilteredListener
62e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin{
63e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinpublic:
64e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    /**
65e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     * ICameraDeviceUser interface (see ICameraDeviceUser for details)
66e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     */
67e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
68e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // Note that the callee gets a copy of the metadata.
69d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status submitRequest(
70d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            const hardware::camera2::CaptureRequest& request,
71d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            bool streaming = false,
72d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            /*out*/
73bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala            hardware::camera2::utils::SubmitInfo *submitInfo = nullptr) override;
7490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    // List of requests are copied.
75d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status submitRequestList(
76d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            const std::vector<hardware::camera2::CaptureRequest>& requests,
77d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            bool streaming = false,
78d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            /*out*/
79bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala            hardware::camera2::utils::SubmitInfo *submitInfo = nullptr) override;
80d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status cancelRequest(int requestId,
81d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            /*out*/
82bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala            int64_t* lastFrameNumber = NULL) override;
83e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
84bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala    virtual binder::Status beginConfigure() override;
85b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk
86bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala    virtual binder::Status endConfigure(int operatingMode) override;
87b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk
88e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // Returns -EBUSY if device is not idle
89bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala    virtual binder::Status deleteStream(int streamId) override;
90e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
91d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status createStream(
92d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            const hardware::camera2::params::OutputConfiguration &outputConfiguration,
93d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            /*out*/
94bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala            int32_t* newStreamId = NULL) override;
95e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
96618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    // Create an input stream of width, height, and format.
97d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status createInputStream(int width, int height, int format,
98d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            /*out*/
99bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala            int32_t* newStreamId = NULL) override;
100618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen
101618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    // Get the buffer producer of the input stream
102d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status getInputSurface(
103d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            /*out*/
104bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala            view::Surface *inputSurface) override;
105618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen
106e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // Create a request object from a template.
107d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status createDefaultRequest(int templateId,
108d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            /*out*/
109bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala            hardware::camera2::impl::CameraMetadataNative* request) override;
110e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
111e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // Get the static metadata for the camera
112e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // -- Caller owns the newly allocated metadata
113d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status getCameraInfo(
114d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            /*out*/
115bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala            hardware::camera2::impl::CameraMetadataNative* cameraCharacteristics) override;
116e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
1172ab500c632569e2f131a1a2288459933da70c4eeZhijun He    // Wait until all the submitted requests have finished processing
118bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala    virtual binder::Status waitUntilIdle() override;
119abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
120abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    // Flush all active and pending requests as fast as possible
121d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status flush(
122d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            /*out*/
123bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala            int64_t* lastFrameNumber = NULL) override;
124abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
1254d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    // Prepare stream by preallocating its buffers
126bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala    virtual binder::Status prepare(int32_t streamId) override;
1274d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
128b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala    // Tear down stream resources by freeing its unused buffers
129bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala    virtual binder::Status tearDown(int32_t streamId) override;
130b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala
131c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk    // Prepare stream by preallocating up to maxCount of its buffers
132bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala    virtual binder::Status prepare2(int32_t maxCount, int32_t streamId) override;
133c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk
134758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang    // Finalize the output configurations with surfaces not added before.
135758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang    virtual binder::Status finalizeOutputConfigurations(int32_t streamId,
136bbbbe84b3a7296c9c3266bb16e0dc98b11cb5939Eino-Ville Talvala            const hardware::camera2::params::OutputConfiguration &outputConfiguration) override;
1375d677d1f0879d5101e38df480a38228a64d63959Zhijun He
138e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    /**
139e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     * Interface used by CameraService
140e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     */
141e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
142e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    CameraDeviceClient(const sp<CameraService>& cameraService,
143d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            const sp<hardware::camera2::ICameraDeviceCallbacks>& remoteCallback,
144e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            const String16& clientPackageName,
1452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala            const String8& cameraId,
146e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int cameraFacing,
147e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int clientPid,
148e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            uid_t clientUid,
149e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int servicePid);
150e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    virtual ~CameraDeviceClient();
151e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
1522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala    virtual status_t      initialize(sp<CameraProviderManager> manager) override;
153e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
154e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    virtual status_t      dump(int fd, const Vector<String16>& args);
155e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
156c4003965258404a19b99280ac0f475e2f290bf27Eino-Ville Talvala    virtual status_t      dumpClient(int fd, const Vector<String16>& args);
157c4003965258404a19b99280ac0f475e2f290bf27Eino-Ville Talvala
158e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    /**
159f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Device listener interface
160f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     */
161f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
162f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    virtual void notifyIdle();
163d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual void notifyError(int32_t errorCode,
164cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                             const CaptureResultExtras& resultExtras);
165cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual void notifyShutter(const CaptureResultExtras& resultExtras, nsecs_t timestamp);
1664d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    virtual void notifyPrepared(int streamId);
1679d06601e54848f076b7472a376c672215cd70c46Shuzhen Wang    virtual void notifyRequestQueueEmpty();
168e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen    virtual void notifyRepeatingRequestError(long lastFrameNumber);
169f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
170f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    /**
171e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     * Interface used by independent components of CameraDeviceClient.
172e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     */
173e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinprotected:
174e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    /** FilteredListener implementation **/
175cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual void          onResultAvailable(const CaptureResult& result);
176e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    virtual void          detachDevice();
177e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
178f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin    // Calculate the ANativeWindow transform from android.sensor.orientation
179f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin    status_t              getRotationTransformLocked(/*out*/int32_t* transform);
180f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin
181e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinprivate:
1820129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang    // StreamSurfaceId encapsulates streamId + surfaceId for a particular surface.
1830129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang    // streamId specifies the index of the stream the surface belongs to, and the
1840129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang    // surfaceId specifies the index of the surface within the stream. (one stream
1850129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang    // could contain multiple surfaces.)
1860129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang    class StreamSurfaceId final {
1870129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang    public:
1880129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang        StreamSurfaceId() {
1890129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang            mStreamId = -1;
1900129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang            mSurfaceId = -1;
1910129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang        }
1920129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang        StreamSurfaceId(int32_t streamId, int32_t surfaceId) {
1930129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang            mStreamId = streamId;
1940129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang            mSurfaceId = surfaceId;
1950129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang        }
1960129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang        int32_t streamId() const {
1970129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang            return mStreamId;
1980129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang        }
1990129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang        int32_t surfaceId() const {
2000129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang            return mSurfaceId;
2010129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang        }
2020129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang
2030129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang    private:
2040129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang        int32_t mStreamId;
2050129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang        int32_t mSurfaceId;
2060129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang
2070129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang    }; // class StreamSurfaceId
2080129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang
209758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang    // OutputStreamInfo describes the property of a camera stream.
210758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang    class OutputStreamInfo {
211758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang    public:
212758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang        int width;
213758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang        int height;
214758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang        int format;
215758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang        android_dataspace dataSpace;
216758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang        int32_t consumerUsage;
21788fd00509164dc46a98ff2921c956e2d37919117Shuzhen Wang        bool finalized = false;
218758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang        OutputStreamInfo() :
219758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang                width(-1), height(-1), format(-1), dataSpace(HAL_DATASPACE_UNKNOWN),
220758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang                consumerUsage(0) {}
221758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang        OutputStreamInfo(int _width, int _height, int _format, android_dataspace _dataSpace,
222758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang                int32_t _consumerUsage) :
223758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang                    width(_width), height(_height), format(_format),
224758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang                    dataSpace(_dataSpace), consumerUsage(_consumerUsage) {}
225758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang    };
226758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang
2270129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wangprivate:
228e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    /** ICameraDeviceUser interface-related private members */
229e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
230e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    /** Preview callback related members */
2317b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala    sp<camera2::FrameProcessorBase> mFrameProcessor;
232e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    static const int32_t FRAME_PROCESSOR_LISTENER_MIN_ID = 0;
233e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    static const int32_t FRAME_PROCESSOR_LISTENER_MAX_ID = 0x7fffffffL;
234e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
2352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala    template<typename TProviderPtr>
2362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala    status_t      initializeImpl(TProviderPtr providerPtr);
2372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala
238e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    /** Utility members */
239d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    binder::Status checkPidStatus(const char* checkLocation);
240e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    bool enforceRequestPermissions(CameraMetadata& metadata);
241e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
242bba75576c3bc5a90cd8e14bd053ab2d74a6c7e9dRuben Brunk    // Find the square of the euclidean distance between two points
243bba75576c3bc5a90cd8e14bd053ab2d74a6c7e9dRuben Brunk    static int64_t euclidDistSquare(int32_t x0, int32_t y0, int32_t x1, int32_t y1);
244bba75576c3bc5a90cd8e14bd053ab2d74a6c7e9dRuben Brunk
2455d677d1f0879d5101e38df480a38228a64d63959Zhijun He    // Create an output stream with surface deferred for future.
2465d677d1f0879d5101e38df480a38228a64d63959Zhijun He    binder::Status createDeferredSurfaceStreamLocked(
2475d677d1f0879d5101e38df480a38228a64d63959Zhijun He            const hardware::camera2::params::OutputConfiguration &outputConfiguration,
248758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang            bool isShared,
2495d677d1f0879d5101e38df480a38228a64d63959Zhijun He            int* newStreamId = NULL);
2505d677d1f0879d5101e38df480a38228a64d63959Zhijun He
2515d677d1f0879d5101e38df480a38228a64d63959Zhijun He    // Set the stream transform flags to automatically rotate the camera stream for preview use
2525d677d1f0879d5101e38df480a38228a64d63959Zhijun He    // cases.
2535d677d1f0879d5101e38df480a38228a64d63959Zhijun He    binder::Status setStreamTransformLocked(int streamId);
2545d677d1f0879d5101e38df480a38228a64d63959Zhijun He
255bba75576c3bc5a90cd8e14bd053ab2d74a6c7e9dRuben Brunk    // Find the closest dimensions for a given format in available stream configurations with
256bba75576c3bc5a90cd8e14bd053ab2d74a6c7e9dRuben Brunk    // a width <= ROUNDING_WIDTH_CAP
25777a77f6ef6f04dba8caa54bda937cb276cace9adRuben Brunk    static const int32_t ROUNDING_WIDTH_CAP = 1920;
258bba75576c3bc5a90cd8e14bd053ab2d74a6c7e9dRuben Brunk    static bool roundBufferDimensionNearest(int32_t width, int32_t height, int32_t format,
2593d82c0d9ed2b3e956ad699a9ca2c8a70c9d24678Eino-Ville Talvala            android_dataspace dataSpace, const CameraMetadata& info,
2603d82c0d9ed2b3e956ad699a9ca2c8a70c9d24678Eino-Ville Talvala            /*out*/int32_t* outWidth, /*out*/int32_t* outHeight);
261bba75576c3bc5a90cd8e14bd053ab2d74a6c7e9dRuben Brunk
2626d7af0e93c8442f98b3f3683a3e03d9b4b9856dbEman Copty    //check if format is not custom format
2636d7af0e93c8442f98b3f3683a3e03d9b4b9856dbEman Copty    static bool isPublicFormat(int32_t format);
2646d7af0e93c8442f98b3f3683a3e03d9b4b9856dbEman Copty
265758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang    // Create a Surface from an IGraphicBufferProducer. Returns error if
266758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang    // IGraphicBufferProducer's property doesn't match with streamInfo
267758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang    binder::Status createSurfaceFromGbp(OutputStreamInfo& streamInfo, bool isStreamInfoValid,
268758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang            sp<Surface>& surface, const sp<IGraphicBufferProducer>& gbp);
269758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang
2700129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang    // IGraphicsBufferProducer binder -> Stream ID + Surface ID for output streams
2710129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang    KeyedVector<sp<IBinder>, StreamSurfaceId> mStreamMap;
272e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
273618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    struct InputStreamConfiguration {
274618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen        bool configured;
275618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen        int32_t width;
276618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen        int32_t height;
277618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen        int32_t format;
278618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen        int32_t id;
279618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    } mInputStream;
280618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen
281e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen    // Streaming request ID
282e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen    int32_t mStreamingRequestId;
283c9ca6788c65ed3f578d1a1ed0ba7c268254dcb4bShuzhen Wang    Mutex mStreamingRequestIdLock;
284e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen    static const int32_t REQUEST_ID_NONE = -1;
285e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
286e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    int32_t mRequestIdCounter;
287412fe56cd7cf7d73bc5d2bcc3f635bc650d18de9Eino-Ville Talvala
2885d677d1f0879d5101e38df480a38228a64d63959Zhijun He    // The list of output streams whose surfaces are deferred. We have to track them separately
2895d677d1f0879d5101e38df480a38228a64d63959Zhijun He    // as there are no surfaces available and can not be put into mStreamMap. Once the deferred
2905d677d1f0879d5101e38df480a38228a64d63959Zhijun He    // Surface is configured, the stream id will be moved to mStreamMap.
2915d677d1f0879d5101e38df480a38228a64d63959Zhijun He    Vector<int32_t> mDeferredStreams;
2920129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang
293758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang    // stream ID -> outputStreamInfo mapping
294758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang    std::unordered_map<int32_t, OutputStreamInfo> mStreamInfoMap;
295758c215374dba397dabe17b8e96dd38593c09dd7Shuzhen Wang
2960129d52df9794d6fdf06be304722b5cb51a2eab5Shuzhen Wang    static const int32_t MAX_SURFACES_PER_STREAM = 2;
297e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin};
298e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
299e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}; // namespace android
300e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
301e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#endif
302