相关说明:
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( ¶m, 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()函数会使文件指示器自动移位,这就是一帧一帧读取的实现过程.
分享到:
相关推荐
C标准库源代码\FREAD.C C标准库源代码\FREE.C C标准库源代码\FREOPEN.C C标准库源代码\FSCANF.C C标准库源代码\FSEEK.C C 标准库源代码\FSEEKI64.C C标准库源代码\FSETPOS.C C标准库源代码\FSTAT.C C标准库源代码\...
C代码 //初始置换表IP int IP_Table[64] = { 57,49,41,33,25,17,9,1, 59,51,43,35,27,19,11,3, 61,53,45,37,29,21,13,5, 63,55,47,39,31,23,15,7, 56,48,40,32,24,16,8,0, 58,50,42,34,26,18,10,2, ...
C语言文件读写函数,fread,fwrite函数的使用。 简单实例,仅供参考。
资源中包含了5个文件,其中两个为read函数和fread函数c语言实例的源码,以及编译后的两个代码的可执行文件,还包含了测试用的文件。
int x,y; int xx,yy; int chakela; int amd[200][200]; int rmd[200][200]; int gmd[200][200]; int bmd[200][200]; int yanser,yanseg,yanseb; FILE *zuojian; bool keys[256]; // Array Used For The Keyboard ...
c++ 读文件 fread是一个函数。从一个文件流中读数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功或读到文件末尾返回 0。
C语言fread函数和fwrite函数的用法及其实例
为什么fwrite写文件后,用fread读出来文件长度是0,即fread读不出数据
/* 从键盘输入4个学生的有关数据,然后把它们转存到磁盘文件上去 */ #include #define SIZE 4 struct student_type { char name[10]; int num; int age; char addr[15]; }stud[SIZE]; ...……
fread,fwrite的参数2,3顺序 为什么fread读出来的文件大小不对
为什么fread(),fwrite()的返回值总是为0,但是文件读写正常 初学C语言文件操作的新人,总会犯这个错误,明明文件读 写成功 ,但是返回值总是为0,而不是读写成功的字节数,原因是因为...
1、本文详细描述了c语言fread函数的用法。 2、通过详细示例,让读者更直观地阅读,更清晰的理解。 3、示例代码可直接复制,编译后可直接运行。 4、根据示例以及运行结果,让读者加强记忆及理解。
Matlab文件操作及读txt文件(fopen,fseek,fread,fclose).pdf
68000 反汇编C原码 /* * main() */ int main(int argc, char **argv) { char dis_op[64], dis_inst[32], dis_arg[24]... fread(buffer, sizeof(UINT8), fsize, fp); fclose(fp); ByteSwapMemory(buffer, fsize);
fread函数的用法
fread_fwrite.cpp
适合初学者,大神莫笑。C语言打开文件、判断大小、申请内存空间、初始化内存空间,复制读文件内容到内存空间等等,fopen,ftell,fseek,malloc,memset,fread,free,详细应用带详细注解源代码!!!
C语言fread函数和fwrite函数的用法及其实例[收集].pdf
采用Matlab下fread函数读取高光谱BIL文件数据
php fread函数用于读取文件(可安全用于二进制文件),其语法是fread(file,length),参数file必需,指规定要读取打开文件,length 必需,指规定要读取的最大字节数。 php fread函数怎么用? 定义和用法 fread() 函数...