camera2 (v)ndk: Add APIs for pre-allocation of surface buffers.
Clients may need to pre-allocate stream buffers in order to reduce
affects of buffer-allocation time such as frame jank till steady state
capture is reached (eg: for a repeating request).
The SDK already has an api which does this :
CameraCaptureSession.prepare(Surface). We're exposing a similar API to
the ndk/ vndk here.
Bug: 259735869
Test: NdkCameraDeviceTest.java
Change-Id: Iee8559fcebd61a6886f23779a05351b52633f851
Signed-off-by: Jayant Chowdhary <jchowdhary@google.com>
diff --git a/camera/ndk/NdkCameraCaptureSession.cpp b/camera/ndk/NdkCameraCaptureSession.cpp
index 65b8837..8a3acf3 100644
--- a/camera/ndk/NdkCameraCaptureSession.cpp
+++ b/camera/ndk/NdkCameraCaptureSession.cpp
@@ -40,6 +40,7 @@
if (session != nullptr) {
session->closeByApp();
}
+
return;
}
@@ -191,3 +192,42 @@
}
return session->updateOutputConfiguration(output);
}
+EXPORT
+camera_status_t ACameraCaptureSession_setWindowPreparedCallback(
+ ACameraCaptureSession* session, ACameraCaptureSession_prepareCallbacks *cb) {
+ ATRACE_CALL();
+ if (session == nullptr || cb == nullptr) {
+ ALOGE("%s: Error: session %p / callback %p is null", __FUNCTION__, session, cb);
+ return ACAMERA_ERROR_INVALID_PARAMETER;
+ }
+
+ if (cb->reserved0 != nullptr || cb->reserved1 != nullptr) {
+ ALOGE("%s: Setting reserved 0 and reserved 1 fields of "
+ "ACameraCaptureSession_prepareCallbacks is currently not supported "
+ " .They must be set to null", __FUNCTION__);
+ return ACAMERA_ERROR_INVALID_PARAMETER;
+ }
+ if (session->isClosed()) {
+ ALOGE("%s: session %p is already closed", __FUNCTION__, session);
+ return ACAMERA_ERROR_SESSION_CLOSED;
+ }
+ session->setWindowPreparedCallback(cb);
+ return ACAMERA_OK;
+}
+
+EXPORT
+camera_status_t ACameraCaptureSession_prepareWindow(
+ ACameraCaptureSession* session,
+ ACameraWindowType *window) {
+ ATRACE_CALL();
+ if (session == nullptr || window == nullptr) {
+ ALOGE("%s: Error: session %p / window %p is null", __FUNCTION__, session, window);
+ return ACAMERA_ERROR_INVALID_PARAMETER;
+ }
+
+ if (session->isClosed()) {
+ ALOGE("%s: session %p is already closed", __FUNCTION__, session);
+ return ACAMERA_ERROR_SESSION_CLOSED;
+ }
+ return session->prepare(window);
+}
\ No newline at end of file