Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8d86a694 authored by Dorin Drimus's avatar Dorin Drimus Committed by Android (Google) Code Review
Browse files

Merge "Inject CaptureResults to VirtualCameraService (base)" into main

parents b67b2380 977bf0bc
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -28,5 +28,5 @@ oneway interface ICaptureResultConsumer {
     * Injects the CameraMetadataNative part of the CaptureResult to be sent for the timestamp
     * on all streams for the associated session.
     */
    void sendCaptureResult(long timestamp, in CameraMetadataNative captureResult);
    void acceptCaptureResult(long timestamp, in CameraMetadataNative captureResult);
}
 No newline at end of file
+3 −2
Original line number Diff line number Diff line
@@ -52,10 +52,11 @@ oneway interface IVirtualCameraCallback {
     *      The available Keys need to be set in the ANDROID_REQUEST_AVAILABLE_SESSION_KEYS tag of
     *      the {@link CameraCharacteristics}.
     * @param captureResultConsumer The consumer interface through which the virtual camera server
     *      consumes the CameraMetadataNative part of the CaptureResult.
     *      consumes the CameraMetadataNative part of the CaptureResult. It is null if per frame
     *      camera metadata is not enabled.
     */
    void onConfigureSession(in CaptureRequest sessionParameters,
        in ICaptureResultConsumer captureResultConsumer);
        in @nullable ICaptureResultConsumer captureResultConsumer);

    /**
     * Called when one of the requested stream has been configured by the virtual camera service and
+19 −9
Original line number Diff line number Diff line
@@ -501,18 +501,11 @@ public final class VirtualCameraConfig implements Parcelable {
            if (Flags.virtualCameraMetadata()) {
                VirtualCameraSessionConfig virtualCameraSessionConfig =
                        new VirtualCameraSessionConfig(sessionParameters);

                mExecutor.execute(() -> mCallback.onConfigureSession(virtualCameraSessionConfig,
                        (captureResult, timestamp) -> {
                            try {
                                captureResultConsumer.sendCaptureResult(timestamp,
                                        captureResult.getNativeMetadata());
                            } catch (RemoteException e) {
                                throw e.rethrowFromSystemServer();
                        convertToFrameworkCaptureResultConsumer(captureResultConsumer)));
            }
                        }));
        }
        }


        @Override
        public void onStreamConfigured(int streamId, Surface surface, int width, int height,
@@ -536,6 +529,23 @@ public final class VirtualCameraConfig implements Parcelable {
        public void onStreamClosed(int streamId) {
            mExecutor.execute(() -> mCallback.onStreamClosed(streamId));
        }

        @Nullable
        private ObjLongConsumer<CaptureResult> convertToFrameworkCaptureResultConsumer(
                @Nullable ICaptureResultConsumer captureResultConsumer) {
            if (!mPerFrameCameraMetadataEnabled || captureResultConsumer == null) {
                return null;
            }

            return (captureResult, timestamp) -> {
                try {
                    captureResultConsumer.acceptCaptureResult(timestamp,
                            captureResult.getNativeMetadata());
                } catch (RemoteException e) {
                    throw e.rethrowFromSystemServer();
                }
            };
        }
    }

    @NonNull
+18 −17
Original line number Diff line number Diff line
@@ -34,7 +34,6 @@ import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.impl.CameraMetadataNative;
import android.os.IBinder;
import android.os.Parcel;
import android.os.RemoteException;
import android.util.Slog;
@@ -94,22 +93,8 @@ public final class VirtualCameraConversionUtil {
                        captureRequest = convertToCaptureRequest(sessionParameters);
                    }

                    android.companion.virtual.camera.ICaptureResultConsumer consumer =
                            new android.companion.virtual.camera.ICaptureResultConsumer() {
                                @Override
                                public void sendCaptureResult(long timestamp,
                                        CameraMetadataNative captureResult) throws RemoteException {
                                    captureResultConsumer.sendCaptureResult(timestamp,
                                            convertToVirtualCameraMetadata(captureResult));
                                }

                                @Override
                                public IBinder asBinder() {
                                    return null;
                                }
                            };

                    camera.onConfigureSession(captureRequest, consumer);
                    camera.onConfigureSession(captureRequest,
                            convertToVdmCaptureResultConsumer(captureResultConsumer));
                }
            }
            @Override
@@ -224,4 +209,20 @@ public final class VirtualCameraConversionUtil {

        return null;
    }

    private static @Nullable android.companion.virtual.camera.ICaptureResultConsumer
            convertToVdmCaptureResultConsumer(
                @Nullable ICaptureResultConsumer serviceCaptureResultConsumer) {
        if (serviceCaptureResultConsumer != null) {
            return new android.companion.virtual.camera.ICaptureResultConsumer.Stub() {
                @Override
                public void acceptCaptureResult(long timestamp, CameraMetadataNative captureResult)
                        throws RemoteException {
                    serviceCaptureResultConsumer.acceptCaptureResult(timestamp,
                            convertToVirtualCameraMetadata(captureResult));
                }
            };
        }
        return null;
    }
}