Merge "EffectHalAidl: continue effect processing in DRAINING state" into main
diff --git a/media/codec2/components/apv/C2SoftApvEnc.cpp b/media/codec2/components/apv/C2SoftApvEnc.cpp
index 9c5e0b2..9d84bc7 100644
--- a/media/codec2/components/apv/C2SoftApvEnc.cpp
+++ b/media/codec2/components/apv/C2SoftApvEnc.cpp
@@ -222,6 +222,7 @@
.build());
std::vector<uint32_t> pixelFormats = {
HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED,
+ HAL_PIXEL_FORMAT_YCBCR_420_888,
};
if (isHalPixelFormatSupported((AHardwareBuffer_Format)HAL_PIXEL_FORMAT_YCBCR_P010)) {
pixelFormats.push_back(HAL_PIXEL_FORMAT_YCBCR_P010);
@@ -231,7 +232,7 @@
}
addParameter(DefineParam(mPixelFormat, C2_PARAMKEY_PIXEL_FORMAT)
.withDefault(new C2StreamPixelFormatInfo::input(
- 0u, HAL_PIXEL_FORMAT_YCBCR_P010))
+ 0u, HAL_PIXEL_FORMAT_YCBCR_420_888))
.withFields({C2F(mPixelFormat, value).oneOf({pixelFormats})})
.withSetter((Setter<decltype(*mPixelFormat)>::StrictValueWithNoDeps))
.build());
@@ -272,6 +273,13 @@
if (!me.F(me.v.level).supportsAtAll(me.v.level)) {
me.set().level = LEVEL_APV_1_BAND_0;
}
+
+ int32_t bandIdc = me.v.level <= LEVEL_APV_7_1_BAND_0 ? 0 :
+ me.v.level <= LEVEL_APV_7_1_BAND_1 ? 1 :
+ me.v.level <= LEVEL_APV_7_1_BAND_2 ? 2 : 3;
+
+ me.set().level = decisionApvLevel(size.v.width, size.v.height, frameRate.v.value,
+ (uint64_t)bitrate.v.value, bandIdc);
return C2R::Ok();
}
@@ -302,6 +310,119 @@
return C2R::Ok();
}
+ static C2Config::level_t decisionApvLevel(int32_t width, int32_t height, int32_t fps,
+ uint64_t bitrate, int32_t band) {
+ C2Config::level_t level = C2Config::LEVEL_APV_1_BAND_0;
+ struct LevelLimits {
+ C2Config::level_t level;
+ uint64_t samplesPerSec;
+ uint64_t kbpsOfBand;
+ };
+
+ constexpr LevelLimits kLimitsBand0[] = {
+ {LEVEL_APV_1_BAND_0, 3'041'280, 7'000},
+ {LEVEL_APV_1_1_BAND_0, 6'082'560, 14'000},
+ {LEVEL_APV_2_BAND_0, 15'667'200, 36'000},
+ {LEVEL_APV_2_1_BAND_0, 31'334'400, 71'000},
+ {LEVEL_APV_3_BAND_0, 66'846'720, 101'000},
+ {LEVEL_APV_3_1_BAND_0, 133'693'440, 201'000},
+ {LEVEL_APV_4_BAND_0, 265'420'800, 401'000},
+ {LEVEL_APV_4_1_BAND_0, 530'841'600, 780'000},
+ {LEVEL_APV_5_BAND_0, 1'061'683'200, 1'560'000},
+ {LEVEL_APV_5_1_BAND_0, 2'123'366'400, 3'324'000},
+ {LEVEL_APV_6_BAND_0, 4'777'574'400, 6'648'000},
+ {LEVEL_APV_6_1_BAND_0, 8'493'465'600, 13'296'000},
+ {LEVEL_APV_7_BAND_0, 16'986'931'200, 26'592'000},
+ {LEVEL_APV_7_1_BAND_0, 33'973'862'400, 53'184'000},
+ };
+
+ constexpr LevelLimits kLimitsBand1[] = {
+ {LEVEL_APV_1_BAND_1, 3'041'280, 11'000},
+ {LEVEL_APV_1_1_BAND_1, 6'082'560, 21'000},
+ {LEVEL_APV_2_BAND_1, 15'667'200, 53'000},
+ {LEVEL_APV_2_1_BAND_1, 31'334'400, 106'00},
+ {LEVEL_APV_3_BAND_1, 66'846'720, 151'000},
+ {LEVEL_APV_3_1_BAND_1, 133'693'440, 301'000},
+ {LEVEL_APV_4_BAND_1, 265'420'800, 602'000},
+ {LEVEL_APV_4_1_BAND_1, 530'841'600, 1'170'000},
+ {LEVEL_APV_5_BAND_1, 1'061'683'200, 2'340'000},
+ {LEVEL_APV_5_1_BAND_1, 2'123'366'400, 4'986'000},
+ {LEVEL_APV_6_BAND_1, 4'777'574'400, 9'972'000},
+ {LEVEL_APV_6_1_BAND_1, 8'493'465'600, 19'944'000},
+ {LEVEL_APV_7_BAND_1, 16'986'931'200, 39'888'000},
+ {LEVEL_APV_7_1_BAND_1, 33'973'862'400, 79'776'000},
+ };
+
+ constexpr LevelLimits kLimitsBand2[] = {
+ {LEVEL_APV_1_BAND_2, 3'041'280, 14'000},
+ {LEVEL_APV_1_1_BAND_2, 6'082'560, 28'000},
+ {LEVEL_APV_2_BAND_2, 15'667'200, 71'000},
+ {LEVEL_APV_2_1_BAND_2, 31'334'400, 141'000},
+ {LEVEL_APV_3_BAND_2, 66'846'720, 201'000},
+ {LEVEL_APV_3_1_BAND_2, 133'693'440, 401'000},
+ {LEVEL_APV_4_BAND_2, 265'420'800, 780'000},
+ {LEVEL_APV_4_1_BAND_2, 530'841'600, 1'560'000},
+ {LEVEL_APV_5_BAND_2, 1'061'683'200, 3'324'000},
+ {LEVEL_APV_5_1_BAND_2, 2'123'366'400, 6'648'000},
+ {LEVEL_APV_6_BAND_2, 4'777'574'400, 13'296'000},
+ {LEVEL_APV_6_1_BAND_2, 8'493'465'600, 26'592'000},
+ {LEVEL_APV_7_BAND_2, 16'986'931'200, 53'184'000},
+ {LEVEL_APV_7_1_BAND_2, 33'973'862'400, 106'368'000},
+ };
+
+ constexpr LevelLimits kLimitsBand3[] = {
+ {LEVEL_APV_1_BAND_3, 3'041'280, 21'000},
+ {LEVEL_APV_1_1_BAND_3, 6'082'560, 42'000},
+ {LEVEL_APV_2_BAND_3, 15'667'200, 106'000},
+ {LEVEL_APV_2_1_BAND_3, 31'334'400, 212'000},
+ {LEVEL_APV_3_BAND_3, 66'846'720, 301'000},
+ {LEVEL_APV_3_1_BAND_3, 133'693'440, 602'000},
+ {LEVEL_APV_4_BAND_3, 265'420'800, 1'170'000},
+ {LEVEL_APV_4_1_BAND_3, 530'841'600, 2'340'000},
+ {LEVEL_APV_5_BAND_3, 1'061'683'200, 4'986'000},
+ {LEVEL_APV_5_1_BAND_3, 2'123'366'400, 9'972'000},
+ {LEVEL_APV_6_BAND_3, 4'777'574'400, 19'944'000},
+ {LEVEL_APV_6_1_BAND_3, 8'493'465'600, 39'888'000},
+ {LEVEL_APV_7_BAND_3, 16'986'931'200, 79'776'000},
+ {LEVEL_APV_7_1_BAND_3, 33'973'862'400, 159'552'000},
+ };
+
+ uint64_t samplesPerSec = width * height * fps;
+ if (band == 0) {
+ for (const LevelLimits& limit : kLimitsBand0) {
+ if (samplesPerSec <= limit.samplesPerSec && bitrate <= limit.kbpsOfBand * 1000) {
+ level = limit.level;
+ break;
+ }
+ }
+ } else if (band == 1) {
+ for (const LevelLimits& limit : kLimitsBand1) {
+ if (samplesPerSec <= limit.samplesPerSec && bitrate <= limit.kbpsOfBand * 1000) {
+ level = limit.level;
+ break;
+ }
+ }
+ } else if (band == 2) {
+ for (const LevelLimits& limit : kLimitsBand2) {
+ if (samplesPerSec <= limit.samplesPerSec && bitrate <= limit.kbpsOfBand * 1000) {
+ level = limit.level;
+ break;
+ }
+ }
+ } else if (band == 3) {
+ for (const LevelLimits& limit : kLimitsBand3) {
+ if (samplesPerSec <= limit.samplesPerSec && bitrate <= limit.kbpsOfBand * 1000) {
+ level = limit.level;
+ break;
+ }
+ }
+ } else {
+ ALOGE("Invalid band_idc on calculte level");
+ }
+
+ return level;
+ }
+
uint32_t getProfile_l() const {
int32_t profile = PROFILE_UNUSED;
@@ -328,7 +449,7 @@
profile = 99;
break;
default:
- ALOGD("Unrecognized profile: %x", mProfileLevel->profile);
+ ALOGW("Unrecognized profile: %x", mProfileLevel->profile);
}
return profile;
}
@@ -339,54 +460,264 @@
// TODO: Add Band settings
switch (mProfileLevel->level) {
case C2Config::LEVEL_APV_1_BAND_0:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_1_BAND_1:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_1_BAND_2:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_1_BAND_3:
level = 10;
break;
case C2Config::LEVEL_APV_1_1_BAND_0:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_1_1_BAND_1:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_1_1_BAND_2:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_1_1_BAND_3:
level = 11;
break;
case C2Config::LEVEL_APV_2_BAND_0:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_2_BAND_1:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_2_BAND_2:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_2_BAND_3:
level = 20;
break;
case C2Config::LEVEL_APV_2_1_BAND_0:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_2_1_BAND_1:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_2_1_BAND_2:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_2_1_BAND_3:
level = 21;
break;
case C2Config::LEVEL_APV_3_BAND_0:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_3_BAND_1:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_3_BAND_2:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_3_BAND_3:
level = 30;
break;
case C2Config::LEVEL_APV_3_1_BAND_0:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_3_1_BAND_1:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_3_1_BAND_2:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_3_1_BAND_3:
level = 31;
break;
case C2Config::LEVEL_APV_4_BAND_0:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_4_BAND_1:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_4_BAND_2:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_4_BAND_3:
level = 40;
break;
case C2Config::LEVEL_APV_4_1_BAND_0:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_4_1_BAND_1:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_4_1_BAND_2:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_4_1_BAND_3:
level = 41;
break;
case C2Config::LEVEL_APV_5_BAND_0:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_5_BAND_1:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_5_BAND_2:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_5_BAND_3:
level = 50;
break;
case C2Config::LEVEL_APV_5_1_BAND_0:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_5_1_BAND_1:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_5_1_BAND_2:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_5_1_BAND_3:
level = 51;
break;
case C2Config::LEVEL_APV_6_BAND_0:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_6_BAND_1:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_6_BAND_2:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_6_BAND_3:
level = 60;
break;
case C2Config::LEVEL_APV_6_1_BAND_0:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_6_1_BAND_1:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_6_1_BAND_2:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_6_1_BAND_3:
level = 61;
break;
case C2Config::LEVEL_APV_7_BAND_0:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_7_BAND_1:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_7_BAND_2:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_7_BAND_3:
level = 70;
break;
case C2Config::LEVEL_APV_7_1_BAND_0:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_7_1_BAND_1:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_7_1_BAND_2:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_7_1_BAND_3:
level = 71;
break;
default:
- ALOGD("Unrecognized level: %x", mProfileLevel->level);
+ ALOGW("Unrecognized level: %x", mProfileLevel->level);
}
// Convert to APV level_idc according to APV spec
return level * 3;
}
+ uint32_t getBandIdc_l() const {
+ uint32_t bandIdc = 0;
+
+ switch (mProfileLevel->level) {
+ case C2Config::LEVEL_APV_1_BAND_0:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_1_1_BAND_0:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_2_BAND_0:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_2_1_BAND_0:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_3_BAND_0:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_3_1_BAND_0:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_4_BAND_0:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_4_1_BAND_0:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_5_BAND_0:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_5_1_BAND_0:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_6_BAND_0:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_6_1_BAND_0:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_7_BAND_0:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_7_1_BAND_0:
+ bandIdc = 0;
+ break;
+ case C2Config::LEVEL_APV_1_BAND_1:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_1_1_BAND_1:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_2_BAND_1:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_2_1_BAND_1:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_3_BAND_1:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_3_1_BAND_1:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_4_BAND_1:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_4_1_BAND_1:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_5_BAND_1:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_5_1_BAND_1:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_6_BAND_1:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_6_1_BAND_1:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_7_BAND_1:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_7_1_BAND_1:
+ bandIdc = 1;
+ break;
+ case C2Config::LEVEL_APV_1_BAND_2:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_1_1_BAND_2:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_2_BAND_2:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_2_1_BAND_2:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_3_BAND_2:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_3_1_BAND_2:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_4_BAND_2:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_4_1_BAND_2:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_5_BAND_2:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_5_1_BAND_2:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_6_BAND_2:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_6_1_BAND_2:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_7_BAND_2:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_7_1_BAND_2:
+ bandIdc = 2;
+ break;
+ case C2Config::LEVEL_APV_1_BAND_3:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_1_1_BAND_3:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_2_BAND_3:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_2_1_BAND_3:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_3_BAND_3:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_3_1_BAND_3:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_4_BAND_3:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_4_1_BAND_3:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_5_BAND_3:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_5_1_BAND_3:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_6_BAND_3:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_6_1_BAND_3:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_7_BAND_3:
+ [[fallthrough]];
+ case C2Config::LEVEL_APV_7_1_BAND_3:
+ bandIdc = 3;
+ break;
+ default:
+ ALOGW("Unrecognized bandIdc through level: %x", mProfileLevel->level);
+ }
+ return bandIdc;
+ }
+
int32_t getBitrateMode_l() const {
int32_t bitrateMode = C2Config::BITRATE_CONST;
@@ -636,7 +967,7 @@
param.h = mSize->height;
param.fps_num = (int)(mFrameRate->value * 100);
param.fps_den = 100;
- param.bitrate = mBitrate->value / 1000;
+ param.bitrate = (int)(mBitrate->value / 1000);
param.rc_type = mIntf->getBitrateMode_l();
int ApvQP = kApvDefaultQP;
@@ -646,14 +977,8 @@
mQuality->value, ApvQP);
}
param.qp = ApvQP;
- param.band_idc = 0; // TODO: Get from the Level setting
+ param.band_idc = mIntf->getBandIdc_l();
param.profile_idc = mIntf->getProfile_l();
- C2Config::level_t level = decisionApvLevel(
- param.w, param.h, (int)(param.fps_num / param.fps_den), param.bitrate, param.band_idc);
- if (mProfileLevel->level != level) {
- mProfileLevel->level = level;
- ALOGI("Need to update level to %d", mIntf->getLevel_l());
- }
param.level_idc = mIntf->getLevel_l();
}
@@ -750,120 +1075,6 @@
return C2_OK;
}
-C2Config::level_t C2SoftApvEnc::decisionApvLevel(int32_t width, int32_t height, int32_t fps,
- int32_t bitrate, int32_t band) {
- C2Config::level_t level = C2Config::LEVEL_APV_1_BAND_0;
-
- struct LevelLimits {
- C2Config::level_t level;
- uint64_t samplesPerSec;
- uint32_t bitratesOfBand;
- };
-
- constexpr LevelLimits kLimitsBand0[] = {
- {LEVEL_APV_1_BAND_0, 3'041'280, 7'000},
- {LEVEL_APV_1_1_BAND_0, 6'082'560, 14'000},
- {LEVEL_APV_2_BAND_0, 15'667'200, 36'000},
- {LEVEL_APV_2_1_BAND_0, 31'334'400, 71'000},
- {LEVEL_APV_3_BAND_0, 66'846'720, 101'000},
- {LEVEL_APV_3_1_BAND_0, 133'693'440, 201'000},
- {LEVEL_APV_4_BAND_0, 265'420'800, 401'000},
- {LEVEL_APV_4_1_BAND_0, 530'841'600, 780'000},
- {LEVEL_APV_5_BAND_0, 1'061'683'200, 1'560'000},
- {LEVEL_APV_5_1_BAND_0, 2'123'366'400, 3'324'000},
- {LEVEL_APV_6_BAND_0, 4'777'574'400, 6'648'000},
- {LEVEL_APV_6_1_BAND_0, 8'493'465'600, 13'296'000},
- {LEVEL_APV_7_BAND_0, 16'986'931'200, 26'592'000},
- {LEVEL_APV_7_1_BAND_0, 33'973'862'400, 53'184'000},
- };
-
- constexpr LevelLimits kLimitsBand1[] = {
- {LEVEL_APV_1_BAND_1, 3'041'280, 11'000},
- {LEVEL_APV_1_1_BAND_1, 6'082'560, 21'000},
- {LEVEL_APV_2_BAND_1, 15'667'200, 53'000},
- {LEVEL_APV_2_1_BAND_1, 31'334'400, 106'00},
- {LEVEL_APV_3_BAND_1, 66'846'720, 151'000},
- {LEVEL_APV_3_1_BAND_1, 133'693'440, 301'000},
- {LEVEL_APV_4_BAND_1, 265'420'800, 602'000},
- {LEVEL_APV_4_1_BAND_1, 530'841'600, 1'170'000},
- {LEVEL_APV_5_BAND_1, 1'061'683'200, 2'340'000},
- {LEVEL_APV_5_1_BAND_1, 2'123'366'400, 4'986'000},
- {LEVEL_APV_6_BAND_1, 4'777'574'400, 9'972'000},
- {LEVEL_APV_6_1_BAND_1, 8'493'465'600, 19'944'000},
- {LEVEL_APV_7_BAND_1, 16'986'931'200, 39'888'000},
- {LEVEL_APV_7_1_BAND_1, 33'973'862'400, 79'776'000},
- };
-
- constexpr LevelLimits kLimitsBand2[] = {
- {LEVEL_APV_1_BAND_2, 3'041'280, 14'000},
- {LEVEL_APV_1_1_BAND_2, 6'082'560, 28'000},
- {LEVEL_APV_2_BAND_2, 15'667'200, 71'000},
- {LEVEL_APV_2_1_BAND_2, 31'334'400, 141'000},
- {LEVEL_APV_3_BAND_2, 66'846'720, 201'000},
- {LEVEL_APV_3_1_BAND_2, 133'693'440, 401'000},
- {LEVEL_APV_4_BAND_2, 265'420'800, 780'000},
- {LEVEL_APV_4_1_BAND_2, 530'841'600, 1'560'000},
- {LEVEL_APV_5_BAND_2, 1'061'683'200, 3'324'000},
- {LEVEL_APV_5_1_BAND_2, 2'123'366'400, 6'648'000},
- {LEVEL_APV_6_BAND_2, 4'777'574'400, 13'296'000},
- {LEVEL_APV_6_1_BAND_2, 8'493'465'600, 26'592'000},
- {LEVEL_APV_7_BAND_2, 16'986'931'200, 53'184'000},
- {LEVEL_APV_7_1_BAND_2, 33'973'862'400, 106'368'000},
- };
-
- constexpr LevelLimits kLimitsBand3[] = {
- {LEVEL_APV_1_BAND_3, 3'041'280, 21'000},
- {LEVEL_APV_1_1_BAND_3, 6'082'560, 42'000},
- {LEVEL_APV_2_BAND_3, 15'667'200, 106'000},
- {LEVEL_APV_2_1_BAND_3, 31'334'400, 212'000},
- {LEVEL_APV_3_BAND_3, 66'846'720, 301'000},
- {LEVEL_APV_3_1_BAND_3, 133'693'440, 602'000},
- {LEVEL_APV_4_BAND_3, 265'420'800, 1'170'000},
- {LEVEL_APV_4_1_BAND_3, 530'841'600, 2'340'000},
- {LEVEL_APV_5_BAND_3, 1'061'683'200, 4'986'000},
- {LEVEL_APV_5_1_BAND_3, 2'123'366'400, 9'972'000},
- {LEVEL_APV_6_BAND_3, 4'777'574'400, 19'944'000},
- {LEVEL_APV_6_1_BAND_3, 8'493'465'600, 39'888'000},
- {LEVEL_APV_7_BAND_3, 16'986'931'200, 79'776'000},
- {LEVEL_APV_7_1_BAND_3, 33'973'862'400, 159'552'000},
- };
-
- uint64_t samplesPerSec = width * height * fps;
- if (band == 0) {
- for (const LevelLimits& limit : kLimitsBand0) {
- if (samplesPerSec <= limit.samplesPerSec && bitrate <= limit.bitratesOfBand) {
- level = limit.level;
- break;
- }
- }
- } else if (band == 1) {
- for (const LevelLimits& limit : kLimitsBand1) {
- if (samplesPerSec <= limit.samplesPerSec && bitrate <= limit.bitratesOfBand) {
- level = limit.level;
- break;
- }
- }
- } else if (band == 2) {
- for (const LevelLimits& limit : kLimitsBand2) {
- if (samplesPerSec <= limit.samplesPerSec && bitrate <= limit.bitratesOfBand) {
- level = limit.level;
- break;
- }
- }
- } else if (band == 3) {
- for (const LevelLimits& limit : kLimitsBand3) {
- if (samplesPerSec <= limit.samplesPerSec && bitrate <= limit.bitratesOfBand) {
- level = limit.level;
- break;
- }
- }
- } else {
- ALOGE("Invalid band_idc on calculte level");
- }
-
- return level;
-}
-
void C2SoftApvEnc::ColorConvertP010ToYUV422P10le(const C2GraphicView* const input,
oapv_imgb_t* imgb) {
uint32_t width = input->width();
diff --git a/media/codec2/components/apv/C2SoftApvEnc.h b/media/codec2/components/apv/C2SoftApvEnc.h
index fc4ad7d..f281052 100644
--- a/media/codec2/components/apv/C2SoftApvEnc.h
+++ b/media/codec2/components/apv/C2SoftApvEnc.h
@@ -60,8 +60,6 @@
const std::unique_ptr<C2Work>& work);
void setParams(oapve_param_t& param);
int32_t getQpFromQuality(int quality);
- C2Config::level_t decisionApvLevel(int32_t width, int32_t height, int32_t fps, int32_t bitrate,
- int32_t band);
void showEncoderParams(oapve_cdesc_t* cdsc);
diff --git a/media/libeffects/lvm/wrapper/Aidl/BundleContext.cpp b/media/libeffects/lvm/wrapper/Aidl/BundleContext.cpp
index d5e3cf7..5574ea1 100644
--- a/media/libeffects/lvm/wrapper/Aidl/BundleContext.cpp
+++ b/media/libeffects/lvm/wrapper/Aidl/BundleContext.cpp
@@ -90,6 +90,23 @@
}
}
+RetCode BundleContext::setCommon(const Parameter::Common& common) {
+ RetCode ret = EffectContext::setCommon(common);
+ RETURN_VALUE_IF(ret != RetCode::SUCCESS, ret, " setCommonFailed");
+ if (mInstance) {
+ LVM_ControlParams_t params;
+ RETURN_VALUE_IF(LVM_SUCCESS != LVM_GetControlParameters(mInstance, ¶ms),
+ RetCode::ERROR_EFFECT_LIB_ERROR, "failGetControlParams");
+ RETURN_VALUE_IF(RetCode::SUCCESS != applyCommonParameter(params),
+ RetCode::ERROR_EFFECT_LIB_ERROR, " applyCommonParameterFailed");
+ RETURN_VALUE_IF(LVM_SUCCESS != LVM_SetControlParameters(mInstance, ¶ms),
+ RetCode::ERROR_EFFECT_LIB_ERROR, "failSetControlParams");
+ } else {
+ RETURN_VALUE_IF(RetCode::SUCCESS != init(), RetCode::ERROR_EFFECT_LIB_ERROR, " initFailed");
+ }
+ return RetCode::SUCCESS;
+}
+
RetCode BundleContext::enable() {
if (mEnabled) return RetCode::ERROR_ILLEGAL_PARAMETER;
// Bass boost or Virtualizer can be temporarily disabled if playing over device speaker due to
@@ -599,7 +616,7 @@
return ret;
}
-RetCode BundleContext::initControlParameter(LVM_ControlParams_t& params) const {
+RetCode BundleContext::applyCommonParameter(LVM_ControlParams_t& params) const {
int outputChannelCount = ::aidl::android::hardware::audio::common::getChannelCount(
mCommon.output.base.channelMask);
auto outputChannelMaskConv = aidl2legacy_AudioChannelLayout_audio_channel_mask_t(
@@ -621,6 +638,13 @@
params.SourceFormat = LVM_MULTICHANNEL;
}
+ return RetCode::SUCCESS;
+}
+
+RetCode BundleContext::initControlParameter(LVM_ControlParams_t& params) const {
+ RETURN_VALUE_IF(RetCode::SUCCESS != applyCommonParameter(params),
+ RetCode::ERROR_EFFECT_LIB_ERROR, " applyCommonParameterFailed");
+
/* General parameters */
params.OperatingMode = LVM_MODE_ON;
params.SpeakerType = LVM_HEADPHONES;
diff --git a/media/libeffects/lvm/wrapper/Aidl/BundleContext.h b/media/libeffects/lvm/wrapper/Aidl/BundleContext.h
index e5ab40d..96f63cd 100644
--- a/media/libeffects/lvm/wrapper/Aidl/BundleContext.h
+++ b/media/libeffects/lvm/wrapper/Aidl/BundleContext.h
@@ -35,6 +35,8 @@
void deInit();
lvm::BundleEffectType getBundleType() const { return mType; }
+ RetCode setCommon(const Parameter::Common& common) override;
+
RetCode enable() override;
RetCode enableOperatingMode();
RetCode disable() override;
@@ -133,6 +135,7 @@
bool isBandLevelIndexInRange(const std::vector<Equalizer::BandLevel>& bandLevels) const;
static LVM_EQNB_BandDef_t* getDefaultEqualizerBandDefs();
static LVM_HeadroomBandDef_t* getDefaultEqualizerHeadroomBanDefs();
+ RetCode applyCommonParameter(LVM_ControlParams_t& params) const;
};
} // namespace aidl::android::hardware::audio::effect
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
index e434a3d..225cfdd 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
@@ -98,24 +98,6 @@
// static
const int64_t NuPlayer::Renderer::kMinPositionUpdateDelayUs = 100000ll;
-static audio_format_t constexpr audioFormatFromEncoding(int32_t pcmEncoding) {
- switch (pcmEncoding) {
- case kAudioEncodingPcmFloat:
- return AUDIO_FORMAT_PCM_FLOAT;
- case kAudioEncodingPcm32bit:
- return AUDIO_FORMAT_PCM_32_BIT;
- case kAudioEncodingPcm24bitPacked:
- return AUDIO_FORMAT_PCM_24_BIT_PACKED;
- case kAudioEncodingPcm16bit:
- return AUDIO_FORMAT_PCM_16_BIT;
- case kAudioEncodingPcm8bit:
- return AUDIO_FORMAT_PCM_8_BIT; // TODO: do we want to support this?
- default:
- ALOGE("%s: Invalid encoding: %d", __func__, pcmEncoding);
- return AUDIO_FORMAT_INVALID;
- }
-}
-
NuPlayer::Renderer::Renderer(
const sp<MediaPlayerBase::AudioSink> &sink,
const sp<MediaClock> &mediaClock,
diff --git a/media/libstagefright/Utils.cpp b/media/libstagefright/Utils.cpp
index 50eeb62..46606de 100644
--- a/media/libstagefright/Utils.cpp
+++ b/media/libstagefright/Utils.cpp
@@ -2422,6 +2422,24 @@
return;
}
+audio_format_t audioFormatFromEncoding(int32_t pcmEncoding) {
+ switch (pcmEncoding) {
+ case kAudioEncodingPcmFloat:
+ return AUDIO_FORMAT_PCM_FLOAT;
+ case kAudioEncodingPcm32bit:
+ return AUDIO_FORMAT_PCM_32_BIT;
+ case kAudioEncodingPcm24bitPacked:
+ return AUDIO_FORMAT_PCM_24_BIT_PACKED;
+ case kAudioEncodingPcm16bit:
+ return AUDIO_FORMAT_PCM_16_BIT;
+ case kAudioEncodingPcm8bit:
+ return AUDIO_FORMAT_PCM_8_BIT; // TODO: do we want to support this?
+ default:
+ ALOGE("%s: Invalid encoding: %d", __func__, pcmEncoding);
+ return AUDIO_FORMAT_INVALID;
+ }
+}
+
status_t getAudioOffloadInfo(const sp<MetaData>& meta, bool hasVideo,
bool isStreaming, audio_stream_type_t streamType, audio_offload_info_t *info)
{
@@ -2441,6 +2459,12 @@
ALOGV("Mime type \"%s\" mapped to audio_format %d", mime, info->format);
}
+ int32_t pcmEncoding;
+ if (meta->findInt32(kKeyPcmEncoding, &pcmEncoding)) {
+ info->format = audioFormatFromEncoding(pcmEncoding);
+ ALOGV("audio_format use kKeyPcmEncoding value %d first", info->format);
+ }
+
if (AUDIO_FORMAT_INVALID == info->format) {
// can't offload if we don't know what the source format is
ALOGE("mime type \"%s\" not a known audio format", mime);
diff --git a/media/libstagefright/include/media/stagefright/Utils.h b/media/libstagefright/include/media/stagefright/Utils.h
index 1673120..e190374 100644
--- a/media/libstagefright/include/media/stagefright/Utils.h
+++ b/media/libstagefright/include/media/stagefright/Utils.h
@@ -44,6 +44,9 @@
// Convert a MIME type to a AudioSystem::audio_format
status_t mapMimeToAudioFormat(audio_format_t& format, const char* mime);
+// Convert a pcm-encoding to a AudioSystem::audio_format
+audio_format_t audioFormatFromEncoding(int32_t pcmEncoding);
+
// Convert a aac profile to a AudioSystem::audio_format
void mapAACProfileToAudioFormat(audio_format_t& format, uint64_t eAacProfile);
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index b82a9af..1cb9ea4 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -7760,6 +7760,9 @@
audio_utils::lock_guard l(mutex());
localTracks = std::move(mOutputTracks);
mOutputTracks.clear();
+ for (size_t i = 0; i < localTracks.size(); ++i) {
+ localTracks[i]->destroy();
+ }
}
localTracks.clear();
outputTracks.clear();
diff --git a/services/audiopolicy/common/managerdefinitions/include/EffectDescriptor.h b/services/audiopolicy/common/managerdefinitions/include/EffectDescriptor.h
index f7b9b33..9107e2a 100644
--- a/services/audiopolicy/common/managerdefinitions/include/EffectDescriptor.h
+++ b/services/audiopolicy/common/managerdefinitions/include/EffectDescriptor.h
@@ -75,7 +75,8 @@
bool isEffectEnabled(int id) const;
uint32_t getMaxEffectsCpuLoad() const;
uint32_t getMaxEffectsMemory() const;
- bool isNonOffloadableEffectEnabled() const;
+ bool isNonOffloadableEffectEnabled(
+ const std::optional<const effect_uuid_t>& uuid = std::nullopt) const;
void moveEffects(audio_session_t session,
audio_io_handle_t srcOutput,
diff --git a/services/audiopolicy/common/managerdefinitions/src/EffectDescriptor.cpp b/services/audiopolicy/common/managerdefinitions/src/EffectDescriptor.cpp
index 090da6c..6d66781 100644
--- a/services/audiopolicy/common/managerdefinitions/src/EffectDescriptor.cpp
+++ b/services/audiopolicy/common/managerdefinitions/src/EffectDescriptor.cpp
@@ -21,6 +21,7 @@
#include "AudioInputDescriptor.h"
#include "EffectDescriptor.h"
+#include <system/audio_effects/audio_effects_utils.h>
#include <utils/String8.h>
#include <AudioPolicyInterface.h>
@@ -157,14 +158,18 @@
return NO_ERROR;
}
-bool EffectDescriptorCollection::isNonOffloadableEffectEnabled() const
+bool EffectDescriptorCollection::isNonOffloadableEffectEnabled(
+ const std::optional<const effect_uuid_t>& uuid) const
{
+ using namespace android::effect::utils;
for (size_t i = 0; i < size(); i++) {
sp<EffectDescriptor> effectDesc = valueAt(i);
- if (effectDesc->mEnabled && (effectDesc->isMusicEffect()) &&
- ((effectDesc->mDesc.flags & EFFECT_FLAG_OFFLOAD_SUPPORTED) == 0)) {
- ALOGV("isNonOffloadableEffectEnabled() non offloadable effect %s enabled on session %d",
- effectDesc->mDesc.name, effectDesc->mSession);
+ if ((effectDesc->mEnabled && (effectDesc->isMusicEffect()) &&
+ ((effectDesc->mDesc.flags & EFFECT_FLAG_OFFLOAD_SUPPORTED) == 0)) &&
+ (uuid == std::nullopt || uuid.value() == effectDesc->mDesc.uuid)) {
+ ALOGE("%s: non offloadable effect %s, uuid %s, enabled on session %d", __func__,
+ effectDesc->mDesc.name, ToString(effectDesc->mDesc.uuid).c_str(),
+ effectDesc->mSession);
return true;
}
}