一 函数作用
函数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_b

最低0.47元/天 解锁文章
928

被折叠的 条评论
为什么被折叠?



