@ -1306,7 +1306,7 @@ status_t Camera3Device::readOneCameraMetadataLocked(
void Camera3Device : : processOneCaptureResultLocked (
const hardware : : camera : : device : : V3_2 : : CaptureResult & result ,
const hardware : : hidl_vec <
hardware : : camera : : device : : V3_4 : : PhysicalCameraMetadata > physicalCameraMetadata s ) {
hardware : : camera : : device : : V3_4 : : PhysicalCameraMetadata > physicalCameraMetadata ) {
camera3_capture_result r ;
status_t res ;
r . frame_number = result . frameNumber ;
@ -1322,21 +1322,21 @@ void Camera3Device::processOneCaptureResultLocked(
r . result = reinterpret_cast < const camera_metadata_t * > ( resultMetadata . data ( ) ) ;
// Read and validate physical camera metadata
size_t physResultCount = physicalCameraMetadata s . size ( ) ;
size_t physResultCount = physicalCameraMetadata . size ( ) ;
std : : vector < const char * > physCamIds ( physResultCount ) ;
std : : vector < const camera_metadata_t * > phyCamMetadatas ( physResultCount ) ;
std : : vector < hardware : : camera : : device : : V3_2 : : CameraMetadata > physResultMetadata ;
physResultMetadata . resize ( physResultCount ) ;
for ( size_t i = 0 ; i < physicalCameraMetadata s . size ( ) ; i + + ) {
res = readOneCameraMetadataLocked ( physicalCameraMetadata s [ i ] . fmqMetadataSize ,
physResultMetadata [ i ] , physicalCameraMetadata s [ i ] . metadata ) ;
for ( size_t i = 0 ; i < physicalCameraMetadata . size ( ) ; i + + ) {
res = readOneCameraMetadataLocked ( physicalCameraMetadata [ i ] . fmqMetadataSize ,
physResultMetadata [ i ] , physicalCameraMetadata [ i ] . metadata ) ;
if ( res ! = OK ) {
ALOGE ( " %s: Frame %d: Failed to read capture result metadata for camera %s " ,
__FUNCTION__ , result . frameNumber ,
physicalCameraMetadata s [ i ] . physicalCameraId . c_str ( ) ) ;
physicalCameraMetadata [ i ] . physicalCameraId . c_str ( ) ) ;
return ;
}
physCamIds [ i ] = physicalCameraMetadata s [ i ] . physicalCameraId . c_str ( ) ;
physCamIds [ i ] = physicalCameraMetadata [ i ] . physicalCameraId . c_str ( ) ;
phyCamMetadatas [ i ] = reinterpret_cast < const camera_metadata_t * > (
physResultMetadata [ i ] . data ( ) ) ;
}
@ -3420,6 +3420,14 @@ void Camera3Device::insertResultLocked(CaptureResult *result,
return ;
}
// Update vendor tag id for physical metadata
for ( auto & physicalMetadata : result - > mPhysicalMetadatas ) {
camera_metadata_t * pmeta = const_cast < camera_metadata_t * > (
physicalMetadata . mPhysicalCameraMetadata . getAndLock ( ) ) ;
set_camera_metadata_vendor_id ( pmeta , mVendorTagId ) ;
physicalMetadata . mPhysicalCameraMetadata . unlock ( pmeta ) ;
}
// Valid result, insert into queue
List < CaptureResult > : : iterator queuedResult =
mResultQueue . insert ( mResultQueue . end ( ) , CaptureResult ( * result ) ) ;
@ -3551,8 +3559,14 @@ void Camera3Device::sendCaptureResult(CameraMetadata &pendingMetadata,
}
}
std : : unordered_map < std : : string , CameraMetadata > monitoredPhysicalMetadata ;
for ( auto & m : physicalMetadatas ) {
monitoredPhysicalMetadata . emplace ( String8 ( m . mPhysicalCameraId ) . string ( ) ,
CameraMetadata ( m . mPhysicalCameraMetadata ) ) ;
}
mTagMonitor . monitorMetadata ( TagMonitor : : RESULT ,
frameNumber , timestamp . data . i64 [ 0 ] , captureResult . mMetadata ) ;
frameNumber , timestamp . data . i64 [ 0 ] , captureResult . mMetadata ,
monitoredPhysicalMetadata ) ;
insertResultLocked ( & captureResult , frameNumber ) ;
}
@ -3966,8 +3980,11 @@ CameraMetadata Camera3Device::getLatestRequestLocked() {
void Camera3Device : : monitorMetadata ( TagMonitor : : eventSource source ,
int64_t frameNumber , nsecs_t timestamp , const CameraMetadata & metadata ) {
mTagMonitor . monitorMetadata ( source , frameNumber , timestamp , metadata ) ;
int64_t frameNumber , nsecs_t timestamp , const CameraMetadata & metadata ,
const std : : unordered_map < std : : string , CameraMetadata > & physicalMetadata ) {
mTagMonitor . monitorMetadata ( source , frameNumber , timestamp , metadata ,
physicalMetadata ) ;
}
/**
@ -5107,28 +5124,7 @@ bool Camera3Device::RequestThread::sendRequestsBatch() {
NextRequest & nextRequest = mNextRequests . editItemAt ( i ) ;
nextRequest . submitted = true ;
// Update the latest request sent to HAL
if ( nextRequest . halRequest . settings ! = NULL ) { // Don't update if they were unchanged
Mutex : : Autolock al ( mLatestRequestMutex ) ;
camera_metadata_t * cloned = clone_camera_metadata ( nextRequest . halRequest . settings ) ;
mLatestRequest . acquire ( cloned ) ;
sp < Camera3Device > parent = mParent . promote ( ) ;
if ( parent ! = NULL ) {
parent - > monitorMetadata ( TagMonitor : : REQUEST ,
nextRequest . halRequest . frame_number ,
0 , mLatestRequest ) ;
}
}
if ( nextRequest . halRequest . settings ! = NULL ) {
nextRequest . captureRequest - > mSettingsList . begin ( ) - > metadata . unlock (
nextRequest . halRequest . settings ) ;
}
cleanupPhysicalSettings ( nextRequest . captureRequest , & nextRequest . halRequest ) ;
updateNextRequest ( nextRequest ) ;
if ( ! triggerRemoveFailed ) {
// Remove any previously queued triggers (after unlock)
@ -5183,26 +5179,7 @@ bool Camera3Device::RequestThread::sendRequestsOneByOne() {
// Mark that the request has be submitted successfully.
nextRequest . submitted = true ;
// Update the latest request sent to HAL
if ( nextRequest . halRequest . settings ! = NULL ) { // Don't update if they were unchanged
Mutex : : Autolock al ( mLatestRequestMutex ) ;
camera_metadata_t * cloned = clone_camera_metadata ( nextRequest . halRequest . settings ) ;
mLatestRequest . acquire ( cloned ) ;
sp < Camera3Device > parent = mParent . promote ( ) ;
if ( parent ! = NULL ) {
parent - > monitorMetadata ( TagMonitor : : REQUEST , nextRequest . halRequest . frame_number ,
0 , mLatestRequest ) ;
}
}
if ( nextRequest . halRequest . settings ! = NULL ) {
nextRequest . captureRequest - > mSettingsList . begin ( ) - > metadata . unlock (
nextRequest . halRequest . settings ) ;
}
cleanupPhysicalSettings ( nextRequest . captureRequest , & nextRequest . halRequest ) ;
updateNextRequest ( nextRequest ) ;
// Remove any previously queued triggers (after unlock)
res = removeTriggers ( mPrevRequest ) ;
@ -5264,6 +5241,37 @@ bool Camera3Device::RequestThread::skipHFRTargetFPSUpdate(int32_t tag,
return false ;
}
void Camera3Device : : RequestThread : : updateNextRequest ( NextRequest & nextRequest ) {
// Update the latest request sent to HAL
if ( nextRequest . halRequest . settings ! = NULL ) { // Don't update if they were unchanged
Mutex : : Autolock al ( mLatestRequestMutex ) ;
camera_metadata_t * cloned = clone_camera_metadata ( nextRequest . halRequest . settings ) ;
mLatestRequest . acquire ( cloned ) ;
mLatestPhysicalRequest . clear ( ) ;
for ( uint32_t i = 0 ; i < nextRequest . halRequest . num_physcam_settings ; i + + ) {
cloned = clone_camera_metadata ( nextRequest . halRequest . physcam_settings [ i ] ) ;
mLatestPhysicalRequest . emplace ( nextRequest . halRequest . physcam_id [ i ] ,
CameraMetadata ( cloned ) ) ;
}
sp < Camera3Device > parent = mParent . promote ( ) ;
if ( parent ! = NULL ) {
parent - > monitorMetadata ( TagMonitor : : REQUEST ,
nextRequest . halRequest . frame_number ,
0 , mLatestRequest , mLatestPhysicalRequest ) ;
}
}
if ( nextRequest . halRequest . settings ! = NULL ) {
nextRequest . captureRequest - > mSettingsList . begin ( ) - > metadata . unlock (
nextRequest . halRequest . settings ) ;
}
cleanupPhysicalSettings ( nextRequest . captureRequest , & nextRequest . halRequest ) ;
}
bool Camera3Device : : RequestThread : : updateSessionParameters ( const CameraMetadata & settings ) {
ATRACE_CALL ( ) ;
bool updatesDetected = false ;