AV1 Encoder: implement complexity setting
KEY_COMPLEXITY implementation allows to balance performance with
qaulity. Default is least complex to maintain performance
Bug: b/268566107
Test: atest VideoEncoerDecoderTest
Change-Id: Icd0cf47a671a8ed65b3f4992349ab99792e050f4
diff --git a/media/codec2/components/aom/C2SoftAomEnc.cpp b/media/codec2/components/aom/C2SoftAomEnc.cpp
index 81c593f..59cad9d 100644
--- a/media/codec2/components/aom/C2SoftAomEnc.cpp
+++ b/media/codec2/components/aom/C2SoftAomEnc.cpp
@@ -88,6 +88,12 @@
.withSetter(BitrateSetter)
.build());
+ addParameter(DefineParam(mComplexity, C2_PARAMKEY_COMPLEXITY)
+ .withDefault(new C2StreamComplexityTuning::output(0u, 0))
+ .withFields({C2F(mComplexity, value).inRange(0, 5)})
+ .withSetter(Setter<decltype(*mComplexity)>::NonStrictValueWithNoDeps)
+ .build());
+
addParameter(DefineParam(mQuality, C2_PARAMKEY_QUALITY)
.withDefault(new C2StreamQualityTuning::output(0u, 80))
.withFields({C2F(mQuality, value).inRange(0, 100)})
@@ -306,10 +312,20 @@
return 15 + 35 * (100 - c2Quality) / 100;
}
+static int MapC2ComplexityToAOMSpeed (int c2Complexity) {
+ int mapping[6] = {10, 9, 8, 7, 6, 6};
+ if (c2Complexity > 5 || c2Complexity < 0) {
+ ALOGW("Wrong complexity setting. Falling back to speed 10");
+ return 10;
+ }
+ return mapping[c2Complexity];
+}
+
aom_codec_err_t C2SoftAomEnc::setupCodecParameters() {
aom_codec_err_t codec_return = AOM_CODEC_OK;
- codec_return = aom_codec_control(mCodecContext, AOME_SET_CPUUSED, DEFAULT_SPEED);
+ codec_return = aom_codec_control(mCodecContext, AOME_SET_CPUUSED,
+ MapC2ComplexityToAOMSpeed(mComplexity->value));
if (codec_return != AOM_CODEC_OK) goto BailOut;
codec_return = aom_codec_control(mCodecContext, AV1E_SET_ROW_MT, 1);
@@ -461,6 +477,7 @@
mRequestSync = mIntf->getRequestSync_l();
mColorAspects = mIntf->getCodedColorAspects_l();
mQuality = mIntf->getQuality_l();
+ mComplexity = mIntf->getComplexity_l();
}
@@ -481,9 +498,9 @@
mCodecInterface = aom_codec_av1_cx();
if (!mCodecInterface) goto CleanUp;
- ALOGD("AOM: initEncoder. BRMode: %u. KF: %u. QP: %u - %u, 10Bit: %d",
+ ALOGD("AOM: initEncoder. BRMode: %u. KF: %u. QP: %u - %u, 10Bit: %d, comlexity %d",
(uint32_t)mBitrateControlMode,
- mIntf->getSyncFramePeriod(), mMinQuantizer, mMaxQuantizer, mIs10Bit);
+ mIntf->getSyncFramePeriod(), mMinQuantizer, mMaxQuantizer, mIs10Bit, mComplexity->value);
mCodecConfiguration = new aom_codec_enc_cfg_t;
if (!mCodecConfiguration) goto CleanUp;