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

Commit 83bff12e authored by Shuzhen Wang's avatar Shuzhen Wang
Browse files

Camera: Add support for multi-resolution input and output streams

1. Add support for multi-resolution image reader
2. Add support for multi-resolution reprocessing
3. Support the up-reved HAL provider and device interfaces

Test: Camera CTS
Bug: 156254356
Change-Id: Ifb9befb6b12d76ec9ecdda4dbbdc853a4cd54a83
parent ab8e76c8
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -119,10 +119,11 @@ interface ICameraDeviceUser
     * @param width Width of the input buffers
     * @param height Height of the input buffers
     * @param format Format of the input buffers. One of HAL_PIXEL_FORMAT_*.
     * @param isMultiResolution Whether the input stream supports variable resolution image.
     *
     * @return new stream ID
     */
    int createInputStream(int width, int height, int format);
    int createInputStream(int width, int height, int format, boolean isMultiResolution);

    /**
     * Get the surface of the input stream.
+20 −4
Original line number Diff line number Diff line
@@ -68,6 +68,10 @@ String16 OutputConfiguration::getPhysicalCameraId() const {
    return mPhysicalCameraId;
}

bool OutputConfiguration::isMultiResolution() const {
    return mIsMultiResolution;
}

OutputConfiguration::OutputConfiguration() :
        mRotation(INVALID_ROTATION),
        mSurfaceSetID(INVALID_SET_ID),
@@ -75,7 +79,8 @@ OutputConfiguration::OutputConfiguration() :
        mWidth(0),
        mHeight(0),
        mIsDeferred(false),
        mIsShared(false) {
        mIsShared(false),
        mIsMultiResolution(false) {
}

OutputConfiguration::OutputConfiguration(const android::Parcel& parcel) :
@@ -145,6 +150,12 @@ status_t OutputConfiguration::readFromParcel(const android::Parcel* parcel) {

    parcel->readString16(&mPhysicalCameraId);

    int isMultiResolution = 0;
    if ((err = parcel->readInt32(&isMultiResolution)) != OK) {
        ALOGE("%s: Failed to read surface isMultiResolution flag from parcel", __FUNCTION__);
        return err;
    }

    mRotation = rotation;
    mSurfaceSetID = setID;
    mSurfaceType = surfaceType;
@@ -152,6 +163,7 @@ status_t OutputConfiguration::readFromParcel(const android::Parcel* parcel) {
    mHeight = height;
    mIsDeferred = isDeferred != 0;
    mIsShared = isShared != 0;
    mIsMultiResolution = isMultiResolution != 0;
    for (auto& surface : surfaceShims) {
        ALOGV("%s: OutputConfiguration: %p, name %s", __FUNCTION__,
                surface.graphicBufferProducer.get(),
@@ -160,8 +172,8 @@ status_t OutputConfiguration::readFromParcel(const android::Parcel* parcel) {
    }

    ALOGV("%s: OutputConfiguration: rotation = %d, setId = %d, surfaceType = %d,"
          " physicalCameraId = %s", __FUNCTION__, mRotation, mSurfaceSetID,
          mSurfaceType, String8(mPhysicalCameraId).string());
          " physicalCameraId = %s, isMultiResolution = %d", __FUNCTION__, mRotation,
          mSurfaceSetID, mSurfaceType, String8(mPhysicalCameraId).string(), mIsMultiResolution);

    return err;
}
@@ -175,6 +187,7 @@ OutputConfiguration::OutputConfiguration(sp<IGraphicBufferProducer>& gbp, int ro
    mIsDeferred = false;
    mIsShared = isShared;
    mPhysicalCameraId = physicalId;
    mIsMultiResolution = false;
}

OutputConfiguration::OutputConfiguration(
@@ -183,7 +196,7 @@ OutputConfiguration::OutputConfiguration(
    int width, int height, bool isShared)
  : mGbps(gbps), mRotation(rotation), mSurfaceSetID(surfaceSetID), mSurfaceType(surfaceType),
    mWidth(width), mHeight(height), mIsDeferred(false), mIsShared(isShared),
    mPhysicalCameraId(physicalCameraId) { }
    mPhysicalCameraId(physicalCameraId), mIsMultiResolution(false) { }

status_t OutputConfiguration::writeToParcel(android::Parcel* parcel) const {

@@ -224,6 +237,9 @@ status_t OutputConfiguration::writeToParcel(android::Parcel* parcel) const {
    err = parcel->writeString16(mPhysicalCameraId);
    if (err != OK) return err;

    err = parcel->writeInt32(mIsMultiResolution ? 1 : 0);
    if (err != OK) return err;

    return OK;
}

+10 −0
Original line number Diff line number Diff line
@@ -55,6 +55,12 @@ status_t SessionConfiguration::readFromParcel(const android::Parcel* parcel) {
        return err;
    }

    bool inputIsMultiResolution = false;
    if ((err = parcel->readBool(&inputIsMultiResolution)) != OK) {
        ALOGE("%s: Failed to read input multi-resolution flag from parcel", __FUNCTION__);
        return err;
    }

    std::vector<OutputConfiguration> outputStreams;
    if ((err = parcel->readParcelableVector(&outputStreams)) != OK) {
        ALOGE("%s: Failed to read output configurations from parcel", __FUNCTION__);
@@ -65,6 +71,7 @@ status_t SessionConfiguration::readFromParcel(const android::Parcel* parcel) {
    mInputWidth = inputWidth;
    mInputHeight = inputHeight;
    mInputFormat = inputFormat;
    mInputIsMultiResolution = inputIsMultiResolution;
    for (auto& stream : outputStreams) {
        mOutputStreams.push_back(stream);
    }
@@ -90,6 +97,9 @@ status_t SessionConfiguration::writeToParcel(android::Parcel* parcel) const {
    err = parcel->writeInt32(mInputFormat);
    if (err != OK) return err;

    err = parcel->writeBool(mInputIsMultiResolution);
    if (err != OK) return err;

    err = parcel->writeParcelableVector(mOutputStreams);
    if (err != OK) return err;

+1 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ cc_binary {
        "android.hardware.camera.provider@2.4",
        "android.hardware.camera.provider@2.5",
        "android.hardware.camera.provider@2.6",
        "android.hardware.camera.provider@2.7",
        "android.hardware.camera.device@1.0",
        "android.hardware.camera.device@3.2",
        "android.hardware.camera.device@3.4",
+8 −1
Original line number Diff line number Diff line
@@ -47,6 +47,8 @@ public:
    bool                       isDeferred() const;
    bool                       isShared() const;
    String16                   getPhysicalCameraId() const;
    bool                       isMultiResolution() const;

    /**
     * Keep impl up-to-date with OutputConfiguration.java in frameworks/base
     */
@@ -83,7 +85,8 @@ public:
                mIsDeferred == other.mIsDeferred &&
                mIsShared == other.mIsShared &&
                gbpsEqual(other) &&
                mPhysicalCameraId == other.mPhysicalCameraId );
                mPhysicalCameraId == other.mPhysicalCameraId &&
                mIsMultiResolution == other.mIsMultiResolution);
    }
    bool operator != (const OutputConfiguration& other) const {
        return !(*this == other);
@@ -114,6 +117,9 @@ public:
        if (mPhysicalCameraId != other.mPhysicalCameraId) {
            return mPhysicalCameraId < other.mPhysicalCameraId;
        }
        if (mIsMultiResolution != other.mIsMultiResolution) {
            return mIsMultiResolution < other.mIsMultiResolution;
        }
        return gbpsLessThan(other);
    }
    bool operator > (const OutputConfiguration& other) const {
@@ -133,6 +139,7 @@ private:
    bool                       mIsDeferred;
    bool                       mIsShared;
    String16                   mPhysicalCameraId;
    bool                       mIsMultiResolution;
};
} // namespace params
} // namespace camera2
Loading