Loading camera/device/3.2/default/CameraDeviceSession.cpp +88 −68 Original line number Diff line number Diff line Loading @@ -803,52 +803,21 @@ android_dataspace CameraDeviceSession::mapToLegacyDataspace( return dataSpace; } Return<void> CameraDeviceSession::configureStreams( bool CameraDeviceSession::preProcessConfigurationLocked( const StreamConfiguration& requestedConfiguration, ICameraDeviceSession::configureStreams_cb _hidl_cb) { Status status = initStatus(); HalStreamConfiguration outStreams; camera3_stream_configuration_t *stream_list /*out*/, hidl_vec<camera3_stream_t*> *streams /*out*/) { // hold the inflight lock for entire configureStreams scope since there must not be any // inflight request/results during stream configuration. Mutex::Autolock _l(mInflightLock); if (!mInflightBuffers.empty()) { ALOGE("%s: trying to configureStreams while there are still %zu inflight buffers!", __FUNCTION__, mInflightBuffers.size()); _hidl_cb(Status::INTERNAL_ERROR, outStreams); return Void(); } if (!mInflightAETriggerOverrides.empty()) { ALOGE("%s: trying to configureStreams while there are still %zu inflight" " trigger overrides!", __FUNCTION__, mInflightAETriggerOverrides.size()); _hidl_cb(Status::INTERNAL_ERROR, outStreams); return Void(); } if (!mInflightRawBoostPresent.empty()) { ALOGE("%s: trying to configureStreams while there are still %zu inflight" " boost overrides!", __FUNCTION__, mInflightRawBoostPresent.size()); _hidl_cb(Status::INTERNAL_ERROR, outStreams); return Void(); } if (status != Status::OK) { _hidl_cb(status, outStreams); return Void(); if ((stream_list == nullptr) || (streams == nullptr)) { return false; } camera3_stream_configuration_t stream_list; hidl_vec<camera3_stream_t*> streams; stream_list.operation_mode = (uint32_t) requestedConfiguration.operationMode; stream_list.num_streams = requestedConfiguration.streams.size(); streams.resize(stream_list.num_streams); stream_list.streams = streams.data(); stream_list->operation_mode = (uint32_t) requestedConfiguration.operationMode; stream_list->num_streams = requestedConfiguration.streams.size(); streams->resize(stream_list->num_streams); stream_list->streams = streams->data(); for (uint32_t i = 0; i < stream_list.num_streams; i++) { for (uint32_t i = 0; i < stream_list->num_streams; i++) { int id = requestedConfiguration.streams[i].id; if (mStreamMap.count(id) == 0) { Loading @@ -869,22 +838,19 @@ Return<void> CameraDeviceSession::configureStreams( mapToLegacyDataspace( static_cast<android_dataspace_t> ( requestedConfiguration.streams[i].dataSpace))) { ALOGE("%s: stream %d configuration changed!", __FUNCTION__, id); _hidl_cb(Status::INTERNAL_ERROR, outStreams); return Void(); return false; } mStreamMap[id].rotation = (int) requestedConfiguration.streams[i].rotation; mStreamMap[id].usage = (uint32_t) requestedConfiguration.streams[i].usage; } streams[i] = &mStreamMap[id]; (*streams)[i] = &mStreamMap[id]; } ATRACE_BEGIN("camera3->configure_streams"); status_t ret = mDevice->ops->configure_streams(mDevice, &stream_list); ATRACE_END(); return true; } // In case Hal returns error most likely it was not able to release // the corresponding resources of the deleted streams. if (ret == OK) { void CameraDeviceSession::postProcessConfigurationLocked( const StreamConfiguration& requestedConfiguration) { // delete unused streams, note we do this after adding new streams to ensure new stream // will not have the same address as deleted stream, and HAL has a chance to reference // the to be deleted stream in configure_streams call Loading Loading @@ -920,6 +886,60 @@ Return<void> CameraDeviceSession::configureStreams( mResultBatcher.setBatchedStreams(mVideoStreamIds); } Return<void> CameraDeviceSession::configureStreams( const StreamConfiguration& requestedConfiguration, ICameraDeviceSession::configureStreams_cb _hidl_cb) { Status status = initStatus(); HalStreamConfiguration outStreams; // hold the inflight lock for entire configureStreams scope since there must not be any // inflight request/results during stream configuration. Mutex::Autolock _l(mInflightLock); if (!mInflightBuffers.empty()) { ALOGE("%s: trying to configureStreams while there are still %zu inflight buffers!", __FUNCTION__, mInflightBuffers.size()); _hidl_cb(Status::INTERNAL_ERROR, outStreams); return Void(); } if (!mInflightAETriggerOverrides.empty()) { ALOGE("%s: trying to configureStreams while there are still %zu inflight" " trigger overrides!", __FUNCTION__, mInflightAETriggerOverrides.size()); _hidl_cb(Status::INTERNAL_ERROR, outStreams); return Void(); } if (!mInflightRawBoostPresent.empty()) { ALOGE("%s: trying to configureStreams while there are still %zu inflight" " boost overrides!", __FUNCTION__, mInflightRawBoostPresent.size()); _hidl_cb(Status::INTERNAL_ERROR, outStreams); return Void(); } if (status != Status::OK) { _hidl_cb(status, outStreams); return Void(); } camera3_stream_configuration_t stream_list{}; hidl_vec<camera3_stream_t*> streams; if (!preProcessConfigurationLocked(requestedConfiguration, &stream_list, &streams)) { _hidl_cb(Status::INTERNAL_ERROR, outStreams); return Void(); } ATRACE_BEGIN("camera3->configure_streams"); status_t ret = mDevice->ops->configure_streams(mDevice, &stream_list); ATRACE_END(); // In case Hal returns error most likely it was not able to release // the corresponding resources of the deleted streams. if (ret == OK) { postProcessConfigurationLocked(requestedConfiguration); } if (ret == -EINVAL) { status = Status::ILLEGAL_ARGUMENT; } else if (ret != OK) { Loading camera/device/3.2/default/CameraDeviceSession.h +6 −0 Original line number Diff line number Diff line Loading @@ -112,6 +112,12 @@ protected: Return<Status> flush(); Return<void> close(); //Helper methods bool preProcessConfigurationLocked(const StreamConfiguration& requestedConfiguration, camera3_stream_configuration_t *stream_list /*out*/, hidl_vec<camera3_stream_t*> *streams /*out*/); void postProcessConfigurationLocked(const StreamConfiguration& requestedConfiguration); protected: // protecting mClosed/mDisconnected/mInitFail Loading camera/device/3.3/default/CameraDeviceSession.cpp +5 −68 Original line number Diff line number Diff line Loading @@ -77,43 +77,12 @@ Return<void> CameraDeviceSession::configureStreams_3_3( return Void(); } camera3_stream_configuration_t stream_list; camera3_stream_configuration_t stream_list{}; hidl_vec<camera3_stream_t*> streams; stream_list.operation_mode = (uint32_t) requestedConfiguration.operationMode; stream_list.num_streams = requestedConfiguration.streams.size(); streams.resize(stream_list.num_streams); stream_list.streams = streams.data(); for (uint32_t i = 0; i < stream_list.num_streams; i++) { int id = requestedConfiguration.streams[i].id; if (mStreamMap.count(id) == 0) { Camera3Stream stream; V3_2::implementation::convertFromHidl(requestedConfiguration.streams[i], &stream); mStreamMap[id] = stream; mStreamMap[id].data_space = mapToLegacyDataspace( mStreamMap[id].data_space); mCirculatingBuffers.emplace(stream.mId, CirculatingBuffers{}); } else { // width/height/format must not change, but usage/rotation might need to change if (mStreamMap[id].stream_type != (int) requestedConfiguration.streams[i].streamType || mStreamMap[id].width != requestedConfiguration.streams[i].width || mStreamMap[id].height != requestedConfiguration.streams[i].height || mStreamMap[id].format != (int) requestedConfiguration.streams[i].format || mStreamMap[id].data_space != mapToLegacyDataspace( static_cast<android_dataspace_t> ( requestedConfiguration.streams[i].dataSpace))) { ALOGE("%s: stream %d configuration changed!", __FUNCTION__, id); if (!preProcessConfigurationLocked(requestedConfiguration, &stream_list, &streams)) { _hidl_cb(Status::INTERNAL_ERROR, outStreams); return Void(); } mStreamMap[id].rotation = (int) requestedConfiguration.streams[i].rotation; mStreamMap[id].usage = (uint32_t) requestedConfiguration.streams[i].usage; } streams[i] = &mStreamMap[id]; } ATRACE_BEGIN("camera3->configure_streams"); status_t ret = mDevice->ops->configure_streams(mDevice, &stream_list); Loading @@ -122,39 +91,7 @@ Return<void> CameraDeviceSession::configureStreams_3_3( // In case Hal returns error most likely it was not able to release // the corresponding resources of the deleted streams. if (ret == OK) { // delete unused streams, note we do this after adding new streams to ensure new stream // will not have the same address as deleted stream, and HAL has a chance to reference // the to be deleted stream in configure_streams call for(auto it = mStreamMap.begin(); it != mStreamMap.end();) { int id = it->first; bool found = false; for (const auto& stream : requestedConfiguration.streams) { if (id == stream.id) { found = true; break; } } if (!found) { // Unmap all buffers of deleted stream // in case the configuration call succeeds and HAL // is able to release the corresponding resources too. cleanupBuffersLocked(id); it = mStreamMap.erase(it); } else { ++it; } } // Track video streams mVideoStreamIds.clear(); for (const auto& stream : requestedConfiguration.streams) { if (stream.streamType == V3_2::StreamType::OUTPUT && stream.usage & graphics::common::V1_0::BufferUsage::VIDEO_ENCODER) { mVideoStreamIds.push_back(stream.id); } } mResultBatcher.setBatchedStreams(mVideoStreamIds); postProcessConfigurationLocked(requestedConfiguration); } if (ret == -EINVAL) { Loading camera/device/3.4/Android.bp 0 → 100644 +25 −0 Original line number Diff line number Diff line // This file is autogenerated by hidl-gen -Landroidbp. hidl_interface { name: "android.hardware.camera.device@3.4", root: "android.hardware", vndk: { enabled: true, }, srcs: [ "types.hal", "ICameraDeviceSession.hal", ], interfaces: [ "android.hardware.camera.common@1.0", "android.hardware.camera.device@3.2", "android.hardware.camera.device@3.3", "android.hardware.graphics.common@1.0", "android.hidl.base@1.0", ], types: [ "StreamConfiguration", ], gen_java: false, } camera/device/3.4/ICameraDeviceSession.hal 0 → 100644 +74 −0 Original line number Diff line number Diff line /* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.hardware.camera.device@3.4; import android.hardware.camera.common@1.0::Status; import @3.3::ICameraDeviceSession; import @3.3::HalStreamConfiguration; /** * Camera device active session interface. * * Obtained via ICameraDevice::open(), this interface contains the methods to * configure and request captures from an active camera device. */ interface ICameraDeviceSession extends @3.3::ICameraDeviceSession { /** * configureStreams_3_4: * * Identical to @3.3::ICameraDeviceSession.configureStreams, except that: * * - The requested configuration includes session parameters. * * @return Status Status code for the operation, one of: * OK: * On successful stream configuration. * INTERNAL_ERROR: * If there has been a fatal error and the device is no longer * operational. Only close() can be called successfully by the * framework after this error is returned. * ILLEGAL_ARGUMENT: * If the requested stream configuration is invalid. Some examples * of invalid stream configurations include: * - Including more than 1 INPUT stream * - Not including any OUTPUT streams * - Including streams with unsupported formats, or an unsupported * size for that format. * - Including too many output streams of a certain format. * - Unsupported rotation configuration * - Stream sizes/formats don't satisfy the * camera3_stream_configuration_t->operation_mode requirements * for non-NORMAL mode, or the requested operation_mode is not * supported by the HAL. * - Unsupported usage flag * The camera service cannot filter out all possible illegal stream * configurations, since some devices may support more simultaneous * streams or larger stream resolutions than the minimum required * for a given camera device hardware level. The HAL must return an * ILLEGAL_ARGUMENT for any unsupported stream set, and then be * ready to accept a future valid stream configuration in a later * configureStreams call. * @return halConfiguration The stream parameters desired by the HAL for * each stream, including maximum buffers, the usage flags, and the * override format. */ configureStreams_3_4(@3.4::StreamConfiguration requestedConfiguration) generates (Status status, @3.3::HalStreamConfiguration halConfiguration); }; Loading
camera/device/3.2/default/CameraDeviceSession.cpp +88 −68 Original line number Diff line number Diff line Loading @@ -803,52 +803,21 @@ android_dataspace CameraDeviceSession::mapToLegacyDataspace( return dataSpace; } Return<void> CameraDeviceSession::configureStreams( bool CameraDeviceSession::preProcessConfigurationLocked( const StreamConfiguration& requestedConfiguration, ICameraDeviceSession::configureStreams_cb _hidl_cb) { Status status = initStatus(); HalStreamConfiguration outStreams; camera3_stream_configuration_t *stream_list /*out*/, hidl_vec<camera3_stream_t*> *streams /*out*/) { // hold the inflight lock for entire configureStreams scope since there must not be any // inflight request/results during stream configuration. Mutex::Autolock _l(mInflightLock); if (!mInflightBuffers.empty()) { ALOGE("%s: trying to configureStreams while there are still %zu inflight buffers!", __FUNCTION__, mInflightBuffers.size()); _hidl_cb(Status::INTERNAL_ERROR, outStreams); return Void(); } if (!mInflightAETriggerOverrides.empty()) { ALOGE("%s: trying to configureStreams while there are still %zu inflight" " trigger overrides!", __FUNCTION__, mInflightAETriggerOverrides.size()); _hidl_cb(Status::INTERNAL_ERROR, outStreams); return Void(); } if (!mInflightRawBoostPresent.empty()) { ALOGE("%s: trying to configureStreams while there are still %zu inflight" " boost overrides!", __FUNCTION__, mInflightRawBoostPresent.size()); _hidl_cb(Status::INTERNAL_ERROR, outStreams); return Void(); } if (status != Status::OK) { _hidl_cb(status, outStreams); return Void(); if ((stream_list == nullptr) || (streams == nullptr)) { return false; } camera3_stream_configuration_t stream_list; hidl_vec<camera3_stream_t*> streams; stream_list.operation_mode = (uint32_t) requestedConfiguration.operationMode; stream_list.num_streams = requestedConfiguration.streams.size(); streams.resize(stream_list.num_streams); stream_list.streams = streams.data(); stream_list->operation_mode = (uint32_t) requestedConfiguration.operationMode; stream_list->num_streams = requestedConfiguration.streams.size(); streams->resize(stream_list->num_streams); stream_list->streams = streams->data(); for (uint32_t i = 0; i < stream_list.num_streams; i++) { for (uint32_t i = 0; i < stream_list->num_streams; i++) { int id = requestedConfiguration.streams[i].id; if (mStreamMap.count(id) == 0) { Loading @@ -869,22 +838,19 @@ Return<void> CameraDeviceSession::configureStreams( mapToLegacyDataspace( static_cast<android_dataspace_t> ( requestedConfiguration.streams[i].dataSpace))) { ALOGE("%s: stream %d configuration changed!", __FUNCTION__, id); _hidl_cb(Status::INTERNAL_ERROR, outStreams); return Void(); return false; } mStreamMap[id].rotation = (int) requestedConfiguration.streams[i].rotation; mStreamMap[id].usage = (uint32_t) requestedConfiguration.streams[i].usage; } streams[i] = &mStreamMap[id]; (*streams)[i] = &mStreamMap[id]; } ATRACE_BEGIN("camera3->configure_streams"); status_t ret = mDevice->ops->configure_streams(mDevice, &stream_list); ATRACE_END(); return true; } // In case Hal returns error most likely it was not able to release // the corresponding resources of the deleted streams. if (ret == OK) { void CameraDeviceSession::postProcessConfigurationLocked( const StreamConfiguration& requestedConfiguration) { // delete unused streams, note we do this after adding new streams to ensure new stream // will not have the same address as deleted stream, and HAL has a chance to reference // the to be deleted stream in configure_streams call Loading Loading @@ -920,6 +886,60 @@ Return<void> CameraDeviceSession::configureStreams( mResultBatcher.setBatchedStreams(mVideoStreamIds); } Return<void> CameraDeviceSession::configureStreams( const StreamConfiguration& requestedConfiguration, ICameraDeviceSession::configureStreams_cb _hidl_cb) { Status status = initStatus(); HalStreamConfiguration outStreams; // hold the inflight lock for entire configureStreams scope since there must not be any // inflight request/results during stream configuration. Mutex::Autolock _l(mInflightLock); if (!mInflightBuffers.empty()) { ALOGE("%s: trying to configureStreams while there are still %zu inflight buffers!", __FUNCTION__, mInflightBuffers.size()); _hidl_cb(Status::INTERNAL_ERROR, outStreams); return Void(); } if (!mInflightAETriggerOverrides.empty()) { ALOGE("%s: trying to configureStreams while there are still %zu inflight" " trigger overrides!", __FUNCTION__, mInflightAETriggerOverrides.size()); _hidl_cb(Status::INTERNAL_ERROR, outStreams); return Void(); } if (!mInflightRawBoostPresent.empty()) { ALOGE("%s: trying to configureStreams while there are still %zu inflight" " boost overrides!", __FUNCTION__, mInflightRawBoostPresent.size()); _hidl_cb(Status::INTERNAL_ERROR, outStreams); return Void(); } if (status != Status::OK) { _hidl_cb(status, outStreams); return Void(); } camera3_stream_configuration_t stream_list{}; hidl_vec<camera3_stream_t*> streams; if (!preProcessConfigurationLocked(requestedConfiguration, &stream_list, &streams)) { _hidl_cb(Status::INTERNAL_ERROR, outStreams); return Void(); } ATRACE_BEGIN("camera3->configure_streams"); status_t ret = mDevice->ops->configure_streams(mDevice, &stream_list); ATRACE_END(); // In case Hal returns error most likely it was not able to release // the corresponding resources of the deleted streams. if (ret == OK) { postProcessConfigurationLocked(requestedConfiguration); } if (ret == -EINVAL) { status = Status::ILLEGAL_ARGUMENT; } else if (ret != OK) { Loading
camera/device/3.2/default/CameraDeviceSession.h +6 −0 Original line number Diff line number Diff line Loading @@ -112,6 +112,12 @@ protected: Return<Status> flush(); Return<void> close(); //Helper methods bool preProcessConfigurationLocked(const StreamConfiguration& requestedConfiguration, camera3_stream_configuration_t *stream_list /*out*/, hidl_vec<camera3_stream_t*> *streams /*out*/); void postProcessConfigurationLocked(const StreamConfiguration& requestedConfiguration); protected: // protecting mClosed/mDisconnected/mInitFail Loading
camera/device/3.3/default/CameraDeviceSession.cpp +5 −68 Original line number Diff line number Diff line Loading @@ -77,43 +77,12 @@ Return<void> CameraDeviceSession::configureStreams_3_3( return Void(); } camera3_stream_configuration_t stream_list; camera3_stream_configuration_t stream_list{}; hidl_vec<camera3_stream_t*> streams; stream_list.operation_mode = (uint32_t) requestedConfiguration.operationMode; stream_list.num_streams = requestedConfiguration.streams.size(); streams.resize(stream_list.num_streams); stream_list.streams = streams.data(); for (uint32_t i = 0; i < stream_list.num_streams; i++) { int id = requestedConfiguration.streams[i].id; if (mStreamMap.count(id) == 0) { Camera3Stream stream; V3_2::implementation::convertFromHidl(requestedConfiguration.streams[i], &stream); mStreamMap[id] = stream; mStreamMap[id].data_space = mapToLegacyDataspace( mStreamMap[id].data_space); mCirculatingBuffers.emplace(stream.mId, CirculatingBuffers{}); } else { // width/height/format must not change, but usage/rotation might need to change if (mStreamMap[id].stream_type != (int) requestedConfiguration.streams[i].streamType || mStreamMap[id].width != requestedConfiguration.streams[i].width || mStreamMap[id].height != requestedConfiguration.streams[i].height || mStreamMap[id].format != (int) requestedConfiguration.streams[i].format || mStreamMap[id].data_space != mapToLegacyDataspace( static_cast<android_dataspace_t> ( requestedConfiguration.streams[i].dataSpace))) { ALOGE("%s: stream %d configuration changed!", __FUNCTION__, id); if (!preProcessConfigurationLocked(requestedConfiguration, &stream_list, &streams)) { _hidl_cb(Status::INTERNAL_ERROR, outStreams); return Void(); } mStreamMap[id].rotation = (int) requestedConfiguration.streams[i].rotation; mStreamMap[id].usage = (uint32_t) requestedConfiguration.streams[i].usage; } streams[i] = &mStreamMap[id]; } ATRACE_BEGIN("camera3->configure_streams"); status_t ret = mDevice->ops->configure_streams(mDevice, &stream_list); Loading @@ -122,39 +91,7 @@ Return<void> CameraDeviceSession::configureStreams_3_3( // In case Hal returns error most likely it was not able to release // the corresponding resources of the deleted streams. if (ret == OK) { // delete unused streams, note we do this after adding new streams to ensure new stream // will not have the same address as deleted stream, and HAL has a chance to reference // the to be deleted stream in configure_streams call for(auto it = mStreamMap.begin(); it != mStreamMap.end();) { int id = it->first; bool found = false; for (const auto& stream : requestedConfiguration.streams) { if (id == stream.id) { found = true; break; } } if (!found) { // Unmap all buffers of deleted stream // in case the configuration call succeeds and HAL // is able to release the corresponding resources too. cleanupBuffersLocked(id); it = mStreamMap.erase(it); } else { ++it; } } // Track video streams mVideoStreamIds.clear(); for (const auto& stream : requestedConfiguration.streams) { if (stream.streamType == V3_2::StreamType::OUTPUT && stream.usage & graphics::common::V1_0::BufferUsage::VIDEO_ENCODER) { mVideoStreamIds.push_back(stream.id); } } mResultBatcher.setBatchedStreams(mVideoStreamIds); postProcessConfigurationLocked(requestedConfiguration); } if (ret == -EINVAL) { Loading
camera/device/3.4/Android.bp 0 → 100644 +25 −0 Original line number Diff line number Diff line // This file is autogenerated by hidl-gen -Landroidbp. hidl_interface { name: "android.hardware.camera.device@3.4", root: "android.hardware", vndk: { enabled: true, }, srcs: [ "types.hal", "ICameraDeviceSession.hal", ], interfaces: [ "android.hardware.camera.common@1.0", "android.hardware.camera.device@3.2", "android.hardware.camera.device@3.3", "android.hardware.graphics.common@1.0", "android.hidl.base@1.0", ], types: [ "StreamConfiguration", ], gen_java: false, }
camera/device/3.4/ICameraDeviceSession.hal 0 → 100644 +74 −0 Original line number Diff line number Diff line /* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.hardware.camera.device@3.4; import android.hardware.camera.common@1.0::Status; import @3.3::ICameraDeviceSession; import @3.3::HalStreamConfiguration; /** * Camera device active session interface. * * Obtained via ICameraDevice::open(), this interface contains the methods to * configure and request captures from an active camera device. */ interface ICameraDeviceSession extends @3.3::ICameraDeviceSession { /** * configureStreams_3_4: * * Identical to @3.3::ICameraDeviceSession.configureStreams, except that: * * - The requested configuration includes session parameters. * * @return Status Status code for the operation, one of: * OK: * On successful stream configuration. * INTERNAL_ERROR: * If there has been a fatal error and the device is no longer * operational. Only close() can be called successfully by the * framework after this error is returned. * ILLEGAL_ARGUMENT: * If the requested stream configuration is invalid. Some examples * of invalid stream configurations include: * - Including more than 1 INPUT stream * - Not including any OUTPUT streams * - Including streams with unsupported formats, or an unsupported * size for that format. * - Including too many output streams of a certain format. * - Unsupported rotation configuration * - Stream sizes/formats don't satisfy the * camera3_stream_configuration_t->operation_mode requirements * for non-NORMAL mode, or the requested operation_mode is not * supported by the HAL. * - Unsupported usage flag * The camera service cannot filter out all possible illegal stream * configurations, since some devices may support more simultaneous * streams or larger stream resolutions than the minimum required * for a given camera device hardware level. The HAL must return an * ILLEGAL_ARGUMENT for any unsupported stream set, and then be * ready to accept a future valid stream configuration in a later * configureStreams call. * @return halConfiguration The stream parameters desired by the HAL for * each stream, including maximum buffers, the usage flags, and the * override format. */ configureStreams_3_4(@3.4::StreamConfiguration requestedConfiguration) generates (Status status, @3.3::HalStreamConfiguration halConfiguration); };