diff options
author | Jayant Chowdhary <jchowdhary@google.com> | 2021-12-10 21:59:06 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2021-12-10 21:59:06 +0000 |
commit | 013c8046e7def48118e33d39961b6aedc1d3c26e (patch) | |
tree | b0d9fa6e5bd99f243e5729b86e6c1cbba99fb282 | |
parent | 2e0351320cab1529987ae2392f1c610ca4f6ad8b (diff) | |
parent | 6a6d3a881a42927abd176c40a03b7abd5173d4a1 (diff) | |
download | av-013c8046e7def48118e33d39961b6aedc1d3c26e.tar.gz |
Merge "Use physical camera characteristics for various buffer size calculations for physical streams." into sc-v2-dev
4 files changed, 27 insertions, 19 deletions
diff --git a/services/camera/libcameraservice/api1/client2/JpegProcessor.cpp b/services/camera/libcameraservice/api1/client2/JpegProcessor.cpp index eed2654476..a38d7ae606 100755 --- a/services/camera/libcameraservice/api1/client2/JpegProcessor.cpp +++ b/services/camera/libcameraservice/api1/client2/JpegProcessor.cpp @@ -78,7 +78,8 @@ status_t JpegProcessor::updateStream(const Parameters ¶ms) { } // Find out buffer size for JPEG - ssize_t maxJpegSize = device->getJpegBufferSize(params.pictureWidth, params.pictureHeight); + ssize_t maxJpegSize = device->getJpegBufferSize(device->infoPhysical(String8("")), + params.pictureWidth, params.pictureHeight); if (maxJpegSize <= 0) { ALOGE("%s: Camera %d: Jpeg buffer size (%zu) is invalid ", __FUNCTION__, mId, maxJpegSize); diff --git a/services/camera/libcameraservice/common/CameraDeviceBase.h b/services/camera/libcameraservice/common/CameraDeviceBase.h index 07b5f16748..b42f3f6bc1 100644 --- a/services/camera/libcameraservice/common/CameraDeviceBase.h +++ b/services/camera/libcameraservice/common/CameraDeviceBase.h @@ -99,7 +99,8 @@ class CameraDeviceBase : public virtual FrameProducer { virtual status_t dump(int fd, const Vector<String16> &args) = 0; /** - * The physical camera device's static characteristics metadata buffer + * The physical camera device's static characteristics metadata buffer, or + * the logical camera's static characteristics if physical id is empty. */ virtual const CameraMetadata& infoPhysical(const String8& physicalId) const = 0; @@ -304,7 +305,8 @@ class CameraDeviceBase : public virtual FrameProducer { * Get Jpeg buffer size for a given jpeg resolution. * Negative values are error codes. */ - virtual ssize_t getJpegBufferSize(uint32_t width, uint32_t height) const = 0; + virtual ssize_t getJpegBufferSize(const CameraMetadata &info, uint32_t width, + uint32_t height) const = 0; /** * Connect HAL notifications to a listener. Overwrites previous diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp index b9a97befa9..de418da6cc 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.cpp +++ b/services/camera/libcameraservice/device3/Camera3Device.cpp @@ -602,15 +602,16 @@ uint64_t Camera3Device::mapProducerToFrameworkUsage( return usage; } -ssize_t Camera3Device::getJpegBufferSize(uint32_t width, uint32_t height) const { +ssize_t Camera3Device::getJpegBufferSize(const CameraMetadata &info, uint32_t width, + uint32_t height) const { // Get max jpeg size (area-wise) for default sensor pixel mode camera3::Size maxDefaultJpegResolution = - SessionConfigurationUtils::getMaxJpegResolution(mDeviceInfo, + SessionConfigurationUtils::getMaxJpegResolution(info, /*isUltraHighResolutionSensor*/false); // Get max jpeg size (area-wise) for max resolution sensor pixel mode / 0 if // not ultra high res sensor camera3::Size uhrMaxJpegResolution = - SessionConfigurationUtils::getMaxJpegResolution(mDeviceInfo, + SessionConfigurationUtils::getMaxJpegResolution(info, /*isUltraHighResolution*/true); if (maxDefaultJpegResolution.width == 0) { ALOGE("%s: Camera %s: Can't find valid available jpeg sizes in static metadata!", @@ -626,7 +627,7 @@ ssize_t Camera3Device::getJpegBufferSize(uint32_t width, uint32_t height) const // Get max jpeg buffer size ssize_t maxJpegBufferSize = 0; - camera_metadata_ro_entry jpegBufMaxSize = mDeviceInfo.find(ANDROID_JPEG_MAX_SIZE); + camera_metadata_ro_entry jpegBufMaxSize = info.find(ANDROID_JPEG_MAX_SIZE); if (jpegBufMaxSize.count == 0) { ALOGE("%s: Camera %s: Can't find maximum JPEG size in static metadata!", __FUNCTION__, mId.string()); @@ -656,9 +657,9 @@ ssize_t Camera3Device::getJpegBufferSize(uint32_t width, uint32_t height) const return jpegBufferSize; } -ssize_t Camera3Device::getPointCloudBufferSize() const { +ssize_t Camera3Device::getPointCloudBufferSize(const CameraMetadata &info) const { const int FLOATS_PER_POINT=4; - camera_metadata_ro_entry maxPointCount = mDeviceInfo.find(ANDROID_DEPTH_MAX_DEPTH_SAMPLES); + camera_metadata_ro_entry maxPointCount = info.find(ANDROID_DEPTH_MAX_DEPTH_SAMPLES); if (maxPointCount.count == 0) { ALOGE("%s: Camera %s: Can't find maximum depth point cloud size in static metadata!", __FUNCTION__, mId.string()); @@ -669,14 +670,14 @@ ssize_t Camera3Device::getPointCloudBufferSize() const { return maxBytesForPointCloud; } -ssize_t Camera3Device::getRawOpaqueBufferSize(int32_t width, int32_t height, - bool maxResolution) const { +ssize_t Camera3Device::getRawOpaqueBufferSize(const CameraMetadata &info, int32_t width, + int32_t height, bool maxResolution) const { const int PER_CONFIGURATION_SIZE = 3; const int WIDTH_OFFSET = 0; const int HEIGHT_OFFSET = 1; const int SIZE_OFFSET = 2; camera_metadata_ro_entry rawOpaqueSizes = - mDeviceInfo.find( + info.find( camera3::SessionConfigurationUtils::getAppropriateModeTag( ANDROID_SENSOR_OPAQUE_RAW_SIZE, maxResolution)); @@ -1452,7 +1453,7 @@ status_t Camera3Device::createStream(const std::vector<sp<Surface>>& consumers, if (format == HAL_PIXEL_FORMAT_BLOB) { ssize_t blobBufferSize; if (dataSpace == HAL_DATASPACE_DEPTH) { - blobBufferSize = getPointCloudBufferSize(); + blobBufferSize = getPointCloudBufferSize(infoPhysical(physicalCameraId)); if (blobBufferSize <= 0) { SET_ERR_L("Invalid point cloud buffer size %zd", blobBufferSize); return BAD_VALUE; @@ -1460,7 +1461,7 @@ status_t Camera3Device::createStream(const std::vector<sp<Surface>>& consumers, } else if (dataSpace == static_cast<android_dataspace>(HAL_DATASPACE_JPEG_APP_SEGMENTS)) { blobBufferSize = width * height; } else { - blobBufferSize = getJpegBufferSize(width, height); + blobBufferSize = getJpegBufferSize(infoPhysical(physicalCameraId), width, height); if (blobBufferSize <= 0) { SET_ERR_L("Invalid jpeg buffer size %zd", blobBufferSize); return BAD_VALUE; @@ -1474,7 +1475,8 @@ status_t Camera3Device::createStream(const std::vector<sp<Surface>>& consumers, bool maxResolution = sensorPixelModesUsed.find(ANDROID_SENSOR_PIXEL_MODE_MAXIMUM_RESOLUTION) != sensorPixelModesUsed.end(); - ssize_t rawOpaqueBufferSize = getRawOpaqueBufferSize(width, height, maxResolution); + ssize_t rawOpaqueBufferSize = getRawOpaqueBufferSize(infoPhysical(physicalCameraId), width, + height, maxResolution); if (rawOpaqueBufferSize <= 0) { SET_ERR_L("Invalid RAW opaque buffer size %zd", rawOpaqueBufferSize); return BAD_VALUE; @@ -2705,7 +2707,8 @@ status_t Camera3Device::configureStreamsLocked(int operatingMode, // always occupy the initial entry. if (outputStream->data_space == HAL_DATASPACE_V0_JFIF) { bufferSizes[k] = static_cast<uint32_t>( - getJpegBufferSize(outputStream->width, outputStream->height)); + getJpegBufferSize(infoPhysical(String8(outputStream->physical_camera_id)), + outputStream->width, outputStream->height)); } else if (outputStream->data_space == static_cast<android_dataspace>(HAL_DATASPACE_JPEG_APP_SEGMENTS)) { bufferSizes[k] = outputStream->width * outputStream->height; diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h index 08d36dbeac..e8a6a08f5f 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.h +++ b/services/camera/libcameraservice/device3/Camera3Device.h @@ -192,9 +192,11 @@ class Camera3Device : status_t prepare(int maxCount, int streamId) override; - ssize_t getJpegBufferSize(uint32_t width, uint32_t height) const override; - ssize_t getPointCloudBufferSize() const; - ssize_t getRawOpaqueBufferSize(int32_t width, int32_t height, bool maxResolution) const; + ssize_t getJpegBufferSize(const CameraMetadata &info, uint32_t width, + uint32_t height) const override; + ssize_t getPointCloudBufferSize(const CameraMetadata &info) const; + ssize_t getRawOpaqueBufferSize(const CameraMetadata &info, int32_t width, int32_t height, + bool maxResolution) const; // Methods called by subclasses void notifyStatus(bool idle); // updates from StatusTracker |