Skip to content

Commit 3f2a1e7

Browse files
committed
fix set color correction gain
1 parent 7ddb05b commit 3f2a1e7

File tree

3 files changed

+47
-93
lines changed

3 files changed

+47
-93
lines changed

encoder/src/main/java/com/pedro/encoder/input/sources/video/Camera2Source.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,5 +251,5 @@ class Camera2Source(context: Context): VideoSource() {
251251

252252
fun getAutoWhiteBalanceModesAvailable() = camera.getAutoWhiteBalanceModesAvailable()
253253

254-
fun setColorCorrectionGains(r: Float, g: Float, g2: Float, b: Float) = camera.setColorCorrectionGains(r, g, g2, b)
254+
fun setColorCorrectionGains(red: Float, greenEven: Float, greenOdd: Float, blue: Float) = camera.setColorCorrectionGains(red, greenEven, greenOdd, blue)
255255
}

encoder/src/main/java/com/pedro/encoder/input/video/Camera2ApiManager.kt

Lines changed: 44 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,21 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
289289
else openCameraId(cameraId)
290290
}
291291

292+
private fun applyRequest(builder: CaptureRequest.Builder): Boolean {
293+
this.builderInputSurface = builder
294+
val cameraCaptureSession = this.cameraCaptureSession ?: return false
295+
try {
296+
cameraCaptureSession.setRepeatingRequest(
297+
builder.build(),
298+
if (faceDetectionEnabled) cb else null, null
299+
)
300+
return true
301+
} catch (e: Exception) {
302+
Log.e(TAG, "Error", e)
303+
return false
304+
}
305+
}
306+
292307
/**
293308
* @param mode value from CameraCharacteristics.CONTROL_AWB_MODE_*
294309
*/
@@ -298,7 +313,7 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
298313
val modes = characteristics.secureGet(CameraCharacteristics.CONTROL_AWB_AVAILABLE_MODES) ?: return false
299314
if (!modes.contains(mode)) return false
300315
builderInputSurface.set(CaptureRequest.CONTROL_AWB_MODE, mode)
301-
isAutoWhiteBalanceEnabled = true
316+
isAutoWhiteBalanceEnabled = applyRequest(builderInputSurface)
302317
return isAutoWhiteBalanceEnabled
303318
}
304319

@@ -308,6 +323,7 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
308323
val modes = characteristics.secureGet(CameraCharacteristics.CONTROL_AWB_AVAILABLE_MODES) ?: return
309324
if (!modes.contains(CaptureRequest.CONTROL_AWB_MODE_OFF)) return
310325
builderInputSurface.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_OFF)
326+
applyRequest(builderInputSurface)
311327
isAutoExposureEnabled = false
312328
}
313329

@@ -322,15 +338,17 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
322338
return builderInputSurface.secureGet(CaptureRequest.CONTROL_AWB_MODE) ?: default
323339
}
324340

325-
fun setColorCorrectionGains(r: Float, g: Float, g2: Float, b: Float): Boolean {
341+
fun setColorCorrectionGains(red: Float, greenEven: Float, greenOdd: Float, blue: Float): Boolean {
326342
val characteristics = cameraCharacteristics ?: return false
327343
val builderInputSurface = this.builderInputSurface ?: return false
328344
val modes = characteristics.secureGet(CameraCharacteristics.COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES) ?: return false
329345
if (!modes.contains(CaptureRequest.COLOR_CORRECTION_MODE_TRANSFORM_MATRIX)) return false
330-
disableAutoWhiteBalance()
346+
builderInputSurface.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_OFF)
331347
builderInputSurface.set(CaptureRequest.COLOR_CORRECTION_MODE, CaptureRequest.COLOR_CORRECTION_MODE_TRANSFORM_MATRIX)
332-
builderInputSurface.set(CaptureRequest.COLOR_CORRECTION_GAINS, RggbChannelVector(r, g, g2, b))
333-
return true
348+
builderInputSurface.set(CaptureRequest.COLOR_CORRECTION_TRANSFORM, characteristics.get(CameraCharacteristics.SENSOR_CALIBRATION_TRANSFORM1))
349+
val vector = RggbChannelVector(red, greenEven, greenOdd, blue)
350+
builderInputSurface.set(CaptureRequest.COLOR_CORRECTION_GAINS, vector)
351+
return applyRequest(builderInputSurface)
334352
}
335353

