x264 - FENC_SRIDE、FDEC_STRIDE相关以及fenc、fdec的buf存储结构

来源:互联网 发布:淘宝直通车排名规则 编辑:程序博客网 时间:2024/05/16 12:55


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
yyyyyyyyyyyyyyyy...............y
YYYYYYYYYYYYYYYY...............y
YYYYYYYYYYYYYYYY...............y
YYYYYYYYYYYYYYYY...............y
YYYYYYYYYYYYYYYY...............y
YYYYYYYYYYYYYYYY...............y
YYYYYYYYYYYYYYYY...............y
YYYYYYYYYYYYYYYY...............y
YYYYYYYYYYYYYYYY...............y
YYYYYYYYYYYYYYYY...............y
YYYYYYYYYYYYYYYY...............y
YYYYYYYYYYYYYYYY...............y
YYYYYYYYYYYYYYYY...............y
YYYYYYYYYYYYYYYY...............y
YYYYYYYYYYYYYYYY...............y
YYYYYYYYYYYYYYYY...............y
YYYYYYYYYYYYYYYY...............u
uuuuuuuu.......vvvvvvvvv.......u
UUUUUUUU.......vVVVVVVVV.......u
UUUUUUUU.......vVVVVVVVV.......u
UUUUUUUU.......vVVVVVVVV.......u
UUUUUUUU.......vVVVVVVVV.......u
UUUUUUUU.......vVVVVVVVV.......u
UUUUUUUU.......vVVVVVVVV.......u
UUUUUUUU.......vVVVVVVVV.......u
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_bufh->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分量地址


0 0
原创粉丝点击