h264中帧内4*4预测编码宏块的赋值


此文章为转载,作者采用的是pdf方式,所以一些图片无法显示请谅解!但也可说明

其不知道哪里是源头的一篇文章中可以看到在x264中用到的一些结构的内部数据排序,如Intra4*4_pred_mode_cache[],Non_zero_count_cache[48]等,也就理解了x264_scan8的用途,是作为一个数据的映射表而存在,见下面的内容

 

int8_t intra4x4_pred_mode_cache[40]; //5*8
int8_t (*intra4x4_pred_mode)[8];

uint8_t non_zero_count_cache[48]; //6*8
uint8_t (*non_zero_count)[16];
的理解,关键:当前MB 处理完后,仅仅其右、下4*4 宽度的边界对于后续MB 有参考价
值。

Intra4*4_pred_mode_cache[40]:如图1 所示,其中40=5*8,黄色区域为当前MB的16个4*4
块,主要根据上、左8 个4*4块的预测模式来预测当前MB的16 个模式。当前MB处理完,
其右、下边界(红色框)相对于后续MB 而言,分别是左、上边预测边界,所以要对当前
MB的右、下边界4*4预测模式进行保存,以便后用。

 

 

Intra4*4_pred_mode[8]如图2 所示,把当前MB的右、下边界4*4预测模式进行保存。
程序如下:
h->intra4x4_pred_mode[mb_xy][0]= h->intra4x4_pred_mode_cache[15];
h->intra4x4_pred_mode[mb_xy][1]= h->intra4x4_pred_mode_cache[23];
h->intra4x4_pred_mode[mb_xy][2]= h->intra4x4_pred_mode_cache[31];

h->intra4x4_pred_mode[mb_xy][3]= h->intra4x4_pred_mode_cache[39];
h->intra4x4_pred_mode[mb_xy][4]= h->intra4x4_pred_mode_cache[36];
h->intra4x4_pred_mode[mb_xy][5]= h->intra4x4_pred_mode_cache[37];
h->intra4x4_pred_mode[mb_xy][6]= h->intra4x4_pred_mode_cache[38];
39 号4*4块比较特殊,只保存到Intra4*4_pred_mod 数组(白色区域中的0、1、2、3、4、5、
6)中的[3],[7]空缺,这也就解释了程序中的
h->intra4x4_pred_mode_cache[4]= h->intra4x4_pred_mode[top_xy][4];
h->intra4x4_pred_mode_cache[5]= h->intra4x4_pred_mode[top_xy][5];
h->intra4x4_pred_mode_cache[6]= h->intra4x4_pred_mode[top_xy][6];
h->intra4x4_pred_mode_cache[7]= h->intra4x4_pred_mode[top_xy][3];


 

Non_zero_count_cache[48]:non_zeor_count 缓存如图3 所示,其中48=6*8。黄色区域为当
前MB 的16 个4*4 块的非零数;绿色区域分别为两个色度块的非零数。红色框为当前MB
亮度、两个色度的右、下边界。

 

Non_zero_count[16]:当前MB 处理完后,原理同图1,也是对MB 的右、下4*4 宽度的边
界进行保存,保存到non_zero_count[16]供后续使用。由图4 可清楚明了,白色区域(0、1、
2、3、4、5、6、7、8、9、10、11、12)为数组non_zero_count[16]。
程序如下:
h->non_zero_count[mb_xy][0]= h->non_zero_count_cache[36];
h->non_zero_count[mb_xy][1]= h->non_zero_count_cache[37];
h->non_zero_count[mb_xy][2]= h->non_zero_count_cache[38];
h->non_zero_count[mb_xy][3]= h->non_zero_count_cache[39];
h->non_zero_count[mb_xy][4]= h->non_zero_count_cache[31];
h->non_zero_count[mb_xy][5]= h->non_zero_count_cache[23];
h->non_zero_count[mb_xy][6]= h->non_zero_count_cache[15];
h->non_zero_count[mb_xy][7]= h->non_zero_count_cache[17];
h->non_zero_count[mb_xy][8]= h->non_zero_count_cache[18];
h->non_zero_count[mb_xy][9]= h->non_zero_count_cache[10];
h->non_zero_count[mb_xy][10]=h->non_zero_count_cache[41];
h->non_zero_count[mb_xy][11]=h->non_zero_count_cache[42];
h->non_zero_count[mb_xy][12]=h->non_zero_count_cache[34];


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值