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,
45e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int 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*/
73d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            hardware::camera2::utils::SubmitInfo *submitInfo = nullptr);
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*/
79d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            hardware::camera2::utils::SubmitInfo *submitInfo = nullptr);
80d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status cancelRequest(int requestId,
81d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            /*out*/
82d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            int64_t* lastFrameNumber = NULL);
83e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
84d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status beginConfigure();
85b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk
86d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status endConfigure(bool isConstrainedHighSpeed = false);
87b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk
88e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // Returns -EBUSY if device is not idle
89d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status deleteStream(int streamId);
90e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
91d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status createStream(
92d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            const hardware::camera2::params::OutputConfiguration &outputConfiguration,
93d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            /*out*/
94d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            int32_t* newStreamId = NULL);
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*/
99d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            int32_t* newStreamId = NULL);
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*/
104d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            view::Surface *inputSurface);
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*/
109d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            hardware::camera2::impl::CameraMetadataNative* request);
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*/
115d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            hardware::camera2::impl::CameraMetadataNative* cameraCharacteristics);
116e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
1172ab500c632569e2f131a1a2288459933da70c4eeZhijun He    // Wait until all the submitted requests have finished processing
118d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status waitUntilIdle();
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*/
123d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            int64_t* lastFrameNumber = NULL);
124abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
1254d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    // Prepare stream by preallocating its buffers
126d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status prepare(int32_t streamId);
1274d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
128b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala    // Tear down stream resources by freeing its unused buffers
129d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status tearDown(int32_t streamId);
130b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala
131c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk    // Prepare stream by preallocating up to maxCount of its buffers
132d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status prepare2(int32_t maxCount, int32_t streamId);
133c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk
134e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    /**
135e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     * Interface used by CameraService
136e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     */
137e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
138e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    CameraDeviceClient(const sp<CameraService>& cameraService,
139d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            const sp<hardware::camera2::ICameraDeviceCallbacks>& remoteCallback,
140e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            const String16& clientPackageName,
141e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int cameraId,
142e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int cameraFacing,
143e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int clientPid,
144e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            uid_t clientUid,
145e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int servicePid);
146e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    virtual ~CameraDeviceClient();
147e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
148e074a93046ebe5cea0b55c3a479e082a426e1e07Yin-Chia Yeh    virtual status_t      initialize(CameraModule *module);
149e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
150e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    virtual status_t      dump(int fd, const Vector<String16>& args);
151e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
152c4003965258404a19b99280ac0f475e2f290bf27Eino-Ville Talvala    virtual status_t      dumpClient(int fd, const Vector<String16>& args);
153c4003965258404a19b99280ac0f475e2f290bf27Eino-Ville Talvala
154e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    /**
155f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Device listener interface
156f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     */
157f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
158f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    virtual void notifyIdle();
159d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual void notifyError(int32_t errorCode,
160cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                             const CaptureResultExtras& resultExtras);
161cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual void notifyShutter(const CaptureResultExtras& resultExtras, nsecs_t timestamp);
1624d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    virtual void notifyPrepared(int streamId);
163e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen    virtual void notifyRepeatingRequestError(long lastFrameNumber);
164f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
165f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    /**
166e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     * Interface used by independent components of CameraDeviceClient.
167e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     */
168e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinprotected:
169e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    /** FilteredListener implementation **/
170cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual void          onResultAvailable(const CaptureResult& result);
171e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    virtual void          detachDevice();
172e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
173f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin    // Calculate the ANativeWindow transform from android.sensor.orientation
174f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin    status_t              getRotationTransformLocked(/*out*/int32_t* transform);
175f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin
176e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinprivate:
177e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    /** ICameraDeviceUser interface-related private members */
178e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
179e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    /** Preview callback related members */
1807b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala    sp<camera2::FrameProcessorBase> mFrameProcessor;
181e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    static const int32_t FRAME_PROCESSOR_LISTENER_MIN_ID = 0;
182e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    static const int32_t FRAME_PROCESSOR_LISTENER_MAX_ID = 0x7fffffffL;
183e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
184e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    /** Utility members */
185d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    binder::Status checkPidStatus(const char* checkLocation);
186e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    bool enforceRequestPermissions(CameraMetadata& metadata);
187e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
188bba75576c3bc5a90cd8e14bd053ab2d74a6c7e9dRuben Brunk    // Find the square of the euclidean distance between two points
189bba75576c3bc5a90cd8e14bd053ab2d74a6c7e9dRuben Brunk    static int64_t euclidDistSquare(int32_t x0, int32_t y0, int32_t x1, int32_t y1);
190bba75576c3bc5a90cd8e14bd053ab2d74a6c7e9dRuben Brunk
191bba75576c3bc5a90cd8e14bd053ab2d74a6c7e9dRuben Brunk    // Find the closest dimensions for a given format in available stream configurations with
192bba75576c3bc5a90cd8e14bd053ab2d74a6c7e9dRuben Brunk    // a width <= ROUNDING_WIDTH_CAP
19377a77f6ef6f04dba8caa54bda937cb276cace9adRuben Brunk    static const int32_t ROUNDING_WIDTH_CAP = 1920;
194bba75576c3bc5a90cd8e14bd053ab2d74a6c7e9dRuben Brunk    static bool roundBufferDimensionNearest(int32_t width, int32_t height, int32_t format,
1953d82c0d9ed2b3e956ad699a9ca2c8a70c9d24678Eino-Ville Talvala            android_dataspace dataSpace, const CameraMetadata& info,
1963d82c0d9ed2b3e956ad699a9ca2c8a70c9d24678Eino-Ville Talvala            /*out*/int32_t* outWidth, /*out*/int32_t* outHeight);
197bba75576c3bc5a90cd8e14bd053ab2d74a6c7e9dRuben Brunk
198618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    // IGraphicsBufferProducer binder -> Stream ID for output streams
199e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    KeyedVector<sp<IBinder>, int> mStreamMap;
200e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
201618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    struct InputStreamConfiguration {
202618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen        bool configured;
203618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen        int32_t width;
204618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen        int32_t height;
205618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen        int32_t format;
206618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen        int32_t id;
207618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    } mInputStream;
208618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen
209e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen    // Streaming request ID
210e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen    int32_t mStreamingRequestId;
211c9ca6788c65ed3f578d1a1ed0ba7c268254dcb4bShuzhen Wang    Mutex mStreamingRequestIdLock;
212e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen    static const int32_t REQUEST_ID_NONE = -1;
213e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
214e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    int32_t mRequestIdCounter;
215412fe56cd7cf7d73bc5d2bcc3f635bc650d18de9Eino-Ville Talvala
216e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin};
217e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
218e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}; // namespace android
219e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
220e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#endif
221