diff options
author | Eino-Ville Talvala <etalvala@google.com> | 2015-08-11 15:08:53 -0700 |
---|---|---|
committer | Eino-Ville Talvala <etalvala@google.com> | 2015-08-11 15:08:53 -0700 |
commit | 95a1d0f2fb1ea85c549ef8b869ab9ab52601d1db (patch) | |
tree | 588303955754f420083abf393acc61de98c7e7b8 /services | |
parent | 9872cdceaf76727e9ccc353ee41957b957b76566 (diff) | |
download | frameworks_av-95a1d0f2fb1ea85c549ef8b869ab9ab52601d1db.zip frameworks_av-95a1d0f2fb1ea85c549ef8b869ab9ab52601d1db.tar.gz frameworks_av-95a1d0f2fb1ea85c549ef8b869ab9ab52601d1db.tar.bz2 |
Camera: Allocate correctly-sized buffers for DEPTH_POINT_CLOUD
Bug: 20537722
Change-Id: I9fa2fcdcfd41cd3370732c70414914993d3dc94e
Diffstat (limited to 'services')
-rw-r--r-- | services/camera/libcameraservice/device3/Camera3Device.cpp | 37 | ||||
-rw-r--r-- | services/camera/libcameraservice/device3/Camera3Device.h | 1 |
2 files changed, 31 insertions, 7 deletions
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp index 3afbd89..c91517c 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.cpp +++ b/services/camera/libcameraservice/device3/Camera3Device.cpp @@ -370,7 +370,7 @@ ssize_t Camera3Device::getJpegBufferSize(uint32_t width, uint32_t height) const // Get max jpeg size (area-wise). Size maxJpegResolution = getMaxJpegResolution(); if (maxJpegResolution.width == 0) { - ALOGE("%s: Camera %d: Can't find find valid available jpeg sizes in static metadata!", + ALOGE("%s: Camera %d: Can't find valid available jpeg sizes in static metadata!", __FUNCTION__, mId); return BAD_VALUE; } @@ -397,6 +397,21 @@ ssize_t Camera3Device::getJpegBufferSize(uint32_t width, uint32_t height) const return jpegBufferSize; } +ssize_t Camera3Device::getPointCloudBufferSize() const { + const int FLOATS_PER_POINT=4; + camera_metadata_ro_entry maxPointCount = mDeviceInfo.find(ANDROID_DEPTH_MAX_DEPTH_SAMPLES); + if (maxPointCount.count == 0) { + ALOGE("%s: Camera %d: Can't find maximum depth point cloud size in static metadata!", + __FUNCTION__, mId); + return BAD_VALUE; + } + ssize_t maxBytesForPointCloud = sizeof(android_depth_points) + + maxPointCount.data.i32[0] * sizeof(float) * FLOATS_PER_POINT; + return maxBytesForPointCloud; +} + + + status_t Camera3Device::dump(int fd, const Vector<String16> &args) { ATRACE_CALL(); (void)args; @@ -865,14 +880,22 @@ status_t Camera3Device::createStream(sp<Surface> consumer, sp<Camera3OutputStream> newStream; if (format == HAL_PIXEL_FORMAT_BLOB) { - ssize_t jpegBufferSize = getJpegBufferSize(width, height); - if (jpegBufferSize <= 0) { - SET_ERR_L("Invalid jpeg buffer size %zd", jpegBufferSize); - return BAD_VALUE; + ssize_t blobBufferSize; + if (dataSpace != HAL_DATASPACE_DEPTH) { + blobBufferSize = getJpegBufferSize(width, height); + if (blobBufferSize <= 0) { + SET_ERR_L("Invalid jpeg buffer size %zd", blobBufferSize); + return BAD_VALUE; + } + } else { + blobBufferSize = getPointCloudBufferSize(); + if (blobBufferSize <= 0) { + SET_ERR_L("Invalid point cloud buffer size %zd", blobBufferSize); + return BAD_VALUE; + } } - newStream = new Camera3OutputStream(mNextStreamId, consumer, - width, height, jpegBufferSize, format, dataSpace, rotation); + width, height, blobBufferSize, format, dataSpace, rotation); } else { newStream = new Camera3OutputStream(mNextStreamId, consumer, width, height, format, dataSpace, rotation); diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h index 140da98..eea34af 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.h +++ b/services/camera/libcameraservice/device3/Camera3Device.h @@ -146,6 +146,7 @@ class Camera3Device : virtual uint32_t getDeviceVersion(); virtual ssize_t getJpegBufferSize(uint32_t width, uint32_t height) const; + ssize_t getPointCloudBufferSize() const; // Methods called by subclasses void notifyStatus(bool idle); // updates from StatusTracker |