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