From c28189a64a6ef65aecccb6e3bb980f1afc189a1c Mon Sep 17 00:00:00 2001 From: Shuzhen Wang Date: Mon, 27 Nov 2017 23:05:10 -0800 Subject: [PATCH] Camera: Add physicalCameraId to OutputConfiguration Add physical camera ID in OutputConfiguration so that the application can optionally set physical camera id for an output stream. Test: Camera CTS Bug: 64691172 Change-Id: I5909cd71618cc07ef403c420913eb1c02f1e10f0 --- camera/camera2/OutputConfiguration.cpp | 16 +++- .../camera/camera2/OutputConfiguration.h | 12 ++- .../include/camera/NdkCameraMetadataTags.h | 92 +++++++++++++++++++ .../api1/client2/CallbackProcessor.cpp | 5 +- .../api1/client2/JpegProcessor.cpp | 5 +- .../api1/client2/StreamingProcessor.cpp | 7 +- .../api1/client2/ZslProcessor.cpp | 5 +- .../api2/CameraDeviceClient.cpp | 53 ++++++++++- .../api2/CameraDeviceClient.h | 6 +- .../common/CameraDeviceBase.h | 4 +- .../device3/Camera3Device.cpp | 82 ++++++++++------- .../libcameraservice/device3/Camera3Device.h | 4 +- .../device3/Camera3DummyStream.cpp | 7 +- .../device3/Camera3DummyStream.h | 3 +- .../device3/Camera3IOStreamBase.cpp | 8 +- .../device3/Camera3IOStreamBase.h | 3 +- .../device3/Camera3InputStream.cpp | 7 +- .../device3/Camera3InputStream.h | 4 +- .../device3/Camera3OutputStream.cpp | 22 +++-- .../device3/Camera3OutputStream.h | 10 +- .../device3/Camera3SharedOutputStream.cpp | 9 +- .../device3/Camera3SharedOutputStream.h | 3 +- .../device3/Camera3Stream.cpp | 9 +- .../libcameraservice/device3/Camera3Stream.h | 5 +- 24 files changed, 296 insertions(+), 85 deletions(-) diff --git a/camera/camera2/OutputConfiguration.cpp b/camera/camera2/OutputConfiguration.cpp index 813d6c9bb9..feb04c24ed 100644 --- a/camera/camera2/OutputConfiguration.cpp +++ b/camera/camera2/OutputConfiguration.cpp @@ -1,6 +1,6 @@ /* ** -** Copyright 2015, The Android Open Source Project +** Copyright 2015-2018, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. @@ -64,6 +64,10 @@ bool OutputConfiguration::isShared() const { return mIsShared; } +String16 OutputConfiguration::getPhysicalCameraId() const { + return mPhysicalCameraId; +} + OutputConfiguration::OutputConfiguration() : mRotation(INVALID_ROTATION), mSurfaceSetID(INVALID_SET_ID), @@ -139,6 +143,8 @@ status_t OutputConfiguration::readFromParcel(const android::Parcel* parcel) { return err; } + parcel->readString16(&mPhysicalCameraId); + mRotation = rotation; mSurfaceSetID = setID; mSurfaceType = surfaceType; @@ -153,8 +159,9 @@ status_t OutputConfiguration::readFromParcel(const android::Parcel* parcel) { mGbps.push_back(surface.graphicBufferProducer); } - ALOGV("%s: OutputConfiguration: rotation = %d, setId = %d, surfaceType = %d", - __FUNCTION__, mRotation, mSurfaceSetID, mSurfaceType); + ALOGV("%s: OutputConfiguration: rotation = %d, setId = %d, surfaceType = %d," + " physicalCameraId = %s", __FUNCTION__, mRotation, mSurfaceSetID, + mSurfaceType, String8(mPhysicalCameraId).string()); return err; } @@ -204,6 +211,9 @@ status_t OutputConfiguration::writeToParcel(android::Parcel* parcel) const { err = parcel->writeParcelableVector(surfaceShims); if (err != OK) return err; + err = parcel->writeString16(mPhysicalCameraId); + if (err != OK) return err; + return OK; } diff --git a/camera/include/camera/camera2/OutputConfiguration.h b/camera/include/camera/camera2/OutputConfiguration.h index 3599604353..a80f44b1f4 100644 --- a/camera/include/camera/camera2/OutputConfiguration.h +++ b/camera/include/camera/camera2/OutputConfiguration.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015 The Android Open Source Project + * Copyright (C) 2015-2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -46,6 +46,7 @@ public: int getHeight() const; bool isDeferred() const; bool isShared() const; + String16 getPhysicalCameraId() const; /** * Keep impl up-to-date with OutputConfiguration.java in frameworks/base */ @@ -74,7 +75,8 @@ public: mHeight == other.mHeight && mIsDeferred == other.mIsDeferred && mIsShared == other.mIsShared && - gbpsEqual(other)); + gbpsEqual(other) && + mPhysicalCameraId == other.mPhysicalCameraId ); } bool operator != (const OutputConfiguration& other) const { return !(*this == other); @@ -102,6 +104,9 @@ public: if (mIsShared != other.mIsShared) { return mIsShared < other.mIsShared; } + if (mPhysicalCameraId != other.mPhysicalCameraId) { + return mPhysicalCameraId < other.mPhysicalCameraId; + } return gbpsLessThan(other); } bool operator > (const OutputConfiguration& other) const { @@ -120,8 +125,7 @@ private: int mHeight; bool mIsDeferred; bool mIsShared; - // helper function - static String16 readMaybeEmptyString16(const android::Parcel* parcel); + String16 mPhysicalCameraId; }; } // namespace params } // namespace camera2 diff --git a/camera/ndk/include/camera/NdkCameraMetadataTags.h b/camera/ndk/include/camera/NdkCameraMetadataTags.h index 6e861a69df..2be9db8fef 100644 --- a/camera/ndk/include/camera/NdkCameraMetadataTags.h +++ b/camera/ndk/include/camera/NdkCameraMetadataTags.h @@ -69,6 +69,7 @@ typedef enum acamera_metadata_section { ACAMERA_SYNC, ACAMERA_REPROCESS, ACAMERA_DEPTH, + ACAMERA_LOGICAL_MULTI_CAMERA, ACAMERA_SECTION_COUNT, ACAMERA_VENDOR = 0x8000 @@ -104,6 +105,9 @@ typedef enum acamera_metadata_section_start { ACAMERA_SYNC_START = ACAMERA_SYNC << 16, ACAMERA_REPROCESS_START = ACAMERA_REPROCESS << 16, ACAMERA_DEPTH_START = ACAMERA_DEPTH << 16, + ACAMERA_LOGICAL_MULTI_CAMERA_START + = ACAMERA_LOGICAL_MULTI_CAMERA + << 16, ACAMERA_VENDOR_START = ACAMERA_VENDOR << 16 } acamera_metadata_section_start_t; @@ -5165,6 +5169,29 @@ typedef enum acamera_metadata_tag { ACAMERA_DEPTH_START + 4, ACAMERA_DEPTH_END, + /** + *

The accuracy of frame timestamp synchronization between physical cameras

+ * + *

Type: byte (acamera_metadata_enum_android_logical_multi_camera_sensor_sync_type_t)

+ * + *

This tag may appear in: + *

+ * + *

The accuracy of the frame timestamp synchronization determines the physical cameras' + * ability to start exposure at the same time. If the sensorSyncType is CALIBRATED, + * the physical camera sensors usually run in master-slave mode so that their shutter + * time is synchronized. For APPROXIMATE sensorSyncType, the camera sensors usually run in + * master-master mode, and there could be offset between their start of exposure.

+ *

In both cases, all images generated for a particular capture request still carry the same + * timestamps, so that they can be used to look up the matching frame number and + * onCaptureStarted callback.

+ */ + ACAMERA_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE = // byte (acamera_metadata_enum_android_logical_multi_camera_sensor_sync_type_t) + ACAMERA_LOGICAL_MULTI_CAMERA_START + 1, + ACAMERA_LOGICAL_MULTI_CAMERA_END, + } acamera_metadata_tag_t; /** @@ -6895,6 +6922,52 @@ typedef enum acamera_metadata_enum_acamera_request_available_capabilities { */ ACAMERA_REQUEST_AVAILABLE_CAPABILITIES_MOTION_TRACKING = 10, + /** + *

The camera device is a logical camera backed by two or more physical cameras that are + * also exposed to the application.

+ *

This capability requires the camera device to support the following:

+ * + *

Both the logical camera device and its underlying physical devices support the + * mandatory stream combinations required for their device levels.

+ *

Additionally, for each guaranteed stream combination, the logical camera supports:

+ * + *

Using physical streams in place of a logical stream of the same size and format will + * not slow down the frame rate of the capture, as long as the minimum frame duration + * of the physical and logical streams are the same.

+ * + * @see ACAMERA_LENS_INTRINSIC_CALIBRATION + * @see ACAMERA_LENS_POSE_REFERENCE + * @see ACAMERA_LENS_POSE_ROTATION + * @see ACAMERA_LENS_POSE_TRANSLATION + * @see ACAMERA_LENS_RADIAL_DISTORTION + * @see ACAMERA_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE + */ + ACAMERA_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA = 11, + } acamera_metadata_enum_android_request_available_capabilities_t; @@ -7474,6 +7547,25 @@ typedef enum acamera_metadata_enum_acamera_depth_depth_is_exclusive { } acamera_metadata_enum_android_depth_depth_is_exclusive_t; +// ACAMERA_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE +typedef enum acamera_metadata_enum_acamera_logical_multi_camera_sensor_sync_type { + /** + *

