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

Commit c9d7e4da authored by Eino-Ville Talvala's avatar Eino-Ville Talvala
Browse files

Camera2: Fix FPS value scaling between HAL2 and API

API assumes FPS values are in fixed-point with LSB 0.001; HAL2 just
uses ints with no fractional part.

HAL should probably use floats or something similar, but for now, fix
scaling so the two agree on FPS values.

Bug: 7230239
Change-Id: Ie18a4f11fc9d17d9ae2d04781511a273213eda55
parent 72ff5903
Loading
Loading
Loading
Loading
+10 −7
Original line number Diff line number Diff line
@@ -94,16 +94,16 @@ status_t Parameters::initialize(const CameraMetadata *info) {

    params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
            String8::format("%d,%d",
                    previewFpsRange[0],
                    previewFpsRange[1]));
                    previewFpsRange[0] * kFpsToApiScale,
                    previewFpsRange[1] * kFpsToApiScale));

    {
        String8 supportedPreviewFpsRange;
        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
            if (i != 0) supportedPreviewFpsRange += ",";
            supportedPreviewFpsRange += String8::format("(%d,%d)",
                    availableFpsRanges.data.i32[i],
                    availableFpsRanges.data.i32[i+1]);
                    availableFpsRanges.data.i32[i] * kFpsToApiScale,
                    availableFpsRanges.data.i32[i+1] * kFpsToApiScale);
        }
        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
                supportedPreviewFpsRange);
@@ -171,14 +171,14 @@ status_t Parameters::initialize(const CameraMetadata *info) {
    // still have to do something sane for them

    params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
            previewFpsRange[0]);
            previewFpsRange[0] * kFpsToApiScale);

    {
        String8 supportedPreviewFrameRates;
        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
            if (i != 0) supportedPreviewFrameRates += ",";
            supportedPreviewFrameRates += String8::format("%d",
                    availableFpsRanges.data.i32[i]);
                    availableFpsRanges.data.i32[i] * kFpsToApiScale);
        }
        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
                supportedPreviewFrameRates);
@@ -894,6 +894,9 @@ status_t Parameters::set(const String8& params) {
    bool fpsRangeChanged = false;
    newParams.getPreviewFpsRange(&validatedParams.previewFpsRange[0],
            &validatedParams.previewFpsRange[1]);
    validatedParams.previewFpsRange[0] /= kFpsToApiScale;
    validatedParams.previewFpsRange[1] /= kFpsToApiScale;

    if (validatedParams.previewFpsRange[0] != previewFpsRange[0] ||
            validatedParams.previewFpsRange[1] != previewFpsRange[1]) {
        fpsRangeChanged = true;
@@ -943,7 +946,7 @@ status_t Parameters::set(const String8& params) {
    // Deprecated, only use if the preview fps range is unchanged this time.
    // The single-value FPS is the same as the minimum of the range.
    if (!fpsRangeChanged) {
        validatedParams.previewFps = newParams.getPreviewFrameRate();
        validatedParams.previewFps = newParams.getPreviewFrameRate() / kFpsToApiScale;
        if (validatedParams.previewFps != previewFps) {
            camera_metadata_ro_entry_t availableFrameRates =
                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
+2 −0
Original line number Diff line number Diff line
@@ -223,6 +223,8 @@ struct Parameters {
    // Map from camera orientation + facing to gralloc transform enum
    static int degToTransform(int degrees, bool mirror);

    static const int kFpsToApiScale = 1000;

    // Transform between (-1000,-1000)-(1000,1000) normalized coords from camera
    // API and HAL2 (0,0)-(activePixelArray.width/height) coordinates
    int arrayXToNormalized(int width) const;