h.264中,视频原始采样数据位宽8bit,假设一个帧的第一个数据data0=8'd48。IDCT(逆DCT)输出后(假设相应系数值为r),不进行任何限制或移位处理,然后进行:uF'n = r + P(P为预测值,无符号的。假设P=8'h80=8'd128)。然后对uF'n进行移位操作,KK=(uF'n +32)>>6,其中KK为16bit。最后对KK进行限制,确保其在 [0, 255] 范围内。reconstructed_pixel = (KK< 0) ? 0 : (KK> 255) ? 255 : KK。其中reconstructed_pixel(去块滤波前的系数) 为8bit。
现在 r= -5252(视频原始采样一个帧的第一个数据data0位置的值经过各种处理后得到的r)。
方案1.根据上面的公式计算得到KK= -79。那么根据 reconstructed_pixel = (KK< 0) ? 0 : (KK> 255) ? 255 : KK,则 reconstructed_pixel = 0?怎么感觉不太对劲呢?是不是有错呢?按照预想,reconstructed_pixel应该与视频原始采样相应位置的数据值(比如上面说的data0的值,即data0=8'd48)差不多吧?但是明显,相差太大了!
方案2.如果先对r进行移位,再加上预测值P,结果会比较理想。即:end_data=((32+r)>>6)+P=((32-5252)>>6)+128=46.4375=46。然后再进行限制,则 reconstructed_pixel = (end_data< 0) ? 0 : (end_data> 255) ? 255 : end_data=46。这个值与假设的一个帧的第一个数据data0值差不多。
因此,到底选择哪种方案呢?方案1?方案2?