- 1、本文档共12页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
x264源代码分析(H264乐园供稿)
x264源代码分析(H.264乐园供稿)
相关说明:1.?????使用版本:??? x264-cvs-2004-05-112.?????这次的分析基本上已经将代码中最难理解的部分做了阐释,对代码的主线也做了剖析,如果这个主线理解了,就容易设置几个区间,进行分工阅读,将各个区间击破了.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( st
文档评论(0)