codec 随写笔记未整理

264,


intra prediction


对于16x16,4种,垂直,水平,DC,plane
DC:需要上面和左边的宏块。上面一行和左边一列的像素平均值作为宏块预测
plane:需要上面和左边的宏块。适用于亮度变化平缓区域

对于8x8,4种,顺序和16x16不同,DC,水平,垂直,plane

对于4x4,比16x16少plane,除了垂直,水平,DC以外有六种不同方向的像素插值预测模式



ME,原理性的东西
整像素用sad,亚像素satd。整像素是不可以用satd的。
SAD即绝对误差和,仅反映残差时域差异,影响PSNR值,不能有效反映码流的大小。SATD即将残差经哈德曼变换的预测残差绝对值总和,可以将其看作简单的时频变换,其值在一定程度上可以反映生成码流的大小。因此,不用率失真最优化时,可将其作为模式选择的依据。
在做运动估计时,一般而言,离最优匹配点越远,匹配误差值SAD越大,这就是有名的单一平面假设,现有的运动估计快速算法大都利用该特性。但是,转换后SATD值并不满足该条件,如果在整象素中运用SATD搜索,容易陷入局部最优点。而在亚象素中,待搜索点不多,各点处的SAD差异相对不大,可以用SATD选择码流较少的匹配位置。
cost = satd + lambda * mvbits


x264里,rc部分下采样的me是在slicetype.c里的x264_slicetype_mb_cost(),里面调用到x264_me_search(),和整帧做me是一样的,最后都是到x264_me_search_ref()里。


RD
在x264_rd_cost_mb中先编码一遍(熵编码和重构),计算每种宏块的cost:
cost = ssd + i_bits*lamda
其中ssd是重构块和参考块之间的差值平方和
该值返回作为当前模式的复杂度,比如
a->i_satd_i16x16 = x264_rd_cost_mb( h, a->i_lambda2 );


RDO用来确定编码模式的,保证码率比特数和图像失真的最佳权衡点。
SATD用来测量宏块的复杂度。

RDOQ是在熵编码和量化之间调整最优值,尝试调整很少的值,判断节省熵编码比特与对重构影响哪个的cost更小。


自适应量化:

计算每个16x16的AC能量energy,计算得到量化调整系数qp_adj,能量(方差)越大,量化调整系数qp_adj越大:
qp_adj = strength * (x264_log2( X264_MAX(energy, 1) ) - (14.427f + 2*(BIT_DEPTH-8)));
把qp_adj存入frame->f_qp_offset[mb_xy]和frame->f_qp_offset_aq[mb_xy],其中frame->f_qp_offset[mb_xy]还会受到mbtree的影响。最后在编码宏块的时候,调用x264_ratecontrol_mb_qp,取出qp_offset,调整后添加给帧一级的qp += qp_offset;
总结来说,就是平缓的区域,方差小,量化调整系数qp_adj小,qp_offset小,分配比特多,复杂区域方差大,qp_offset大,分配比特少。


其中,计算ac能量的函数:计算的是每个16x16块的像素值之和,以及像素平方之和。返回的能量为:ssd - ((uint64_t)sum * sum >> 8),物理意义是当前块Σ(x^2) - (Σx * Σx)/n = n*Variance (n倍的方差)


Entropy

无损编码是否有压缩:如果n个符号,每个符号出现的概率一模一样,那么无论哪种算法压缩都无法压缩任何。(信息论)

只有当信息源各符号出现的概率很不平均的时候,哈夫曼编码的效果才明显。

为什么cabac比cavlc强:哈夫曼编码只能用整数来表示单个符号而不能用小数,这很大程度上限制了压缩效果。反过来算数编码可以用小数来表示单个符号,这就是算数编码压缩效率更高的原因。


deblocking

为什么帧内预测要用未滤波的图像而不是滤波后的图像呢?
帧内预测只能用滤波前的值,因为帧内预测的时候边界滤波还不能进行,帧内预测所需要的象素点的边界的滤波不能进行,因为需要等到当前宏块解完后才开始,但是现在就在解当前宏块,所以为了避免预测和滤波的耦合应该分开来单独做,prediction的时候保存一个line buffer就解决问题了。所以流程相当于,解一个intra块,参考上/左的一行/列滤波前的像素作为预测,补偿残差,对重构宏块和边界部分滤波



为什么采用90k作为时钟?
90k是用于视频同步的时间尺度(TimeScale),就是每秒90k个时钟tick。 目前视频的帧速率主要有25fps、29.97fps、30fps等,而90k刚好是它们的倍数,所以就采用了90k。


YUV,

420:最基础,对每个色度分量来说,水平方向和竖直方向的抽样率都是2:1,所以可以说色度的抽样率是4:1

422:水平方向的色度抽样率只是4:4:4的一半。

下面的四个像素为:[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3] 
存放的码流为:Y0 U0 Y1 V1 Y2 U2 Y3 V3  
映射出像素点为:[Y0 U0 V1] [Y1 U0 V1] [Y2 U2 V3] [Y3 U2 V3]

对每个色度分量来说,水平方向和竖直方向的抽样率都是

2:1

,所以可以说

色度的抽样率是

4:1


YV12和I420存储不同,UV顺序反过来:
YV12 : 亮度(行×列) + V(行×列/4) + U(行×列/4)
I420 : 亮度(行×列) + U(行×列/4) + V(行×列/4)

SAD(Sum of Absolute Difference)=SAE(Sum of Absolute Error)即绝对误差和
SATD(Sum of Absolute Transformed Difference)即hadamard变换后再绝对值求和
SSD(Sum of Squared Difference)=SSE(Sum of Squared Error)即差值的平方和
MAD(Mean Absolute Difference)=MAE(Mean Absolute Error)即平均绝对差值

MSD(Mean Squared Difference)=MSE(Mean Squared Error)即平均平方误差





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值