From 1fa8999c91d5df81949aa723000058380cd3faa2 Mon Sep 17 00:00:00 2001 From: Zhijun He Date: Mon, 1 Jun 2015 15:44:31 -0700 Subject: Camera2: implement high speed video APIs Bug: 21442271 Change-Id: Ia0ae5bbd3e8c81bad293c29987301a2457817d12 --- .../libcameraservice/api2/CameraDeviceClient.cpp | 26 +++++++++++++++++++--- .../libcameraservice/api2/CameraDeviceClient.h | 2 +- .../libcameraservice/common/CameraDeviceBase.h | 2 +- .../libcameraservice/common/CameraModule.cpp | 15 +++++++++++++ .../libcameraservice/device2/Camera2Device.cpp | 2 +- .../libcameraservice/device2/Camera2Device.h | 2 +- .../libcameraservice/device3/Camera3Device.cpp | 9 ++++++-- .../libcameraservice/device3/Camera3Device.h | 5 ++++- 8 files changed, 53 insertions(+), 10 deletions(-) (limited to 'services') diff --git a/services/camera/libcameraservice/api2/CameraDeviceClient.cpp b/services/camera/libcameraservice/api2/CameraDeviceClient.cpp index b6f6677..4d276be 100644 --- a/services/camera/libcameraservice/api2/CameraDeviceClient.cpp +++ b/services/camera/libcameraservice/api2/CameraDeviceClient.cpp @@ -269,14 +269,34 @@ status_t CameraDeviceClient::cancelRequest(int requestId, int64_t* lastFrameNumb status_t CameraDeviceClient::beginConfigure() { // TODO: Implement this. - ALOGE("%s: Not implemented yet.", __FUNCTION__); + ALOGV("%s: Not implemented yet.", __FUNCTION__); return OK; } -status_t CameraDeviceClient::endConfigure() { +status_t CameraDeviceClient::endConfigure(bool isConstrainedHighSpeed) { ALOGV("%s: ending configure (%d input stream, %zu output streams)", __FUNCTION__, mInputStream.configured ? 1 : 0, mStreamMap.size()); + // Sanitize the high speed session against necessary capability bit. + if (isConstrainedHighSpeed) { + CameraMetadata staticInfo = mDevice->info(); + camera_metadata_entry_t entry = staticInfo.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES); + bool isConstrainedHighSpeedSupported = false; + for(size_t i = 0; i < entry.count; ++i) { + uint8_t capability = entry.data.u8[i]; + if (capability == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO) { + isConstrainedHighSpeedSupported = true; + break; + } + } + if (!isConstrainedHighSpeedSupported) { + ALOGE("%s: Camera %d: Try to create a constrained high speed configuration on a device" + " that doesn't support it.", + __FUNCTION__, mCameraId); + return INVALID_OPERATION; + } + } + status_t res; if ( (res = checkPid(__FUNCTION__) ) != OK) return res; @@ -284,7 +304,7 @@ status_t CameraDeviceClient::endConfigure() { if (!mDevice.get()) return DEAD_OBJECT; - return mDevice->configureStreams(); + return mDevice->configureStreams(isConstrainedHighSpeed); } status_t CameraDeviceClient::deleteStream(int streamId) { diff --git a/services/camera/libcameraservice/api2/CameraDeviceClient.h b/services/camera/libcameraservice/api2/CameraDeviceClient.h index b8d8bea..3bda70c 100644 --- a/services/camera/libcameraservice/api2/CameraDeviceClient.h +++ b/services/camera/libcameraservice/api2/CameraDeviceClient.h @@ -79,7 +79,7 @@ public: virtual status_t beginConfigure(); - virtual status_t endConfigure(); + virtual status_t endConfigure(bool isConstrainedHighSpeed = false); // Returns -EBUSY if device is not idle virtual status_t deleteStream(int streamId); diff --git a/services/camera/libcameraservice/common/CameraDeviceBase.h b/services/camera/libcameraservice/common/CameraDeviceBase.h index f02fc32..64236c5 100644 --- a/services/camera/libcameraservice/common/CameraDeviceBase.h +++ b/services/camera/libcameraservice/common/CameraDeviceBase.h @@ -157,7 +157,7 @@ class CameraDeviceBase : public virtual RefBase { * - BAD_VALUE if the set of streams was invalid (e.g. fmts or sizes) * - INVALID_OPERATION if the device was in the wrong state */ - virtual status_t configureStreams() = 0; + virtual status_t configureStreams(bool isConstrainedHighSpeed = false) = 0; // get the buffer producer of the input stream virtual status_t getInputBufferProducer( diff --git a/services/camera/libcameraservice/common/CameraModule.cpp b/services/camera/libcameraservice/common/CameraModule.cpp index 2f0117d..fcbf958 100644 --- a/services/camera/libcameraservice/common/CameraModule.cpp +++ b/services/camera/libcameraservice/common/CameraModule.cpp @@ -116,6 +116,21 @@ void CameraModule::deriveCameraCharacteristicsKeys( availableCharsKeys.push(ANDROID_STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES); chars.update(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, availableCharsKeys); + // Need update android.control.availableHighSpeedVideoConfigurations since HAL3.3 + // adds batch size to this array. + entry = chars.find(ANDROID_CONTROL_AVAILABLE_HIGH_SPEED_VIDEO_CONFIGURATIONS); + if (entry.count > 0) { + Vector highSpeedConfig; + for (size_t i = 0; i < entry.count; i += 4) { + highSpeedConfig.add(entry.data.i32[i]); // width + highSpeedConfig.add(entry.data.i32[i + 1]); // height + highSpeedConfig.add(entry.data.i32[i + 2]); // fps_min + highSpeedConfig.add(entry.data.i32[i + 3]); // fps_max + highSpeedConfig.add(1); // batchSize_max. default to 1 for HAL3.2 + } + chars.update(ANDROID_CONTROL_AVAILABLE_HIGH_SPEED_VIDEO_CONFIGURATIONS, + highSpeedConfig); + } } return; } diff --git a/services/camera/libcameraservice/device2/Camera2Device.cpp b/services/camera/libcameraservice/device2/Camera2Device.cpp index f6645f3..7aba0ee 100644 --- a/services/camera/libcameraservice/device2/Camera2Device.cpp +++ b/services/camera/libcameraservice/device2/Camera2Device.cpp @@ -415,7 +415,7 @@ status_t Camera2Device::deleteReprocessStream(int id) { return OK; } -status_t Camera2Device::configureStreams() { +status_t Camera2Device::configureStreams(bool isConstrainedHighSpeed) { ATRACE_CALL(); ALOGV("%s: E", __FUNCTION__); diff --git a/services/camera/libcameraservice/device2/Camera2Device.h b/services/camera/libcameraservice/device2/Camera2Device.h index fd1240a..a9affa2 100644 --- a/services/camera/libcameraservice/device2/Camera2Device.h +++ b/services/camera/libcameraservice/device2/Camera2Device.h @@ -68,7 +68,7 @@ class Camera2Device: public CameraDeviceBase { virtual status_t deleteStream(int id); virtual status_t deleteReprocessStream(int id); // No-op on HAL2 devices - virtual status_t configureStreams(); + virtual status_t configureStreams(bool isConstrainedHighSpeed = false); virtual status_t getInputBufferProducer( sp *producer); virtual status_t createDefaultRequest(int templateId, CameraMetadata *request); diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp index 45d9421..731f74c 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.cpp +++ b/services/camera/libcameraservice/device3/Camera3Device.cpp @@ -419,6 +419,8 @@ status_t Camera3Device::dump(int fd, const Vector &args) { lines.appendFormat(" Error cause: %s\n", mErrorCause.string()); } lines.appendFormat(" Stream configuration:\n"); + lines.appendFormat(" Operation mode: %s \n", mIsConstrainedHighSpeedConfiguration ? + "CONSTAINED HIGH SPEED VIDEO" : "NORMAL"); if (mInputStream != NULL) { write(fd, lines.string(), lines.size()); @@ -1023,12 +1025,13 @@ status_t Camera3Device::deleteReprocessStream(int id) { return INVALID_OPERATION; } -status_t Camera3Device::configureStreams() { +status_t Camera3Device::configureStreams(bool isConstrainedHighSpeed) { ATRACE_CALL(); ALOGV("%s: E", __FUNCTION__); Mutex::Autolock il(mInterfaceLock); Mutex::Autolock l(mLock); + mIsConstrainedHighSpeedConfiguration = isConstrainedHighSpeed; return configureStreamsLocked(); } @@ -1528,7 +1531,9 @@ status_t Camera3Device::configureStreamsLocked() { ALOGV("%s: Camera %d: Starting stream configuration", __FUNCTION__, mId); camera3_stream_configuration config; - + config.operation_mode = mIsConstrainedHighSpeedConfiguration ? + CAMERA3_STREAM_CONFIGURATION_CONSTRAINED_HIGH_SPEED_MODE : + CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE; config.num_streams = (mInputStream != NULL) + mOutputStreams.size(); Vector streams; diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h index b9313fc..b3db2e9 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.h +++ b/services/camera/libcameraservice/device3/Camera3Device.h @@ -115,7 +115,7 @@ class Camera3Device : virtual status_t deleteStream(int id); virtual status_t deleteReprocessStream(int id); - virtual status_t configureStreams(); + virtual status_t configureStreams(bool isConstraiedHighSpeed = false); virtual status_t getInputBufferProducer( sp *producer); @@ -173,6 +173,9 @@ class Camera3Device : // Camera device ID const int mId; + // Flag indicating is the current active stream configuration is constrained high speed. + bool mIsConstrainedHighSpeedConfiguration; + /**** Scope for mLock ****/ camera3_device_t *mHal3Device; -- cgit v1.1