427 expand_border

扩边,对于高和宽不是16倍数要进行填充

Frame->i_plane是存储在plane中存了几维的数据,这里是2,对应色亮度和两个色度,0存储亮度,1,和2存储色度

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][y*frame->i_stride[i] + i_width],

                              &frame->plane[i][y*frame->i_stride[i] + i_width - 1-h_shift],

                              i_padx>>h_shift, sizeof(pixel)<<h_shift );

        }

        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) );

        }

    }

}

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