Camera: Add support for session parameters

The initial values of the session-wide capture parameters
should be passed along the stream list during stream
configuration. This could yield performance gains depending
on the Hal implementation and support.

Bug: 64450664
Test: Camera CTS
Change-Id: I2b0ec8916f027e7f34f81dc414c3ca649807e925
gugelfrei
Emilian Peev 7 years ago
parent 3700e162a5
commit 5fbe0ba24d

@ -79,8 +79,9 @@ interface ICameraDeviceUser
* <p>
* @param operatingMode The kind of session to create; either NORMAL_MODE or
* CONSTRAINED_HIGH_SPEED_MODE. Must be a non-negative value.
* @param sessionParams Session wide camera parameters
*/
void endConfigure(int operatingMode);
void endConfigure(int operatingMode, in CameraMetadataNative sessionParams);
void deleteStream(int streamId);

@ -220,5 +220,21 @@ camera_status_t ACameraDevice_createCaptureSession(
__FUNCTION__, device, outputs, callbacks, session);
return ACAMERA_ERROR_INVALID_PARAMETER;
}
return device->createCaptureSession(outputs, callbacks, session);
return device->createCaptureSession(outputs, nullptr, callbacks, session);
}
EXPORT
camera_status_t ACameraDevice_createCaptureSessionWithSessionParameters(
ACameraDevice* device,
const ACaptureSessionOutputContainer* outputs,
const ACaptureRequest* sessionParameters,
const ACameraCaptureSession_stateCallbacks* callbacks,
/*out*/ACameraCaptureSession** session) {
ATRACE_CALL();
if (device == nullptr || outputs == nullptr || callbacks == nullptr || session == nullptr) {
ALOGE("%s: Error: invalid input: device %p, outputs %p, callbacks %p, session %p",
__FUNCTION__, device, outputs, callbacks, session);
return ACAMERA_ERROR_INVALID_PARAMETER;
}
return device->createCaptureSession(outputs, sessionParameters, callbacks, session);
}

