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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在centos下安装pycrypto报错 RuntimeError: autoconf error

解决&#xff1a;yum -y install gcc File "/usr/lib64/python3.6/distutils/dist.py", line 974, in run_command cmd_obj.run() File "/usr/lib64/python3.6/distutils/command/build.py", line 135, in run self.run_command(cm…

Java多线程实现异步调用

在Java平台,实现异步调用的角色有如下三个角色&#xff1a;调用者、 提货单 、真实数据&#xff0c;一个调用者在调用耗时操作,不能立即返回数据时,先返回一个提货单 .然后在过一断时间后凭提货单来获取真正的数据.去蛋糕店买蛋糕&#xff0c;不需要等蛋糕做出来(假设现做要很长…

sql server 2008 r2卸载重装_免费下载:Intouch软件、Windows操作系统、SQL数据库,VB6.0、C#...

为大家整理了常用的Windows操作系统和安装软件&#xff0c;基本上都是经过我们项目测试OK的版本&#xff0c;以后项目调试就齐全了&#xff0c;不用再“东奔西走”&#xff0c;“小鹿乱撞”了。整理不易&#xff0c;若对您有帮助请关注并转发&#xff0c;以便帮助到更多的人。I…

Android ToolBar 使用完全解析

ToolBar简介 ToolBar是Android 5.0推出的一个新的导航控件用于取代之前的ActionBar&#xff0c;由于其高度的可定制性、灵活性、具有Material Design风格等优点&#xff0c;越来越多的应用也用上了ToolBar&#xff0c;比如常用的知乎软件其顶部导航栏正是使用ToolBar。官方考虑…

【零散积累】传输文件(sz/rz/scp命令)

来自wiki迁移页面路径&#xff1a;刘旺的主页 / 个人零散积累 / 01> 传输文件&#xff08;sz/rz/scp命令&#xff09; 工作中的传输文件会出现在linux之间&#xff0c;或者linux与windows之间。 一、怎么实现linux与windows之间的文件传输&#xff1f; 1.sz和rz是什么 s…

x264_macroblock_cache_load()

功能:完成将已编码数据参数和待编码数据装入到h->mb.cache中,下图是BUF中存储的数据在以MB为单位的时候的存储顺序 x264_macroblock_cache_load( h, i_mb_x, i_mb_y );//是把当前宏块的up宏块和left宏块的intra4x4_pred_mode&#xff0c;non_zero_count加载进来&#xff0c…

U(优)盘安装FreeBSD-9.0+GNOME_lite桌面

贴图在我的主页&#xff1a;http://hi.baidu.com/daodej/item/26313f4fc3db51ef1f19bcc6 修订于&#xff1a;2012/07/04 标题&#xff1a;U(优)盘安装FreeBSD-9.0GNOME_lite桌面&#xff0c;boot0启动XP(Windows)、FreeBSD、Ubuntu(Linux)三系统 【黑括号表示说明&#xff0c;中…

【零散积累】 vim常用操作

类型 操作 含义 删除 dd 删除游标所在的一整行(常用) ndd n为数字。删除光标所在的向下n行&#xff0c;例如20dd则是删除光标所在的向下20行 d1G 删除光标所在到第一行的所有数据 dG 删除光标所在到最后一行的所有数据 d$ 删除光标所在处&#xff0c;到该…

生活中常见物联网实例_物联网网关常见问题解答(一)

1.为什么物联网解决方案需要网关&#xff1f;物联网网关弥合了设备&#xff0c;传感器&#xff0c;设备&#xff0c;系统和云之间的通信鸿沟。通过系统地连接云&#xff0c;物联网网关提供了本地处理和存储&#xff0c;并具有基于传感器输入的数据自主控制现场设备的功能。物联…

predict_16x16[i_mode]( p_dst, i_stride )lowres

