当前位置: 首页 > news >正文

SVTAV1函数分析-svt_av1_cost_coeffs_txb

一 函数作用

函数svt_av1_cost_coefss_txb是一个与AV1视频编码相关的函数,主要用于计算变换块(Transform Block)中系数的成本(Cost)。在视频编码中,特被是在AV1编码中,计算系数的成本对于模式决策(Mode Decision)和熵编码(Entropy Coding)

等步骤非常重要。这个函数可能涉及到量化系数,变换类型,上下文自适应二进制算术编码(Context-Adaptive Binary Arithmetic Coding CABAC)等内容。

函数参数解释

1 struct ModeDecisionContext *ctx;

这是一个指向模式决策上下文的指针,模式决策上下文包含了当前编码过程中的一些状态信息和配置参数,这些信息对于决定最佳的编码模式至关重要。它可能包括诸如块大小,帧类型,参考帧等信息。

2 unint8_t allow_update_cdf

这是一个标志,用于指示是否允许更新累积分布函数CDF,CDF在熵编码中用于表示符号的概率分布。如果允许更新,则编码器可以根据实际数据调整概率模型,这可能有助于提高编码效率。

3 FRAME_CONTEXT *en_ctx

这是一个指向帧上下文的指针,帧上下文包含了当前帧的编码上下文信息,可能包括诸如概率模型,统计信息等。这些信息对于熵编码过程中的符号概率估计和编码决策非常重要。

4 struct ModeDecisionCandidateBuffer *cand_bf;

这是一个指向模式决策候选缓冲区的指针。候选缓冲区可能存储了多个编码模式的候选信息,这些信息用于模式决策过程,可能包括诸如不同变换类型,预测模式等候选配置。

5 const TranLow *const qcoeff

这是一个指向量化系数的指针。量化系数是经过量化处理后的变换系数,它们是视频编码中用于表示图像块信息的重要数据,这些系数将用于计算成本。

6 uint16_t eob

这是End of block的缩写,表示块中最后一个非零系数的位置,在视频编码中,特别是在变换和量化之后, 块中的许多系数可能变为零,EOB值可以额帮助快速定位到最后一个非零系数,从而提高编码效率。

7 PlaneType plane_type

这个参数指定了当前处理的平面类型,在视频编码中,图像通常被氛围亮度平面和色度平面,这个参数可能用于区分不同平面类型,并根据平面类型应用不同的编码策略。

8 TxSize transform_size

这个参数指定了变换块的大小,在AV1只能够,支持多种变换块大小,如4x4,8x8,16x16,32x32 等。变换块大小的选择会影响编码效率和计算复杂度。

9 TxType transform_type

这个参数指定了变换类型,在AV1中,支持多种变换类型。如DCT,ADST等,不同的变换类型适用于不同的图像内容和编码需求。

10 int16_t txb_skip_ctx

这个参数可能与变换块跳过(Transform Block Skip)的上下文有关,某些情况下,如果块中的系数非常稀疏或者满足某些条件,可以跳过变换和量化过程,以计生计算资源和编码时间。

11 int16_t dc_sign_ctx

这个参数可能与直流分量DC符号的上下文有关,直流分量是变换系数中的低频部分,对编码效率有影响

12 Bool reduced_transform_set_flag

这是一个布尔标志,用于指示是否使用简化的变换集,在某些编码配置下,为了减少计算复杂度,可能会限制可用的变换类型。

二 函数注释

//定义函数,计算AV1,编码中变换块系数的成本

uint64_t svt_av1_cost_coeffs_txb(struct ModeDecisionContext *ctx,

uint8_t allow_update_cdf, FRAME_CONTEXT *ec_ctx,

struct ModeDecisionCandidateBuffer *cand_bf,

const TranLow *const qcoeff,

uint16_t eob,

PlaneType plane_type,

TxSize transform_size,

TxType transform_type,

int16_t txb_skip_ctx,

int16_t dc_sign_ctx,

Bool reduced_transform_set_flag)

