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( ¶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()函数会使文件指示器自动移位,这就是一帧一帧读取的实现过程.
x264源代码分析1。fread()相关推荐
- x264源代码分析.
l 相关说明: 1. 使用版本: x264-cvs- 2004-05-11 2. 这次的分析基本上已经将代码中最难理解的部分做了阐释,对代码的主线也做了剖析,如果这个主线理解了,就容易设置几个区间,进 ...
- x264里的2pass指的是什么意思? x264源代码分析2.encode()
A:x264里的2pass指的是什么意思?另外stat是什么意思, 比如有个参数--stats <string> Filename for 2 pass stats [/&q ...
- x264源代码简单分析:x264命令行工具(x264.exe)
===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...
- x264源代码简单分析:熵编码(Entropy Encoding)部分
===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...
- x264源代码简单分析:宏块编码(Encode)部分
===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...
- x264源代码简单分析:宏块分析(Analysis)部分-帧间宏块(Inter)
===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...
- x264源代码简单分析:滤波(Filter)部分
===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...
- x264源代码简单分析:x264_slice_write()
===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...
- x264源代码简单分析:编码器主干部分-2
===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...
最新文章
- [转]12款最佳Linux命令行终端工具
- python to_excel保存成xls_pd.ExcelWriter(to_excel)保存结果到已存在的excel文件中
- spring 基于xml方式配置aop
- 为什么简单的删除集合中的元素竟然报错了?
- Python企业微信机器人
- 【Oracle】非RMAN恢复数据文件、控制文件
- 13. jQuery - 设置内容和属性
- 天勤数据结构顺序表算法操作含完整测试
- TCP—为什么是AIMD?
- 第一个FPGA项目:led_flash简介项目流程和项目中遇到的问题
- python下载b站视频_python怎么下载b站视频
- matlab 双均线,[转载]百年一人的双均线系统及双均线系统公式
- w ndows安装程序无法将,windows安装程序无法将windows配置在硬件上运行
- 逆转裁判Ace Attorney
- 高数_第3章重积分__二重积分_怎样交换积分次序
- spring学习(四)spring 持久层的封装
- 【大数据开发必看】项目一 电信客服
- 【学习笔记】AGC009/AGC019/AGC029/AGC035
- 有限域(Galois Field,GF,伽罗华域)的乘法原理
- 安卓手机怎么录屏?精心挑选这几款录屏软件,个个好用
热门文章
- php聊天室技术,PHP聊天室技术
- java面试宝典 多线程,《java面试宝典》之java多线程面试题
- 第一次尝试修复Hbase2出现Region不一致,HBCK2
- JAVA 捕获异常所遇BUG
- 【Python CheckiO 题解】Feed Pigeons
- Spring Boot Actuator监控关闭
- android 自定义相机源码,Android 自定义相机及分析源码
- Linux 启动失败 磁盘阵列,组建RAID5重启系统,出现md127的解决办法
- 【2019浙江省赛 - K 】Strings in the Pocket(马拉车,思维)
- *【CodeForces - 202C 】Clear Symmetry (思维,找规律,特判)