summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--camera/camera2/ICameraDeviceUser.cpp7
-rw-r--r--include/camera/camera2/ICameraDeviceUser.h2
-rw-r--r--services/camera/libcameraservice/api2/CameraDeviceClient.cpp26
-rw-r--r--services/camera/libcameraservice/api2/CameraDeviceClient.h2
-rw-r--r--services/camera/libcameraservice/common/CameraDeviceBase.h2
-rw-r--r--services/camera/libcameraservice/common/CameraModule.cpp15
-rw-r--r--services/camera/libcameraservice/device2/Camera2Device.cpp2
-rw-r--r--services/camera/libcameraservice/device2/Camera2Device.h2
-rw-r--r--services/camera/libcameraservice/device3/Camera3Device.cpp9
-rw-r--r--services/camera/libcameraservice/device3/Camera3Device.h5
10 files changed, 59 insertions, 13 deletions
diff --git a/camera/camera2/ICameraDeviceUser.cpp b/camera/camera2/ICameraDeviceUser.cpp
index 9700258..a7549f2 100644
--- a/camera/camera2/ICameraDeviceUser.cpp
+++ b/camera/camera2/ICameraDeviceUser.cpp
@@ -190,11 +190,13 @@ public:
return reply.readInt32();
}
- virtual status_t endConfigure()
+ virtual status_t endConfigure(bool isConstrainedHighSpeed)
{
ALOGV("endConfigure");
Parcel data, reply;
data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
+ data.writeInt32(isConstrainedHighSpeed);
+
remote()->transact(END_CONFIGURE, data, &reply);
reply.readExceptionCode();
return reply.readInt32();
@@ -556,8 +558,9 @@ status_t BnCameraDeviceUser::onTransact(
} break;
case END_CONFIGURE: {
CHECK_INTERFACE(ICameraDeviceUser, data, reply);
+ bool isConstrainedHighSpeed = data.readInt32();
reply->writeNoException();
- reply->writeInt32(endConfigure());
+ reply->writeInt32(endConfigure(isConstrainedHighSpeed));
return NO_ERROR;
} break;
case PREPARE: {
diff --git a/include/camera/camera2/ICameraDeviceUser.h b/include/camera/camera2/ICameraDeviceUser.h
index 619b161..b3dd140 100644
--- a/include/camera/camera2/ICameraDeviceUser.h
+++ b/include/camera/camera2/ICameraDeviceUser.h
@@ -97,7 +97,7 @@ public:
* must be called before any requests can be submitted.
* <p>
*/
- virtual status_t endConfigure() = 0;
+ virtual status_t endConfigure(bool isConstrainedHighSpeed = false) = 0;
virtual status_t deleteStream(int streamId) = 0;
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<int32_t> 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<IGraphicBufferProducer> *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<String16> &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<camera3_stream_t*> 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<IGraphicBufferProducer> *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;