一 函数作用说明
svt_av1_cost_coeffs_txb 用于计算变换块(Transform Block, TXB)中量化系数的码率失真成本(Rate - Distortion Cost).
该函数在视频编码 如AV1 的模式决策,阶段被调用,目的是评估当前变换块编码的比特率和失真的权衡,从而选择最佳的模式。
参数说明:
// Note: don't call this function when eob is 0.
uint64_t svt_av1_cost_coeffs_txb(
struct ModeDecisionContext *ctx, //模式决策上下文,包含编码参数,中间计算结果,概率模型,量化参数,以及算法控制标志
uint8_t allow_update_cdf,//是否允许更新上下文自适应二进制算数编码CABAC的概率模型,CDF,通常为0
FRAME_CONTEXT *ec_ctx,//帧级别的熵编码上下文,存储符号的概率分别模型,用于比特率估算。
struct ModeDecisionCandidateBuffer *cand_bf, //候选模式缓冲区,存储当前候选模式的数据 比如量化系数,预测模式等
const TranLow *const qcoeff,//量化后的变换系数数组指针
uint16_t eob,//变换块的非零系数结束为止End of Block 即最后一个非零系数的索引
PlaneType plane_type, //通道类型,Y/UV
TxSize transform_size, //变换村村,
TxType transform_type,//变换类型 DCT, ADST等
int16_t txb_skip_ctx, //变换块是否跳过上下文索引,用于熵编码概率模型的选择
int16_t dc_sign_ctx, //DC系数符号上下文索引,用于熵编码概率模型的选择
Bool reduced_transform_set_flag //是否使用简化的变换集
)
1.1 初始化上下文
根据plane_type 和transform_size 获取对应的熵编码概率模型(CDF表)
确定是否需要跳过当前块的编码 通过txb_skip_ctx 上下文
1.2 计算跳过块的代价
若块中所有系数均为零(eob == 0) ,直接计算跳过块的比特率成本。
1.3 计算非跳过块的代价
DC系数处理,
计算DC系数的符号Sign和幅值 的编码成本。
AC系数处理
逆扫描通过扫描顺序表 遍历所有非零AC系数,计算每一点的
幅值编码成本(包括二进制化,旁路编码)
符号编码成本(仅对非零系数)
EOB 位置编码
编码ROB位置的额外比特开销。
1.4 码率失真
结合量化系数失真(通常预计算并存储在cand_bf中)和比特率成本,生成最终的码率失真代价
RDCost = lambda * rate + Distortion
1.5 更新概率模型
若allow_update_cdf为1,根据实际编码结果更新 CDF 表,以提升后续符号的编码效率。
CDF:表示符号的概率累积分布表,例如,某个二进制符号的概率模型可能初始化为{0.5,0.5} 但是随着编码数据的变化,CDF会逐步更新为{0.3,0.7}等。
二 函数源码分析
uint64_t svt_av1_cost_coeffs_txb(
struct ModeDecisionContext *ctx,
uint8_t allow_update_cdf,
FRAME_CONTEXT *ec_ctx,

最低0.47元/天 解锁文章
734

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



