@ -24,23 +24,37 @@
# include <algorithm>
# include <chrono>
# include <future>
# include <inttypes.h>
# include <hardware/camera_common.h>
# include <hidl/ServiceManagement.h>
# include <functional>
# include <camera_metadata_hidden.h>
# include <android-base/parseint.h>
# include <android-base/logging.h>
# include <cutils/properties.h>
# include <hwbinder/IPCThreadState.h>
# include <utils/Trace.h>
namespace android {
using namespace : : android : : hardware : : camera ;
using namespace : : android : : hardware : : camera : : common : : V1_0 ;
using std : : literals : : chrono_literals : : operator " " s ;
namespace {
// Hardcoded name for the passthrough HAL implementation, since it can't be discovered via the
// service manager
const std : : string kLegacyProviderName ( " legacy/0 " ) ;
const std : : string kExternalProviderName ( " external/0 " ) ;
const bool kEnableLazyHal ( property_get_bool ( " ro.camera.enableLazyHal " , false ) ) ;
// The extra amount of time to hold a reference to an ICameraProvider after it is no longer needed.
// Hold the reference for this extra time so that if the camera is unreferenced and then referenced
// again quickly, we do not let the HAL exit and then need to immediately restart it. An example
// when this could happen is switching from a front-facing to a rear-facing camera. If the HAL were
// to exit during the camera switch, the camera could appear janky to the user.
const std : : chrono : : system_clock : : duration kCameraKeepAliveDelay = 3 s ;
} // anonymous namespace
@ -74,6 +88,8 @@ status_t CameraProviderManager::initialize(wp<CameraProviderManager::StatusListe
addProviderLocked ( kLegacyProviderName , /*expected*/ false ) ;
addProviderLocked ( kExternalProviderName , /*expected*/ false ) ;
IPCThreadState : : self ( ) - > flushCommands ( ) ;
return OK ;
}
@ -219,26 +235,15 @@ status_t CameraProviderManager::getHighestSupportedVersion(const std::string &id
return OK ;
}
bool CameraProviderManager : : supportSetTorchMode ( const std : : string & id ) {
bool CameraProviderManager : : supportSetTorchMode ( const std : : string & id ) const {
std : : lock_guard < std : : mutex > lock ( mInterfaceMutex ) ;
bool support = false ;
for ( auto & provider : mProviders ) {
auto deviceInfo = findDeviceInfoLocked ( id ) ;
if ( deviceInfo ! = nullptr ) {
auto ret = provider - > mInterface - > isSetTorchModeSupported (
[ & support ] ( auto status , bool supported ) {
if ( status = = Status : : OK ) {
support = supported ;
}
} ) ;
if ( ! ret . isOk ( ) ) {
ALOGE ( " %s: Transaction error checking torch mode support '%s': %s " ,
__FUNCTION__ , provider - > mProviderName . c_str ( ) , ret . description ( ) . c_str ( ) ) ;
}
break ;
return provider - > mSetTorchModeSupported ;
}
}
return support ;
return false ;
}
status_t CameraProviderManager : : setTorchMode ( const std : : string & id , bool enabled ) {
@ -247,6 +252,15 @@ status_t CameraProviderManager::setTorchMode(const std::string &id, bool enabled
auto deviceInfo = findDeviceInfoLocked ( id ) ;
if ( deviceInfo = = nullptr ) return NAME_NOT_FOUND ;
// Pass the camera ID to start interface so that it will save it to the map of ICameraProviders
// that are currently in use.
const sp < provider : : V2_4 : : ICameraProvider > interface =
deviceInfo - > mParentProvider - > startProviderInterface ( ) ;
if ( interface = = nullptr ) {
return DEAD_OBJECT ;
}
saveRef ( DeviceMode : : TORCH , deviceInfo - > mId , interface ) ;
return deviceInfo - > setTorchMode ( enabled ) ;
}
@ -274,10 +288,22 @@ status_t CameraProviderManager::openSession(const std::string &id,
if ( deviceInfo = = nullptr ) return NAME_NOT_FOUND ;
auto * deviceInfo3 = static_cast < ProviderInfo : : DeviceInfo3 * > ( deviceInfo ) ;
const sp < provider : : V2_4 : : ICameraProvider > provider =
deviceInfo - > mParentProvider - > startProviderInterface ( ) ;
if ( provider = = nullptr ) {
return DEAD_OBJECT ;
}
saveRef ( DeviceMode : : CAMERA , id , provider ) ;
Status status ;
hardware : : Return < void > ret ;
ret = deviceInfo3 - > mInterface - > open ( callback , [ & status , & session ]
auto interface = deviceInfo3 - > startDeviceInterface <
CameraProviderManager : : ProviderInfo : : DeviceInfo3 : : InterfaceT > ( ) ;
if ( interface = = nullptr ) {
return DEAD_OBJECT ;
}
ret = interface - > open ( callback , [ & status , & session ]
( Status s , const sp < device : : V3_2 : : ICameraDeviceSession > & cameraSession ) {
status = s ;
if ( status = = Status : : OK ) {
@ -285,6 +311,7 @@ status_t CameraProviderManager::openSession(const std::string &id,
}
} ) ;
if ( ! ret . isOk ( ) ) {
removeRef ( DeviceMode : : CAMERA , id ) ;
ALOGE ( " %s: Transaction error opening a session for camera device %s: %s " ,
__FUNCTION__ , id . c_str ( ) , ret . description ( ) . c_str ( ) ) ;
return DEAD_OBJECT ;
@ -304,19 +331,82 @@ status_t CameraProviderManager::openSession(const std::string &id,
if ( deviceInfo = = nullptr ) return NAME_NOT_FOUND ;
auto * deviceInfo1 = static_cast < ProviderInfo : : DeviceInfo1 * > ( deviceInfo ) ;
const sp < provider : : V2_4 : : ICameraProvider > provider =
deviceInfo - > mParentProvider - > startProviderInterface ( ) ;
if ( provider = = nullptr ) {
return DEAD_OBJECT ;
}
saveRef ( DeviceMode : : CAMERA , id , provider ) ;
hardware : : Return < Status > status = deviceInfo1 - > mInterface - > open ( callback ) ;
auto interface = deviceInfo1 - > startDeviceInterface <
CameraProviderManager : : ProviderInfo : : DeviceInfo1 : : InterfaceT > ( ) ;
if ( interface = = nullptr ) {
return DEAD_OBJECT ;
}
hardware : : Return < Status > status = interface - > open ( callback ) ;
if ( ! status . isOk ( ) ) {
removeRef ( DeviceMode : : CAMERA , id ) ;
ALOGE ( " %s: Transaction error opening a session for camera device %s: %s " ,
__FUNCTION__ , id . c_str ( ) , status . description ( ) . c_str ( ) ) ;
return DEAD_OBJECT ;
}
if ( status = = Status : : OK ) {
* session = dev iceInfo1- > mI nterface;
* session = interface;
}
return mapToStatusT ( status ) ;
}
void CameraProviderManager : : saveRef ( DeviceMode usageType , const std : : string & cameraId ,
sp < provider : : V2_4 : : ICameraProvider > provider ) {
if ( ! kEnableLazyHal ) {
return ;
}
ALOGI ( " Saving camera provider %s for camera device %s " , provider - > descriptor , cameraId . c_str ( ) ) ;
std : : lock_guard < std : : mutex > lock ( mProviderInterfaceMapLock ) ;
std : : unordered_map < std : : string , sp < provider : : V2_4 : : ICameraProvider > > * primaryMap , * alternateMap ;
if ( usageType = = DeviceMode : : TORCH ) {
primaryMap = & mTorchProviderByCameraId ;
alternateMap = & mCameraProviderByCameraId ;
} else {
primaryMap = & mCameraProviderByCameraId ;
alternateMap = & mTorchProviderByCameraId ;
}
auto id = cameraId . c_str ( ) ;
( * primaryMap ) [ id ] = provider ;
auto search = alternateMap - > find ( id ) ;
if ( search ! = alternateMap - > end ( ) ) {
ALOGW ( " %s: Camera device %s is using both torch mode and camera mode simultaneously. "
" That should not be possible " , __FUNCTION__ , id ) ;
}
ALOGV ( " %s: Camera device %s connected " , __FUNCTION__ , id ) ;
}
void CameraProviderManager : : removeRef ( DeviceMode usageType , const std : : string & cameraId ) {
if ( ! kEnableLazyHal ) {
return ;
}
ALOGI ( " Removing camera device %s " , cameraId . c_str ( ) ) ;
std : : unordered_map < std : : string , sp < provider : : V2_4 : : ICameraProvider > > * providerMap ;
if ( usageType = = DeviceMode : : TORCH ) {
providerMap = & mTorchProviderByCameraId ;
} else {
providerMap = & mCameraProviderByCameraId ;
}
std : : lock_guard < std : : mutex > lock ( mProviderInterfaceMapLock ) ;
auto search = providerMap - > find ( cameraId . c_str ( ) ) ;
if ( search ! = providerMap - > end ( ) ) {
auto ptr = search - > second ;
auto future = std : : async ( std : : launch : : async , [ ptr ] {
std : : this_thread : : sleep_for ( kCameraKeepAliveDelay ) ;
IPCThreadState : : self ( ) - > flushCommands ( ) ;
} ) ;
providerMap - > erase ( cameraId . c_str ( ) ) ;
} else {
ALOGE ( " %s: Asked to remove reference for camera %s, but no reference to it was found. This "
" could mean removeRef was called twice for the same camera ID. " , __FUNCTION__ ,
cameraId . c_str ( ) ) ;
}
}
hardware : : Return < void > CameraProviderManager : : onRegistration (
const hardware : : hidl_string & /*fqName*/ ,
@ -334,6 +424,8 @@ hardware::Return<void> CameraProviderManager::onRegistration(
listener - > onNewProviderRegistered ( ) ;
}
IPCThreadState : : self ( ) - > flushCommands ( ) ;
return hardware : : Return < void > ( ) ;
}
@ -581,9 +673,8 @@ status_t CameraProviderManager::addProviderLocked(const std::string& newProvider
}
}
sp < ProviderInfo > providerInfo =
new ProviderInfo ( newProvider , interface , this ) ;
status_t res = providerInfo - > initialize ( ) ;
sp < ProviderInfo > providerInfo = new ProviderInfo ( newProvider , this ) ;
status_t res = providerInfo - > initialize ( interface ) ;
if ( res ! = OK ) {
return res ;
}
@ -635,27 +726,26 @@ sp<CameraProviderManager::StatusListener> CameraProviderManager::getStatusListen
CameraProviderManager : : ProviderInfo : : ProviderInfo (
const std : : string & providerName ,
sp < provider : : V2_4 : : ICameraProvider > & interface ,
CameraProviderManager * manager ) :
mProviderName ( providerName ) ,
mInterface ( interface ) ,
mProviderTagid ( generateVendorTagId ( providerName ) ) ,
mUniqueDeviceCount ( 0 ) ,
mManager ( manager ) {
( void ) mManager ;
}
status_t CameraProviderManager : : ProviderInfo : : initialize ( ) {
status_t CameraProviderManager : : ProviderInfo : : initialize (
sp < provider : : V2_4 : : ICameraProvider > & interface ) {
status_t res = parseProviderName ( mProviderName , & mType , & mId ) ;
if ( res ! = OK ) {
ALOGE ( " %s: Invalid provider name, ignoring " , __FUNCTION__ ) ;
return BAD_VALUE ;
}
ALOGI ( " Connecting to new camera provider: %s, isRemote? %d " ,
mProviderName . c_str ( ) , mI nterface- > isRemote ( ) ) ;
mProviderName . c_str ( ) , i nterface- > isRemote ( ) ) ;
// cameraDeviceStatusChange callbacks may be called (and causing new devices added)
// before setCallback returns
hardware : : Return < Status > status = mI nterface- > setCallback ( this ) ;
hardware : : Return < Status > status = i nterface- > setCallback ( this ) ;
if ( ! status . isOk ( ) ) {
ALOGE ( " %s: Transaction error setting up callbacks with camera provider '%s': %s " ,
__FUNCTION__ , mProviderName . c_str ( ) , status . description ( ) . c_str ( ) ) ;
@ -667,7 +757,7 @@ status_t CameraProviderManager::ProviderInfo::initialize() {
return mapToStatusT ( status ) ;
}
hardware : : Return < bool > linked = mI nterface- > linkToDeath ( this , /*cookie*/ mId ) ;
hardware : : Return < bool > linked = i nterface- > linkToDeath ( this , /*cookie*/ mId ) ;
if ( ! linked . isOk ( ) ) {
ALOGE ( " %s: Transaction error in linking to camera provider '%s' death: %s " ,
__FUNCTION__ , mProviderName . c_str ( ) , linked . description ( ) . c_str ( ) ) ;
@ -679,7 +769,7 @@ status_t CameraProviderManager::ProviderInfo::initialize() {
// Get initial list of camera devices, if any
std : : vector < std : : string > devices ;
hardware : : Return < void > ret = mI nterface- > getCameraIdList ( [ & status , this , & devices ] (
hardware : : Return < void > ret = i nterface- > getCameraIdList ( [ & status , this , & devices ] (
Status idStatus ,
const hardware : : hidl_vec < hardware : : hidl_string > & cameraDeviceNames ) {
status = idStatus ;
@ -708,6 +798,20 @@ status_t CameraProviderManager::ProviderInfo::initialize() {
return mapToStatusT ( status ) ;
}
ret = interface - > isSetTorchModeSupported (
[ this ] ( auto status , bool supported ) {
if ( status = = Status : : OK ) {
mSetTorchModeSupported = supported ;
}
} ) ;
if ( ! ret . isOk ( ) ) {
ALOGE ( " %s: Transaction error checking torch mode support '%s': %s " ,
__FUNCTION__ , mProviderName . c_str ( ) , ret . description ( ) . c_str ( ) ) ;
return DEAD_OBJECT ;
}
mIsRemote = interface - > isRemote ( ) ;
sp < StatusListener > listener = mManager - > getStatusListener ( ) ;
for ( auto & device : devices ) {
std : : string id ;
@ -730,9 +834,42 @@ status_t CameraProviderManager::ProviderInfo::initialize() {
mProviderName . c_str ( ) , mDevices . size ( ) ) ;
mInitialized = true ;
if ( ! kEnableLazyHal ) {
// Save HAL reference indefinitely
mSavedInterface = interface ;
}
return OK ;
}
const sp < provider : : V2_4 : : ICameraProvider >
CameraProviderManager : : ProviderInfo : : startProviderInterface ( ) {
ATRACE_CALL ( ) ;
ALOGI ( " Request to start camera provider: %s " , mProviderName . c_str ( ) ) ;
if ( mSavedInterface ! = nullptr ) {
return mSavedInterface ;
}
auto interface = mActiveInterface . promote ( ) ;
if ( interface = = nullptr ) {
ALOGI ( " Could not promote, calling getService(%s) " , mProviderName . c_str ( ) ) ;
interface = mManager - > mServiceProxy - > getService ( mProviderName ) ;
interface - > setCallback ( this ) ;
hardware : : Return < bool > linked = interface - > linkToDeath ( this , /*cookie*/ mId ) ;
if ( ! linked . isOk ( ) ) {
ALOGE ( " %s: Transaction error in linking to camera provider '%s' death: %s " ,
__FUNCTION__ , mProviderName . c_str ( ) , linked . description ( ) . c_str ( ) ) ;
mManager - > removeProvider ( mProviderName ) ;
return nullptr ;
} else if ( ! linked ) {
ALOGW ( " %s: Unable to link to provider '%s' death notifications " ,
__FUNCTION__ , mProviderName . c_str ( ) ) ;
}
mActiveInterface = interface ;
} else {
ALOGI ( " Camera provider (%s) already in use. Re-using instance. " , mProviderName . c_str ( ) ) ;
}
return interface ;
}
const std : : string & CameraProviderManager : : ProviderInfo : : getType ( ) const {
return mType ;
}
@ -814,7 +951,7 @@ void CameraProviderManager::ProviderInfo::removeDevice(std::string id) {
status_t CameraProviderManager : : ProviderInfo : : dump ( int fd , const Vector < String16 > & ) const {
dprintf ( fd , " == Camera Provider HAL %s (v2.4, %s) static info: %zu devices: == \n " ,
mProviderName . c_str ( ) , mI nterface- > i sRemote( ) ? " remote " : " passthrough " ,
mProviderName . c_str ( ) , mI sRemote ? " remote " : " passthrough " ,
mDevices . size ( ) ) ;
for ( auto & device : mDevices ) {
@ -942,6 +1079,9 @@ hardware::Return<void> CameraProviderManager::ProviderInfo::torchModeStatusChang
torchStatusToString ( newStatus ) ) ;
id = deviceInfo - > mId ;
known = true ;
if ( TorchModeStatus : : AVAILABLE_ON ! = newStatus ) {
mManager - > removeRef ( DeviceMode : : TORCH , id ) ;
}
break ;
}
}
@ -977,7 +1117,11 @@ status_t CameraProviderManager::ProviderInfo::setUpVendorTags() {
hardware : : hidl_vec < VendorTagSection > vts ;
Status status ;
hardware : : Return < void > ret ;
ret = mInterface - > getVendorTags (
const sp < provider : : V2_4 : : ICameraProvider > interface = startProviderInterface ( ) ;
if ( interface = = nullptr ) {
return DEAD_OBJECT ;
}
ret = interface - > getVendorTags (
[ & ] ( auto s , const auto & vendorTagSecs ) {
status = s ;
if ( s = = Status : : OK ) {
@ -1010,11 +1154,11 @@ template<class DeviceInfoT>
std : : unique_ptr < CameraProviderManager : : ProviderInfo : : DeviceInfo >
CameraProviderManager : : ProviderInfo : : initializeDeviceInfo (
const std : : string & name , const metadata_vendor_id_t tagId ,
const std : : string & id , uint16_t minorVersion ) const {
const std : : string & id , uint16_t minorVersion ) {
Status status ;
auto cameraInterface =
ge tDeviceInterface< typename DeviceInfoT : : InterfaceT > ( name ) ;
star tDeviceInterface< typename DeviceInfoT : : InterfaceT > ( name ) ;
if ( cameraInterface = = nullptr ) return nullptr ;
CameraResourceCost resourceCost ;
@ -1041,13 +1185,13 @@ std::unique_ptr<CameraProviderManager::ProviderInfo::DeviceInfo>
}
return std : : unique_ptr < DeviceInfo > (
new DeviceInfoT ( name , tagId , id , minorVersion , resourceCost ,
new DeviceInfoT ( name , tagId , id , minorVersion , resourceCost , this ,
mProviderPublicCameraIds , cameraInterface ) ) ;
}
template < class InterfaceT >
sp < InterfaceT >
CameraProviderManager : : ProviderInfo : : ge tDeviceInterface( const std : : string & name ) const {
CameraProviderManager : : ProviderInfo : : star tDeviceInterface( const std : : string & name ) {
ALOGE ( " %s: Device %s: Unknown HIDL device HAL major version %d: " , __FUNCTION__ ,
name . c_str ( ) , InterfaceT : : version . get_major ( ) ) ;
return nullptr ;
@ -1055,12 +1199,16 @@ CameraProviderManager::ProviderInfo::getDeviceInterface(const std::string &name)
template < >
sp < device : : V1_0 : : ICameraDevice >
CameraProviderManager : : ProviderInfo : : ge tDeviceInterface
< device : : V1_0 : : ICameraDevice > ( const std : : string & name ) const {
CameraProviderManager : : ProviderInfo : : star tDeviceInterface
< device : : V1_0 : : ICameraDevice > ( const std : : string & name ) {
Status status ;
sp < device : : V1_0 : : ICameraDevice > cameraInterface ;
hardware : : Return < void > ret ;
ret = mInterface - > getCameraDeviceInterface_V1_x ( name , [ & status , & cameraInterface ] (
const sp < provider : : V2_4 : : ICameraProvider > interface = startProviderInterface ( ) ;
if ( interface = = nullptr ) {
return nullptr ;
}
ret = interface - > getCameraDeviceInterface_V1_x ( name , [ & status , & cameraInterface ] (
Status s , sp < device : : V1_0 : : ICameraDevice > interface ) {
status = s ;
cameraInterface = interface ;
@ -1080,12 +1228,16 @@ CameraProviderManager::ProviderInfo::getDeviceInterface
template < >
sp < device : : V3_2 : : ICameraDevice >
CameraProviderManager : : ProviderInfo : : ge tDeviceInterface
< device : : V3_2 : : ICameraDevice > ( const std : : string & name ) const {
CameraProviderManager : : ProviderInfo : : star tDeviceInterface
< device : : V3_2 : : ICameraDevice > ( const std : : string & name ) {
Status status ;
sp < device : : V3_2 : : ICameraDevice > cameraInterface ;
hardware : : Return < void > ret ;
ret = mInterface - > getCameraDeviceInterface_V3_x ( name , [ & status , & cameraInterface ] (
const sp < provider : : V2_4 : : ICameraProvider > interface = startProviderInterface ( ) ;
if ( interface = = nullptr ) {
return nullptr ;
}
ret = interface - > getCameraDeviceInterface_V3_x ( name , [ & status , & cameraInterface ] (
Status s , sp < device : : V3_2 : : ICameraDevice > interface ) {
status = s ;
cameraInterface = interface ;
@ -1105,6 +1257,18 @@ CameraProviderManager::ProviderInfo::getDeviceInterface
CameraProviderManager : : ProviderInfo : : DeviceInfo : : ~ DeviceInfo ( ) { }
template < class InterfaceT >
sp < InterfaceT > CameraProviderManager : : ProviderInfo : : DeviceInfo : : startDeviceInterface ( ) {
sp < InterfaceT > device ;
ATRACE_CALL ( ) ;
if ( mSavedInterface = = nullptr ) {
device = mParentProvider - > startDeviceInterface < InterfaceT > ( mName ) ;
} else {
device = ( InterfaceT * ) mSavedInterface . get ( ) ;
}
return device ;
}
template < class InterfaceT >
status_t CameraProviderManager : : ProviderInfo : : DeviceInfo : : setTorchMode ( InterfaceT & interface ,
bool enabled ) {
@ -1116,31 +1280,31 @@ CameraProviderManager::ProviderInfo::DeviceInfo1::DeviceInfo1(const std::string&
const metadata_vendor_id_t tagId , const std : : string & id ,
uint16_t minorVersion ,
const CameraResourceCost & resourceCost ,
sp < ProviderInfo > parentProvider ,
const std : : vector < std : : string > & publicCameraIds ,
sp < InterfaceT > interface ) :
DeviceInfo ( name , tagId , id , hardware : : hidl_version { 1 , minorVersion } ,
publicCameraIds , resourceCost ) ,
mInterface ( interface ) {
publicCameraIds , resourceCost , parentProvider ) {
// Get default parameters and initialize flash unit availability
// Requires powering on the camera device
hardware : : Return < Status > status = mI nterface- > open ( nullptr ) ;
hardware : : Return < Status > status = i nterface- > open ( nullptr ) ;
if ( ! status . isOk ( ) ) {
ALOGE ( " %s: Transaction error opening camera device %s to check for a flash unit: %s " ,
__FUNCTION__ , mI d. c_str ( ) , status . description ( ) . c_str ( ) ) ;
__FUNCTION__ , i d. c_str ( ) , status . description ( ) . c_str ( ) ) ;
return ;
}
if ( status ! = Status : : OK ) {
ALOGE ( " %s: Unable to open camera device %s to check for a flash unit: %s " , __FUNCTION__ ,
mI d. c_str ( ) , CameraProviderManager : : statusToString ( status ) ) ;
i d. c_str ( ) , CameraProviderManager : : statusToString ( status ) ) ;
return ;
}
hardware : : Return < void > ret ;
ret = mI nterface- > getParameters ( [ this ] ( const hardware : : hidl_string & parms ) {
ret = i nterface- > getParameters ( [ this ] ( const hardware : : hidl_string & parms ) {
mDefaultParameters . unflatten ( String8 ( parms . c_str ( ) ) ) ;
} ) ;
if ( ! ret . isOk ( ) ) {
ALOGE ( " %s: Transaction error reading camera device %s params to check for a flash unit: %s " ,
__FUNCTION__ , mI d. c_str ( ) , status . description ( ) . c_str ( ) ) ;
__FUNCTION__ , i d. c_str ( ) , status . description ( ) . c_str ( ) ) ;
return ;
}
const char * flashMode =
@ -1149,27 +1313,43 @@ CameraProviderManager::ProviderInfo::DeviceInfo1::DeviceInfo1(const std::string&
mHasFlashUnit = true ;
}
ret = mInterface - > close ( ) ;
status_t res = cacheCameraInfo ( interface ) ;
if ( res ! = OK ) {
ALOGE ( " %s: Could not cache CameraInfo " , __FUNCTION__ ) ;
return ;
}
ret = interface - > close ( ) ;
if ( ! ret . isOk ( ) ) {
ALOGE ( " %s: Transaction error closing camera device %s after check for a flash unit: %s " ,
__FUNCTION__ , mId . c_str ( ) , status . description ( ) . c_str ( ) ) ;
__FUNCTION__ , id . c_str ( ) , status . description ( ) . c_str ( ) ) ;
}
if ( ! kEnableLazyHal ) {
// Save HAL reference indefinitely
mSavedInterface = interface ;
}
}
CameraProviderManager : : ProviderInfo : : DeviceInfo1 : : ~ DeviceInfo1 ( ) { }
status_t CameraProviderManager : : ProviderInfo : : DeviceInfo1 : : setTorchMode ( bool enabled ) {
return DeviceInfo: : setTorchMode ( mInterface , enabled ) ;
return setTorchModeForDevice< InterfaceT > ( enabled ) ;
}
status_t CameraProviderManager : : ProviderInfo : : DeviceInfo1 : : getCameraInfo (
hardware : : CameraInfo * info ) const {
if ( info = = nullptr ) return BAD_VALUE ;
* info = mInfo ;
return OK ;
}
status_t CameraProviderManager : : ProviderInfo : : DeviceInfo1 : : cacheCameraInfo (
sp < CameraProviderManager : : ProviderInfo : : DeviceInfo1 : : InterfaceT > interface ) {
Status status ;
device : : V1_0 : : CameraInfo cInfo ;
hardware : : Return < void > ret ;
ret = mI nterface- > getCameraInfo ( [ & status , & cInfo ] ( Status s , device : : V1_0 : : CameraInfo camInfo ) {
ret = i nterface- > getCameraInfo ( [ & status , & cInfo ] ( Status s , device : : V1_0 : : CameraInfo camInfo ) {
status = s ;
cInfo = camInfo ;
} ) ;
@ -1184,27 +1364,31 @@ status_t CameraProviderManager::ProviderInfo::DeviceInfo1::getCameraInfo(
switch ( cInfo . facing ) {
case device : : V1_0 : : CameraFacing : : BACK :
info- > facing = hardware : : CAMERA_FACING_BACK ;
mInfo. facing = hardware : : CAMERA_FACING_BACK ;
break ;
case device : : V1_0 : : CameraFacing : : EXTERNAL :
// Map external to front for legacy API
case device : : V1_0 : : CameraFacing : : FRONT :
info- > facing = hardware : : CAMERA_FACING_FRONT ;
mInfo. facing = hardware : : CAMERA_FACING_FRONT ;
break ;
default :
ALOGW ( " %s: Device %s: Unknown camera facing: %d " ,
__FUNCTION__ , mId . c_str ( ) , cInfo . facing ) ;
info- > facing = hardware : : CAMERA_FACING_BACK ;
mInfo. facing = hardware : : CAMERA_FACING_BACK ;
}
info- > orientation = cInfo . orientation ;
mInfo. orientation = cInfo . orientation ;
return OK ;
}
status_t CameraProviderManager : : ProviderInfo : : DeviceInfo1 : : dumpState ( int fd ) const {
status_t CameraProviderManager : : ProviderInfo : : DeviceInfo1 : : dumpState ( int fd ) {
native_handle_t * handle = native_handle_create ( 1 , 0 ) ;
handle - > data [ 0 ] = fd ;
hardware : : Return < Status > s = mInterface - > dumpState ( handle ) ;
const sp < InterfaceT > interface = startDeviceInterface < InterfaceT > ( ) ;
if ( interface = = nullptr ) {
return DEAD_OBJECT ;
}
hardware : : Return < Status > s = interface - > dumpState ( handle ) ;
native_handle_delete ( handle ) ;
if ( ! s . isOk ( ) ) {
return INVALID_OPERATION ;
@ -1216,15 +1400,15 @@ CameraProviderManager::ProviderInfo::DeviceInfo3::DeviceInfo3(const std::string&
const metadata_vendor_id_t tagId , const std : : string & id ,
uint16_t minorVersion ,
const CameraResourceCost & resourceCost ,
sp < ProviderInfo > parentProvider ,
const std : : vector < std : : string > & publicCameraIds ,
sp < InterfaceT > interface ) :
DeviceInfo ( name , tagId , id , hardware : : hidl_version { 3 , minorVersion } ,
publicCameraIds , resourceCost ) ,
mInterface ( interface ) {
publicCameraIds , resourceCost , parentProvider ) {
// Get camera characteristics and initialize flash unit availability
Status status ;
hardware : : Return < void > ret ;
ret = mI nterface- > getCameraCharacteristics ( [ & status , this ] ( Status s ,
ret = i nterface- > getCameraCharacteristics ( [ & status , this ] ( Status s ,
device : : V3_2 : : CameraMetadata metadata ) {
status = s ;
if ( s = = Status : : OK ) {
@ -1243,13 +1427,13 @@ CameraProviderManager::ProviderInfo::DeviceInfo3::DeviceInfo3(const std::string&
} ) ;
if ( ! ret . isOk ( ) ) {
ALOGE ( " %s: Transaction error getting camera characteristics for device %s "
" to check for a flash unit: %s " , __FUNCTION__ , mI d. c_str ( ) ,
" to check for a flash unit: %s " , __FUNCTION__ , i d. c_str ( ) ,
ret . description ( ) . c_str ( ) ) ;
return ;
}
if ( status ! = Status : : OK ) {
ALOGE ( " %s: Unable to get camera characteristics for device %s: %s (%d) " ,
__FUNCTION__ , mI d. c_str ( ) , CameraProviderManager : : statusToString ( status ) , status ) ;
__FUNCTION__ , i d. c_str ( ) , CameraProviderManager : : statusToString ( status ) , status ) ;
return ;
}
status_t res = fixupMonochromeTags ( ) ;
@ -1269,7 +1453,7 @@ CameraProviderManager::ProviderInfo::DeviceInfo3::DeviceInfo3(const std::string&
queryPhysicalCameraIds ( ) ;
// Get physical camera characteristics if applicable
auto castResult = device : : V3_5 : : ICameraDevice : : castFrom ( mI nterface) ;
auto castResult = device : : V3_5 : : ICameraDevice : : castFrom ( i nterface) ;
if ( ! castResult . isOk ( ) ) {
ALOGV ( " %s: Unable to convert ICameraDevice instance to version 3.5 " , __FUNCTION__ ) ;
return ;
@ -1308,7 +1492,7 @@ CameraProviderManager::ProviderInfo::DeviceInfo3::DeviceInfo3(const std::string&
if ( ! ret . isOk ( ) ) {
ALOGE ( " %s: Transaction error getting physical camera %s characteristics for %s: %s " ,
__FUNCTION__ , id . c_str ( ) , mI d. c_str ( ) , ret . description ( ) . c_str ( ) ) ;
__FUNCTION__ , id . c_str ( ) , i d. c_str ( ) , ret . description ( ) . c_str ( ) ) ;
return ;
}
if ( status ! = Status : : OK ) {
@ -1319,12 +1503,17 @@ CameraProviderManager::ProviderInfo::DeviceInfo3::DeviceInfo3(const std::string&
}
}
}
if ( ! kEnableLazyHal ) {
// Save HAL reference indefinitely
mSavedInterface = interface ;
}
}
CameraProviderManager : : ProviderInfo : : DeviceInfo3 : : ~ DeviceInfo3 ( ) { }
status_t CameraProviderManager : : ProviderInfo : : DeviceInfo3 : : setTorchMode ( bool enabled ) {
return DeviceInfo: : setTorchMode ( mInterface , enabled ) ;
return setTorchModeForDevice< InterfaceT > ( enabled ) ;
}
status_t CameraProviderManager : : ProviderInfo : : DeviceInfo3 : : getCameraInfo (
@ -1375,10 +1564,14 @@ bool CameraProviderManager::ProviderInfo::DeviceInfo3::isAPI1Compatible() const
return isBackwardCompatible ;
}
status_t CameraProviderManager : : ProviderInfo : : DeviceInfo3 : : dumpState ( int fd ) const {
status_t CameraProviderManager : : ProviderInfo : : DeviceInfo3 : : dumpState ( int fd ) {
native_handle_t * handle = native_handle_create ( 1 , 0 ) ;
handle - > data [ 0 ] = fd ;
auto ret = mInterface - > dumpState ( handle ) ;
const sp < InterfaceT > interface = startDeviceInterface < InterfaceT > ( ) ;
if ( interface = = nullptr ) {
return DEAD_OBJECT ;
}
auto ret = interface - > dumpState ( handle ) ;
native_handle_delete ( handle ) ;
if ( ! ret . isOk ( ) ) {
return INVALID_OPERATION ;
@ -1408,8 +1601,14 @@ status_t CameraProviderManager::ProviderInfo::DeviceInfo3::getPhysicalCameraChar
status_t CameraProviderManager : : ProviderInfo : : DeviceInfo3 : : isSessionConfigurationSupported (
const hardware : : camera : : device : : V3_4 : : StreamConfiguration & configuration ,
bool * status /*out*/ ) const {
auto castResult = device : : V3_5 : : ICameraDevice : : castFrom ( mInterface ) ;
bool * status /*out*/ ) {
const sp < CameraProviderManager : : ProviderInfo : : DeviceInfo3 : : InterfaceT > interface =
this - > startDeviceInterface < CameraProviderManager : : ProviderInfo : : DeviceInfo3 : : InterfaceT > ( ) ;
if ( interface = = nullptr ) {
return DEAD_OBJECT ;
}
auto castResult = device : : V3_5 : : ICameraDevice : : castFrom ( interface ) ;
sp < hardware : : camera : : device : : V3_5 : : ICameraDevice > interface_3_5 = castResult ;
if ( interface_3_5 = = nullptr ) {
return INVALID_OPERATION ;