Skip to content

Commit 7a8f566

Browse files
authored
Merge pull request #1978 from noho501/feature/add_custom_capture_completed_callback
Add custom onCaptureCompleted callback to expose realtime camera metadata (ISO, WB, Exposure…)
2 parents 0799695 + b83e962 commit 7a8f566

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@ package com.pedro.encoder.input.sources.video
1818

1919
import android.content.Context
2020
import android.graphics.SurfaceTexture
21+
import android.hardware.camera2.CameraCaptureSession
2122
import android.hardware.camera2.CameraCharacteristics
2223
import android.hardware.camera2.CameraManager
2324
import android.hardware.camera2.CaptureRequest
25+
import android.hardware.camera2.TotalCaptureResult
2426
import android.os.Build
2527
import android.util.Range
2628
import android.util.Size
@@ -312,4 +314,10 @@ class Camera2Source(context: Context): VideoSource() {
312314
fun setCustomRequest(request: (CaptureRequest.Builder) -> Unit): Boolean {
313315
return camera.setCustomRequest(request)
314316
}
317+
318+
fun setCustomOnCaptureCompletedCallback(
319+
callback: ((CameraCaptureSession, CaptureRequest, TotalCaptureResult) -> Unit)?
320+
) {
321+
camera.setCustomOnCaptureCompletedCallback(callback)
322+
}
315323
}

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,8 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
117117
private var imageReader: ImageReader? = null
118118
private var availabilityCallback: CameraManager.AvailabilityCallback? = null
119119

120+
private var customCaptureCompletedCallback: ((session: CameraCaptureSession, request: CaptureRequest, result: TotalCaptureResult) -> Unit)? = null
121+
120122
init {
121123
cameraId = try { getCameraIdForFacing(Facing.BACK) } catch (_: Exception) { "0" }
122124
}
@@ -161,7 +163,7 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
161163
try {
162164
it.setRepeatingRequest(
163165
captureRequest,
164-
if (faceDetectionEnabled || frameCapturedCallback != null) cb else null,
166+
if (faceDetectionEnabled || frameCapturedCallback != null || customCaptureCompletedCallback != null) cb else null,
165167
cameraHandler
166168
)
167169
} catch (_: IllegalStateException) {
@@ -203,6 +205,12 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
203205
return applyRequest(builderInputSurface)
204206
}
205207

208+
fun setCustomOnCaptureCompletedCallback(
209+
callback: ((CameraCaptureSession, CaptureRequest, TotalCaptureResult) -> Unit)?
210+
) {
211+
this.customCaptureCompletedCallback = callback
212+
}
213+
206214
fun getSupportedFps(size: Size?, facing: Facing): List<Range<Int>> {
207215
try {
208216
val characteristics = cameraManager.getCameraCharacteristics(getCameraIdForFacing(facing))
@@ -321,7 +329,7 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
321329
try {
322330
cameraCaptureSession.setRepeatingRequest(
323331
builder.build(),
324-
if (faceDetectionEnabled || frameCapturedCallback != null) cb else null, null
332+
if (faceDetectionEnabled || frameCapturedCallback != null || customCaptureCompletedCallback != null) cb else null, null
325333
)
326334
return true
327335
} catch (e: Exception) {
@@ -681,6 +689,8 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
681689
request: CaptureRequest,
682690
result: TotalCaptureResult
683691
) {
692+
customCaptureCompletedCallback?.invoke(session, request, result)
693+
684694
val faces = result.get(CaptureResult.STATISTICS_FACES) ?: return
685695
faceDetectorCallback?.onGetFaces(
686696
faces = mapCamera2Faces(faces = faces),

0 commit comments

Comments
 (0)