x264源码解析(01)

 

    由main函数进入参数设置后开始Encode函数。。。这里只把Encode函数体解析下,借鉴了很多网上资源(即使不全是自己原话也是亲手打字上去的哦^_^),感谢网友。

 

    代码似懂非懂的注释了下,尽当资源存储吧吧,暂且发到博客大家讨论批评。

 

 

static int Encode( x264_param_t *param, cli_opt_t *opt )

{

    x264_t *h; //还不知道干啥的,这个结构也很烦,不压x264_param_t

    x264_picture_t pic; //一帧的结构体,色度存储

 

    int     i_frame, i_frame_total;

    int64_t i_start, i_end; //用来计算时间

    int64_t i_file;

    int     i_frame_size;

    int     i_update_interval;

    char    buf[200];

 

    opt->b_progress &= param->i_log_level < X264_LOG_DEBUG;

    i_frame_total = p_get_frame_total( opt->hin );

    i_frame_total -= opt->i_seek;

    if( ( i_frame_total == 0 || param->i_frame_total < i_frame_total )

        && param->i_frame_total > 0 )

        i_frame_total = param->i_frame_total;

    param->i_frame_total = i_frame_total;

     //上面这段代码是实现,计算文件中的总共的帧数,并根据输入的参数初始帧的位置,

     //对i_frame_total做出修正,i_frame_total -= opt->i_seek,然后再根据param->i_frame_total,

     //对i_frame_total做出进一步的修正。

     //总体来说,就是对参数设置中的进行编码的帧数的总数进行修正和计算。

 

 

    i_update_interval = i_frame_total ? x264_clip3( i_frame_total / 1000, 1, 10 ) : 10;

 

    if( ( h = x264_encoder_open( param ) ) == NULL )//关键函数:x264_encoder_open( param ) 根据参数要求对encoder进行一系列的初始化,例如分配内存,值的初始化等。

    {

        …… ……(略)

    }

 

    if( p_set_outfile_param( opt->hout, param ) )//关键函数:p_set_outfile_param() 设置输出文件格式

    {

        …… ……(略)

    }

 

   

     //关键函数:x264_picture_alloc() 按照色度空间分配内存,并返回内存的首地址作为指针

    if( x264_picture_alloc( &pic, X264_CSP_I420, param->i_width, param->i_height ) < 0 )

    {

        …… ……(略)

    }

 

     //关键函数:x264_mdate()     用于编码用时的计算,设定起始时间

    i_start = x264_mdate();

 

   

    for( i_frame = 0, i_file = 0; b_ctrl_c == 0 && (i_frame < i_frame_total || i_frame_total == 0); )

    {

         //p_read_frame() 按照h->hin提供的输入文件的地址,读入图像的内容到&pic提供的存储区的首地址

        if( p_read_frame( &pic, opt->hin, i_frame + opt->i_seek ) )

            break;

 

        pic.i_pts = (int64_t)i_frame * param->i_fps_den;

 

        if( opt->qpfile )

            parse_qpfile( opt, &pic, i_frame + opt->i_seek );//parse_qpfile() 为从指定的文件中读入qp的值留下的接口,qpfile为文件的首地址

        else

        {

           

            pic.i_type = X264_TYPE_AUTO;

            pic.i_qpplus1 = 0;

        }

 

        i_frame_size = Encode_frame( h, opt->hout, &pic );/

         //用于显示整个编码过程的进度

        if( opt->b_progress && i_frame % i_update_interval == 0 )

        {

            int64_t i_elapsed = x264_mdate() - i_start;//编码使用的时间计算

            //帧率的计算

            double fps = i_elapsed > 0 ? i_frame * 1000000. / i_elapsed : 0;

            double bitrate = (double) i_file * 8 * param->i_fps_num / ( (double) param->i_fps_den * i_frame * 1000 );

             …… ……(略)

 

            SetConsoleTitle( buf );

            fflush( stderr ); // needed in windows

        }

    }

    ……   ………………

    // 后边的除了清理工作,其他的还不知道。

    return 0;

}

你可能感兴趣的:(c,windows,工作,File,null,存储)