文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>x264源代码分析(一)

x264源代码分析(一)

时间:2006-07-17  来源:lzhw_lucky

相关说明:

1.     使用版本:  x264-cvs-2004-05-11

2.     这次的分析基本上已经将代码中最难理解的部分做了阐释,对代码的主线也做了剖析,如果这个主线理解了,就容易设置几个区间,进行分工阅读,将各个区间击破了.

3.     需要学习的知识:

a)       编码器的工作流程.

b)      H.264的码流结构,像x264_sps_t,x264_pps_t等参数的定义基本上都完全符合标准文档中参数集的定义,抓住主要参数,次要参数也应该有所了解.

c)       数学知识,对dct变换等与数学相关的知识的编程实现要有较好理解.

d)      C语言的知识.涉及到c语言的较多不经常用的特性,如函数指针数组,移位运算,结构体的嵌套定义等.

e)       耐心,对h.264的复杂性要有清醒的认识.

3.参考资料:

a)       新一代视频压缩编码标准-h.264/avc  毕厚杰主编,人民邮电出版社.

b)      网上的流媒体论坛,百度,google等搜索引擎.

4. 阅读代码的方法:

a)       较好的方法是利用vc的调试器,如果对某个函数感兴趣,可以将断点设置在它的前面.然后采用step into,step over等方法进去该函数一步步分析.当然本身要对程序执行流程要有较清楚认识,不然不知道何时step into,何时step over.

b)      建议应该先对照标准弄清各个结构体成员的意义.

源代码主要过程分析:

 

1.       进入x264.c中的main函数.

刚开始是读取默认参数,如果你设置了参数的话会修改param的.

   i_ret = Encode( &param, fin, fout );

这条语句使过程进入x264.c中的Encode函数.

2.       X.264的encode函数.

A.     i_frame_total = 0;

if( !fseek( fyuv, 0, SEEK_END ) )

     {

        int64_t i_size = ftell( fyuv );

        fseek( fyuv, 0, SEEK_SET );

        i_frame_total = i_size / ( param->i_width * param->i_height * 3 / 2 )

}

上面这段计算出输入文件的总帧数.

B.      h = x264_encoder_open( param )这个函数是对不正确的参数进行修改,并对各结构体参数和cabac编码,预测等需要的参数进行初始化.

C.     pic = x264_picture_new( h );

该函数定义在\CORE\common.c中.首先分给能容纳sizeof(x264_picture_t)字节数的空间,然后进行初始化.

      这里看一下x264_picture_t和x264_frame_t的区别.前者是说明一个视频序列中每帧的特点.后者存放每帧实际的象素值.注意区分.

D.     for( i_frame = 0, i_file = 0; i_ctrl_c == 0 ; i_frame++ )

    {

        int         i_nal;

        x264_nal_t  *nal;

 int         i;

/* read a frame */

        if( fread( pic->plane[0], 1, param->i_width * param->i_height, fyuv ) <= 0 ||

            fread( pic->plane[1], 1, param->i_width * param->i_height / 4, fyuv ) <= 0 ||

            fread( pic->plane[2], 1, param->i_width * param->i_height / 4, fyuv ) <= 0 )

        {

            break;

        }

    //文件位置指示器自己变化了.

 

        if( x264_encoder_encode( h, &nal, &i_nal, pic ) < 0 )

        {

            fprintf( stderr, "x264_encoder_encode failed\n" );

        }

        ……

}

凡是出现for循环的地方都应该认真对待,这是我的一个体会,也是进入分层结构认真分析的好方法.

fread()函数一次读入一帧,分亮度和色度分别读取.这里要看到c语言中的File文件有一个文件位置指示器,调用fread()函数会使文件指示器自动移位,这就是一帧一帧读取的实现过程.

E.      然后进入x264_encoder_encode( h, &nal, &i_nal, pic )函数,该函数定义在/Enc/encoder.c中.

开始进入比较复杂的地方了.

相关阅读 更多 +
排行榜 更多 +
萌趣贪吃蛇

萌趣贪吃蛇

休闲益智 下载
粘液快跑

粘液快跑

休闲益智 下载
一个不能跑

一个不能跑

休闲益智 下载