av1encoder: Implment CQ bitrate control mode
According to CDD CQ mode will be required for AVIF encoding
Test: atest testAllAdvertisedVideoEncoderBitrateModes
Bug: b/268566107
Change-Id: I0c17850e5ce2d63d39b56f869250483373aa0f91
diff --git a/media/codec2/components/aom/C2SoftAomEnc.cpp b/media/codec2/components/aom/C2SoftAomEnc.cpp
index 66cdc62..9102a97 100644
--- a/media/codec2/components/aom/C2SoftAomEnc.cpp
+++ b/media/codec2/components/aom/C2SoftAomEnc.cpp
@@ -64,7 +64,8 @@
0u, C2Config::BITRATE_VARIABLE))
.withFields({C2F(mBitrateMode, value)
.oneOf({C2Config::BITRATE_CONST,
- C2Config::BITRATE_VARIABLE})})
+ C2Config::BITRATE_VARIABLE,
+ C2Config::BITRATE_IGNORE})})
.withSetter(Setter<decltype(*mBitrateMode)>::StrictValueWithNoDeps)
.build());
@@ -87,6 +88,12 @@
.withSetter(BitrateSetter)
.build());
+ addParameter(DefineParam(mQuality, C2_PARAMKEY_QUALITY)
+ .withDefault(new C2StreamQualityTuning::output(0u, 80))
+ .withFields({C2F(mQuality, value).inRange(0, 100)})
+ .withSetter(Setter<decltype(*mQuality)>::NonStrictValueWithNoDeps)
+ .build());
+
addParameter(DefineParam(mIntraRefresh, C2_PARAMKEY_INTRA_REFRESH)
.withConstValue(new C2StreamIntraRefreshTuning::output(
0u, C2Config::INTRA_REFRESH_DISABLED, 0.))
@@ -293,6 +300,12 @@
return onStop();
}
+// c2Quality is in range of 0-100 (the more - the better),
+// for AOM quality we are using a range of 15-50 (the less - the better)
+static int MapC2QualityToAOMQuality (int c2Quality) {
+ return 15 + 35 * (100 - c2Quality) / 100;
+}
+
aom_codec_err_t C2SoftAomEnc::setupCodecParameters() {
aom_codec_err_t codec_return = AOM_CODEC_OK;
@@ -391,6 +404,15 @@
codec_return = aom_codec_control(mCodecContext, AV1E_SET_MAX_REFERENCE_FRAMES, 3);
if (codec_return != AOM_CODEC_OK) goto BailOut;
+ if (mBitrateControlMode == AOM_Q) {
+ const int aomCQLevel = MapC2QualityToAOMQuality(mQuality->value);
+ ALOGV("Set Q from %d to CQL %d",
+ mQuality->value, aomCQLevel);
+
+ codec_return = aom_codec_control(mCodecContext, AOME_SET_CQ_LEVEL, aomCQLevel);
+ if (codec_return != AOM_CODEC_OK) goto BailOut;
+ }
+
ColorAspects sfAspects;
if (!C2Mapper::map(mColorAspects->primaries, &sfAspects.mPrimaries)) {
sfAspects.mPrimaries = android::ColorAspects::PrimariesUnspecified;
@@ -438,6 +460,7 @@
mIntraRefresh = mIntf->getIntraRefresh_l();
mRequestSync = mIntf->getRequestSync_l();
mColorAspects = mIntf->getCodedColorAspects_l();
+ mQuality = mIntf->getQuality_l();
}
@@ -445,6 +468,9 @@
case C2Config::BITRATE_CONST:
mBitrateControlMode = AOM_CBR;
break;
+ case C2Config::BITRATE_IGNORE:
+ mBitrateControlMode = AOM_Q;
+ break;
case C2Config::BITRATE_VARIABLE:
[[fallthrough]];
default:
@@ -484,7 +510,7 @@
mCodecConfiguration->g_timebase.den = 1000000;
// rc_target_bitrate is in kbps, mBitrate in bps
mCodecConfiguration->rc_target_bitrate = (mBitrate->value + 500) / 1000;
- mCodecConfiguration->rc_end_usage = AOM_CBR;
+ mCodecConfiguration->rc_end_usage = mBitrateControlMode == AOM_Q ? AOM_Q : AOM_CBR;
// Disable frame drop - not allowed in MediaCodec now.
mCodecConfiguration->rc_dropframe_thresh = 0;
// Disable lagged encoding.