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

Commit 828adbba authored by Chien-Yu Chen's avatar Chien-Yu Chen
Browse files

Camera2: Handle surface size change

When comparing if two OutputConfigurations are equal, also check
the width, height, format, dataspace when the output configurations
were created. With this, CameraDeviceImpl knows that the surface has
changed sizes and will reconfigure the stream.

Bug: 12250682
Change-Id: Ie5965d242b2017b87a76d26cdc2f6b700082e002
parent 358fcc79
Loading
Loading
Loading
Loading
+22 −6
Original line number Diff line number Diff line
@@ -19,7 +19,9 @@ package android.hardware.camera2.params;

import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.utils.HashCodeHelpers;
import android.hardware.camera2.utils.SurfaceUtils;
import android.util.Log;
import android.util.Size;
import android.view.Surface;
import android.os.Parcel;
import android.os.Parcelable;
@@ -66,9 +68,7 @@ public final class OutputConfiguration implements Parcelable {
     *
     */
    public OutputConfiguration(Surface surface) {
        checkNotNull(surface, "Surface must not be null");
        mSurface = surface;
        mRotation = ROTATION_0;
        this(surface, ROTATION_0);
    }

    /**
@@ -94,6 +94,9 @@ public final class OutputConfiguration implements Parcelable {
        checkArgumentInRange(rotation, ROTATION_0, ROTATION_270, "Rotation constant");
        mSurface = surface;
        mRotation = rotation;
        mConfiguredSize = SurfaceUtils.getSurfaceSize(surface);
        mConfiguredFormat = SurfaceUtils.getSurfaceFormat(surface);
        mConfiguredDataspace = SurfaceUtils.getSurfaceDataspace(surface);
    }

    /**
@@ -106,6 +109,9 @@ public final class OutputConfiguration implements Parcelable {
        checkArgumentInRange(rotation, ROTATION_0, ROTATION_270, "Rotation constant");
        mSurface = surface;
        mRotation = rotation;
        mConfiguredSize = SurfaceUtils.getSurfaceSize(mSurface);
        mConfiguredFormat = SurfaceUtils.getSurfaceFormat(mSurface);
        mConfiguredDataspace = SurfaceUtils.getSurfaceDataspace(mSurface);
    }

    /**
@@ -163,8 +169,9 @@ public final class OutputConfiguration implements Parcelable {
    /**
     * Check if this {@link OutputConfiguration} is equal to another {@link OutputConfiguration}.
     *
     * <p>Two output configurations are only equal if and only if the underlying surface and
     * all other configuration parameters are equal. </p>
     * <p>Two output configurations are only equal if and only if the underlying surfaces, surface
     * properties (width, height, format, dataspace) when the output configurations are created,
     * and all other configuration parameters are equal. </p>
     *
     * @return {@code true} if the objects were equal, {@code false} otherwise
     */
@@ -176,7 +183,11 @@ public final class OutputConfiguration implements Parcelable {
            return true;
        } else if (obj instanceof OutputConfiguration) {
            final OutputConfiguration other = (OutputConfiguration) obj;
            return (mSurface == other.mSurface && mRotation == other.mRotation);
            return mSurface == other.mSurface &&
                   mRotation == other.mRotation &&
                   mConfiguredSize.equals(other.mConfiguredSize) &&
                   mConfiguredFormat == other.mConfiguredFormat &&
                   mConfiguredDataspace == other.mConfiguredDataspace;
        }
        return false;
    }
@@ -192,4 +203,9 @@ public final class OutputConfiguration implements Parcelable {
    private static final String TAG = "OutputConfiguration";
    private final Surface mSurface;
    private final int mRotation;

    // The size, format, and dataspace of the surface when OutputConfiguration is created.
    private final Size mConfiguredSize;
    private final int mConfiguredFormat;
    private final int mConfiguredDataspace;
}