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

Commit 69f64a81 authored by Ray Essick's avatar Ray Essick Committed by Automerger Merge Worker
Browse files

Rework how QP bounds are passed am: a9a724a0

Original change: https://android-review.googlesource.com/c/platform/frameworks/av/+/1651748

Change-Id: I68dfa0d7d74cffba802f3d247484200f56d4f421
parents ebb89834 a9a724a0
Loading
Loading
Loading
Loading
+26 −33
Original line number Diff line number Diff line
@@ -187,7 +187,7 @@ enum C2ParamIndexKind : C2Param::type_index_t {
    kParamIndexPictureType,
    kParamIndexHdr10PlusMetadata,

    kParamIndexQuantization,
    kParamIndexPictureQuantization,

    /* ------------------------------------ video components ------------------------------------ */

@@ -710,38 +710,6 @@ typedef C2StreamParam<C2Info, C2ProfileLevelStruct, kParamIndexProfileLevel>
        C2StreamProfileLevelInfo;
constexpr char C2_PARAMKEY_PROFILE_LEVEL[] = "coded.pl";

struct C2QuantizationStruct {
    int32_t iMax;  ///< max/min for I frames
    int32_t iMin;
    int32_t pMax;  ///< max/min for P frames
    int32_t pMin;
    int32_t bMax;  ///< max/min for B frames
    int32_t bMin;

    C2QuantizationStruct(
            int32_t iMax_ = INT32_MAX,
            int32_t iMin_ = INT32_MIN,
            int32_t pMax_ = INT32_MAX,
            int32_t pMin_ = INT32_MIN,
            int32_t bMax_ = INT32_MAX,
            int32_t bMin_ = INT32_MIN)
        : iMax(iMax_), iMin(iMin_),
          pMax(pMax_), pMin(pMin_),
          bMax(bMax_), bMin(bMin_) { }

    DEFINE_AND_DESCRIBE_C2STRUCT(Quantization)          // reference?
    C2FIELD(iMax, "i-max")
    C2FIELD(iMin, "i-min")
    C2FIELD(pMax, "p-max")
    C2FIELD(pMin, "p-min")
    C2FIELD(bMax, "b-max")
    C2FIELD(bMin, "b-min")
};

typedef C2StreamParam<C2Info, C2QuantizationStruct, kParamIndexQuantization>
        C2StreamQuantizationInfo;
constexpr char C2_PARAMKEY_QUANTIZATION[] = "coded.qp";

/**
 * Codec-specific initialization data.
 *
@@ -1732,6 +1700,31 @@ typedef C2StreamParam<C2Tuning, C2SimpleArrayStruct<C2GopLayerStruct>, kParamInd
        C2StreamGopTuning;
constexpr char C2_PARAMKEY_GOP[] = "coding.gop";

/**
 * Quantization
 * min/max for each picture type
 *
 */
struct C2PictureQuantizationStruct {
    C2PictureQuantizationStruct() : type_((C2Config::picture_type_t)0),
                                         min(INT32_MIN), max(INT32_MAX) {}
    C2PictureQuantizationStruct(C2Config::picture_type_t type, int32_t min_, int32_t max_)
        : type_(type), min(min_), max(max_) { }

    C2Config::picture_type_t type_;
    int32_t min;      // INT32_MIN == 'no lower bound specified'
    int32_t max;      // INT32_MAX == 'no upper bound specified'

    DEFINE_AND_DESCRIBE_C2STRUCT(PictureQuantization)
    C2FIELD(type_, "type")
    C2FIELD(min, "min")
    C2FIELD(max, "max")
};

typedef C2StreamParam<C2Tuning, C2SimpleArrayStruct<C2PictureQuantizationStruct>,
        kParamIndexPictureQuantization> C2StreamPictureQuantizationTuning;
constexpr char C2_PARAMKEY_PICTURE_QUANTIZATION[] = "coding.qp";

/**
 * Sync frame can be requested on demand by the client.
 *
+39 −0
Original line number Diff line number Diff line
@@ -1095,6 +1095,45 @@ void CCodec::configure(const sp<AMessage> &msg) {
            configUpdate.push_back(std::move(gop));
        }

        if ((config->mDomain & Config::IS_ENCODER)
                && (config->mDomain & Config::IS_VIDEO)) {
            // we may not use all 3 of these entries
            std::unique_ptr<C2StreamPictureQuantizationTuning::output> qp =
                C2StreamPictureQuantizationTuning::output::AllocUnique(3 /* flexCount */,
                                                                       0u /* stream */);

            int ix = 0;

            int32_t iMax = INT32_MAX;
            int32_t iMin = INT32_MIN;
            (void) sdkParams->findInt32(KEY_VIDEO_QP_I_MAX, &iMax);
            (void) sdkParams->findInt32(KEY_VIDEO_QP_I_MIN, &iMin);
            if (iMax != INT32_MAX || iMin != INT32_MIN) {
                qp->m.values[ix++] = {I_FRAME, iMin, iMax};
            }

            int32_t pMax = INT32_MAX;
            int32_t pMin = INT32_MIN;
            (void) sdkParams->findInt32(KEY_VIDEO_QP_P_MAX, &pMax);
            (void) sdkParams->findInt32(KEY_VIDEO_QP_P_MIN, &pMin);
            if (pMax != INT32_MAX || pMin != INT32_MIN) {
                qp->m.values[ix++] = {P_FRAME, pMin, pMax};
            }

            int32_t bMax = INT32_MAX;
            int32_t bMin = INT32_MIN;
            (void) sdkParams->findInt32(KEY_VIDEO_QP_B_MAX, &bMax);
            (void) sdkParams->findInt32(KEY_VIDEO_QP_B_MIN, &bMin);
            if (bMax != INT32_MAX || bMin != INT32_MIN) {
                qp->m.values[ix++] = {B_FRAME, bMin, bMax};
            }

            // adjust to reflect actual use.
            qp->setFlexCount(ix);

            configUpdate.push_back(std::move(qp));
        }

        err = config->setParameters(comp, configUpdate, C2_DONT_BLOCK);
        if (err != OK) {
            ALOGW("failed to configure c2 params");
+0 −13
Original line number Diff line number Diff line
@@ -730,19 +730,6 @@ void CCodecConfig::initializeStandardParams() {
            return C2Value();
        }));

    add(ConfigMapper(KEY_VIDEO_QP_I_MAX, C2_PARAMKEY_QUANTIZATION, "i-max")
        .limitTo(D::VIDEO & D::ENCODER));
    add(ConfigMapper(KEY_VIDEO_QP_I_MIN, C2_PARAMKEY_QUANTIZATION, "i-min")
        .limitTo(D::VIDEO & D::ENCODER));
    add(ConfigMapper(KEY_VIDEO_QP_P_MAX, C2_PARAMKEY_QUANTIZATION, "p-max")
        .limitTo(D::VIDEO & D::ENCODER));
    add(ConfigMapper(KEY_VIDEO_QP_P_MIN, C2_PARAMKEY_QUANTIZATION, "p-min")
        .limitTo(D::VIDEO & D::ENCODER));
    add(ConfigMapper(KEY_VIDEO_QP_B_MAX, C2_PARAMKEY_QUANTIZATION, "b-max")
        .limitTo(D::VIDEO & D::ENCODER));
    add(ConfigMapper(KEY_VIDEO_QP_B_MIN, C2_PARAMKEY_QUANTIZATION, "b-min")
        .limitTo(D::VIDEO & D::ENCODER));

    // convert to dBFS and add default
    add(ConfigMapper(KEY_AAC_DRC_TARGET_REFERENCE_LEVEL, C2_PARAMKEY_DRC_TARGET_REFERENCE_LEVEL, "value")
        .limitTo(D::AUDIO & D::DECODER & (D::CONFIG | D::PARAM | D::READ))