A software mechanism is used to synchronize between the physical cameras. As a result, + * the timestamp of an image from a physical stream is only an approximation of the + * image sensor start-of-exposure time.

+ */ + ACAMERA_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE = 0, + + /** + *

The camera device supports frame timestamp synchronization at the hardware level, + * and the timestamp of a physical stream image accurately reflects its + * start-of-exposure time.

+ */ + ACAMERA_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED = 1, + +} acamera_metadata_enum_android_logical_multi_camera_sensor_sync_type_t; + + #endif /* __ANDROID_API__ >= 24 */ __END_DECLS diff --git a/services/camera/libcameraservice/api1/client2/CallbackProcessor.cpp b/services/camera/libcameraservice/api1/client2/CallbackProcessor.cpp index 0d2dba1d73..a71a732fd7 100644 --- a/services/camera/libcameraservice/api1/client2/CallbackProcessor.cpp +++ b/services/camera/libcameraservice/api1/client2/CallbackProcessor.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 The Android Open Source Project + * Copyright (C) 2012-2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -154,7 +154,8 @@ status_t CallbackProcessor::updateStream(const Parameters ¶ms) { callbackFormat, params.previewFormat); res = device->createStream(mCallbackWindow, params.previewWidth, params.previewHeight, callbackFormat, - HAL_DATASPACE_V0_JFIF, CAMERA3_STREAM_ROTATION_0, &mCallbackStreamId); + HAL_DATASPACE_V0_JFIF, CAMERA3_STREAM_ROTATION_0, &mCallbackStreamId, + String8()); if (res != OK) { ALOGE("%s: Camera %d: Can't create output stream for callbacks: " "%s (%d)", __FUNCTION__, mId, diff --git a/services/camera/libcameraservice/api1/client2/JpegProcessor.cpp b/services/camera/libcameraservice/api1/client2/JpegProcessor.cpp index d1bbdaf735..cc4249f19e 100755 --- a/services/camera/libcameraservice/api1/client2/JpegProcessor.cpp +++ b/services/camera/libcameraservice/api1/client2/JpegProcessor.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 The Android Open Source Project + * Copyright (C) 2012-2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -168,7 +168,8 @@ status_t JpegProcessor::updateStream(const Parameters ¶ms) { res = device->createStream(mCaptureWindow, params.pictureWidth, params.pictureHeight, HAL_PIXEL_FORMAT_BLOB, HAL_DATASPACE_V0_JFIF, - CAMERA3_STREAM_ROTATION_0, &mCaptureStreamId); + CAMERA3_STREAM_ROTATION_0, &mCaptureStreamId, + String8()); if (res != OK) { ALOGE("%s: Camera %d: Can't create output stream for capture: " "%s (%d)", __FUNCTION__, mId, diff --git a/services/camera/libcameraservice/api1/client2/StreamingProcessor.cpp b/services/camera/libcameraservice/api1/client2/StreamingProcessor.cpp index 73dca73105..0786f53e61 100644 --- a/services/camera/libcameraservice/api1/client2/StreamingProcessor.cpp +++ b/services/camera/libcameraservice/api1/client2/StreamingProcessor.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 The Android Open Source Project + * Copyright (C) 2012-2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -194,7 +194,7 @@ status_t StreamingProcessor::updatePreviewStream(const Parameters ¶ms) { res = device->createStream(mPreviewWindow, params.previewWidth, params.previewHeight, CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, HAL_DATASPACE_UNKNOWN, - CAMERA3_STREAM_ROTATION_0, &mPreviewStreamId); + CAMERA3_STREAM_ROTATION_0, &mPreviewStreamId, String8()); if (res != OK) { ALOGE("%s: Camera %d: Unable to create preview stream: %s (%d)", __FUNCTION__, mId, strerror(-res), res); @@ -379,7 +379,8 @@ status_t StreamingProcessor::updateRecordingStream(const Parameters ¶ms) { res = device->createStream(mRecordingWindow, params.videoWidth, params.videoHeight, params.videoFormat, params.videoDataSpace, - CAMERA3_STREAM_ROTATION_0, &mRecordingStreamId); + CAMERA3_STREAM_ROTATION_0, &mRecordingStreamId, + String8()); if (res != OK) { ALOGE("%s: Camera %d: Can't create output stream for recording: " "%s (%d)", __FUNCTION__, mId, diff --git a/services/camera/libcameraservice/api1/client2/ZslProcessor.cpp b/services/camera/libcameraservice/api1/client2/ZslProcessor.cpp index b0607fbfb1..372a2c576f 100644 --- a/services/camera/libcameraservice/api1/client2/ZslProcessor.cpp +++ b/services/camera/libcameraservice/api1/client2/ZslProcessor.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 The Android Open Source Project + * Copyright (C) 2013-2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -311,7 +311,8 @@ status_t ZslProcessor::updateStream(const Parameters ¶ms) { res = device->createStream(outSurface, params.fastInfo.arrayWidth, params.fastInfo.arrayHeight, HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, - HAL_DATASPACE_UNKNOWN, CAMERA3_STREAM_ROTATION_0, &mZslStreamId); + HAL_DATASPACE_UNKNOWN, CAMERA3_STREAM_ROTATION_0, &mZslStreamId, + String8()); if (res != OK) { ALOGE("%s: Camera %d: Can't create ZSL stream: " "%s (%d)", __FUNCTION__, client->getCameraId(), diff --git a/services/camera/libcameraservice/api2/CameraDeviceClient.cpp b/services/camera/libcameraservice/api2/CameraDeviceClient.cpp index 5cbc1588df..ec6d56483e 100644 --- a/services/camera/libcameraservice/api2/CameraDeviceClient.cpp +++ b/services/camera/libcameraservice/api2/CameraDeviceClient.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 The Android Open Source Project + * Copyright (C) 2013-2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -508,6 +508,7 @@ binder::Status CameraDeviceClient::createStream( size_t numBufferProducers = bufferProducers.size(); bool deferredConsumer = outputConfiguration.isDeferred(); bool isShared = outputConfiguration.isShared(); + String8 physicalCameraId = String8(outputConfiguration.getPhysicalCameraId()); if (numBufferProducers > MAX_SURFACES_PER_STREAM) { ALOGE("%s: GraphicBufferProducer count %zu for stream exceeds limit of %d", @@ -529,6 +530,12 @@ binder::Status CameraDeviceClient::createStream( return STATUS_ERROR(CameraService::ERROR_DISCONNECTED, "Camera device no longer alive"); } + if (!checkPhysicalCameraId(physicalCameraId)) { + String8 msg = String8::format("Camera %s: Camera doesn't support physicalCameraId %s.", + mCameraIdStr.string(), physicalCameraId.string()); + ALOGE("%s: %s", __FUNCTION__, msg.string()); + return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, msg.string()); + } std::vector> surfaces; std::vector> binders; status_t err; @@ -578,7 +585,8 @@ binder::Status CameraDeviceClient::createStream( err = mDevice->createStream(surfaces, deferredConsumer, streamInfo.width, streamInfo.height, streamInfo.format, streamInfo.dataSpace, static_cast(outputConfiguration.getRotation()), - &streamId, &surfaceIds, outputConfiguration.getSurfaceSetID(), isShared); + &streamId, physicalCameraId, &surfaceIds, outputConfiguration.getSurfaceSetID(), + isShared); if (err != OK) { res = STATUS_ERROR_FMT(CameraService::ERROR_INVALID_OPERATION, @@ -640,10 +648,12 @@ binder::Status CameraDeviceClient::createDeferredSurfaceStreamLocked( int streamId = camera3::CAMERA3_STREAM_ID_INVALID; std::vector> noSurface; std::vector surfaceIds; + String8 physicalCameraId(outputConfiguration.getPhysicalCameraId()); err = mDevice->createStream(noSurface, /*hasDeferredConsumer*/true, width, height, format, dataSpace, static_cast(outputConfiguration.getRotation()), - &streamId, &surfaceIds, outputConfiguration.getSurfaceSetID(), isShared, + &streamId, physicalCameraId, &surfaceIds, + outputConfiguration.getSurfaceSetID(), isShared, consumerUsage); if (err != OK) { @@ -1059,6 +1069,43 @@ binder::Status CameraDeviceClient::createSurfaceFromGbp( return binder::Status::ok(); } +bool CameraDeviceClient::checkPhysicalCameraId(const String8& physicalCameraId) { + if (0 == physicalCameraId.size()) { + return true; + } + + CameraMetadata staticInfo = mDevice->info(); + camera_metadata_entry_t entryCap; + bool isLogicalCam = false; + + entryCap = staticInfo.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES); + for (size_t i = 0; i < entryCap.count; ++i) { + uint8_t capability = entryCap.data.u8[i]; + if (capability == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA) { + isLogicalCam = true; + } + } + if (!isLogicalCam) { + return false; + } + + camera_metadata_entry_t entryIds = staticInfo.find(ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS); + const uint8_t* ids = entryIds.data.u8; + size_t start = 0; + for (size_t i = 0; i < entryIds.count; ++i) { + if (ids[i] == '\0') { + if (start != i) { + String8 currentId((const char*)ids+start); + if (currentId == physicalCameraId) { + return true; + } + } + start = i+1; + } + } + return false; +} + bool CameraDeviceClient::roundBufferDimensionNearest(int32_t width, int32_t height, int32_t format, android_dataspace dataSpace, const CameraMetadata& info, /*out*/int32_t* outWidth, /*out*/int32_t* outHeight) { diff --git a/services/camera/libcameraservice/api2/CameraDeviceClient.h b/services/camera/libcameraservice/api2/CameraDeviceClient.h index 4086c72067..14aeed09af 100644 --- a/services/camera/libcameraservice/api2/CameraDeviceClient.h +++ b/services/camera/libcameraservice/api2/CameraDeviceClient.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 The Android Open Source Project + * Copyright (C) 2013-2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -262,6 +262,10 @@ private: /*out*/SurfaceMap* surfaceMap, /*out*/Vector* streamIds); + // Check that the physicalCameraId passed in is spported by the camera + // device. + bool checkPhysicalCameraId(const String8& physicalCameraId); + // IGraphicsBufferProducer binder -> Stream ID + Surface ID for output streams KeyedVector, StreamSurfaceId> mStreamMap; diff --git a/services/camera/libcameraservice/common/CameraDeviceBase.h b/services/camera/libcameraservice/common/CameraDeviceBase.h index 3fd6921965..4a7c674b06 100644 --- a/services/camera/libcameraservice/common/CameraDeviceBase.h +++ b/services/camera/libcameraservice/common/CameraDeviceBase.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 The Android Open Source Project + * Copyright (C) 2013-2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -119,6 +119,7 @@ class CameraDeviceBase : public virtual RefBase { virtual status_t createStream(sp consumer, uint32_t width, uint32_t height, int format, android_dataspace dataSpace, camera3_stream_rotation_t rotation, int *id, + const String8& physicalCameraId, std::vector *surfaceIds = nullptr, int streamSetId = camera3::CAMERA3_STREAM_SET_ID_INVALID, bool isShared = false, uint64_t consumerUsage = 0) = 0; @@ -133,6 +134,7 @@ class CameraDeviceBase : public virtual RefBase { virtual status_t createStream(const std::vector>& consumers, bool hasDeferredConsumer, uint32_t width, uint32_t height, int format, android_dataspace dataSpace, camera3_stream_rotation_t rotation, int *id, + const String8& physicalCameraId, std::vector *surfaceIds = nullptr, int streamSetId = camera3::CAMERA3_STREAM_SET_ID_INVALID, bool isShared = false, uint64_t consumerUsage = 0) = 0; diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp index 16d699911f..bd15620f36 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.cpp +++ b/services/camera/libcameraservice/device3/Camera3Device.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 The Android Open Source Project + * Copyright (C) 2013-2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -1230,6 +1230,7 @@ status_t Camera3Device::createInputStream( status_t Camera3Device::createStream(sp consumer, uint32_t width, uint32_t height, int format, android_dataspace dataSpace, camera3_stream_rotation_t rotation, int *id, + const String8& physicalCameraId, std::vector *surfaceIds, int streamSetId, bool isShared, uint64_t consumerUsage) { ATRACE_CALL(); @@ -1242,12 +1243,14 @@ status_t Camera3Device::createStream(sp consumer, consumers.push_back(consumer); return createStream(consumers, /*hasDeferredConsumer*/ false, width, height, - format, dataSpace, rotation, id, surfaceIds, streamSetId, isShared, consumerUsage); + format, dataSpace, rotation, id, physicalCameraId, surfaceIds, streamSetId, + isShared, consumerUsage); } status_t Camera3Device::createStream(const std::vector>& consumers, bool hasDeferredConsumer, uint32_t width, uint32_t height, int format, android_dataspace dataSpace, camera3_stream_rotation_t rotation, int *id, + const String8& physicalCameraId, std::vector *surfaceIds, int streamSetId, bool isShared, uint64_t consumerUsage) { ATRACE_CALL(); @@ -1255,8 +1258,9 @@ status_t Camera3Device::createStream(const std::vector>& consumers, nsecs_t maxExpectedDuration = getExpectedInFlightDuration(); Mutex::Autolock l(mLock); ALOGV("Camera %s: Creating new stream %d: %d x %d, format %d, dataspace %d rotation %d" - " consumer usage %" PRIu64 ", isShared %d", mId.string(), mNextStreamId, width, height, format, - dataSpace, rotation, consumerUsage, isShared); + " consumer usage %" PRIu64 ", isShared %d, physicalCameraId %s", mId.string(), + mNextStreamId, width, height, format, dataSpace, rotation, consumerUsage, isShared, + physicalCameraId.string()); status_t res; bool wasActive = false; @@ -1316,7 +1320,7 @@ status_t Camera3Device::createStream(const std::vector>& consumers, } newStream = new Camera3OutputStream(mNextStreamId, consumers[0], width, height, blobBufferSize, format, dataSpace, rotation, - mTimestampOffset, streamSetId); + mTimestampOffset, physicalCameraId, streamSetId); } else if (format == HAL_PIXEL_FORMAT_RAW_OPAQUE) { ssize_t rawOpaqueBufferSize = getRawOpaqueBufferSize(width, height); if (rawOpaqueBufferSize <= 0) { @@ -1325,19 +1329,19 @@ status_t Camera3Device::createStream(const std::vector>& consumers, } newStream = new Camera3OutputStream(mNextStreamId, consumers[0], width, height, rawOpaqueBufferSize, format, dataSpace, rotation, - mTimestampOffset, streamSetId); + mTimestampOffset, physicalCameraId, streamSetId); } else if (isShared) { newStream = new Camera3SharedOutputStream(mNextStreamId, consumers, width, height, format, consumerUsage, dataSpace, rotation, - mTimestampOffset, streamSetId); + mTimestampOffset, physicalCameraId, streamSetId); } else if (consumers.size() == 0 && hasDeferredConsumer) { newStream = new Camera3OutputStream(mNextStreamId, width, height, format, consumerUsage, dataSpace, rotation, - mTimestampOffset, streamSetId); + mTimestampOffset, physicalCameraId, streamSetId); } else { newStream = new Camera3OutputStream(mNextStreamId, consumers[0], width, height, format, dataSpace, rotation, - mTimestampOffset, streamSetId); + mTimestampOffset, physicalCameraId, streamSetId); } size_t consumerCount = consumers.size(); @@ -3322,10 +3326,13 @@ status_t Camera3Device::HalInterface::configureStreams(const camera_metadata_t * // Convert stream config to HIDL std::set activeStreams; - device::V3_4::StreamConfiguration requestedConfiguration; - requestedConfiguration.v3_2.streams.resize(config->num_streams); + device::V3_2::StreamConfiguration requestedConfiguration3_2; + device::V3_4::StreamConfiguration requestedConfiguration3_4; + requestedConfiguration3_2.streams.resize(config->num_streams); + requestedConfiguration3_4.streams.resize(config->num_streams); for (size_t i = 0; i < config->num_streams; i++) { - Stream &dst = requestedConfiguration.v3_2.streams[i]; + device::V3_2::Stream &dst3_2 = requestedConfiguration3_2.streams[i]; + device::V3_4::Stream &dst3_4 = requestedConfiguration3_4.streams[i]; camera3_stream_t *src = config->streams[i]; Camera3Stream* cam3stream = Camera3Stream::cast(src); @@ -3344,14 +3351,18 @@ status_t Camera3Device::HalInterface::configureStreams(const camera_metadata_t * __FUNCTION__, streamId, config->streams[i]->stream_type); return BAD_VALUE; } - dst.id = streamId; - dst.streamType = streamType; - dst.width = src->width; - dst.height = src->height; - dst.format = mapToPixelFormat(src->format); - dst.usage = mapToConsumerUsage(cam3stream->getUsage()); - dst.dataSpace = mapToHidlDataspace(src->data_space); - dst.rotation = mapToStreamRotation((camera3_stream_rotation_t) src->rotation); + dst3_2.id = streamId; + dst3_2.streamType = streamType; + dst3_2.width = src->width; + dst3_2.height = src->height; + dst3_2.format = mapToPixelFormat(src->format); + dst3_2.usage = mapToConsumerUsage(cam3stream->getUsage()); + dst3_2.dataSpace = mapToHidlDataspace(src->data_space); + dst3_2.rotation = mapToStreamRotation((camera3_stream_rotation_t) src->rotation); + dst3_4.v3_2 = dst3_2; + if (src->physical_camera_id != nullptr) { + dst3_4.physicalCameraId = src->physical_camera_id; + } activeStreams.insert(streamId); // Create Buffer ID map if necessary @@ -3370,19 +3381,20 @@ status_t Camera3Device::HalInterface::configureStreams(const camera_metadata_t * } } + StreamConfigurationMode operationMode; res = mapToStreamConfigurationMode( (camera3_stream_configuration_mode_t) config->operation_mode, - /*out*/ &requestedConfiguration.v3_2.operationMode); + /*out*/ &operationMode); if (res != OK) { return res; } - - requestedConfiguration.sessionParams.setToExternal( + requestedConfiguration3_2.operationMode = operationMode; + requestedConfiguration3_4.operationMode = operationMode; + requestedConfiguration3_4.sessionParams.setToExternal( reinterpret_cast(const_cast(sessionParams)), get_camera_metadata_size(sessionParams)); // Invoke configureStreams - device::V3_3::HalStreamConfiguration finalConfiguration; common::V1_0::Status status; @@ -3400,22 +3412,28 @@ status_t Camera3Device::HalInterface::configureStreams(const camera_metadata_t * } if (hidlSession_3_4 != nullptr) { - // We do; use v3.4 for the call + // We do; use v3.4 for the call, and construct a v3.4 + // HalStreamConfiguration ALOGV("%s: v3.4 device found", __FUNCTION__); - auto err = hidlSession_3_4->configureStreams_3_4(requestedConfiguration, - [&status, &finalConfiguration] - (common::V1_0::Status s, const device::V3_3::HalStreamConfiguration& halConfiguration) { - finalConfiguration = halConfiguration; + device::V3_4::HalStreamConfiguration finalConfiguration3_4; + auto err = hidlSession_3_4->configureStreams_3_4(requestedConfiguration3_4, + [&status, &finalConfiguration3_4] + (common::V1_0::Status s, const device::V3_4::HalStreamConfiguration& halConfiguration) { + finalConfiguration3_4 = halConfiguration; status = s; }); if (!err.isOk()) { ALOGE("%s: Transaction error: %s", __FUNCTION__, err.description().c_str()); return DEAD_OBJECT; } + finalConfiguration.streams.resize(finalConfiguration3_4.streams.size()); + for (size_t i = 0; i < finalConfiguration3_4.streams.size(); i++) { + finalConfiguration.streams[i] = finalConfiguration3_4.streams[i].v3_3; + } } else if (hidlSession_3_3 != nullptr) { // We do; use v3.3 for the call ALOGV("%s: v3.3 device found", __FUNCTION__); - auto err = hidlSession_3_3->configureStreams_3_3(requestedConfiguration.v3_2, + auto err = hidlSession_3_3->configureStreams_3_3(requestedConfiguration3_2, [&status, &finalConfiguration] (common::V1_0::Status s, const device::V3_3::HalStreamConfiguration& halConfiguration) { finalConfiguration = halConfiguration; @@ -3429,7 +3447,7 @@ status_t Camera3Device::HalInterface::configureStreams(const camera_metadata_t * // We don't; use v3.2 call and construct a v3.3 HalStreamConfiguration ALOGV("%s: v3.2 device found", __FUNCTION__); HalStreamConfiguration finalConfiguration_3_2; - auto err = mHidlSession->configureStreams(requestedConfiguration.v3_2, + auto err = mHidlSession->configureStreams(requestedConfiguration3_2, [&status, &finalConfiguration_3_2] (common::V1_0::Status s, const HalStreamConfiguration& halConfiguration) { finalConfiguration_3_2 = halConfiguration; @@ -3443,7 +3461,7 @@ status_t Camera3Device::HalInterface::configureStreams(const camera_metadata_t * for (size_t i = 0; i < finalConfiguration_3_2.streams.size(); i++) { finalConfiguration.streams[i].v3_2 = finalConfiguration_3_2.streams[i]; finalConfiguration.streams[i].overrideDataSpace = - requestedConfiguration.v3_2.streams[i].dataSpace; + requestedConfiguration3_2.streams[i].dataSpace; } } diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h index 8e7f2e0d86..ef346ef34c 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.h +++ b/services/camera/libcameraservice/device3/Camera3Device.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 The Android Open Source Project + * Copyright (C) 2013-2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -119,12 +119,14 @@ class Camera3Device : status_t createStream(sp consumer, uint32_t width, uint32_t height, int format, android_dataspace dataSpace, camera3_stream_rotation_t rotation, int *id, + const String8& physicalCameraId, std::vector *surfaceIds = nullptr, int streamSetId = camera3::CAMERA3_STREAM_SET_ID_INVALID, bool isShared = false, uint64_t consumerUsage = 0) override; status_t createStream(const std::vector>& consumers, bool hasDeferredConsumer, uint32_t width, uint32_t height, int format, android_dataspace dataSpace, camera3_stream_rotation_t rotation, int *id, + const String8& physicalCameraId, std::vector *surfaceIds = nullptr, int streamSetId = camera3::CAMERA3_STREAM_SET_ID_INVALID, bool isShared = false, uint64_t consumerUsage = 0) override; diff --git a/services/camera/libcameraservice/device3/Camera3DummyStream.cpp b/services/camera/libcameraservice/device3/Camera3DummyStream.cpp index 0a245c4a13..44eb68ab2f 100644 --- a/services/camera/libcameraservice/device3/Camera3DummyStream.cpp +++ b/services/camera/libcameraservice/device3/Camera3DummyStream.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014 The Android Open Source Project + * Copyright (C) 2014-2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,9 +26,12 @@ namespace android { namespace camera3 { +const String8 Camera3DummyStream::DUMMY_ID; + Camera3DummyStream::Camera3DummyStream(int id) : Camera3IOStreamBase(id, CAMERA3_STREAM_OUTPUT, DUMMY_WIDTH, DUMMY_HEIGHT, - /*maxSize*/0, DUMMY_FORMAT, DUMMY_DATASPACE, DUMMY_ROTATION) { + /*maxSize*/0, DUMMY_FORMAT, DUMMY_DATASPACE, DUMMY_ROTATION, + DUMMY_ID) { } diff --git a/services/camera/libcameraservice/device3/Camera3DummyStream.h b/services/camera/libcameraservice/device3/Camera3DummyStream.h index 684f4b0863..dcf9160a14 100644 --- a/services/camera/libcameraservice/device3/Camera3DummyStream.h +++ b/services/camera/libcameraservice/device3/Camera3DummyStream.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014 The Android Open Source Project + * Copyright (C) 2014-2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -114,6 +114,7 @@ class Camera3DummyStream : static const android_dataspace DUMMY_DATASPACE = HAL_DATASPACE_UNKNOWN; static const camera3_stream_rotation_t DUMMY_ROTATION = CAMERA3_STREAM_ROTATION_0; static const uint64_t DUMMY_USAGE = GRALLOC_USAGE_HW_COMPOSER; + static const String8 DUMMY_ID; /** * Internal Camera3Stream interface diff --git a/services/camera/libcameraservice/device3/Camera3IOStreamBase.cpp b/services/camera/libcameraservice/device3/Camera3IOStreamBase.cpp index a52422ddea..3c1e43d9b4 100644 --- a/services/camera/libcameraservice/device3/Camera3IOStreamBase.cpp +++ b/services/camera/libcameraservice/device3/Camera3IOStreamBase.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 The Android Open Source Project + * Copyright (C) 2013-2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,9 +31,11 @@ namespace camera3 { Camera3IOStreamBase::Camera3IOStreamBase(int id, camera3_stream_type_t type, uint32_t width, uint32_t height, size_t maxSize, int format, - android_dataspace dataSpace, camera3_stream_rotation_t rotation, int setId) : + android_dataspace dataSpace, camera3_stream_rotation_t rotation, + const String8& physicalCameraId, int setId) : Camera3Stream(id, type, - width, height, maxSize, format, dataSpace, rotation, setId), + width, height, maxSize, format, dataSpace, rotation, + physicalCameraId, setId), mTotalBufferCount(0), mHandoutTotalBufferCount(0), mHandoutOutputBufferCount(0), diff --git a/services/camera/libcameraservice/device3/Camera3IOStreamBase.h b/services/camera/libcameraservice/device3/Camera3IOStreamBase.h index 2376058647..0a31d444b9 100644 --- a/services/camera/libcameraservice/device3/Camera3IOStreamBase.h +++ b/services/camera/libcameraservice/device3/Camera3IOStreamBase.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 The Android Open Source Project + * Copyright (C) 2013-2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,6 +35,7 @@ class Camera3IOStreamBase : Camera3IOStreamBase(int id, camera3_stream_type_t type, uint32_t width, uint32_t height, size_t maxSize, int format, android_dataspace dataSpace, camera3_stream_rotation_t rotation, + const String8& physicalCameraId, int setId = CAMERA3_STREAM_SET_ID_INVALID); public: diff --git a/services/camera/libcameraservice/device3/Camera3InputStream.cpp b/services/camera/libcameraservice/device3/Camera3InputStream.cpp index 2cb1ea7326..017d7beac9 100644 --- a/services/camera/libcameraservice/device3/Camera3InputStream.cpp +++ b/services/camera/libcameraservice/device3/Camera3InputStream.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 The Android Open Source Project + * Copyright (C) 2013-2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,10 +27,13 @@ namespace android { namespace camera3 { +const String8 Camera3InputStream::DUMMY_ID; + Camera3InputStream::Camera3InputStream(int id, uint32_t width, uint32_t height, int format) : Camera3IOStreamBase(id, CAMERA3_STREAM_INPUT, width, height, /*maxSize*/0, - format, HAL_DATASPACE_UNKNOWN, CAMERA3_STREAM_ROTATION_0) { + format, HAL_DATASPACE_UNKNOWN, CAMERA3_STREAM_ROTATION_0, + DUMMY_ID) { if (format == HAL_PIXEL_FORMAT_BLOB) { ALOGE("%s: Bad format, BLOB not supported", __FUNCTION__); diff --git a/services/camera/libcameraservice/device3/Camera3InputStream.h b/services/camera/libcameraservice/device3/Camera3InputStream.h index 81226f836d..0732464c44 100644 --- a/services/camera/libcameraservice/device3/Camera3InputStream.h +++ b/services/camera/libcameraservice/device3/Camera3InputStream.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 The Android Open Source Project + * Copyright (C) 2013-2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -53,6 +53,8 @@ class Camera3InputStream : public Camera3IOStreamBase, sp mProducer; Vector mBuffersInFlight; + static const String8 DUMMY_ID; + /** * Camera3IOStreamBase */ diff --git a/services/camera/libcameraservice/device3/Camera3OutputStream.cpp b/services/camera/libcameraservice/device3/Camera3OutputStream.cpp index e79eecc72b..b73e2562fb 100644 --- a/services/camera/libcameraservice/device3/Camera3OutputStream.cpp +++ b/services/camera/libcameraservice/device3/Camera3OutputStream.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 The Android Open Source Project + * Copyright (C) 2013-2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,9 +35,11 @@ Camera3OutputStream::Camera3OutputStream(int id, sp consumer, uint32_t width, uint32_t height, int format, android_dataspace dataSpace, camera3_stream_rotation_t rotation, - nsecs_t timestampOffset, int setId) : + nsecs_t timestampOffset, const String8& physicalCameraId, + int setId) : Camera3IOStreamBase(id, CAMERA3_STREAM_OUTPUT, width, height, - /*maxSize*/0, format, dataSpace, rotation, setId), + /*maxSize*/0, format, dataSpace, rotation, + physicalCameraId, setId), mConsumer(consumer), mTransform(0), mTraceFirstBuffer(true), @@ -61,9 +63,9 @@ Camera3OutputStream::Camera3OutputStream(int id, sp consumer, uint32_t width, uint32_t height, size_t maxSize, int format, android_dataspace dataSpace, camera3_stream_rotation_t rotation, - nsecs_t timestampOffset, int setId) : + nsecs_t timestampOffset, const String8& physicalCameraId, int setId) : Camera3IOStreamBase(id, CAMERA3_STREAM_OUTPUT, width, height, maxSize, - format, dataSpace, rotation, setId), + format, dataSpace, rotation, physicalCameraId, setId), mConsumer(consumer), mTransform(0), mTraceFirstBuffer(true), @@ -93,9 +95,11 @@ Camera3OutputStream::Camera3OutputStream(int id, Camera3OutputStream::Camera3OutputStream(int id, uint32_t width, uint32_t height, int format, uint64_t consumerUsage, android_dataspace dataSpace, - camera3_stream_rotation_t rotation, nsecs_t timestampOffset, int setId) : + camera3_stream_rotation_t rotation, nsecs_t timestampOffset, + const String8& physicalCameraId, int setId) : Camera3IOStreamBase(id, CAMERA3_STREAM_OUTPUT, width, height, - /*maxSize*/0, format, dataSpace, rotation, setId), + /*maxSize*/0, format, dataSpace, rotation, + physicalCameraId, setId), mConsumer(nullptr), mTransform(0), mTraceFirstBuffer(true), @@ -131,11 +135,13 @@ Camera3OutputStream::Camera3OutputStream(int id, camera3_stream_type_t type, int format, android_dataspace dataSpace, camera3_stream_rotation_t rotation, + const String8& physicalCameraId, uint64_t consumerUsage, nsecs_t timestampOffset, int setId) : Camera3IOStreamBase(id, type, width, height, /*maxSize*/0, - format, dataSpace, rotation, setId), + format, dataSpace, rotation, + physicalCameraId, setId), mTransform(0), mTraceFirstBuffer(true), mUseMonoTimestamp(false), diff --git a/services/camera/libcameraservice/device3/Camera3OutputStream.h b/services/camera/libcameraservice/device3/Camera3OutputStream.h index 18b190199f..824aef73de 100644 --- a/services/camera/libcameraservice/device3/Camera3OutputStream.h +++ b/services/camera/libcameraservice/device3/Camera3OutputStream.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 The Android Open Source Project + * Copyright (C) 2013-2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -82,7 +82,8 @@ class Camera3OutputStream : Camera3OutputStream(int id, sp consumer, uint32_t width, uint32_t height, int format, android_dataspace dataSpace, camera3_stream_rotation_t rotation, - nsecs_t timestampOffset, int setId = CAMERA3_STREAM_SET_ID_INVALID); + nsecs_t timestampOffset, const String8& physicalCameraId, + int setId = CAMERA3_STREAM_SET_ID_INVALID); /** * Set up a stream for formats that have a variable buffer size for the same @@ -93,7 +94,8 @@ class Camera3OutputStream : Camera3OutputStream(int id, sp consumer, uint32_t width, uint32_t height, size_t maxSize, int format, android_dataspace dataSpace, camera3_stream_rotation_t rotation, - nsecs_t timestampOffset, int setId = CAMERA3_STREAM_SET_ID_INVALID); + nsecs_t timestampOffset, const String8& physicalCameraId, + int setId = CAMERA3_STREAM_SET_ID_INVALID); /** * Set up a stream with deferred consumer for formats that have 2 dimensions, such as @@ -103,6 +105,7 @@ class Camera3OutputStream : Camera3OutputStream(int id, uint32_t width, uint32_t height, int format, uint64_t consumerUsage, android_dataspace dataSpace, camera3_stream_rotation_t rotation, nsecs_t timestampOffset, + const String8& physicalCameraId, int setId = CAMERA3_STREAM_SET_ID_INVALID); virtual ~Camera3OutputStream(); @@ -194,6 +197,7 @@ class Camera3OutputStream : Camera3OutputStream(int id, camera3_stream_type_t type, uint32_t width, uint32_t height, int format, android_dataspace dataSpace, camera3_stream_rotation_t rotation, + const String8& physicalCameraId, uint64_t consumerUsage = 0, nsecs_t timestampOffset = 0, int setId = CAMERA3_STREAM_SET_ID_INVALID); diff --git a/services/camera/libcameraservice/device3/Camera3SharedOutputStream.cpp b/services/camera/libcameraservice/device3/Camera3SharedOutputStream.cpp index 1c9417b358..2bb9ff7a3f 100644 --- a/services/camera/libcameraservice/device3/Camera3SharedOutputStream.cpp +++ b/services/camera/libcameraservice/device3/Camera3SharedOutputStream.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016 The Android Open Source Project + * Copyright (C) 2016-2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,10 +27,11 @@ Camera3SharedOutputStream::Camera3SharedOutputStream(int id, uint32_t width, uint32_t height, int format, uint64_t consumerUsage, android_dataspace dataSpace, camera3_stream_rotation_t rotation, - nsecs_t timestampOffset, int setId) : + nsecs_t timestampOffset, const String8& physicalCameraId, + int setId) : Camera3OutputStream(id, CAMERA3_STREAM_OUTPUT, width, height, - format, dataSpace, rotation, consumerUsage, - timestampOffset, setId) { + format, dataSpace, rotation, physicalCameraId, + consumerUsage, timestampOffset, setId) { size_t consumerCount = std::min(surfaces.size(), kMaxOutputs); if (surfaces.size() > consumerCount) { ALOGE("%s: Trying to add more consumers than the maximum ", __func__); diff --git a/services/camera/libcameraservice/device3/Camera3SharedOutputStream.h b/services/camera/libcameraservice/device3/Camera3SharedOutputStream.h index 6eab8bd07a..02b1c09621 100644 --- a/services/camera/libcameraservice/device3/Camera3SharedOutputStream.h +++ b/services/camera/libcameraservice/device3/Camera3SharedOutputStream.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016 The Android Open Source Project + * Copyright (C) 2016-2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,6 +36,7 @@ public: uint32_t width, uint32_t height, int format, uint64_t consumerUsage, android_dataspace dataSpace, camera3_stream_rotation_t rotation, nsecs_t timestampOffset, + const String8& physicalCameraId, int setId = CAMERA3_STREAM_SET_ID_INVALID); virtual ~Camera3SharedOutputStream(); diff --git a/services/camera/libcameraservice/device3/Camera3Stream.cpp b/services/camera/libcameraservice/device3/Camera3Stream.cpp index 83ce18a386..0d91620240 100644 --- a/services/camera/libcameraservice/device3/Camera3Stream.cpp +++ b/services/camera/libcameraservice/device3/Camera3Stream.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 The Android Open Source Project + * Copyright (C) 2013-2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -47,7 +47,8 @@ const Camera3Stream* Camera3Stream::cast(const camera3_stream *stream) { Camera3Stream::Camera3Stream(int id, camera3_stream_type type, uint32_t width, uint32_t height, size_t maxSize, int format, - android_dataspace dataSpace, camera3_stream_rotation_t rotation, int setId) : + android_dataspace dataSpace, camera3_stream_rotation_t rotation, + const String8& physicalCameraId, int setId) : camera3_stream(), mId(id), mSetId(setId), @@ -64,7 +65,8 @@ Camera3Stream::Camera3Stream(int id, mLastMaxCount(Camera3StreamInterface::ALLOCATE_PIPELINE_MAX), mBufferLimitLatency(kBufferLimitLatencyBinSize), mFormatOverridden(false), - mOriginalFormat(-1) { + mOriginalFormat(-1), + mPhysicalCameraId(physicalCameraId) { camera3_stream::stream_type = type; camera3_stream::width = width; @@ -74,6 +76,7 @@ Camera3Stream::Camera3Stream(int id, camera3_stream::rotation = rotation; camera3_stream::max_buffers = 0; camera3_stream::priv = NULL; + camera3_stream::physical_camera_id = mPhysicalCameraId.string(); if ((format == HAL_PIXEL_FORMAT_BLOB || format == HAL_PIXEL_FORMAT_RAW_OPAQUE) && maxSize == 0) { diff --git a/services/camera/libcameraservice/device3/Camera3Stream.h b/services/camera/libcameraservice/device3/Camera3Stream.h index 4ff31ca7a9..f85dff2eb2 100644 --- a/services/camera/libcameraservice/device3/Camera3Stream.h +++ b/services/camera/libcameraservice/device3/Camera3Stream.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 The Android Open Source Project + * Copyright (C) 2013-2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -449,7 +449,7 @@ class Camera3Stream : Camera3Stream(int id, camera3_stream_type type, uint32_t width, uint32_t height, size_t maxSize, int format, android_dataspace dataSpace, camera3_stream_rotation_t rotation, - int setId); + const String8& physicalCameraId, int setId); wp mBufferFreedListener; @@ -556,6 +556,7 @@ class Camera3Stream : bool mDataSpaceOverridden; android_dataspace mOriginalDataSpace; + String8 mPhysicalCameraId; }; // class Camera3Stream }; // namespace camera3