http://www.360doc.com/content/14/0417/09/14169007_369668798.shtml
在x264_macroblock_cache_load()函数下有如下代码:
h->mb.pic.p_fenc[0] = h->mb.pic.fenc_buf;
h->mb.pic.p_fenc[1] = h->mb.pic.fenc_buf + 16*FENC_STRIDE;
h->mb.pic.p_fenc[2] = h->mb.pic.fenc_buf + 16*FENC_STRIDE + 8;
h->mb.pic.p_fdec[0] = h->mb.pic.fdec_buf + 2*FDEC_STRIDE;
h->mb.pic.p_fdec[1] = h->mb.pic.fdec_buf + 19*FDEC_STRIDE;
h->mb.pic.p_fdec[2] = h->mb.pic.fdec_buf + 19*FDEC_STRIDE + 16;
其中
#define FENC_STRIDE 16
#define FDEC_STRIDE 32
/* pointer over mb of the frame to be compressed */
uint8_t *p_fenc[3];
/* pointer over mb of the frame to be reconstructed */
uint8_t *p_fdec[3];
解读:
fdec指的是重建帧,fenc指的是编码帧,两者的存储结构有所不同,帧内预测会用到相邻块,所以 fdec结构需要保存相邻块信息。Fdec、fenc的简易结构如下:
/* fdec: fenc:
* yyyyyyy
* yYYYY YYYY
* yYYYY YYYY
* yYYYY YYYY
* yYYYY YYYY
* uuu vvv UUVV
* uUU vVV UUVV
* uUU vVV
*/
其中,fdec街头的深红色部分是存储的,用于预测的当前宏块的相邻块,y与Y指的都表示4x4块。而实际的fdec宏块的存储结构-h->mb.pic.fdec_buf如下
0123456789ABCDEF0123456789ABCDEF
0 ...............................y
1 yyyyyyyyyyyyyyyy...............y
2 YYYYYYYYYYYYYYYY...............y
3 YYYYYYYYYYYYYYYY...............y
4 YYYYYYYYYYYYYYYY...............y
5 YYYYYYYYYYYYYYYY...............y
6 YYYYYYYYYYYYYYYY...............y
7 YYYYYYYYYYYYYYYY...............y
8 YYYYYYYYYYYYYYYY...............y
9 YYYYYYYYYYYYYYYY...............y
A YYYYYYYYYYYYYYYY...............y
B YYYYYYYYYYYYYYYY...............y
C YYYYYYYYYYYYYYYY...............y
D YYYYYYYYYYYYYYYY...............y
E YYYYYYYYYYYYYYYY...............y
F YYYYYYYYYYYYYYYY...............y
0 YYYYYYYYYYYYYYYY...............y
1 YYYYYYYYYYYYYYYY...............u
2 uuuuuuuu.......vvvvvvvvv.......u
3 UUUUUUUU.......vVVVVVVVV.......u
4 UUUUUUUU.......vVVVVVVVV.......u
5 UUUUUUUU.......vVVVVVVVV.......u
6 UUUUUUUU.......vVVVVVVVV.......u
7 UUUUUUUU.......vVVVVVVVV.......u
8 UUUUUUUU.......vVVVVVVVV.......u
9 UUUUUUUU.......vVVVVVVVV.......u
A UUUUUUUU.......vVVVVVVVV........
实际的fenc宏块的存储结构h->mb.pic.fenc_buf如下:
0123456789ABCDEF
0 YYYYYYYYYYYYYYYY
1 YYYYYYYYYYYYYYYY
2 YYYYYYYYYYYYYYYY
3 YYYYYYYYYYYYYYYY
4 YYYYYYYYYYYYYYYY
5 YYYYYYYYYYYYYYYY
6 YYYYYYYYYYYYYYYY
7 YYYYYYYYYYYYYYYY
8 YYYYYYYYYYYYYYYY
9 YYYYYYYYYYYYYYYY
A YYYYYYYYYYYYYYYY
B YYYYYYYYYYYYYYYY
C YYYYYYYYYYYYYYYY
D YYYYYYYYYYYYYYYY
E YYYYYYYYYYYYYYYY
F YYYYYYYYYYYYYYYY
0 UUUUUUUUVVVVVVVV
1 UUUUUUUUVVVVVVVV
2 UUUUUUUUVVVVVVVV
3 UUUUUUUUVVVVVVVV
4 UUUUUUUUVVVVVVVV
5 UUUUUUUUVVVVVVVV
6 UUUUUUUUVVVVVVVV
7 UUUUUUUUVVVVVVVV
fenc_buf结构体总共有24 x 16 = 384个unit8。fdec结构体总共有27 x 32 = 864个 unit8单元,每个字母表示一个像素值。y、u、v表示所用到的相邻宏块的像素值。*p_fenc[3]、*p_fdec[3]是分别指向h->mb.pic.fenc_buf、h->mb.pic.fdec_buf两个结构中Y、U、V分量的指针。
h->mb.pic.fenc_buf; -- 第一个Y分量地址
h->mb.pic.fenc_buf + 16*FENC_STRIDE; -- 第一个U分量地址
h->mb.pic.fenc_buf + 16*FENC_STRIDE + 8; -- 第一个V分量地址
h->mb.pic.fdec_buf + 2*FDEC_STRIDE; -- 第一个Y分量地址
h->mb.pic.fdec_buf + 19*FDEC_STRIDE; -- 第一个U分量地址
h->mb.pic.fdec_buf + 19*FDEC_STRIDE + 16; -- 第一个V分量地址