336354
fun enableAutoExposure(): Boolean {
@@ -339,7 +357,7 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
339357
val modes = characteristics.secureGet(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES) ?: return false
340358
if (!modes.contains(CaptureRequest.CONTROL_AE_MODE_ON)) return false
341359
builderInputSurface.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON)
342-
isAutoExposureEnabled = true
360+
isAutoExposureEnabled = applyRequest(builderInputSurface)
343361
return isAutoExposureEnabled
344362
}
345363

@@ -349,6 +367,7 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
349367
val modes = characteristics.secureGet(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES) ?: return
350368
if (!modes.contains(CaptureRequest.CONTROL_AE_MODE_ON)) return
351369
builderInputSurface.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF)
370+
applyRequest(builderInputSurface)
352371
isAutoExposureEnabled = false
353372
}
354373

@@ -358,7 +377,7 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
358377
val modes = characteristics.secureGet(CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES) ?: return false
359378
if (!modes.contains(CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE_ON)) return false
360379
builderInputSurface.set(CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE, CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE_ON)
361-
isVideoStabilizationEnabled = true
380+
isVideoStabilizationEnabled = applyRequest(builderInputSurface)
362381
return isVideoStabilizationEnabled
363382
}
364383

@@ -368,6 +387,7 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
368387
val modes = characteristics.secureGet(CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES) ?: return
369388
if (!modes.contains(CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE_ON)) return
370389
builderInputSurface.set(CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE, CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE_OFF)
390+
applyRequest(builderInputSurface)
371391
isVideoStabilizationEnabled = false
372392
}
373393

@@ -377,7 +397,7 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
377397
val opticalStabilizationModes = characteristics.secureGet(CameraCharacteristics.LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION) ?: return false
378398
if (!opticalStabilizationModes.contains(CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE_ON)) return false
379399
builderInputSurface.set(CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE, CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE_ON)
380-
isOpticalStabilizationEnabled = true
400+
isOpticalStabilizationEnabled = applyRequest(builderInputSurface)
381401
return isOpticalStabilizationEnabled
382402
}
383403

@@ -387,21 +407,14 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
387407
val modes = characteristics.secureGet(CameraCharacteristics.LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION) ?: return
388408
if (!modes.contains(CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE_ON)) return
389409
builderInputSurface.set(CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE, CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE_OFF)
410+
applyRequest(builderInputSurface)
390411
isOpticalStabilizationEnabled = false
391412
}
392413

393414
fun setFocusDistance(distance: Float) {
394415
val builderInputSurface = this.builderInputSurface ?: return
395-
val cameraCaptureSession = this.cameraCaptureSession ?: return
396-
try {
397-
builderInputSurface.set(CaptureRequest.LENS_FOCUS_DISTANCE, max(0f, distance))
398-
cameraCaptureSession.setRepeatingRequest(
399-
builderInputSurface.build(),
400-
if (faceDetectionEnabled) cb else null, null
401-
)
402-
} catch (e: Exception) {
403-
Log.e(TAG, "Error", e)
404-
}
416+
builderInputSurface.set(CaptureRequest.LENS_FOCUS_DISTANCE, max(0f, distance))
417+
applyRequest(builderInputSurface)
405418
}
406419

407420
fun getCurrentCameraId() = cameraId
@@ -414,18 +427,10 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
414427
set(value) {
415428
val characteristics = cameraCharacteristics ?: return
416429
val builderInputSurface = this.builderInputSurface ?: return
417-
val cameraCaptureSession = this.cameraCaptureSession ?: return
418430
val supportedExposure = characteristics.secureGet(CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE) ?: return
419431
val v = value.coerceIn(supportedExposure.lower, supportedExposure.upper)
420-
try {
421-
builderInputSurface.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, v)
422-
cameraCaptureSession.setRepeatingRequest(
423-
builderInputSurface.build(),
424-
if (faceDetectionEnabled) cb else null, null
425-
)
426-
} catch (e: Exception) {
427-
Log.e(TAG, "Error", e)
428-
}
432+
builderInputSurface.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, v)
433+
applyRequest(builderInputSurface)
429434
}
430435

431436

@@ -445,7 +450,6 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
445450

