summaryrefslogtreecommitdiff
path: root/camera2/extensions/service_based_sample/oem_library/src/java/androidx/camera/extensions/impl/serviceforward/RequestProcessorAdapter.java
diff options
context:
space:
mode:
Diffstat (limited to 'camera2/extensions/service_based_sample/oem_library/src/java/androidx/camera/extensions/impl/serviceforward/RequestProcessorAdapter.java')
-rw-r--r--camera2/extensions/service_based_sample/oem_library/src/java/androidx/camera/extensions/impl/serviceforward/RequestProcessorAdapter.java229
1 files changed, 229 insertions, 0 deletions
diff --git a/camera2/extensions/service_based_sample/oem_library/src/java/androidx/camera/extensions/impl/serviceforward/RequestProcessorAdapter.java b/camera2/extensions/service_based_sample/oem_library/src/java/androidx/camera/extensions/impl/serviceforward/RequestProcessorAdapter.java
new file mode 100644
index 00000000..3cc1d24c
--- /dev/null
+++ b/camera2/extensions/service_based_sample/oem_library/src/java/androidx/camera/extensions/impl/serviceforward/RequestProcessorAdapter.java
@@ -0,0 +1,229 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.extensions.impl.serviceforward;
+
+import android.hardware.camera2.CaptureFailure;
+import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.CaptureResult;
+import android.hardware.camera2.TotalCaptureResult;
+import android.os.RemoteException;
+import android.util.Log;
+
+import androidx.camera.extensions.impl.advanced.ImageProcessorImpl;
+import androidx.camera.extensions.impl.advanced.ImageReferenceImpl;
+import androidx.camera.extensions.impl.advanced.RequestProcessorImpl;
+import androidx.camera.extensions.impl.service.CaptureFailureWrapper;
+import androidx.camera.extensions.impl.service.CaptureResultWrapper;
+import androidx.camera.extensions.impl.service.IImageProcessorImpl;
+import androidx.camera.extensions.impl.service.IRequestCallback;
+import androidx.camera.extensions.impl.service.IRequestProcessorImpl;
+import androidx.camera.extensions.impl.service.ImageWrapper;
+import androidx.camera.extensions.impl.service.Request;
+import androidx.camera.extensions.impl.service.TotalCaptureResultWrapper;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+class RequestProcessorAdapter extends IRequestProcessorImpl.Stub {
+ private static final String TAG = "RequestProcessorAdapter";
+
+ private RequestProcessorImpl mRequestProcessorImpl;
+ RequestProcessorAdapter(RequestProcessorImpl requestProcessorImpl) {
+ mRequestProcessorImpl = requestProcessorImpl;
+ }
+ @Override
+ public void setImageProcessor(int outputfigId, IImageProcessorImpl imageProcessor)
+ throws RemoteException {
+ mRequestProcessorImpl.setImageProcessor(outputfigId, new ImageProcessorImpl() {
+ @Override
+ public void onNextImageAvailable(int outputConfigId, long timestampNs,
+ ImageReferenceImpl imageReference, String physicalCameraId) {
+ try {
+ imageProcessor.onNextImageAvailable(outputConfigId,
+ new ImageWrapper(imageReference.get()), physicalCameraId);
+ imageReference.decrement();
+ } catch (RemoteException e) {
+ Log.e(TAG, "Can't connect to the binder!", e);
+ }
+ }
+ });
+ }
+
+ @Override
+ public int submit(Request request, IRequestCallback requestCallback)
+ throws RemoteException {
+ return submitBurst(Arrays.asList(request), requestCallback);
+ }
+
+ @Override
+ public int submitBurst(List<Request> requests, IRequestCallback requestCallback)
+ throws RemoteException {
+ List<RequestProcessorImpl.Request> implRequests = new ArrayList<>();
+ Map<RequestProcessorImpl.Request, Request> requestsMap = new HashMap<>();
+ for (Request request : requests) {
+ RequestProcessorImpl.Request implRequest = new ImplRequestAdapter(request);
+ implRequests.add(implRequest);
+ requestsMap.put(implRequest, request);
+ }
+ return mRequestProcessorImpl.submit(implRequests,
+ new ImplCaptureCallbackAdapter(requestsMap, requestCallback));
+ }
+
+ @Override
+ public int setRepeating(Request request, IRequestCallback requestCallback)
+ throws RemoteException {
+ Map<RequestProcessorImpl.Request, Request> requestsMap = new HashMap<>();
+ RequestProcessorImpl.Request implRequest = new ImplRequestAdapter(request);
+ requestsMap.put(implRequest, request);
+
+ return mRequestProcessorImpl.setRepeating(implRequest,
+ new ImplCaptureCallbackAdapter(requestsMap, requestCallback));
+ }
+
+ @Override
+ public void abortCaptures() throws RemoteException {
+ mRequestProcessorImpl.abortCaptures();
+ }
+
+ @Override
+ public void stopRepeating() throws RemoteException {
+ mRequestProcessorImpl.stopRepeating();
+ }
+
+ private static class ImplRequestAdapter implements RequestProcessorImpl.Request {
+ private Request mRequest;
+ ImplRequestAdapter(Request request) {
+ mRequest = request;
+ }
+
+ @Override
+ public List<Integer> getTargetOutputConfigIds() {
+ List<Integer> result = new ArrayList<>(mRequest.targetOutputConfigIds.length);
+ for (int id : mRequest.targetOutputConfigIds) {
+ result.add(id);
+ }
+ return result;
+ }
+
+ @Override
+ public Map<CaptureRequest.Key<?>, Object> getParameters() {
+ CaptureRequest captureRequest = mRequest.parameters.toCaptureRequest();
+ Map<CaptureRequest.Key<?>, Object> parameters = new HashMap<>();
+ for (CaptureRequest.Key<?> key : captureRequest.getKeys()) {
+ parameters.put(key, captureRequest.get(key));
+ }
+ return parameters;
+ }
+
+ @Override
+ public Integer getTemplateId() {
+ return mRequest.templateId;
+ }
+ }
+
+ private static class ImplCaptureCallbackAdapter implements RequestProcessorImpl.Callback {
+ private Map<RequestProcessorImpl.Request, Request> mRequestsMap;
+ private IRequestCallback mRequestCallback;
+ ImplCaptureCallbackAdapter(Map<RequestProcessorImpl.Request, Request> requestsMap,
+ IRequestCallback requestCallback) {
+ mRequestCallback = requestCallback;
+ mRequestsMap = requestsMap;
+ }
+
+ private Request getRequest(RequestProcessorImpl.Request implRequest) {
+ return mRequestsMap.get(implRequest);
+ }
+
+ @Override
+ public void onCaptureStarted(RequestProcessorImpl.Request implRequest, long frameNumber,
+ long timestamp) {
+ try {
+ mRequestCallback.onCaptureStarted(getRequest(implRequest).requestId,
+ frameNumber, timestamp);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Can't connect to the binder!", e);
+ }
+ }
+
+ @Override
+ public void onCaptureProgressed(RequestProcessorImpl.Request implRequest,
+ CaptureResult partialResult) {
+ try {
+ mRequestCallback.onCaptureProgressed(getRequest(implRequest).requestId,
+ new CaptureResultWrapper(partialResult));
+ } catch(RemoteException e) {
+ Log.e(TAG, "Can't connect to the binder!", e);
+ }
+ }
+
+ @Override
+ public void onCaptureCompleted(RequestProcessorImpl.Request implRequest,
+ TotalCaptureResult totalCaptureResult) {
+ try {
+ mRequestCallback.onCaptureCompleted(getRequest(implRequest).requestId,
+ new TotalCaptureResultWrapper(totalCaptureResult));
+ } catch(RemoteException e) {
+ Log.e(TAG, "Can't connect to the binder!", e);
+ }
+ }
+
+ @Override
+ public void onCaptureFailed(RequestProcessorImpl.Request implRequest,
+ CaptureFailure captureFailure) {
+ try {
+
+ mRequestCallback.onCaptureFailed(getRequest(implRequest).requestId,
+ new CaptureFailureWrapper(captureFailure));
+ } catch(RemoteException e) {
+ Log.e(TAG, "Can't connect to the binder!", e);
+ }
+ }
+
+ @Override
+ public void onCaptureBufferLost(RequestProcessorImpl.Request implRequest, long frameNumber,
+ int outputStreamId) {
+ try {
+ mRequestCallback.onCaptureBufferLost(getRequest(implRequest).requestId,
+ frameNumber, outputStreamId);
+ } catch(RemoteException e) {
+ Log.e(TAG, "Can't connect to the binder!", e);
+ }
+ }
+
+ @Override
+ public void onCaptureSequenceCompleted(int sequenceId, long frameNumber) {
+ try {
+ mRequestCallback.onCaptureSequenceCompleted(sequenceId, frameNumber);
+ } catch(RemoteException e) {
+ Log.e(TAG, "Can't connect to the binder!", e);
+ }
+ }
+
+ @Override
+ public void onCaptureSequenceAborted(int sequenceId) {
+ try {
+ mRequestCallback.onCaptureSequenceAborted(sequenceId);
+ } catch(RemoteException e) {
+ Log.e(TAG, "Can't connect to the binder!", e);
+ }
+ }
+ }
+
+}