From 28c9b6f298134624cb52b1af4ed8716dddb983d3 Mon Sep 17 00:00:00 2001 From: Zhijun He Date: Fri, 8 Aug 2014 12:00:47 -0700 Subject: Camera2/3: Cleanup the jpeg buffer size calcaulation logic - Only one place calculating the jpeg size-the device layer, Camera2Device and Camera3Device. - Remove size argument for CameraDeviceBase and cleanup related code. Bug: 14327010 Change-Id: I45d2ab4859ee0cc9273e579254f0569108c748f1 --- .../api1/client2/CallbackProcessor.cpp | 2 +- .../libcameraservice/api1/client2/JpegProcessor.cpp | 15 ++++++--------- .../api1/client2/StreamingProcessor.cpp | 5 ++--- .../libcameraservice/api1/client2/ZslProcessor.cpp | 3 +-- .../libcameraservice/api2/CameraDeviceClient.cpp | 18 +----------------- .../libcameraservice/api_pro/ProCamera2Client.cpp | 2 +- .../camera/libcameraservice/common/CameraDeviceBase.h | 9 +++++++-- .../camera/libcameraservice/device2/Camera2Device.cpp | 18 ++++++++++++++++-- .../camera/libcameraservice/device2/Camera2Device.h | 4 ++-- .../camera/libcameraservice/device3/Camera3Device.cpp | 11 ++++------- .../camera/libcameraservice/device3/Camera3Device.h | 14 ++++---------- 11 files changed, 45 insertions(+), 56 deletions(-) diff --git a/services/camera/libcameraservice/api1/client2/CallbackProcessor.cpp b/services/camera/libcameraservice/api1/client2/CallbackProcessor.cpp index c266213..bf3318e 100644 --- a/services/camera/libcameraservice/api1/client2/CallbackProcessor.cpp +++ b/services/camera/libcameraservice/api1/client2/CallbackProcessor.cpp @@ -155,7 +155,7 @@ status_t CallbackProcessor::updateStream(const Parameters ¶ms) { callbackFormat, params.previewFormat); res = device->createStream(mCallbackWindow, params.previewWidth, params.previewHeight, - callbackFormat, 0, &mCallbackStreamId); + callbackFormat, &mCallbackStreamId); 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 964d278..cda98be 100644 --- a/services/camera/libcameraservice/api1/client2/JpegProcessor.cpp +++ b/services/camera/libcameraservice/api1/client2/JpegProcessor.cpp @@ -73,11 +73,10 @@ status_t JpegProcessor::updateStream(const Parameters ¶ms) { } // Find out buffer size for JPEG - camera_metadata_ro_entry_t maxJpegSize = - params.staticInfo(ANDROID_JPEG_MAX_SIZE); - if (maxJpegSize.count == 0) { - ALOGE("%s: Camera %d: Can't find ANDROID_JPEG_MAX_SIZE!", - __FUNCTION__, mId); + ssize_t maxJpegSize = device->getJpegBufferSize(params.pictureWidth, params.pictureHeight); + if (maxJpegSize <= 0) { + ALOGE("%s: Camera %d: Jpeg buffer size (%zu) is invalid ", + __FUNCTION__, mId, maxJpegSize); return INVALID_OPERATION; } @@ -91,8 +90,7 @@ status_t JpegProcessor::updateStream(const Parameters ¶ms) { mCaptureConsumer->setName(String8("Camera2Client::CaptureConsumer")); mCaptureWindow = new Surface(producer); // Create memory for API consumption - mCaptureHeap = new MemoryHeapBase(maxJpegSize.data.i32[0], 0, - "Camera2Client::CaptureHeap"); + mCaptureHeap = new MemoryHeapBase(maxJpegSize, 0, "Camera2Client::CaptureHeap"); if (mCaptureHeap->getSize() == 0) { ALOGE("%s: Camera %d: Unable to allocate memory for capture", __FUNCTION__, mId); @@ -134,8 +132,7 @@ status_t JpegProcessor::updateStream(const Parameters ¶ms) { // Create stream for HAL production res = device->createStream(mCaptureWindow, params.pictureWidth, params.pictureHeight, - HAL_PIXEL_FORMAT_BLOB, maxJpegSize.data.i32[0], - &mCaptureStreamId); + HAL_PIXEL_FORMAT_BLOB, &mCaptureStreamId); 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 911f55a..ab0af0d 100644 --- a/services/camera/libcameraservice/api1/client2/StreamingProcessor.cpp +++ b/services/camera/libcameraservice/api1/client2/StreamingProcessor.cpp @@ -181,8 +181,7 @@ status_t StreamingProcessor::updatePreviewStream(const Parameters ¶ms) { if (mPreviewStreamId == NO_STREAM) { res = device->createStream(mPreviewWindow, params.previewWidth, params.previewHeight, - CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, - &mPreviewStreamId); + CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, &mPreviewStreamId); if (res != OK) { ALOGE("%s: Camera %d: Unable to create preview stream: %s (%d)", __FUNCTION__, mId, strerror(-res), res); @@ -385,7 +384,7 @@ status_t StreamingProcessor::updateRecordingStream(const Parameters ¶ms) { mRecordingFrameCount = 0; res = device->createStream(mRecordingWindow, params.videoWidth, params.videoHeight, - CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, &mRecordingStreamId); + CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, &mRecordingStreamId); 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 10463c1..8fb876e 100644 --- a/services/camera/libcameraservice/api1/client2/ZslProcessor.cpp +++ b/services/camera/libcameraservice/api1/client2/ZslProcessor.cpp @@ -183,8 +183,7 @@ status_t ZslProcessor::updateStream(const Parameters ¶ms) { (int)HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; res = device->createStream(mZslWindow, params.fastInfo.arrayWidth, params.fastInfo.arrayHeight, - streamType, 0, - &mZslStreamId); + streamType, &mZslStreamId); if (res != OK) { ALOGE("%s: Camera %d: Can't create output stream for ZSL: " "%s (%d)", __FUNCTION__, mId, diff --git a/services/camera/libcameraservice/api2/CameraDeviceClient.cpp b/services/camera/libcameraservice/api2/CameraDeviceClient.cpp index b8611f8..86f82a3 100644 --- a/services/camera/libcameraservice/api2/CameraDeviceClient.cpp +++ b/services/camera/libcameraservice/api2/CameraDeviceClient.cpp @@ -384,23 +384,7 @@ status_t CameraDeviceClient::createStream(int width, int height, int format, // after each call, but only once we are done with all. int streamId = -1; - if (format == HAL_PIXEL_FORMAT_BLOB) { - // JPEG buffers need to be sized for maximum possible compressed size - CameraMetadata staticInfo = mDevice->info(); - camera_metadata_entry_t entry = staticInfo.find(ANDROID_JPEG_MAX_SIZE); - if (entry.count == 0) { - ALOGE("%s: Camera %d: Can't find maximum JPEG size in " - "static metadata!", __FUNCTION__, mCameraId); - return INVALID_OPERATION; - } - int32_t maxJpegSize = entry.data.i32[0]; - res = mDevice->createStream(anw, width, height, format, maxJpegSize, - &streamId); - } else { - // All other streams are a known size - res = mDevice->createStream(anw, width, height, format, /*size*/0, - &streamId); - } + res = mDevice->createStream(anw, width, height, format, &streamId); if (res == OK) { mStreamMap.add(bufferProducer->asBinder(), streamId); diff --git a/services/camera/libcameraservice/api_pro/ProCamera2Client.cpp b/services/camera/libcameraservice/api_pro/ProCamera2Client.cpp index 0f6d278..f8823a3 100644 --- a/services/camera/libcameraservice/api_pro/ProCamera2Client.cpp +++ b/services/camera/libcameraservice/api_pro/ProCamera2Client.cpp @@ -280,7 +280,7 @@ status_t ProCamera2Client::createStream(int width, int height, int format, window = new Surface(bufferProducer); } - return mDevice->createStream(window, width, height, format, /*size*/1, + return mDevice->createStream(window, width, height, format, streamId); } diff --git a/services/camera/libcameraservice/common/CameraDeviceBase.h b/services/camera/libcameraservice/common/CameraDeviceBase.h index 037695d..9e124b0 100644 --- a/services/camera/libcameraservice/common/CameraDeviceBase.h +++ b/services/camera/libcameraservice/common/CameraDeviceBase.h @@ -109,8 +109,7 @@ class CameraDeviceBase : public virtual RefBase { * other formats, the size parameter is ignored. */ virtual status_t createStream(sp consumer, - uint32_t width, uint32_t height, int format, size_t size, - int *id) = 0; + uint32_t width, uint32_t height, int format, int *id) = 0; /** * Create an input reprocess stream that uses buffers from an existing @@ -156,6 +155,12 @@ class CameraDeviceBase : public virtual RefBase { virtual status_t waitUntilDrained() = 0; /** + * 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; + + /** * Abstract class for HAL notification listeners */ class NotificationListener { diff --git a/services/camera/libcameraservice/device2/Camera2Device.cpp b/services/camera/libcameraservice/device2/Camera2Device.cpp index 8c2520e..d473a76 100644 --- a/services/camera/libcameraservice/device2/Camera2Device.cpp +++ b/services/camera/libcameraservice/device2/Camera2Device.cpp @@ -242,13 +242,16 @@ status_t Camera2Device::waitUntilRequestReceived(int32_t requestId, nsecs_t time } status_t Camera2Device::createStream(sp consumer, - uint32_t width, uint32_t height, int format, size_t size, int *id) { + uint32_t width, uint32_t height, int format, int *id) { ATRACE_CALL(); status_t res; ALOGV("%s: E", __FUNCTION__); sp stream = new StreamAdapter(mHal2Device); - + size_t size = 0; + if (format == HAL_PIXEL_FORMAT_BLOB) { + size = getJpegBufferSize(width, height); + } res = stream->connectToDevice(consumer, width, height, format, size); if (res != OK) { ALOGE("%s: Camera %d: Unable to create stream (%d x %d, format %x):" @@ -263,6 +266,17 @@ status_t Camera2Device::createStream(sp consumer, return OK; } +ssize_t Camera2Device::getJpegBufferSize(uint32_t width, uint32_t height) const { + // Always give the max jpeg buffer size regardless of the actual jpeg resolution. + camera_metadata_ro_entry jpegBufMaxSize = mDeviceInfo.find(ANDROID_JPEG_MAX_SIZE); + if (jpegBufMaxSize.count == 0) { + ALOGE("%s: Camera %d: Can't find maximum JPEG size in static metadata!", __FUNCTION__, mId); + return BAD_VALUE; + } + + return jpegBufMaxSize.data.i32[0]; +} + status_t Camera2Device::createReprocessStreamFromStream(int outputId, int *id) { ATRACE_CALL(); status_t res; diff --git a/services/camera/libcameraservice/device2/Camera2Device.h b/services/camera/libcameraservice/device2/Camera2Device.h index 46182f8..d0ca46e 100644 --- a/services/camera/libcameraservice/device2/Camera2Device.h +++ b/services/camera/libcameraservice/device2/Camera2Device.h @@ -57,8 +57,7 @@ class Camera2Device: public CameraDeviceBase { virtual status_t clearStreamingRequest(int64_t *lastFrameNumber = NULL); virtual status_t waitUntilRequestReceived(int32_t requestId, nsecs_t timeout); virtual status_t createStream(sp consumer, - uint32_t width, uint32_t height, int format, size_t size, - int *id); + uint32_t width, uint32_t height, int format, int *id); virtual status_t createReprocessStreamFromStream(int outputId, int *id); virtual status_t getStreamInfo(int id, uint32_t *width, uint32_t *height, uint32_t *format); @@ -79,6 +78,7 @@ class Camera2Device: public CameraDeviceBase { // Flush implemented as just a wait virtual status_t flush(int64_t *lastFrameNumber = NULL); virtual uint32_t getDeviceVersion(); + virtual ssize_t getJpegBufferSize(uint32_t width, uint32_t height) const; private: const int mId; diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp index a6214cc..ed350c1 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.cpp +++ b/services/camera/libcameraservice/device3/Camera3Device.cpp @@ -793,12 +793,12 @@ status_t Camera3Device::createZslStream( } status_t Camera3Device::createStream(sp consumer, - uint32_t width, uint32_t height, int format, size_t size, int *id) { + uint32_t width, uint32_t height, int format, int *id) { ATRACE_CALL(); Mutex::Autolock il(mInterfaceLock); Mutex::Autolock l(mLock); - ALOGV("Camera %d: Creating new stream %d: %d x %d, format %d, size %zu", - mId, mNextStreamId, width, height, format, size); + ALOGV("Camera %d: Creating new stream %d: %d x %d, format %d", + mId, mNextStreamId, width, height, format); status_t res; bool wasActive = false; @@ -832,10 +832,7 @@ status_t Camera3Device::createStream(sp consumer, sp newStream; if (format == HAL_PIXEL_FORMAT_BLOB) { ssize_t jpegBufferSize = getJpegBufferSize(width, height); - if (jpegBufferSize > 0) { - ALOGV("%s: Overwrite Jpeg output buffer size from %zu to %zu", - __FUNCTION__, size, jpegBufferSize); - } else { + if (jpegBufferSize <= 0) { SET_ERR_L("Invalid jpeg buffer size %zd", jpegBufferSize); return BAD_VALUE; } diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h index b1b0033..7656237 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.h +++ b/services/camera/libcameraservice/device3/Camera3Device.h @@ -93,11 +93,9 @@ class Camera3Device : // Actual stream creation/deletion is delayed until first request is submitted // If adding streams while actively capturing, will pause device before adding - // stream, reconfiguring device, and unpausing. Note that, for JPEG stream, the - // buffer size may be overwritten by an more accurate value calculated by Camera3Device. + // stream, reconfiguring device, and unpausing. virtual status_t createStream(sp consumer, - uint32_t width, uint32_t height, int format, size_t size, - int *id); + uint32_t width, uint32_t height, int format, int *id); virtual status_t createInputStream( uint32_t width, uint32_t height, int format, int *id); @@ -137,6 +135,8 @@ class Camera3Device : virtual uint32_t getDeviceVersion(); + virtual ssize_t getJpegBufferSize(uint32_t width, uint32_t height) const; + // Methods called by subclasses void notifyStatus(bool idle); // updates from StatusTracker @@ -316,12 +316,6 @@ class Camera3Device : */ Size getMaxJpegResolution() const; - /** - * Get Jpeg buffer size for a given jpeg resolution. - * Negative values are error codes. - */ - ssize_t getJpegBufferSize(uint32_t width, uint32_t height) const; - struct RequestTrigger { // Metadata tag number, e.g. android.control.aePrecaptureTrigger uint32_t metadataTag; -- cgit v1.1