diff options
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.java | 229 |
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); + } + } + } + +} |