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

Commit 3046ac8a authored by Shuzhen Wang's avatar Shuzhen Wang Committed by Android (Google) Code Review
Browse files

Merge "Camera: Add new function to query for SessionConfiguration" into main

parents 7fb2fbdd df89cb9c
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -43,4 +43,6 @@ interface ICameraDevice {
  void setTorchMode(boolean on);
  void turnOnTorchWithStrengthLevel(int torchStrength);
  int getTorchStrengthLevel();
  android.hardware.camera.device.CameraMetadata constructDefaultRequestSettings(in android.hardware.camera.device.RequestTemplate type);
  boolean isStreamCombinationWithSettingsSupported(in android.hardware.camera.device.StreamConfiguration streams);
}
+89 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.hardware.camera.device.CameraMetadata;
import android.hardware.camera.device.ICameraDeviceCallback;
import android.hardware.camera.device.ICameraDeviceSession;
import android.hardware.camera.device.ICameraInjectionSession;
import android.hardware.camera.device.RequestTemplate;
import android.hardware.camera.device.StreamConfiguration;
import android.os.ParcelFileDescriptor;

@@ -346,4 +347,92 @@ interface ICameraDevice {
     *
     */
    int getTorchStrengthLevel();

    /**
     * constructDefaultRequestSettings:
     *
     * This is the same as ICameraDeviceSession.constructDefaultRequestSettings, with
     * the exception that it can be called before the ICameraDevice.open call.
     *
     * @param type The requested template CaptureRequest type to create the default settings for.
     *
     * @return capture settings for the requested use case.
     *
     */
    CameraMetadata constructDefaultRequestSettings(in RequestTemplate type);

    /**
     * isStreamCombinationWithSettingsSupported:
     *
     * This is the same as isStreamCombinationSupported with below exceptions:
     *
     * 1. The input StreamConfiguration parameter may contain session parameters
     * supported by this camera device. When checking if the particular StreamConfiguration
     * is supported, the camera HAL must take the session parameters into consideration.
     *
     * 2. For version 3 of this interface, the camera compliance test will verify that
     * isStreamCombinationWithSettingsSupported behaves properly for all combinations of
     * below features. This function must return true for all supported combinations,
     * and return false for non-supported feature combinations. The list of features
     * required may grow in future versions.
     *
     * - Stream Combinations (a subset of LEGACY device mandatory stream combinations):
     *   {
     *     //                    4:3                16:9
     *     // S1440P:         1920 x 1440         2560 x 1440
     *     // S1080P:         1440 x 1080         1920 x 1080
     *     // S720P:           960 x 720          1280 x 720
     *
     *     // Simple preview, GPU video processing, or no-preview video recording
     *     {PRIV, MAXIMUM},
     *     {PRIV, PREVIEW},
     *     {PRIV, S1440P},
     *     {PRIV, S1080P},
     *     {PRIV, S720P},
     *     // In-application video/image processing
     *     {YUV, MAXIMUM},
     *     {YUV, PREVIEW},
     *     {YUV, S1440P},
     *     {YUV, S1080P},
     *     {YUV, S720P},
     *     // Standard still imaging.
     *     {PRIV, PREVIEW, JPEG, MAXIMUM},
     *     {PRIV, S1440P,  JPEG, MAXIMUM},
     *     {PRIV, S1080P,  JPEG, MAXIMUM},
     *     {PRIV, S720P,   JPEG, MAXIMUM},
     *     {PRIV, S1440P,  JPEG, S1440P},
     *     {PRIV, S1080P,  JPEG, S1080P},
     *     {PRIV, S720P,   JPEG, S1080P},
     *     // In-app processing plus still capture.
     *     {YUV,  PREVIEW, JPEG, MAXIMUM},
     *     {YUV,  S1440P,  JPEG, MAXIMUM},
     *     {YUV,  S1080P,  JPEG, MAXIMUM},
     *     {YUV,  S720P,   JPEG, MAXIMUM},
     *     // Standard recording.
     *     {PRIV, PREVIEW, PRIV, PREVIEW},
     *     {PRIV, S1440P,  PRIV, S1440P},
     *     {PRIV, S1080P,  PRIV, S1080P},
     *     {PRIV, S720P,   PRIV, S720P},
     *     // Preview plus in-app processing.
     *     {PRIV, PREVIEW, YUV,  PREVIEW},
     *     {PRIV, S1440P,  YUV,  S1440P},
     *     {PRIV, S1080P,  YUV,  S1080P},
     *     {PRIV, S720P,   YUV,  S720P},
     *   }
     * - VIDEO_STABILIZATION_MODES: {OFF, PREVIEW}
     * - AE_TARGET_FPS_RANGE: {{*, 30}, {*, 60}}
     * - DYNAMIC_RANGE_PROFILE: {STANDARD, HLG10}
     *
     * Note: If a combination contains a S1440P, S1080P, or S720P stream,
     * both 4:3 and 16:9 aspect ratio will be considered. For example, for the
     * stream combination of {PRIV, S1440P, JPEG, MAXIMUM}, and if MAXIMUM ==
     * 4032 x 3024, the camera compliance test will verify both
     * {PRIV, 1920 x 1440, JPEG, 4032 x 3024} and {PRIV, 2560 x 1440, JPEG, 4032 x 2268}.
     *
     * @param streams The StreamConfiguration to be tested, with optional session parameters.
     *
     * @return true in case the stream combination is supported, false otherwise.
     *
     */
    boolean isStreamCombinationWithSettingsSupported(in StreamConfiguration streams);
}
+2 −2
Original line number Diff line number Diff line
@@ -17,7 +17,7 @@ aidl_interface {
        "android.hardware.camera.device-V3",
        "android.hardware.camera.common-V1",
    ],
    frozen: true,
    frozen: false,
    stability: "vintf",
    backend: {
        java: {
@@ -38,7 +38,7 @@ aidl_interface {
        {
            version: "2",
            imports: [
                "android.hardware.camera.device-V3",
                "android.hardware.camera.device-V2",
                "android.hardware.camera.common-V1",
            ],
        },
+1 −1
Original line number Diff line number Diff line
@@ -62,7 +62,7 @@ cc_test {
        "android.hardware.camera.common-V1-ndk",
        "android.hardware.camera.device-V3-ndk",
        "android.hardware.camera.metadata-V2-ndk",
        "android.hardware.camera.provider-V2-ndk",
        "android.hardware.camera.provider-V3-ndk",
        "android.hidl.allocator@1.0",
        "libgrallocusage",
        "libhidlmemory",
+41 −17
Original line number Diff line number Diff line
@@ -500,6 +500,12 @@ TEST_P(CameraAidlTest, constructDefaultRequestSettings) {
        ASSERT_TRUE(ret.isOk());
        ASSERT_NE(device, nullptr);

        int32_t interfaceVersion;
        ret = device->getInterfaceVersion(&interfaceVersion);
        ASSERT_TRUE(ret.isOk());
        bool supportFeatureCombinationQuery =
                (interfaceVersion >= CAMERA_DEVICE_API_MINOR_VERSION_3);

        std::shared_ptr<EmptyDeviceCb> cb = ndk::SharedRefBase::make<EmptyDeviceCb>();
        ret = device->open(cb, &mSession);
        ALOGI("device::open returns status:%d:%d", ret.getExceptionCode(),
@@ -533,6 +539,34 @@ TEST_P(CameraAidlTest, constructDefaultRequestSettings) {
            } else {
                ASSERT_EQ(0u, rawMetadata.metadata.size());
            }

            if (flags::feature_combination_query()) {
                if (supportFeatureCombinationQuery) {
                    CameraMetadata rawMetadata2;
                    ndk::ScopedAStatus ret2 =
                            device->constructDefaultRequestSettings(reqTemplate, &rawMetadata2);

                    // TODO: Do not allow OPERATION_NOT_SUPPORTED once HAL
                    // implementation is in place.
                    if (static_cast<Status>(ret2.getServiceSpecificError()) !=
                        Status::OPERATION_NOT_SUPPORTED) {
                        ASSERT_EQ(ret.isOk(), ret2.isOk());
                        ASSERT_EQ(ret.getStatus(), ret2.getStatus());

                        ASSERT_EQ(rawMetadata.metadata.size(), rawMetadata2.metadata.size());
                        if (ret2.isOk()) {
                            const camera_metadata_t* metadata =
                                    (camera_metadata_t*)rawMetadata2.metadata.data();
                            size_t expectedSize = rawMetadata2.metadata.size();
                            int result =
                                    validate_camera_metadata_structure(metadata, &expectedSize);
                            ASSERT_TRUE((result == 0) ||
                                        (result == CAMERA_METADATA_VALIDATION_SHIFTED));
                            verifyRequestTemplate(metadata, reqTemplate);
                        }
                    }
                }
            }
        }
        ret = mSession->close();
        mSession = nullptr;
@@ -588,8 +622,7 @@ TEST_P(CameraAidlTest, configureStreamsAvailableOutputs) {
            createStreamConfiguration(streams, StreamConfigurationMode::NORMAL_MODE, &config,
                                      jpegBufferSize);

            bool expectStreamCombQuery = (isLogicalMultiCamera(staticMeta) == Status::OK);
            verifyStreamCombination(device, config, /*expectedStatus*/ true, expectStreamCombQuery);
            verifyStreamCombination(device, config, /*expectedStatus*/ true);

            config.streamConfigCounter = streamConfigCounter++;
            std::vector<HalStream> halConfigs;
@@ -687,11 +720,7 @@ TEST_P(CameraAidlTest, configureConcurrentStreamsAvailableOutputs) {
        // Test the stream can actually be configured
        for (auto& cti : cameraTestInfos) {
            if (cti.session != nullptr) {
                camera_metadata_t* staticMeta =
                        reinterpret_cast<camera_metadata_t*>(cti.staticMeta.metadata.data());
                bool expectStreamCombQuery = (isLogicalMultiCamera(staticMeta) == Status::OK);
                verifyStreamCombination(cti.cameraDevice, cti.config, /*expectedStatus*/ true,
                                        expectStreamCombQuery);
                verifyStreamCombination(cti.cameraDevice, cti.config, /*expectedStatus*/ true);
            }

            if (cti.session != nullptr) {
@@ -752,8 +781,7 @@ TEST_P(CameraAidlTest, configureStreamsInvalidOutputs) {
        createStreamConfiguration(streams, StreamConfigurationMode::NORMAL_MODE, &config,
                                  jpegBufferSize);

        verifyStreamCombination(cameraDevice, config, /*expectedStatus*/ false,
                                /*expectStreamCombQuery*/ false);
        verifyStreamCombination(cameraDevice, config, /*expectedStatus*/ false);

        config.streamConfigCounter = streamConfigCounter++;
        std::vector<HalStream> halConfigs;
@@ -972,8 +1000,7 @@ TEST_P(CameraAidlTest, configureStreamsZSLInputOutputs) {
                createStreamConfiguration(streams, StreamConfigurationMode::NORMAL_MODE, &config,
                                          jpegBufferSize);

                verifyStreamCombination(cameraDevice, config, /*expectedStatus*/ true,
                                        /*expectStreamCombQuery*/ false);
                verifyStreamCombination(cameraDevice, config, /*expectedStatus*/ true);

                config.streamConfigCounter = streamConfigCounter++;
                std::vector<HalStream> halConfigs;
@@ -1191,8 +1218,7 @@ TEST_P(CameraAidlTest, configureStreamsPreviewStillOutputs) {
                createStreamConfiguration(streams, StreamConfigurationMode::NORMAL_MODE, &config,
                                          jpegBufferSize);
                config.streamConfigCounter = streamConfigCounter++;
                verifyStreamCombination(cameraDevice, config, /*expectedStatus*/ true,
                                        /*expectStreamCombQuery*/ false);
                verifyStreamCombination(cameraDevice, config, /*expectedStatus*/ true);

                std::vector<HalStream> halConfigs;
                ndk::ScopedAStatus ret = mSession->configureStreams(config, &halConfigs);
@@ -1256,8 +1282,7 @@ TEST_P(CameraAidlTest, configureStreamsConstrainedOutputs) {
        createStreamConfiguration(streams, StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE,
                                  &config);

        verifyStreamCombination(cameraDevice, config, /*expectedStatus*/ true,
                                /*expectStreamCombQuery*/ false);
        verifyStreamCombination(cameraDevice, config, /*expectedStatus*/ true);

        config.streamConfigCounter = streamConfigCounter++;
        std::vector<HalStream> halConfigs;
@@ -1429,8 +1454,7 @@ TEST_P(CameraAidlTest, configureStreamsVideoStillOutputs) {

                createStreamConfiguration(streams, StreamConfigurationMode::NORMAL_MODE, &config,
                                          jpegBufferSize);
                verifyStreamCombination(cameraDevice, config, /*expectedStatus*/ true,
                                        /*expectStreamCombQuery*/ false);
                verifyStreamCombination(cameraDevice, config, /*expectedStatus*/ true);

                config.streamConfigCounter = streamConfigCounter++;
                std::vector<HalStream> halConfigs;
Loading