427 mb中一些参数记录备忘

和图像本身长宽相关的几个变量

1.

h->param.i_width 图像本身的宽度  1920

h->param.i_height 图像本身的高度  1080

h->mb.i_mb_width 宽度中有多少个16x16的宏块  120*16 = 1920

h->mb.i_mb_height 高度中有多少个16x16个宏块 68x16 = 1088

h->mb.i_mb_count总共多少个宏块 120x68 = 8160

最开始slice_write中的一些宏块相关变量

h->mb.i_mb_stride = 120 宏块步长,和图像中一行宏块所含的宏块数目是一样的。应该是后来定位实用,上一行的加上个步长就到下一行了。

h->mb.i_neighbour 通过与操作可以和本来定义的一些位置变量得出当前宏块周围有什么相邻的宏块,以前分析过这个变量

h->sh.i_last_mb = 8159  比最开始计算的总共全部宏块数目少了1,不过肯定是相关的,全图宏块。

 2

h->mb.i_mb_x 横向的宏块坐标 (以宏块为单位)

H->mb.i_mb_y 纵向坐标        (以宏块为单位)

和h->mb.i_xy等对应的还有另外一系列的对应8x8块的标示

计算方法 h->mb.i_mb_xy = mb_y * h->mb.i_mb_stride + mb_x;

 

H->mb.i_mb_type 通过xy的值来进行宏块类型的定义

 h->mb.i_mb_type_left[0] = h->mb.type[h->mb.i_mb_left_xy[0]];

 h->mb.i_mb_type_left[1] = h->mb.type[h->mb.i_mb_left_xy[1]];

h->mb.i_b8_stride = 240 这个应该是8x8步长,一行16的话是120这个值是240

 3.

下面几个是x264_mb_analyse_intra 中的

最开始的赋值 

 pixel *p_src = h->mb.pic.p_fenc[0];
    pixel *p_dst = h->mb.pic.p_fdec[0];

可以看出 第一维就是色度的原始量,通过以前的mb_x,mb_y等信息来定位实际要处理的地方。

这个地方时理解错误的,这两个值并不是最初的所有像素的值,在中间它的初始化过程中含有两个赋值表达式(在

x264_macroblock_thread_init()函数里面)

h->mb.pic.p_fenc[0] = h->mb.pic.fenc_buf;

    h->mb.pic.p_fdec[0] = h->mb.pic.fdec_buf + 2*FDEC_STRIDE;

    h->mb.pic.p_fenc[1] = h->mb.pic.fenc_buf + 16*FENC_STRIDE;

h->mb.pic.p_fdec[1] = h->mb.pic.fdec_buf + 19*FDEC_STRIDE;

再看它的buf的两个定义

#define FENC_STRIDE 16
#define FDEC_STRIDE 32
            ALIGNED_16( pixel fenc_buf[48*FENC_STRIDE] );
            ALIGNED_16( pixel fdec_buf[52*FDEC_STRIDE] );

可以看到其实这只是一个宏块,里面并没有所有的源信息,通过48和52可以知道其实他就是scan8中定义的那种宏块。

http://bbs.chinavideo.org/viewthread.php?tid=2310   

这个里面有san8的理解就是这两个里面的48和52的解释

 

 

 

 

//already form macroblock     a block copy
            /* pointer over mb of the frame to be compressed */
            pixel *p_fenc[3]; /* y,u,v */
            /* pointer to the actual source frame, not a block copy */
            pixel *p_fenc_plane[3];

 

   //already compressed   a block copy
            /* pointer over mb of the frame to be reconstructed  */
            pixel *p_fdec[3];

 

            /* pointer over mb of the references */
            int i_fref[2];

4.

 帧内预测的专用相邻标示   h->mb.i_neighbour_intra

predict_16x16_mode_available( h->mb.i_neighbour_intra );

下面才是编码的过程, 这里只是进行一些每一帧的分析过程,如果在encoder_encode函数中设置一个静态变量可以得出在这里缓存了14帧以后才开始进行编码

h->frames.i_delay = 19

h->i_thread_frames = 6

   if( h->frames.i_input <= h->frames.i_delay + 1 - h->i_thread_frames )

        {

            /* Nothing yet to encode, waiting for filling of buffers */

            pic_out->i_type = X264_TYPE_AUTO;

            return 0;

        }

上面这是进行编码前的最后一个判断函数

上面应该有将将要编码的帧放入h->frames.current队列。这个判断下是不是还有内容存在于current队列中,如果有的话就对它进行分析。这个函数决定了slice的类型IPB等

if( !h->frames.current[0] )

        x264_lookahead_get_frames( h );

这个函数将current中的第一帧弹出来,然后将后面的每一帧向前提一个位置,所以current队列中的第一个帧始终是将要编码的帧。

h->fenc = x264_frame_shift( h->frames.current);

原文地址:https://www.cnblogs.com/hatreds/p/2473887.html