Loading media/codec2/components/apv/C2SoftApvEnc.cpp +336 −125 Original line number Diff line number Diff line Loading @@ -222,6 +222,7 @@ class C2SoftApvEnc::IntfImpl : public SimpleInterface<void>::BaseParams { .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); Loading @@ -231,7 +232,7 @@ class C2SoftApvEnc::IntfImpl : public SimpleInterface<void>::BaseParams { } 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()); Loading Loading @@ -272,6 +273,13 @@ class C2SoftApvEnc::IntfImpl : public SimpleInterface<void>::BaseParams { 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(); } Loading Loading @@ -302,6 +310,119 @@ class C2SoftApvEnc::IntfImpl : public SimpleInterface<void>::BaseParams { 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; Loading @@ -328,7 +449,7 @@ class C2SoftApvEnc::IntfImpl : public SimpleInterface<void>::BaseParams { profile = 99; break; default: ALOGD("Unrecognized profile: %x", mProfileLevel->profile); ALOGW("Unrecognized profile: %x", mProfileLevel->profile); } return profile; } Loading @@ -339,54 +460,264 @@ class C2SoftApvEnc::IntfImpl : public SimpleInterface<void>::BaseParams { // 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; Loading Loading @@ -636,7 +967,7 @@ void C2SoftApvEnc::setParams(oapve_param_t& param) { 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; Loading @@ -646,14 +977,8 @@ void C2SoftApvEnc::setParams(oapve_param_t& param) { 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(); } Loading Loading @@ -750,120 +1075,6 @@ c2_status_t C2SoftApvEnc::setEncodeArgs(oapv_frms_t* inputFrames, const C2Graphi 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(); Loading media/codec2/components/apv/C2SoftApvEnc.h +0 −2 Original line number Diff line number Diff line Loading @@ -60,8 +60,6 @@ struct C2SoftApvEnc final : public SimpleC2Component { 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); Loading Loading
media/codec2/components/apv/C2SoftApvEnc.cpp +336 −125 Original line number Diff line number Diff line Loading @@ -222,6 +222,7 @@ class C2SoftApvEnc::IntfImpl : public SimpleInterface<void>::BaseParams { .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); Loading @@ -231,7 +232,7 @@ class C2SoftApvEnc::IntfImpl : public SimpleInterface<void>::BaseParams { } 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()); Loading Loading @@ -272,6 +273,13 @@ class C2SoftApvEnc::IntfImpl : public SimpleInterface<void>::BaseParams { 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(); } Loading Loading @@ -302,6 +310,119 @@ class C2SoftApvEnc::IntfImpl : public SimpleInterface<void>::BaseParams { 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; Loading @@ -328,7 +449,7 @@ class C2SoftApvEnc::IntfImpl : public SimpleInterface<void>::BaseParams { profile = 99; break; default: ALOGD("Unrecognized profile: %x", mProfileLevel->profile); ALOGW("Unrecognized profile: %x", mProfileLevel->profile); } return profile; } Loading @@ -339,54 +460,264 @@ class C2SoftApvEnc::IntfImpl : public SimpleInterface<void>::BaseParams { // 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; Loading Loading @@ -636,7 +967,7 @@ void C2SoftApvEnc::setParams(oapve_param_t& param) { 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; Loading @@ -646,14 +977,8 @@ void C2SoftApvEnc::setParams(oapve_param_t& param) { 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(); } Loading Loading @@ -750,120 +1075,6 @@ c2_status_t C2SoftApvEnc::setEncodeArgs(oapv_frms_t* inputFrames, const C2Graphi 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(); Loading
media/codec2/components/apv/C2SoftApvEnc.h +0 −2 Original line number Diff line number Diff line Loading @@ -60,8 +60,6 @@ struct C2SoftApvEnc final : public SimpleC2Component { 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); Loading