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

Commit 7a3bd17d authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Snap for 12565212 from 6ce88de7 to 25Q1-release

Change-Id: Icdbf0ad11ccf6fef84a4fec71c59bf16a9bcf39e
parents 12919ba9 6ce88de7
Loading
Loading
Loading
Loading
+52 −12
Original line number Diff line number Diff line
@@ -22,12 +22,14 @@

#include <camera/camera2/OutputConfiguration.h>
#include <camera/StringUtils.h>
#include <com_android_internal_camera_flags.h>
#include <binder/Parcel.h>
#include <gui/view/Surface.h>
#include <system/camera_metadata.h>
#include <system/graphics.h>
#include <utils/String8.h>

namespace flags = com::android::internal::camera::flags;

namespace android {

@@ -95,7 +97,21 @@ int OutputConfiguration::getTimestampBase() const {
    return mTimestampBase;
}

int OutputConfiguration::getMirrorMode() const {
int OutputConfiguration::getMirrorMode(sp<IGraphicBufferProducer> surface) const {
    if (!flags::mirror_mode_shared_surfaces()) {
        return mMirrorMode;
    }

    // Use per-producer mirror mode if available.
    for (size_t i = 0; i < mGbps.size(); i++) {
        if (mGbps[i] == surface) {
            return mMirrorModeForProducers[i];
        }
    }

    // For surface that doesn't belong to this output configuration, use
    // mMirrorMode as default.
    ALOGW("%s: Surface doesn't belong to this OutputConfiguration!", __FUNCTION__);
    return mMirrorMode;
}

@@ -251,6 +267,12 @@ status_t OutputConfiguration::readFromParcel(const android::Parcel* parcel) {
        return err;
    }

    std::vector<int> mirrorModeForProducers;
    if ((err = parcel->readInt32Vector(&mirrorModeForProducers)) != OK) {
        ALOGE("%s: Failed to read mirroring mode for surfaces from parcel", __FUNCTION__);
        return err;
    }

    int useReadoutTimestamp = 0;
    if ((err = parcel->readInt32(&useReadoutTimestamp)) != OK) {
        ALOGE("%s: Failed to read useReadoutTimestamp flag from parcel", __FUNCTION__);
@@ -286,6 +308,7 @@ status_t OutputConfiguration::readFromParcel(const android::Parcel* parcel) {
    mStreamUseCase = streamUseCase;
    mTimestampBase = timestampBase;
    mMirrorMode = mirrorMode;
    mMirrorModeForProducers = std::move(mirrorModeForProducers);
    mUseReadoutTimestamp = useReadoutTimestamp != 0;
    for (auto& surface : surfaceShims) {
        ALOGV("%s: OutputConfiguration: %p, name %s", __FUNCTION__,
@@ -409,6 +432,9 @@ status_t OutputConfiguration::writeToParcel(android::Parcel* parcel) const {
    err = parcel->writeInt32(mMirrorMode);
    if (err != OK) return err;

    err = parcel->writeInt32Vector(mMirrorModeForProducers);
    if (err != OK) return err;

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

@@ -438,6 +464,20 @@ static bool simpleVectorsEqual(T first, T second) {
    return true;
}

template <typename T>
static bool simpleVectorsLessThan(T first, T second) {
    if (first.size() != second.size()) {
        return first.size() < second.size();
    }

    for (size_t i = 0; i < first.size(); i++) {
        if (first[i] != second[i]) {
            return first[i] < second[i];
        }
    }
    return false;
}

bool OutputConfiguration::gbpsEqual(const OutputConfiguration& other) const {
    const std::vector<sp<IGraphicBufferProducer> >& otherGbps =
            other.getGraphicBufferProducers();
@@ -449,20 +489,20 @@ bool OutputConfiguration::sensorPixelModesUsedEqual(const OutputConfiguration& o
    return simpleVectorsEqual(othersensorPixelModesUsed, mSensorPixelModesUsed);
}

bool OutputConfiguration::sensorPixelModesUsedLessThan(const OutputConfiguration& other) const {
    const std::vector<int32_t>& spms = other.getSensorPixelModesUsed();
bool OutputConfiguration::mirrorModesEqual(const OutputConfiguration& other) const {
    const std::vector<int>& otherMirrorModes = other.getMirrorModes();
    return simpleVectorsEqual(otherMirrorModes, mMirrorModeForProducers);

    if (mSensorPixelModesUsed.size() !=  spms.size()) {
        return mSensorPixelModesUsed.size() < spms.size();
}

    for (size_t i = 0; i < spms.size(); i++) {
        if (mSensorPixelModesUsed[i] != spms[i]) {
            return mSensorPixelModesUsed[i] < spms[i];
        }
bool OutputConfiguration::sensorPixelModesUsedLessThan(const OutputConfiguration& other) const {
    const std::vector<int32_t>& spms = other.getSensorPixelModesUsed();
    return simpleVectorsLessThan(mSensorPixelModesUsed, spms);
}

    return false;
bool OutputConfiguration::mirrorModesLessThan(const OutputConfiguration& other) const {
    const std::vector<int>& otherMirrorModes = other.getMirrorModes();
    return simpleVectorsLessThan(mMirrorModeForProducers, otherMirrorModes);
}

bool OutputConfiguration::gbpsLessThan(const OutputConfiguration& other) const {
+8 −0
Original line number Diff line number Diff line
@@ -178,3 +178,11 @@ flag {
    description: "Pass the full AttributionSource chain to PermissionChecker"
    bug: "190657833"
}

flag {
    namespace: "camera_platform"
    name: "mirror_mode_shared_surfaces"
    is_exported: true
    description: "Support setting and getting mirror mode for shared surfaces"
    bug: "298899993"
}
+9 −1
Original line number Diff line number Diff line
@@ -72,7 +72,7 @@ public:
    bool                       isMultiResolution() const;
    int64_t                    getStreamUseCase() const;
    int                        getTimestampBase() const;
    int                        getMirrorMode() const;
    int                        getMirrorMode(sp<IGraphicBufferProducer> surface) const;
    bool                       useReadoutTimestamp() const;
    int                        getFormat() const;
    int                        getDataspace() const;
@@ -125,6 +125,7 @@ public:
                mStreamUseCase == other.mStreamUseCase &&
                mTimestampBase == other.mTimestampBase &&
                mMirrorMode == other.mMirrorMode &&
                mirrorModesEqual(other) &&
                mUseReadoutTimestamp == other.mUseReadoutTimestamp &&
                mFormat == other.mFormat &&
                mDataspace == other.mDataspace &&
@@ -180,6 +181,9 @@ public:
        if (mMirrorMode != other.mMirrorMode) {
            return mMirrorMode < other.mMirrorMode;
        }
        if (!mirrorModesEqual(other)) {
            return mirrorModesLessThan(other);
        }
        if (mUseReadoutTimestamp != other.mUseReadoutTimestamp) {
            return mUseReadoutTimestamp < other.mUseReadoutTimestamp;
        }
@@ -204,6 +208,9 @@ public:
    bool sensorPixelModesUsedLessThan(const OutputConfiguration& other) const;
    bool gbpsLessThan(const OutputConfiguration& other) const;
    void addGraphicProducer(sp<IGraphicBufferProducer> gbp) {mGbps.push_back(gbp);}
    bool mirrorModesEqual(const OutputConfiguration& other) const;
    bool mirrorModesLessThan(const OutputConfiguration& other) const;
    const std::vector<int32_t>& getMirrorModes() const {return mMirrorModeForProducers;}
private:
    std::vector<sp<IGraphicBufferProducer>> mGbps;
    int                        mRotation;
@@ -221,6 +228,7 @@ private:
    int64_t                    mStreamUseCase;
    int                        mTimestampBase;
    int                        mMirrorMode;
    std::vector<int>           mMirrorModeForProducers; // 1:1 mapped with mGbps
    bool                       mUseReadoutTimestamp;
    int                        mFormat;
    int                        mDataspace;
+4 −1
Original line number Diff line number Diff line
@@ -120,7 +120,10 @@ void C2OutputConfigurationFuzzer::invokeC2OutputConfigFuzzer() {
                [&]() { outputConfiguration->getColorSpace(); },
                [&]() { outputConfiguration->getStreamUseCase(); },
                [&]() { outputConfiguration->getTimestampBase(); },
                [&]() { outputConfiguration->getMirrorMode(); },
                [&]() {
                    sp<IGraphicBufferProducer> gbp = createIGraphicBufferProducer();
                    outputConfiguration->getMirrorMode(gbp);
                },
                [&]() { outputConfiguration->useReadoutTimestamp(); },
        });
        callC2OutputConfAPIs();
+4 −32
Original line number Diff line number Diff line
@@ -3560,26 +3560,8 @@ void PlaybackThread::threadLoop_removeTracks(

void PlaybackThread::checkSilentMode_l()
{
    if (!mMasterMute) {
        char value[PROPERTY_VALUE_MAX];
        if (mOutDeviceTypeAddrs.empty()) {
            ALOGD("ro.audio.silent is ignored since no output device is set");
            return;
        }
        if (isSingleDeviceType(outDeviceTypes_l(), AUDIO_DEVICE_OUT_REMOTE_SUBMIX)) {
            ALOGD("ro.audio.silent will be ignored for threads on AUDIO_DEVICE_OUT_REMOTE_SUBMIX");
            return;
        }
        if (property_get("ro.audio.silent", value, "0") > 0) {
            char *endptr;
            unsigned long ul = strtoul(value, &endptr, 0);
            if (*endptr == '\0' && ul != 0) {
                ALOGW("%s: mute from ro.audio.silent. Silence is golden", __func__);
                // The setprop command will not allow a property to be changed after
                // the first time it is set, so we don't have to worry about un-muting.
                setMasterMute_l(true);
            }
        }
    if (property_get_bool("ro.audio.silent", false)) {
        ALOGW("ro.audio.silent is now ignored");
    }
}

@@ -11438,18 +11420,8 @@ ThreadBase::MetadataUpdate MmapPlaybackThread::updateMetadata_l()

void MmapPlaybackThread::checkSilentMode_l()
{
    if (!mMasterMute) {
        char value[PROPERTY_VALUE_MAX];
        if (property_get("ro.audio.silent", value, "0") > 0) {
            char *endptr;
            unsigned long ul = strtoul(value, &endptr, 0);
            if (*endptr == '\0' && ul != 0) {
                ALOGW("%s: mute from ro.audio.silent. Silence is golden", __func__);
                // The setprop command will not allow a property to be changed after
                // the first time it is set, so we don't have to worry about un-muting.
                setMasterMute_l(true);
            }
        }
    if (property_get_bool("ro.audio.silent", false)) {
        ALOGW("ro.audio.silent is now ignored");
    }
}

Loading