{

//计算变换块大小的上下文索引

const TxSize txs_ctx = (TxSize)((txsize_sqr_map[transform_size] + txsize_sqr_up_map[transform_size] + 1) >> 1);

//获取变换类

const TxClass tx_class = tx_type_to_class[transform_type];

//初始化成本变量

int32_t cost;

//获取变换块的对数宽度

const int32_t bwl = get_txb_bwl_tab[transform_size];

//获取变换块的宽度

const int32_t width = get_txb_wide_tab[transform_size];

//获取变换块的高度

const int32_t height = get_txb_high_tab[transform_size];

//获取扫描顺序

const ScanOrder *const scan_order = &av1_scan_orders[transform_size][transform_type]; //获取扫描顺序

//获取扫描数组

const int16_t *const scan = scan_order->scan;

//定义存储系统级别的缓冲区

uint8_t levels_buf[TX_PAD_2D];

//设置系数级别指针

uint8_t *const levels = set_levels(levels_buf, width);

//定义存储系数上下文的数组

DECLEAR_ALGIED(16, int8_t, coeff_contexts[MAX_TX_SQUARE]);

//断言txs_ctx小于变换块大小

assert(txs_ctx < TX_SIZES);

//获取系数代价

const LvMapCoeffCost *const coeff_costs = &ctx->md_rate_est_ctx->eob_frac_bits[eob_multi_size][plane_type];

//计算eob多尺寸大小

const int32_t eob_multi_size = txsize_log2_minus4[transform_size];

//获取eob成本

const LvMapEobCost *const eob_bits = &ctx->mb_rate_est_ctx->eob_frac_bits[eob_multi_size][plane_type];

//eob必须大于0

assert(eob > 0);//如果eob = 0就不用往下走

//初始化成本txb_skip_cost

cost = coeff_costs->txb_skip_cost[txb_skip_ctx][0];

//如果允许更新CDF

if (allow_update_cdf)

update_cdf(ec_ctx->txb_skip_cdf[txs_ctx][txb_skip_ctx], eob == 0, 2);

//如果eob 大于1

if (eob > 1)

//初始化levels

svt_av1_txb_init_levels(qcoeff, width, height, levels);

//判断是否INTR模式

const Bool is_inter = is_inter_mode(cand_bf->cand->pred_mode);

//变换类型估计

cost += plane_type > PLANE_TYPE_Y ? 0;

av1_transform_type_rate_estimation(ctx, allow_update_cdf, ec_ctx, cand_bf,

is_inter, transform_size, tranform_type, reduced_transform_set_flag);

int32_t eob_cost = get_sob_cost(eob, eob_bits, coeff_costs, tx_class);

cost += eob_cost;

//如果允许更新CDF

if (allow_update_cdf)

//更新eob上下文

svt_av1_update_eob_context(eob, tranform_size, tx_class, plane_type, ex_ctx, allow_update_cdf);

//变换非零系数估计

svt_av1_get_nz_map_contexts(levels, scan, eob, transform_size, tx_class, coeff_contexts);

//version is avaiable in AOM

assert(eob < width * height);

if (allow_update_cdf) {

//eob - 10循环

for (int c = eob - 1; c>=0; --c) {

//获取位置

const int pos = scan[c];

//获取系数上下文

const int coeff_ctx = coeff_contexts[pos];

//获取系数

const TranLow v = qcoeff[pos];

//获取系数绝对值

const TranLow level = abs(v);

//如果最后一个系数

if (c == eob - 1) {

//断言系数上下文小于4

assert(coeff_ctx < 4);

//更新coeff_base_eob_cdf

update_cdf(ec_ctx->coeff_base_eob_cdf[txs_ctx][plane_type][coeff_ctx], AOMMIN(level, 3) - 1, 3);

} else {

//更新coeff_base_cdf

uodate_cdf(ec_ctx->coeff_base_cdf[txs_ctx][plane_type][coeff_ctx], AOMIN(level, 3), 4);

}

//如果最后一个系数

if (c == eob - 1) {

assert(coeff_ctx < 4);

#if CONFIG_ENTROPY_STATS

//增加统计计数

++td->counts->coeff_base_eob_multi[cdf_idx][txsize_ctx][plane_type][coeff_ctx][AOMIN(level, 3) - 1];

} else {

//增加统计计数

++td->counts->coeff_base_multi[cdf_idx][txsize_ctx][plane_type][coeff_ctx][AOMIN(level, 3)];

}

//如果系数绝对值大于NUM_BASE_LEVELS

if (level > NUM_BASE_LEVELS) {

const int base_range level - 1 - NUM_BASE_LEVELS;

int br_ctx;

//如果eob等于1

if (eob == 1)

br_ctx = 0;

else

br_ctx = get_br_ctx(levels, pos, bwl, tx_class);

//循环更新CDF

for (int idx = 0; idx < COEFF_BASE_RANGE; idx += BR_CDF_SIZE - 1) {

//计算k

const int k = AOMMIN(base_range - idx, BR_CDF_SIZE - 1);

//更新coeff_br_cdf

update_cdf(ec_ctx->coeff_br_cdf[AOMMIN(txs_ctx, TX_32X32)][plane_type][br_ctx], k, BR_CDF_SIZE);

//循环处理LPS

for (int lps = 0; lps < BR_CDF_SIZE - 1; lps ++) {

#if CONFIG_ENTROPY_STATS

//增加统计计数

++td->counts->coeff_lps[AOMMIN(txclass_ctx, TX_32x32)[plane_type][lps][br_ctx][lps == k];

if (lps == k)

break;

}

//增加统计计数

++td->counts->coeff_lps_multi[cdf_idx][AOMMIN(txsize_ctx, TX_32X32)][plane_type][br_ctx][k];
#endif
                    // 如果k小于BR_CDF_SIZE-1,跳出循环
                    if (k < BR_CDF_SIZE - 1)
                        break;

}

//如果第一个系数不为0

if (qcoeff[0] != 0) {

update_cdf(ec_ctx->dc_sign_cdf[plane_type][dc_sign_ctx], qcoeff[0] < 0, 2);

return 0;

}

//计算并返回成本

cost += av1_cost_coeffs_txb_loop_cost_eob(
        ctx, eob, scan, qcoeff, coeff_contexts, coeff_costs, dc_sign_ctx, levels, bwl, transform_type);
    // 返回成本
    return cost;

}

}

}

http://www.dtcms.com/a/98605.html

相关文章:

  • (二)创建实例
  • 人工智能之数学基础:实对称矩阵
  • AI大模型最新发布[update@202503]
  • [Vue2]v-model用于表单
  • fio磁盘测试工具使用笔记
  • Appium中元素定位的注意点
  • springboot-Spring Boot DevTools工具的使用
  • VSCODE npm: 因为在此系统上禁止运行脚本。有关详细信息,请参阅 ...
  • 浏览器 ➔ 服务器or服务器 ➔ 浏览器:
  • 第二卷:海盐城血战(37-72回)正反人物群像
  • 第一篇:系统分析师首篇
  • DFS飞机降落
  • 《HelloGitHub》第 108 期
  • AUTOSAR_StbM_详解
  • 浅谈Thread类及常见方法与线程的状态(多线程编程篇2)
  • fetch`的语法规则及常见用法
  • Document对象的常用属性和方法
  • 蓝桥杯[每日一题] 真题:管道(java版)
  • tryhackme——Windows Local Persistence
  • std::reference_wrapper 和 std::function的详细介绍
  • MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 高级篇 part13
  • 【QT】QT样式设计
  • openwrt24.10.0版本上安装istoreOS的屏幕监控插件
  • CentOS 安装 zip
  • 零基础入门多媒体音频(4)-GENIVIProjectAudioManager总览
  • gdb 调试mysql
  • vue3源码分析 -- watch
  • MVC 文件夹:架构之美,开发之魂
  • 从零开始跑通3DGS教程:(三)坐标系与尺度编辑(CloudCompare)
  • HFSS 使用入门