`
mmdev
  • 浏览: 12934126 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

x264源代码分析1。fread()

 
阅读更多

相关说明:
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的复杂性要有清醒的认识.

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_tx264_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()函数会使文件指示器自动移位,这就是一帧一帧读取的实现过程.

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics