0
0
mirror of https://git.code.sf.net/p/opencamera/code.git synced 2024-09-19 19:42:29 +02:00

Fix setting scene mode flags, needed to fix green tint on Samsung Qualcomm devices with HDR/expo and face detection.

This commit is contained in:
Mark Harman 2024-03-10 19:12:57 +00:00
parent 00144e55dc
commit ae61c064d9
2 changed files with 26 additions and 11 deletions

View File

@ -54,6 +54,7 @@ FIXED Device specific crashes when starting with Camera2 API (related to camer
FIXED Crash when saving images if unable to create thumbnail.
FIXED ANRs and poor performance if using Storage Access Framework when save folder had lots of
files (due to trying to measure free memory).
FIXED HDR images coming out green on Samsung Qualcomm devices.
FIXED If force destroyed when in settings, the camera would be incorrectly opened when application
was recreated (camera should only be reopened when leaving settings).
FIXED Long pressing on the shutter button in video mode meant nothing happened when releasing

View File

@ -526,8 +526,14 @@ public class CameraController2 extends CameraController {
Log.d(TAG, "nr_mode: " + (nr_mode==null ? "null" : nr_mode));
Integer edge_mode = builder.get(CaptureRequest.EDGE_MODE);
Log.d(TAG, "edge_mode: " + (edge_mode==null ? "null" : edge_mode));
Integer cc_mode = builder.get(CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE);
Integer control_mode = builder.get(CaptureRequest.CONTROL_MODE);
Log.d(TAG, "control_mode: " + (control_mode==null ? "null" : control_mode));
Integer scene_mode = builder.get(CaptureRequest.CONTROL_SCENE_MODE);
Log.d(TAG, "scene_mode: " + (scene_mode==null ? "null" : scene_mode));
Integer cc_mode = builder.get(CaptureRequest.COLOR_CORRECTION_MODE);
Log.d(TAG, "cc_mode: " + (cc_mode==null ? "null" : cc_mode));
Integer cca_mode = builder.get(CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE);
Log.d(TAG, "cca_mode: " + (cc_mode==null ? "null" : cca_mode));
/*if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.N ) {
Integer raw_sensitivity_boost = builder.get(CaptureRequest.CONTROL_POST_RAW_SENSITIVITY_BOOST);
Log.d(TAG, "raw_sensitivity_boost: " + (raw_sensitivity_boost==null ? "null" : raw_sensitivity_boost));
@ -542,6 +548,7 @@ public class CameraController2 extends CameraController {
if( MyDebug.LOG ) {
Log.d(TAG, "setSceneMode");
Log.d(TAG, "builder: " + builder);
Log.d(TAG, "has_face_detect_mode: " + has_face_detect_mode);
}
if( sessionType == SessionType.SESSIONTYPE_EXTENSION ) {
@ -549,28 +556,35 @@ public class CameraController2 extends CameraController {
return false;
}
Integer current_mode = builder.get(CaptureRequest.CONTROL_MODE);
Integer current_scene_mode = builder.get(CaptureRequest.CONTROL_SCENE_MODE);
if( MyDebug.LOG )
Log.d(TAG, "current_scene_mode: " + current_scene_mode);
if( has_face_detect_mode ) {
// face detection mode overrides scene mode
if( current_scene_mode == null || current_scene_mode != CameraMetadata.CONTROL_SCENE_MODE_FACE_PRIORITY ) {
if (MyDebug.LOG)
Log.d(TAG, "setting scene mode for face detection");
builder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_USE_SCENE_MODE);
builder.set(CaptureRequest.CONTROL_SCENE_MODE, CameraMetadata.CONTROL_SCENE_MODE_FACE_PRIORITY);
if( MyDebug.LOG )
Log.d(TAG, "setting scene mode for face detection");
builder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_USE_SCENE_MODE);
builder.set(CaptureRequest.CONTROL_SCENE_MODE, CameraMetadata.CONTROL_SCENE_MODE_FACE_PRIORITY);
if( current_mode == null || current_mode != CameraMetadata.CONTROL_MODE_USE_SCENE_MODE || current_scene_mode == null || current_scene_mode != CameraMetadata.CONTROL_SCENE_MODE_FACE_PRIORITY )
return true;
}
}
else if( current_scene_mode == null || current_scene_mode != scene_mode ) {
else {
if( MyDebug.LOG )
Log.d(TAG, "setting scene mode: " + scene_mode);
int new_mode;
if( scene_mode == CameraMetadata.CONTROL_SCENE_MODE_DISABLED ) {
builder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
// note we set CONTROL_MODE_AUTO even if using manual exposure, focus or awb, as we set that separately via
// CONTROL_AE_MODE_OFF etc
new_mode = CameraMetadata.CONTROL_MODE_AUTO;
}
else {
builder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_USE_SCENE_MODE);
new_mode = CameraMetadata.CONTROL_MODE_USE_SCENE_MODE;
}
builder.set(CaptureRequest.CONTROL_MODE, new_mode);
builder.set(CaptureRequest.CONTROL_SCENE_MODE, scene_mode);
return true;
if( current_mode == null || current_mode != new_mode || current_scene_mode == null || current_scene_mode != scene_mode )
return true;
}
return false;
}