在AVS编码器中写代码的时候经常会访问亮度色度分量的原始值、预测值、重构值、残差值等,这时候就需要用到stride以访问到正确的内存空间。亮度分量没什么好说的,一般都可以根据相关的结构体获取得到亮度分量的stride,而色度分量的stride有些时候并不能直接获取到,于是乎,写代码的时候,考虑到色度分量与亮度分量是1:2的关系,我理所当然的认为stride也是这样的。然而,事实证明,想当然是没有好下场的……
在AVS编码器中,要想访问色度分量的相关像素值,其stride并不是stride>>1,而是stride本身。这是为什么呢?我在编码器中跟了一下存放色度分量的预测值的代码,发现YUV三个分量的存放于获取并不是我想的那样,而是如下图所示:
所以,若想访问U1色度块,则需要获取到指向其左上角像素的内存地址p_chroma,及其width和height(亮度分量的一半),逐行访问像素值,当一行的像素值访问结束之后,内存地址p_chroma=p_chroma+Stride可得到下一行行首的内存地址。图示就可以看出,访问色度分量的时候并不是使用stride>>1的,主要是由于其YUV分量的存放方式导致。
其实,只要仔细看代码了就很容易明白,这次犯错还是因为想当然,没有深入到代码中去理解代码。