@ -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_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 ;
}
if ( hidlSession_3_3 ! = nullptr ) {
} 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 ;
}
}