步長stride以及拓展

函數(shù):void x264_sps_init( x264_sps_t *sps, int i_id, x264_param_t *param )

語句:sps->i_mb_width = ( param->i_width + 15 ) / 16;

函數(shù):x264_t *x264_encoder_open( x264_param_t *param )

語句:h->mb.i_mb_width = h->sps->i_mb_width;

函數(shù):void x264_frame_expand_border_mod16( x264_t *h, x264_frame_t *frame )

{
for( int i = 0; i < frame->i_plane; i++ )
{
int i_width = h->param.i_width;
int h_shift = i && CHROMA_H_SHIFT;
int v_shift = i && CHROMA_V_SHIFT;
int i_height = h->param.i_height >> v_shift;
int i_padx = (h->mb.i_mb_width * 16 - h->param.i_width);//計算出需要拓展的寬度
int i_pady = (h->mb.i_mb_height * 16 - h->param.i_height) >> v_shift;//計算出需要拓展的高度
if( i_padx )
{
for( int y = 0; y < i_height; y++ )
pixel_memset( &frame->plane[i][yframe->i_stride[i] + i_width],//dst
&frame->plane[i][y
frame->i_stride[i] + i_width - 1-h_shift],//src
i_padx>>h_shift, sizeof(pixel)<<h_shift );
//將最右邊的像素填充到拓展區(qū)域
}

    >if( i_pady )
    {
        for( int y = i_height; y < i_height + i_pady; y++ )
            memcpy( &frame->plane[i][y*frame->i_stride[i]],
            &frame->plane[i][(i_height-(~y&PARAM_INTERLACED)-1)*frame->i_stride[i]],
            (i_width + i_padx) * sizeof(pixel) );
    }
}

}

#define ALIGN(x,a) (((x)+((a)-1))&~((a)-1))//此公式用于對齊。
比如:448= ALIGN( 432, 32);即,(432+31)&0x11100000=448

函數(shù):static x264_frame_t *x264_frame_new( x264_t *h, int b_fdec )

語句:i_stride = align_stride( i_width + 2*PADH, align, disalign );
其中,

static int align_stride( int x, int align, int disalign )
{
x = ALIGN( x, align );
if( !(x&(disalign-1)) )
x += align;
return x;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容