446451
fun tapToFocus(event: MotionEvent): Boolean {
447452
val builderInputSurface = this.builderInputSurface ?: return false
448-
val cameraCaptureSession = this.cameraCaptureSession ?: return false
449453
var result = false
450454
val pointerId = event.getPointerId(0)
451455
val pointerIndex = event.findPointerIndex(pointerId)
@@ -463,19 +467,12 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
463467
//cancel any existing AF trigger (repeated touches, etc.)
464468
builderInputSurface.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL)
465469
builderInputSurface.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF)
466-
cameraCaptureSession.setRepeatingRequest(
467-
builderInputSurface.build(),
468-
if (faceDetectionEnabled) cb else null, null
469-
)
470+
applyRequest(builderInputSurface)
470471
builderInputSurface.set(CaptureRequest.CONTROL_AF_REGIONS, arrayOf(focusArea))
471472
builderInputSurface.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO)
472473
builderInputSurface.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO)
473474
builderInputSurface.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START)
474-
cameraCaptureSession.setRepeatingRequest(
475-
builderInputSurface.build(),
476-
if (faceDetectionEnabled) cb else null, null
477-
)
478-
isAutoFocusEnabled = true
475+
isAutoFocusEnabled = applyRequest(builderInputSurface)
479476
result = true
480477
} catch (e: Exception) {
481478
Log.e(TAG, "Error", e)
@@ -512,15 +509,10 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
512509
@Throws(Exception::class)
513510
fun enableLantern() {
514511
val builderInputSurface = this.builderInputSurface ?: return
515-
val cameraCaptureSession = this.cameraCaptureSession ?: return
516512
if (isLanternSupported) {
517513
try {
518514
builderInputSurface.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH)
519-
cameraCaptureSession.setRepeatingRequest(
520-
builderInputSurface.build(),
521-
if (faceDetectionEnabled) cb else null, null
522-
)
523-
isLanternEnabled = true
515+
isLanternEnabled = applyRequest(builderInputSurface)
524516
} catch (e: Exception) {
525517
Log.e(TAG, "Error", e)
526518
}
@@ -536,15 +528,11 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
536528
fun disableLantern() {
537529
val characteristics = cameraCharacteristics ?: return
538530
val builderInputSurface = this.builderInputSurface ?: return
539-
val cameraCaptureSession = this.cameraCaptureSession ?: return
540531
val available = characteristics.secureGet(CameraCharacteristics.FLASH_INFO_AVAILABLE) ?: return
541532
if (available) {
542533
try {
543534
builderInputSurface.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF)
544-
cameraCaptureSession.setRepeatingRequest(
545-
builderInputSurface.build(),
546-
if (faceDetectionEnabled) cb else null, null
547-
)
535+
applyRequest(builderInputSurface)
548536
isLanternEnabled = false
549537
} catch (e: Exception) {
550538
Log.e(TAG, "Error", e)
@@ -557,17 +545,12 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
557545
val characteristics = cameraCharacteristics ?: return false
558546
val supportedFocusModes = characteristics.secureGet(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES) ?: return false
559547
val builderInputSurface = this.builderInputSurface ?: return false
560-
val cameraCaptureSession = this.cameraCaptureSession ?: return false
561-
562548
try {
563549
if (supportedFocusModes.isNotEmpty()) {
564550
//cancel any existing AF trigger
565551
builderInputSurface.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL)
566552
builderInputSurface.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF)
567-
cameraCaptureSession.setRepeatingRequest(
568-
builderInputSurface.build(),
569-
if (faceDetectionEnabled) cb else null, null
570-
)
553+
applyRequest(builderInputSurface)
571554
if (supportedFocusModes.contains(CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE)) {
572555
builderInputSurface.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE)
573556
isAutoFocusEnabled = true
@@ -578,10 +561,7 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
578561
builderInputSurface.set(CaptureRequest.CONTROL_AF_MODE, supportedFocusModes[0])
579562
isAutoFocusEnabled = false
580563
}
581-
cameraCaptureSession.setRepeatingRequest(
582-
builderInputSurface.build(),
583-
if (faceDetectionEnabled) cb else null, null
584-
)
564+
applyRequest(builderInputSurface)
585565
}
586566
result = isAutoFocusEnabled
587567
} catch (e: Exception) {
@@ -595,16 +575,12 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
595575
val result = false
596576
val characteristics = cameraCharacteristics ?: return false
597577
val builderInputSurface = this.builderInputSurface ?: return false
598-
val cameraCaptureSession = this.cameraCaptureSession ?: return false
599578
val supportedFocusModes = characteristics.secureGet(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES) ?: return false
600579
for (mode in supportedFocusModes) {
601580
try {
602581
if (mode == CaptureRequest.CONTROL_AF_MODE_OFF) {
603582
builderInputSurface.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF)
604-
cameraCaptureSession.setRepeatingRequest(
605-
builderInputSurface.build(),
606-
if (faceDetectionEnabled) cb else null, null
607-
)
583+
applyRequest(builderInputSurface)
608584
isAutoFocusEnabled = false
609585
return true
610586
}
@@ -629,7 +605,7 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
629605
if (faceDetectionEnabled) {
630606
builderInputSurface.set(CaptureRequest.STATISTICS_FACE_DETECT_MODE, faceDetectionMode)
631607
}
632-
prepareFaceDetectionCallback()
608+
applyRequest(builderInputSurface)
633609
return true
634610
}
635611

@@ -638,7 +614,7 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
638614
faceDetectorCallback = null
639615
faceDetectionEnabled = false
640616
faceDetectionMode = 0
641-
prepareFaceDetectionCallback()
617+
builderInputSurface?.let { applyRequest(it) }
642618
}
643619
}
644620