@ -157,6 +157,7 @@ CameraDevice::createCaptureRequest(
camera_status_t
CameraDevice::createCaptureSession(
const ACaptureSessionOutputContainer* outputs,
const ACaptureRequest* sessionParameters,
const ACameraCaptureSession_stateCallbacks* callbacks,
/*out*/ACameraCaptureSession** session) {
sp<ACameraCaptureSession> currentSession = mCurrentSession.promote();
@ -172,7 +173,7 @@ CameraDevice::createCaptureSession(
}
// Create new session
ret = configureStreamsLocked(outputs);
ret = configureStreamsLocked(outputs, sessionParameters);
if (ret != ACAMERA_OK) {
ALOGE("Fail to create new session. cannot configure streams");
return ret;
@ -434,7 +435,7 @@ CameraDevice::notifySessionEndOfLifeLocked(ACameraCaptureSession* session) {
}
// No new session, unconfigure now
camera_status_t ret = configureStreamsLocked(nullptr);
camera_status_t ret = configureStreamsLocked(nullptr, nullptr);
if (ret != ACAMERA_OK) {
ALOGE("Unconfigure stream failed. Device might still be configured! ret %d", ret);
}
@ -598,7 +599,8 @@ CameraDevice::getSurfaceFromANativeWindow(
}
camera_status_t
CameraDevice::configureStreamsLocked(const ACaptureSessionOutputContainer* outputs) {
CameraDevice::configureStreamsLocked(const ACaptureSessionOutputContainer* outputs,
const ACaptureRequest* sessionParameters) {
ACaptureSessionOutputContainer emptyOutput;
if (outputs == nullptr) {
outputs = &emptyOutput;
@ -694,7 +696,11 @@ CameraDevice::configureStreamsLocked(const ACaptureSessionOutputContainer* outpu
mConfiguredOutputs.insert(std::make_pair(streamId, outputPair));
}
remoteRet = mRemote->endConfigure(/*isConstrainedHighSpeed*/ false);
CameraMetadata params;
if ((sessionParameters != nullptr) && (sessionParameters->settings != nullptr)) {
params.append(sessionParameters->settings->getInternalData());
}
remoteRet = mRemote->endConfigure(/*isConstrainedHighSpeed*/ false, params);
if (remoteRet.serviceSpecificErrorCode() == hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT) {
ALOGE("Camera device %s cannnot support app output configuration: %s", getId(),
remoteRet.toString8().string());

@ -60,6 +60,7 @@ class CameraDevice final : public RefBase {
camera_status_t createCaptureSession(
const ACaptureSessionOutputContainer* outputs,
const ACaptureRequest* sessionParameters,
const ACameraCaptureSession_stateCallbacks* callbacks,
/*out*/ACameraCaptureSession** session);
@ -139,7 +140,8 @@ class CameraDevice final : public RefBase {
// For capture session to notify its end of life
void notifySessionEndOfLifeLocked(ACameraCaptureSession* session);
camera_status_t configureStreamsLocked(const ACaptureSessionOutputContainer* outputs);
camera_status_t configureStreamsLocked(const ACaptureSessionOutputContainer* outputs,
const ACaptureRequest* sessionParameters);
// Input message will be posted and cleared after this returns
void postSessionMsgAndCleanup(sp<AMessage>& msg);
@ -309,9 +311,10 @@ struct ACameraDevice {
camera_status_t createCaptureSession(
const ACaptureSessionOutputContainer* outputs,
const ACaptureRequest* sessionParameters,
const ACameraCaptureSession_stateCallbacks* callbacks,
/*out*/ACameraCaptureSession** session) {
return mDevice->createCaptureSession(outputs, callbacks, session);
return mDevice->createCaptureSession(outputs, sessionParameters, callbacks, session);
}
/***********************

@ -235,7 +235,7 @@ ACameraMetadata::getTags(/*out*/int32_t* numTags,
}
const CameraMetadata&
ACameraMetadata::getInternalData() {
ACameraMetadata::getInternalData() const {
return mData;
}

@ -64,7 +64,7 @@ struct ACameraMetadata : public RefBase {
void filterUnsupportedFeatures(); // Hide features not yet supported by NDK
void filterStreamConfigurations(); // Hide input streams, translate hal format to NDK formats
const CameraMetadata& getInternalData();
const CameraMetadata& getInternalData() const;
template<typename INTERNAL_T, typename NDK_T>
camera_status_t updateImpl(uint32_t tag, uint32_t count, const NDK_T* data) {

@ -720,6 +720,39 @@ camera_status_t ACaptureSessionSharedOutput_add(ACaptureSessionOutput *output, A
camera_status_t ACaptureSessionSharedOutput_remove(ACaptureSessionOutput *output,
ANativeWindow* anw);
/**
* Create a new camera capture session similar to {@link ACameraDevice_createCaptureSession}. This
* function allows clients to pass additional session parameters during session initialization. For
* further information about session parameters see {@link ACAMERA_REQUEST_AVAILABLE_SESSION_KEYS}.
*
* @param device the camera device of interest.
* @param outputs the {@link ACaptureSessionOutputContainer} describes all output streams.
* @param sessionParameters An optional capture request that contains the initial values of session
* parameters advertised in
* {@link ACAMERA_REQUEST_AVAILABLE_SESSION_KEYS}.
* @param callbacks the {@link ACameraCaptureSession_stateCallbacks}
* capture session state callbacks.
* @param session the created {@link ACameraCaptureSession} will be filled here if the method call
* succeeds.
*
* @return <ul>
* <li>{@link ACAMERA_OK} if the method call succeeds. The created capture session will be
* filled in session argument.</li>
* <li>{@link ACAMERA_ERROR_INVALID_PARAMETER} if any of device, outputs, callbacks or
* session is NULL.</li>
* <li>{@link ACAMERA_ERROR_CAMERA_DISCONNECTED} if the camera device is closed.</li>
* <li>{@link ACAMERA_ERROR_CAMERA_DEVICE} if the camera device encounters fatal error.</li>
* <li>{@link ACAMERA_ERROR_CAMERA_SERVICE} if the camera service encounters fatal error.
* </li>
* <li>{@link ACAMERA_ERROR_UNKNOWN} if the method fails for some other reasons.</li></ul>
*/
camera_status_t ACameraDevice_createCaptureSessionWithSessionParameters(
ACameraDevice* device,
const ACaptureSessionOutputContainer* outputs,
const ACaptureRequest* sessionParameters,
const ACameraCaptureSession_stateCallbacks* callbacks,
/*out*/ACameraCaptureSession** session);
#endif /* __ANDROID_API__ >= 28 */
__END_DECLS

@ -2877,6 +2877,59 @@ typedef enum acamera_metadata_tag {
*/
ACAMERA_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS = // int32[n]
ACAMERA_REQUEST_START + 15,
/**
* <p>A subset of the available request keys that the camera device
* can pass as part of the capture session initialization.</p>
*
* <p>Type: int32[n]</p>
*
* <p>This tag may appear in:
* <ul>
* <li>ACameraMetadata from ACameraManager_getCameraCharacteristics</li>
* </ul></p>
*
* <p>This is a subset of ACAMERA_REQUEST_AVAILABLE_REQUEST_KEYS which
* contains a list of keys that are difficult to apply per-frame and
* can result in unexpected delays when modified during the capture session
* lifetime. Typical examples include parameters that require a
* time-consuming hardware re-configuration or internal camera pipeline
* change. For performance reasons we advise clients to pass their initial
* values as part of
* {@link ACameraDevice_createCaptureSessionWithSessionParameters }.i
* Once the camera capture session is enabled it is also recommended to avoid
* changing them from their initial values set in
* {@link ACameraDevice_createCaptureSessionWithSessionParameters }.
* Control over session parameters can still be exerted in capture requests
* but clients should be aware and expect delays during their application.
* An example usage scenario could look like this:</p>
* <ul>
* <li>The camera client starts by quering the session parameter key list via
* {@link ACameraManager_getCameraCharacteristics }.</li>
* <li>Before triggering the capture session create sequence, a capture request
* must be built via
* {@link ACameraDevice_createCaptureRequest }
* using an appropriate template matching the particular use case.</li>
* <li>The client should go over the list of session parameters and check
* whether some of the keys listed matches with the parameters that
* they intend to modify as part of the first capture request.</li>
* <li>If there is no such match, the capture request can be passed
* unmodified to
* {@link ACameraDevice_createCaptureSessionWithSessionParameters }.</li>
* <li>If matches do exist, the client should update the respective values
* and pass the request to
* {@link ACameraDevice_createCaptureSessionWithSessionParameters }.</li>
* <li>After the capture session initialization completes the session parameter
* key list can continue to serve as reference when posting or updating
* further requests. As mentioned above further changes to session
* parameters should ideally be avoided, if updates are necessary
* however clients could expect a delay/glitch during the
* parameter switch.</li>
* </ul>
*
* @see ACAMERA_REQUEST_AVAILABLE_REQUEST_KEYS
*/
ACAMERA_REQUEST_AVAILABLE_SESSION_KEYS = // int32[n]
ACAMERA_REQUEST_START + 16,
ACAMERA_REQUEST_END,
/**

@ -10,6 +10,7 @@ LIBCAMERA2NDK {
ACameraDevice_close;
ACameraDevice_createCaptureRequest;
ACameraDevice_createCaptureSession;
ACameraDevice_createCaptureSessionWithSessionParameters;
ACameraDevice_getId;
ACameraManager_create;
ACameraManager_delete;

@ -476,7 +476,8 @@ TEST_F(CameraClientBinderTest, CheckBinderCameraDeviceUser) {
res = device->createStream(output, &streamId);
EXPECT_TRUE(res.isOk()) << res;
EXPECT_LE(0, streamId);
res = device->endConfigure(/*isConstrainedHighSpeed*/ false);
CameraMetadata sessionParams;
res = device->endConfigure(/*isConstrainedHighSpeed*/ false, sessionParams);
EXPECT_TRUE(res.isOk()) << res;
EXPECT_FALSE(callbacks->hadError());
@ -574,7 +575,7 @@ TEST_F(CameraClientBinderTest, CheckBinderCameraDeviceUser) {
EXPECT_TRUE(res.isOk()) << res;
res = device->deleteStream(streamId);
EXPECT_TRUE(res.isOk()) << res;
res = device->endConfigure(/*isConstrainedHighSpeed*/ false);
res = device->endConfigure(/*isConstrainedHighSpeed*/ false, sessionParams);
EXPECT_TRUE(res.isOk()) << res;
sleep(/*second*/1); // allow some time for errors to show up, if any

@ -78,7 +78,8 @@ LOCAL_SHARED_LIBRARIES:= \
android.hardware.camera.provider@2.4 \
android.hardware.camera.device@1.0 \
android.hardware.camera.device@3.2 \
android.hardware.camera.device@3.3
android.hardware.camera.device@3.3 \
android.hardware.camera.device@3.4
LOCAL_EXPORT_SHARED_LIBRARY_HEADERS := libbinder libcamera_client libfmq

@ -318,7 +318,8 @@ binder::Status CameraDeviceClient::beginConfigure() {
return binder::Status::ok();
}
binder::Status CameraDeviceClient::endConfigure(int operatingMode) {
binder::Status CameraDeviceClient::endConfigure(int operatingMode,
const hardware::camera2::impl::CameraMetadataNative& sessionParams) {
ATRACE_CALL();
ALOGV("%s: ending configure (%d input stream, %zu output surfaces)",
__FUNCTION__, mInputStream.configured ? 1 : 0,
@ -364,7 +365,7 @@ binder::Status CameraDeviceClient::endConfigure(int operatingMode) {
}
}
status_t err = mDevice->configureStreams(operatingMode);
status_t err = mDevice->configureStreams(sessionParams, operatingMode);
if (err == BAD_VALUE) {
String8 msg = String8::format("Camera %s: Unsupported set of inputs/outputs provided",
mCameraIdStr.string());

@ -85,7 +85,8 @@ public:
virtual binder::Status beginConfigure() override;
virtual binder::Status endConfigure(int operatingMode) override;
virtual binder::Status endConfigure(int operatingMode,
const hardware::camera2::impl::CameraMetadataNative& sessionParams) override;
// Returns -EBUSY if device is not idle or in error state
virtual binder::Status deleteStream(int streamId) override;

@ -212,7 +212,8 @@ 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(int operatingMode = 0) = 0;
virtual status_t configureStreams(const CameraMetadata& sessionParams,
int operatingMode = 0) = 0;
// get the buffer producer of the input stream
virtual status_t getInputBufferProducer(

@ -55,6 +55,8 @@
#include "device3/Camera3SharedOutputStream.h"
#include "CameraService.h"
#include <android/hardware/camera/device/3.4/ICameraDeviceSession.h>
using namespace android::camera3;
using namespace android::hardware::camera;
using namespace android::hardware::camera::device::V3_2;
@ -1102,7 +1104,7 @@ sp<Camera3Device::CaptureRequest> Camera3Device::setUpRequestLocked(
if (mStatus == STATUS_UNCONFIGURED || mNeedConfig) {
// This point should only be reached via API1 (API2 must explicitly call configureStreams)
// so unilaterally select normal operating mode.
res = configureStreamsLocked(CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE);
res = configureStreamsLocked(CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE, mSessionParams);
// Stream configuration failed. Client might try other configuraitons.
if (res != OK) {
CLOGE("Can't set up streams: %s (%d)", strerror(-res), res);
@ -1205,8 +1207,8 @@ status_t Camera3Device::createInputStream(
// Continue captures if active at start
if (wasActive) {
ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__);
// Reuse current operating mode for new stream config
res = configureStreamsLocked(mOperatingMode);
// Reuse current operating mode and session parameters for new stream config
res = configureStreamsLocked(mOperatingMode, mSessionParams);
if (res != OK) {
ALOGE("%s: Can't reconfigure device for new stream %d: %s (%d)",
__FUNCTION__, mNextStreamId, strerror(-res), res);
@ -1360,8 +1362,8 @@ status_t Camera3Device::createStream(const std::vector<sp<Surface>>& consumers,
// Continue captures if active at start
if (wasActive) {
ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__);
// Reuse current operating mode for new stream config
res = configureStreamsLocked(mOperatingMode);
// Reuse current operating mode and session parameters for new stream config
res = configureStreamsLocked(mOperatingMode, mSessionParams);
if (res != OK) {
CLOGE("Can't reconfigure device for new stream %d: %s (%d)",
mNextStreamId, strerror(-res), res);
@ -1499,14 +1501,29 @@ status_t Camera3Device::deleteStream(int id) {
return res;
}
status_t Camera3Device::configureStreams(int operatingMode) {
status_t Camera3Device::configureStreams(const CameraMetadata& sessionParams, int operatingMode) {
ATRACE_CALL();
ALOGV("%s: E", __FUNCTION__);
Mutex::Autolock il(mInterfaceLock);
Mutex::Autolock l(mLock);
return configureStreamsLocked(operatingMode);
//Filter out any incoming session parameters
const CameraMetadata params(sessionParams);
CameraMetadata filteredParams;
camera_metadata_entry_t availableSessionKeys = mDeviceInfo.find(
ANDROID_REQUEST_AVAILABLE_SESSION_KEYS);
if (availableSessionKeys.count > 0) {
for (size_t i = 0; i < availableSessionKeys.count; i++) {
camera_metadata_ro_entry entry = params.find(
availableSessionKeys.data.i32[i]);
if (entry.count > 0) {
filteredParams.update(entry);
}
}
}
return configureStreamsLocked(operatingMode, filteredParams);
}
status_t Camera3Device::getInputBufferProducer(
@ -2188,7 +2205,8 @@ void Camera3Device::cancelStreamsConfigurationLocked() {
mNeedConfig = true;
}
status_t Camera3Device::configureStreamsLocked(int operatingMode) {
status_t Camera3Device::configureStreamsLocked(int operatingMode,
const CameraMetadata& sessionParams) {
ATRACE_CALL();
status_t res;
@ -2272,7 +2290,9 @@ status_t Camera3Device::configureStreamsLocked(int operatingMode) {
// Do the HAL configuration; will potentially touch stream
// max_buffers, usage, priv fields.
res = mInterface->configureStreams(&config);
const camera_metadata_t *sessionBuffer = sessionParams.getAndLock();
res = mInterface->configureStreams(sessionBuffer, &config);
sessionParams.unlock(sessionBuffer);
if (res == BAD_VALUE) {
// HAL rejected this set of streams as unsupported, clean up config
@ -2337,6 +2357,14 @@ status_t Camera3Device::configureStreamsLocked(int operatingMode) {
}
// Update device state
const camera_metadata_t *newSessionParams = sessionParams.getAndLock();
const camera_metadata_t *currentSessionParams = mSessionParams.getAndLock();
bool updateSessionParams = (newSessionParams != currentSessionParams) ? true : false;
sessionParams.unlock(newSessionParams);
mSessionParams.unlock(currentSessionParams);
if (updateSessionParams) {
mSessionParams = sessionParams;
}
mNeedConfig = false;
@ -3224,17 +3252,18 @@ status_t Camera3Device::HalInterface::constructDefaultRequestSettings(
return res;
}
status_t Camera3Device::HalInterface::configureStreams(camera3_stream_configuration *config) {
status_t Camera3Device::HalInterface::configureStreams(const camera_metadata_t *sessionParams,
camera3_stream_configuration *config) {
ATRACE_NAME("CameraHal::configureStreams");
if (!valid()) return INVALID_OPERATION;
status_t res = OK;
// Convert stream config to HIDL
std::set<int> activeStreams;
StreamConfiguration requestedConfiguration;
requestedConfiguration.streams.resize(config->num_streams);
device::V3_4::StreamConfiguration requestedConfiguration;
requestedConfiguration.v3_2.streams.resize(config->num_streams);
for (size_t i = 0; i < config->num_streams; i++) {
Stream &dst = requestedConfiguration.streams[i];
Stream &dst = requestedConfiguration.v3_2.streams[i];
camera3_stream_t *src = config->streams[i];
Camera3Stream* cam3stream = Camera3Stream::cast(src);
@ -3281,29 +3310,50 @@ status_t Camera3Device::HalInterface::configureStreams(camera3_stream_configurat
res = mapToStreamConfigurationMode(
(camera3_stream_configuration_mode_t) config->operation_mode,
/*out*/ &requestedConfiguration.operationMode);
/*out*/ &requestedConfiguration.v3_2.operationMode);
if (res != OK) {
return res;
}
requestedConfiguration.sessionParams.setToExternal(
reinterpret_cast<uint8_t*>(const_cast<camera_metadata_t*>(sessionParams)),
get_camera_metadata_size(sessionParams));
// Invoke configureStreams
device::V3_3::HalStreamConfiguration finalConfiguration;
common::V1_0::Status status;
// See if we have v3.3 HAL
// See if we have v3.4 or v3.3 HAL
sp<device::V3_4::ICameraDeviceSession> hidlSession_3_4;
sp<device::V3_3::ICameraDeviceSession> hidlSession_3_3;
auto castResult = device::V3_3::ICameraDeviceSession::castFrom(mHidlSession);
if (castResult.isOk()) {
hidlSession_3_3 = castResult;
auto castResult_3_4 = device::V3_4::ICameraDeviceSession::castFrom(mHidlSession);
if (castResult_3_4.isOk()) {
hidlSession_3_4 = castResult_3_4;
} else {
ALOGE("%s: Transaction error when casting ICameraDeviceSession: %s", __FUNCTION__,
castResult.description().c_str());
auto castResult_3_3 = device::V3_3::ICameraDeviceSession::castFrom(mHidlSession);
if (castResult_3_3.isOk()) {
hidlSession_3_3 = castResult_3_3;
}
}
if (hidlSession_3_3 != nullptr) {
if (hidlSession_3_4 != nullptr) {
// We do; use v3.4 for the call
ALOGV("%s: v3.4 device found", __FUNCTION__);
auto err = hidlSession_3_4->configureStreams_3_4(requestedConfiguration,
[&status, &finalConfiguration]
(common::V1_0::Status s, const device::V3_3::HalStreamConfiguration& halConfiguration) {
finalConfiguration = halConfiguration;
status = s;
});
if (!err.isOk()) {
ALOGE("%s: Transaction error: %s", __FUNCTION__, err.description().c_str());
return DEAD_OBJECT;
}
} else if (hidlSession_3_3 != nullptr) {
// We do; use v3.3 for the call
ALOGV("%s: v3.3 device found", __FUNCTION__);
auto err = hidlSession_3_3->configureStreams_3_3(requestedConfiguration,
auto err = hidlSession_3_3->configureStreams_3_3(requestedConfiguration.v3_2,
[&status, &finalConfiguration]
(common::V1_0::Status s, const device::V3_3::HalStreamConfiguration& halConfiguration) {
finalConfiguration = halConfiguration;
@ -3317,7 +3367,7 @@ status_t Camera3Device::HalInterface::configureStreams(camera3_stream_configurat
// We don't; use v3.2 call and construct a v3.3 HalStreamConfiguration
ALOGV("%s: v3.2 device found", __FUNCTION__);
HalStreamConfiguration finalConfiguration_3_2;
auto err = mHidlSession->configureStreams(requestedConfiguration,
auto err = mHidlSession->configureStreams(requestedConfiguration.v3_2,
[&status, &finalConfiguration_3_2]
(common::V1_0::Status s, const HalStreamConfiguration& halConfiguration) {
finalConfiguration_3_2 = halConfiguration;
@ -3331,7 +3381,7 @@ status_t Camera3Device::HalInterface::configureStreams(camera3_stream_configurat
for (size_t i = 0; i < finalConfiguration_3_2.streams.size(); i++) {
finalConfiguration.streams[i].v3_2 = finalConfiguration_3_2.streams[i];
finalConfiguration.streams[i].overrideDataSpace =
requestedConfiguration.streams[i].dataSpace;
requestedConfiguration.v3_2.streams[i].dataSpace;
}
}

@ -138,7 +138,8 @@ class Camera3Device :
status_t deleteStream(int id) override;
status_t configureStreams(int operatingMode =
status_t configureStreams(const CameraMetadata& sessionParams,
int operatingMode =
static_cast<int>(hardware::camera::device::V3_2::StreamConfigurationMode::NORMAL_MODE))
override;
status_t getInputBufferProducer(
@ -236,6 +237,9 @@ class Camera3Device :
// Current stream configuration mode;
int mOperatingMode;
// Current session wide parameters
hardware::camera2::impl::CameraMetadataNative mSessionParams;
// Constant to use for no set operating mode
static const int NO_MODE = -1;
@ -272,7 +276,8 @@ class Camera3Device :
// Caller takes ownership of requestTemplate
status_t constructDefaultRequestSettings(camera3_request_template_t templateId,
/*out*/ camera_metadata_t **requestTemplate);
status_t configureStreams(/*inout*/ camera3_stream_configuration *config);
status_t configureStreams(const camera_metadata_t *sessionParams,
/*inout*/ camera3_stream_configuration *config);
status_t processCaptureRequest(camera3_capture_request_t *request);
status_t processBatchCaptureRequests(
std::vector<camera3_capture_request_t*>& requests,
@ -550,7 +555,8 @@ class Camera3Device :
* Take the currently-defined set of streams and configure the HAL to use
* them. This is a long-running operation (may be several hundered ms).
*/
status_t configureStreamsLocked(int operatingMode);
status_t configureStreamsLocked(int operatingMode,
const CameraMetadata& sessionParams);
/**
* Cancel stream configuration that did not finish successfully.

Loading…
Cancel
Save