h->predict_16x16[i_mode]( p_dst, i_stride ); 计算对应预测模式时的预测采样值。输出放到dst指向的数组中。Pred0ct_16x16是7个元素指向的数组&#xff0c;数组的每个元素是一个指向函数的指针变量&#xff0c;在x264_predict_16x16_init函数初始这个指针数组。7个元素分…

【零散积累】shell脚本学习

来自wiki迁移页面路径&#xff1a;刘旺的主页 / 个人零散积累 / 03> shell脚本学习 case Shell case语句&#xff08;多分支条件判断&#xff09; $( ) Linux—shell中$(( ))、$( )、与${ }的区别 - chengd - 博客园 在bash中&#xff0c;$( )与 &#xff08;反引号&…

mysql 表锁-解锁

遇到问题“”用工具navicat打开一张表的时候&#xff0c;有的时候会发现这张表怎么打不开&#xff0c;关了navicat工具&#xff0c;再打开&#xff0c;也是同样的状态。查看表锁&#xff1a;show OPEN TABLES where In_use > 0;查看是否是表锁住了。-- 查看进程号 show proc…

alsa 测试 linux_Electron 构建步骤 (Linux)

遵循下面的引导&#xff0c;在 Linux 上构建 Electron .PrerequisitesPython 2.7.x. 一些发行版如 CentOS 仍然使用 Python 2.6.x &#xff0c;所以或许需要 check 你的 Python 版本&#xff0c;使用 python -V.Node.js v0.12.x. 有很多方法来安装 Node. 可以从 Node.js下载原文…

JavaScript中的数学对象Math

js数学对象Math //四舍五入 var res Math.round(5.921);//获取最大值 var res Math.max(10,23,523,43,65,46,32,32);//获取最小值 var res Math.min(12312,324,32,42,3,23,412,4332,21,3,-1);//获取绝对值 var res Math.abs(-100);//退一取整 var res Math.floor(1.9);//…

centos7-安装mysql5.6.36

本地安装了mysql5.7, 但和springboot整合jpa时会出现 hibernateException, 不知道为什么, 换个mysql5.6版本的mysql, 源码安装, cmake一直过不去, 后来改成rpm安装 1, 获取mysql5.6 ftp://ftp.mirrorservice.org/sites/ftp.mysql.com/Downloads/MySQL-5.6/ 下载: 解压: 其中…

mad的问题汇总

Q&#xff1a;我想将I帧的预测图像和原始图像的平均绝对误差给输出来&#xff0c;请问这个在JM86中需要在哪一点改动呢&#xff1f;谢谢 A&#xff1a; 差值保存在diffy中&#xff1a; diffy[j][i] imgY_org[img->opix_yj][img->opix_xi] - pred[j][i]; 分析MAD不知道程…

迷之骚缩写

搜集一些 GitHub 常见骚缩写&#xff0c;以备查询使用。 原文链接&#xff1a;LGTM? 那些迷之缩写 PR: Pull Request. 拉取请求&#xff0c;给其他项目提交代码LGTM: Looks Good To Me. 朕知道了 代码已经过 review&#xff0c;可以合并SGTM: Sounds Good To Me. 和上面那句意…

github设置中文_静态博客托管图片至 GitHub

从 MWeb 切换到静态博客 Jekyll 之后&#xff0c;我就面临一个问题&#xff0c;这在很久之前使用 Hexo 同样遇过的&#xff1a;图片托管在何处。MWeb 的解决方式很棒&#xff0c;直接插入图片&#xff0c;推送到 Github 后亦能正常引用并显示&#xff0c;无需图床或者借助第三方…

JavaScript中的正则

js正则 正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串, 正则表达式通常被用来检索、替换那些符合某个模式的文本 声明方式 普通字符 new RegExp();/hehe/转义字符 \w \W \d \D \s \S var reg /\w/;//单个的字母数字下划线 var reg /\W/;…

SQL注入【sqli靶场第23-28关】(七)

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 0、总体思路 先确认是否可以SQL注入&#xff0c;使用单…