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

Commit d6b3ab77 authored by Emilian Peev's avatar Emilian Peev
Browse files

Camera: Add support for client requests&results for advanced extensions

Allow camera clients to query for any orthogonal camera parameters that
can be applied during advanced extension capture sessions.
Enable capture result callbacks in the same scenario as well as single
catpure requests to the preview client surface.

Bug: 198447410
Test: Camera CTS

Change-Id: Ia51cc0813a93963d628ea73beb54ed080f4696e7
parent c31090f0
Loading
Loading
Loading
Loading
+33 −18
Original line number Original line Diff line number Diff line
@@ -824,21 +824,31 @@ public final class CameraExtensionCharacteristics {
            if (!isExtensionSupported(mCameraId, extension, mChars)) {
            if (!isExtensionSupported(mCameraId, extension, mChars)) {
                throw new IllegalArgumentException("Unsupported extension");
                throw new IllegalArgumentException("Unsupported extension");
            }
            }

            CameraMetadataNative captureRequestMeta = null;
            if (areAdvancedExtensionsSupported()) {
                IAdvancedExtenderImpl extender = initializeAdvancedExtension(extension);
                extender.init(mCameraId);
                captureRequestMeta = extender.getAvailableCaptureRequestKeys(mCameraId);
            } else {
                Pair<IPreviewExtenderImpl, IImageCaptureExtenderImpl> extenders =
                Pair<IPreviewExtenderImpl, IImageCaptureExtenderImpl> extenders =
                        initializeExtension(extension);
                        initializeExtension(extension);
                extenders.second.onInit(mCameraId, mChars.getNativeMetadata());
                extenders.second.onInit(mCameraId, mChars.getNativeMetadata());
                extenders.second.init(mCameraId, mChars.getNativeMetadata());
                extenders.second.init(mCameraId, mChars.getNativeMetadata());
            CameraMetadataNative captureRequestMeta =
                captureRequestMeta = extenders.second.getAvailableCaptureRequestKeys();
                    extenders.second.getAvailableCaptureRequestKeys();
                extenders.second.onDeInit();
            }


            if (captureRequestMeta != null) {
            if (captureRequestMeta != null) {
                int[] requestKeys = captureRequestMeta.get(
                int[] requestKeys = captureRequestMeta.get(
                        CameraCharacteristics.REQUEST_AVAILABLE_REQUEST_KEYS);
                        CameraCharacteristics.REQUEST_AVAILABLE_REQUEST_KEYS);
                if (requestKeys == null) {
                if (requestKeys == null) {
                    throw new AssertionError("android.request.availableRequestKeys must be non-null"
                    throw new AssertionError(
                            "android.request.availableRequestKeys must be non-null"
                                    + " in the characteristics");
                                    + " in the characteristics");
                }
                }
                CameraCharacteristics requestChars = new CameraCharacteristics(captureRequestMeta);
                CameraCharacteristics requestChars = new CameraCharacteristics(
                        captureRequestMeta);


                Object crKey = CaptureRequest.Key.class;
                Object crKey = CaptureRequest.Key.class;
                Class<CaptureRequest.Key<?>> crKeyTyped = (Class<CaptureRequest.Key<?>>) crKey;
                Class<CaptureRequest.Key<?>> crKeyTyped = (Class<CaptureRequest.Key<?>>) crKey;
@@ -854,7 +864,6 @@ public final class CameraExtensionCharacteristics {
            if (!ret.contains(CaptureRequest.JPEG_ORIENTATION)) {
            if (!ret.contains(CaptureRequest.JPEG_ORIENTATION)) {
                ret.add(CaptureRequest.JPEG_ORIENTATION);
                ret.add(CaptureRequest.JPEG_ORIENTATION);
            }
            }
            extenders.second.onDeInit();
        } catch (RemoteException e) {
        } catch (RemoteException e) {
            throw new IllegalStateException("Failed to query the available capture request keys!");
            throw new IllegalStateException("Failed to query the available capture request keys!");
        } finally {
        } finally {
@@ -894,12 +903,19 @@ public final class CameraExtensionCharacteristics {
                throw new IllegalArgumentException("Unsupported extension");
                throw new IllegalArgumentException("Unsupported extension");
            }
            }


            CameraMetadataNative captureResultMeta = null;
            if (areAdvancedExtensionsSupported()) {
                IAdvancedExtenderImpl extender = initializeAdvancedExtension(extension);
                extender.init(mCameraId);
                captureResultMeta = extender.getAvailableCaptureResultKeys(mCameraId);
            } else {
                Pair<IPreviewExtenderImpl, IImageCaptureExtenderImpl> extenders =
                Pair<IPreviewExtenderImpl, IImageCaptureExtenderImpl> extenders =
                        initializeExtension(extension);
                        initializeExtension(extension);
                extenders.second.onInit(mCameraId, mChars.getNativeMetadata());
                extenders.second.onInit(mCameraId, mChars.getNativeMetadata());
                extenders.second.init(mCameraId, mChars.getNativeMetadata());
                extenders.second.init(mCameraId, mChars.getNativeMetadata());
            CameraMetadataNative captureResultMeta =
                captureResultMeta = extenders.second.getAvailableCaptureResultKeys();
                    extenders.second.getAvailableCaptureResultKeys();
                extenders.second.onDeInit();
            }


            if (captureResultMeta != null) {
            if (captureResultMeta != null) {
                int[] resultKeys = captureResultMeta.get(
                int[] resultKeys = captureResultMeta.get(
@@ -926,7 +942,6 @@ public final class CameraExtensionCharacteristics {
                    ret.add(CaptureResult.SENSOR_TIMESTAMP);
                    ret.add(CaptureResult.SENSOR_TIMESTAMP);
                }
                }
            }
            }
            extenders.second.onDeInit();
        } catch (RemoteException e) {
        } catch (RemoteException e) {
            throw new IllegalStateException("Failed to query the available capture result keys!");
            throw new IllegalStateException("Failed to query the available capture result keys!");
        } finally {
        } finally {
+11 −4
Original line number Original line Diff line number Diff line
@@ -265,8 +265,8 @@ public abstract class CameraExtensionSession implements AutoCloseable {
     * from the camera device, to produce a single high-quality output result.
     * from the camera device, to produce a single high-quality output result.
     *
     *
     * <p>Note that single capture requests currently do not support
     * <p>Note that single capture requests currently do not support
     * client parameters except for {@link CaptureRequest#JPEG_ORIENTATION orientation} and
     * client parameters except for controls advertised in
     * {@link CaptureRequest#JPEG_QUALITY quality} in case of ImageFormat.JPEG output target.
     * {@link CameraExtensionCharacteristics#getAvailableCaptureRequestKeys}.
     * The rest of the settings included in the request will be entirely overridden by
     * The rest of the settings included in the request will be entirely overridden by
     * the device-specific extension. </p>
     * the device-specific extension. </p>
     *
     *
@@ -275,6 +275,11 @@ public abstract class CameraExtensionSession implements AutoCloseable {
     * arguments that include further targets will cause
     * arguments that include further targets will cause
     * IllegalArgumentException to be thrown. </p>
     * IllegalArgumentException to be thrown. </p>
     *
     *
     * <p>Starting with Android {@link android.os.Build.VERSION_CODES#TIRAMISU} single capture
     * requests will also support the preview {@link android.graphics.ImageFormat#PRIVATE} target
     * surface. These can typically be used for enabling AF/AE triggers. Do note, that single
     * capture requests referencing both output surfaces remain unsupported.</p>
     *
     * <p>Each request will produce one new frame for one target Surface, set
     * <p>Each request will produce one new frame for one target Surface, set
     * with the CaptureRequest builder's
     * with the CaptureRequest builder's
     * {@link CaptureRequest.Builder#addTarget} method.</p>
     * {@link CaptureRequest.Builder#addTarget} method.</p>
@@ -319,8 +324,10 @@ public abstract class CameraExtensionSession implements AutoCloseable {
     * rate possible.</p>
     * rate possible.</p>
     *
     *
     * <p>Note that repeating capture requests currently do not support
     * <p>Note that repeating capture requests currently do not support
     * client parameters. Settings included in the request will
     * client parameters except for controls advertised in
     * be completely overridden by the device-specific extension.</p>
     * {@link CameraExtensionCharacteristics#getAvailableCaptureRequestKeys}.
     * The rest of the settings included in the request will be entirely overridden by
     * the device-specific extension. </p>
     *
     *
     * <p>The {@link CaptureRequest.Builder#addTarget} supports only one
     * <p>The {@link CaptureRequest.Builder#addTarget} supports only one
     * target surface. {@link CaptureRequest} arguments that include further
     * target surface. {@link CaptureRequest} arguments that include further
+3 −0
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@ import android.hardware.camera2.extension.ISessionProcessorImpl;
import android.hardware.camera2.extension.LatencyRange;
import android.hardware.camera2.extension.LatencyRange;
import android.hardware.camera2.extension.Size;
import android.hardware.camera2.extension.Size;
import android.hardware.camera2.extension.SizeList;
import android.hardware.camera2.extension.SizeList;
import android.hardware.camera2.impl.CameraMetadataNative;


/** @hide */
/** @hide */
interface IAdvancedExtenderImpl
interface IAdvancedExtenderImpl
@@ -30,4 +31,6 @@ interface IAdvancedExtenderImpl
    @nullable List<SizeList> getSupportedPreviewOutputResolutions(in String cameraId);
    @nullable List<SizeList> getSupportedPreviewOutputResolutions(in String cameraId);
    @nullable List<SizeList> getSupportedCaptureOutputResolutions(in String cameraId);
    @nullable List<SizeList> getSupportedCaptureOutputResolutions(in String cameraId);
    ISessionProcessorImpl getSessionProcessor();
    ISessionProcessorImpl getSessionProcessor();
    CameraMetadataNative getAvailableCaptureRequestKeys(in String cameraId);
    CameraMetadataNative getAvailableCaptureResultKeys(in String cameraId);
}
}
+2 −0
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@
package android.hardware.camera2.extension;
package android.hardware.camera2.extension;


import android.hardware.camera2.extension.Request;
import android.hardware.camera2.extension.Request;
import android.hardware.camera2.impl.CameraMetadataNative;


/** @hide */
/** @hide */
interface ICaptureCallback
interface ICaptureCallback
@@ -25,4 +26,5 @@ interface ICaptureCallback
    void onCaptureFailed(int captureSequenceId);
    void onCaptureFailed(int captureSequenceId);
    void onCaptureSequenceCompleted(int captureSequenceId);
    void onCaptureSequenceCompleted(int captureSequenceId);
    void onCaptureSequenceAborted(int captureSequenceId);
    void onCaptureSequenceAborted(int captureSequenceId);
    void onCaptureCompleted(long shutterTimestamp, int requestId, in CameraMetadataNative results);
}
}
+4 −1
Original line number Original line Diff line number Diff line
@@ -15,6 +15,7 @@
 */
 */
package android.hardware.camera2.extension;
package android.hardware.camera2.extension;


import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.extension.CameraSessionConfig;
import android.hardware.camera2.extension.CameraSessionConfig;
import android.hardware.camera2.extension.ICaptureCallback;
import android.hardware.camera2.extension.ICaptureCallback;
import android.hardware.camera2.extension.IRequestProcessorImpl;
import android.hardware.camera2.extension.IRequestProcessorImpl;
@@ -30,5 +31,7 @@ interface ISessionProcessorImpl
    void onCaptureSessionEnd();
    void onCaptureSessionEnd();
    int startRepeating(in ICaptureCallback callback);
    int startRepeating(in ICaptureCallback callback);
    void stopRepeating();
    void stopRepeating();
    int startCapture(in ICaptureCallback callback, int jpegRotation, int jpegQuality);
    int startCapture(in ICaptureCallback callback);
    void setParameters(in CaptureRequest captureRequest);
    int startTrigger(in CaptureRequest captureRequest, in ICaptureCallback callback);
}
}
Loading