@@ -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 }
0 commit comments