美文网首页
(五)帧内宏块预测2:预测像素点

(五)帧内宏块预测2:预测像素点

作者: 奔向火星005 | 来源:发表于2018-08-27 13:13 被阅读0次

    预测宏块是由原宏块的左方和上方的像素构成的,在x264_slicetype_mb_cost函数中可以验证这一点,我在该源码中摘取一段:

    static void x264_slicetype_mb_cost( x264_t *h, x264_mb_analysis_t *a,
                                        x264_frame_t **frames, int p0, int p1, int b,
                                        int dist_scale_factor, int do_search[2], const x264_weight_t *w,
                                        int *output_inter, int *output_intra )
    {
    //......
    
    lowres_intra_mb:
        if( !fenc->b_intra_calculated )
        {
            ALIGNED_ARRAY_16( pixel, edge,[36] );  //pixel edge[36]
            pixel *pix = &pix1[8+FDEC_STRIDE];
            pixel *src = &fenc->lowres[0][i_pel_offset]; //i_pel_offset = 8 * (i_mb_x + i_mb_y * i_stride);说明src指向低分辨率子图像的某个宏块
            const int intra_penalty = 5 * a->i_lambda;
            int satds[3];   //存放satds计算结果
            int pixoff = 4 / sizeof(pixel);  //pixoff等于4;
    
            /* Avoid store forwarding stalls by writing larger chunks */
            //1.拷贝宏块的正上方一行的像素到pix。
            memcpy( pix-FDEC_STRIDE, src-i_stride, 16 * sizeof(pixel) );
            //2.拷贝宏块左边边缘的像素到pix。
            for( int i = -1; i < 8; i++ )  
                M32( &pix[i*FDEC_STRIDE-pixoff] ) = M32( &src[i*i_stride-pixoff] );
    
            //3.对8*8宏块进行satds计算。
            h->pixf.intra_mbcmp_x3_8x8c( h->mb.pic.p_fenc[0], pix, satds ); 
            int i_icost = X264_MIN3( satds[0], satds[1], satds[2] );
    
            //......
      }
    //......
    }
    

    我们先看第1,2步实际上是先将fenc->lowres中一个8*8宏块附近的内存拷贝到pix1内存块中,如下图:


    lowres_copy.png

    从图中我们看到,其实拷贝的是宏块左边和上方的像素值,后面我们将看到,x264会将对这些像素进行平均来构造新的宏块,然后跟原图像求差值,再进行Hadamard变换,然后求得satds。

    相关文章

      网友评论

          本文标题:(五)帧内宏块预测2:预测像素点

          本文链接:https://www.haomeiwen.com/subject/wuiziftx.html