在JM8.6解码端提取DCT系数和残差并模拟验证itrans函数的功能

如何在JM8.6的解码端提取DCT系数呢?自然而然会想到的问题是:DCT系数从哪里来,要到哪里去,所以,要提取DCT系数,可以看它是哪里产生的,也可以看它要到哪里去,然后在任意一条路上"截击"它,必然能找到DCT系数. 下面找DCT系数的思路是要看DCT系数到哪里去. 很显然,在解码端,DCT系数的下一个动作是进行反DCT变换,所以自然而言找到反DCT变换函数,找了一下,发现itans函数正是反DCT变换的函数.

先把JM8.6中的itrans函数的原型列出来:

void itrans(struct img_par *img,int ioff,int joff,int i0,int j0);

仍然以foreman视频第一帧第一宏块第一个4*4块为例:

在itrans函数中,我们分别打印出img->cof和img->mpr,得到的结果分别为:

2304 -3840 -2816 -1600960 -1200 320 0768 -320 -512 3200 0 0 0

128 128 128 128128 128 128 128128 128 128 128128 128 128 128

利用H.264visa分析得:

====================== Y Data ====================== (解码端的DCT系数)+————————+————————+————————+————————+| 2304,-3840,-2816,-1600,| 768, 640, -256, 640,| 1280, 320, 256, -640,| 768, -320, -768, 0,|| 960,-1200, 320, 0,| 0, 0, 320, 0,| -640, -800, 0, 0,| 960, -800, 320, 0,|| 768, -320, -512, 320,| 512, -640, 0, -320,| -768, 320, -512, 320,| 768, 0, 256, 0,|| 0, 0, 0, 0,| 0, 0, 0, 0,| 0, 400, 0, 0,| -320, 0, 0, 0,|+————————+————————+————————+————————+|-1024,-5120,-1792, -640,| 2560, -640, -256, 0,| 512, 0, 0, 0,| 0, 0, 0, 0,|| 0, 1200, -640, -400,| -320, 400, 0, 0,| 640, 0, 0, 0,| 320, 0, 0, 0,|| 512, 0, -256, 0,| 0, 0, 0, 0,| 0, 0, 0, 0,| 0, 0, 0, 0,|| 320, 0, 0, 0,| -320, 0, 0, 0,| 0, 0, 0, 0,| 0, 0, 0, 0,|+————————+————————+————————+————————+| 0, 320, 0, 0,| 0, 0, 0, 0,| -768, 640, 0, 0,| 512, 0, -256, 0,|| 0, 0, 0, 0,| 0, 0, 0, 0,| 640, -800, 0, 0,| -640, -400, 320, 0,|| 0, 0, 0, 0,| 0, 0, 0, 0,| -256, 320, 0, 0,| 0, 320, 0, 0,|| 0, 0, 0, 0,| 0, 0, 0, 0,| 320, -400, 0, 0,| -320, 0, 0, 0,|+————————+————————+————————+————————+| -512, 640, -256, 0,| 0, 0, 0, 0,| 1024, -320, -256, 0,| 1024, -320, 0, 0,|| 960,-1200, 320, 0,| 960, -800, 320, 0,|-1280, 800, 0, 400,| -640, 400, 0, 0,|| -512, 320, 0, 0,| 0, 0, -256, 0,| 0, 0, -256, 0,| 512, 640, 0, 0,|| 0, 0, 0, 0,| -320, 0, 0, 0,| -640, 800, 0, 0,| 0, 0, 0, 0,|+————————+————————+————————+————————+

有多远,走多远,把足迹连成生命线。

在JM8.6解码端提取DCT系数和残差并模拟验证itrans函数的功能

相关文章:

你感兴趣的文章:

标签云: