x264代码中的cabac和之前理解的算数编码有点不一样,x264中编码的时候,先需要将
数据二值化,然后建概率模型。逐个bit写入cabac cache,然后不断更新码表,因为二值化过,所以码表只有两个值0/1。
同样解码的时候,逆向来的,解码一个bit调整一次码表。这个流程目前没有看明白,先看看cabac存储了宏块的哪些字段
cabac_mb_type_intra //帧内块type,另外还有个预测模式
cabac_field_decoding_flag //场编码标记
cabac_intra4x4_pred_mode //帧内块4x4预测模式
cabac_intra_chroma_pred_mode//帧内色度块预测模式 只有帧内预测,才有模式
cabac_cbp_luma //亮度块cbp
cabac_cbp_chroma //色度块cbp
cabac_qp_delta //存储delta qp值
x264_cabac_mb_skip //存储是否为skip宏块标记
cabac_subpartition_p //字块partition P帧
cabac_subpartition_b B帧partition
cabac_transform_size //dct变换size
cabac_ref_p //参考帧idx
cabac_ref_b //B帧参考帧信息,带个list方向
cabac_mvd_cpn //存储mvd信息
cabac_8x8_mvd//存储8x8mvd
cabac_mb_header_i//mb header信息,mb类型,slice 类型,是否为色度
cabac_mb_header_p //MB类型 ,是否为色度
cabac_mb_header_b //mb类型,是否为色度
cabac_block_residual_internal //残差信息
接下来看看,实际编码mb的时候,是如何做的。
P宏块
B宏块
这里先分析完了每一个宏块的宏块头里面存储有哪些信息