@@ -648,20 +624,6 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
648624
this.cameraCallbacks = cameraCallbacks
649625
}
650626

651-
private fun prepareFaceDetectionCallback() {
652-
val builderInputSurface = this.builderInputSurface ?: return
653-
val cameraCaptureSession = this.cameraCaptureSession ?: return
654-
try {
655-
cameraCaptureSession.stopRepeating()
656-
cameraCaptureSession.setRepeatingRequest(
657-
builderInputSurface.build(),
658-
if (faceDetectionEnabled) cb else null, null
659-
)
660-
} catch (e: Exception) {
661-
Log.e(TAG, "Error", e)
662-
}
663-
}
664-
665627
private val cb: CameraCaptureSession.CaptureCallback = object : CameraCaptureSession.CaptureCallback() {
666628
override fun onCaptureCompleted(session: CameraCaptureSession, request: CaptureRequest, result: TotalCaptureResult) {
667629
val faces = result.get(CaptureResult.STATISTICS_FACES) ?: return
@@ -736,7 +698,6 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
736698
set(level) {
737699
val characteristics = cameraCharacteristics ?: return
738700
val builderInputSurface = this.builderInputSurface ?: return
739-
val cameraCaptureSession = this.cameraCaptureSession ?: return
740701
val l = level.coerceIn(zoomRange.lower, zoomRange.upper)
741702
try {
742703
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && levelSupported != CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY) {
@@ -755,10 +716,7 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
755716
)
756717
builderInputSurface.set(CaptureRequest.SCALER_CROP_REGION, zoom)
757718
}
758-
cameraCaptureSession.setRepeatingRequest(
759-
builderInputSurface.build(),
760-
if (faceDetectionEnabled) cb else null, null
761-
)
719+
applyRequest(builderInputSurface)
762720
zoomLevel = l
763721
} catch (e: Exception) {
764722
Log.e(TAG, "Error", e)
@@ -772,13 +730,9 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
772730

773731
fun setOpticalZoom(level: Float) {
774732
val builderInputSurface = this.builderInputSurface ?: return
775-
val cameraCaptureSession = this.cameraCaptureSession ?: return
776733
try {
777734
builderInputSurface.set(CaptureRequest.LENS_FOCAL_LENGTH, level)
778-
cameraCaptureSession.setRepeatingRequest(
779-
builderInputSurface.build(),
780-
if (faceDetectionEnabled) cb else null, null
781-
)
735+
applyRequest(builderInputSurface)
782736
} catch (e: Exception) {
783737
Log.e(TAG, "Error", e)
784738
}

library/src/main/java/com/pedro/library/base/Camera2Base.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -942,8 +942,8 @@ public List<Integer> getAutoWhiteBalanceModesAvailable() {
942942
return cameraManager.getAutoWhiteBalanceModesAvailable();
943943
}
944944

945-
public boolean setColorCorrectionGains(float r, float g, float g2, float b) {
946-
return cameraManager.setColorCorrectionGains(r, g, g2, b);
945+
public boolean setColorCorrectionGains(float red, float greenEven, float greenOdd, float blue) {
946+
return cameraManager.setColorCorrectionGains(red, greenEven, greenOdd, blue);
947947
}
948948

949949
public boolean tapToFocus(MotionEvent event) {

0 commit comments

Comments
 (0)