源码分析系列(一)x264_main_dataflow

http://www.cnblogs.com/xkfz007/articles/2616153.html

帧内帧间编码部分关键函数

1.1 x264_encoder_open (x264_param_t *param )

功能

分配编码器所需结构体。

检测参数有效性。

初始化sps和pps。

分配编码器所需memory空间,包括参考帧和缓冲帧。

初始化macroblock cache相应空间。

分配编码器所需memory空间,包括参考帧和缓冲帧。

根据cpu类型,初始化各指令集加速函数。

输入项目

x264_param_t *param

输出项目

x264_t *h

存储分配

x264_t *h = x264_malloc( sizeof( x264_t ) );

h->out.p_bitstream = x264_malloc( h->out.i_bitstream );

h->frames.unused[i] = x264_frame_new( h );

h->frames.reference[i] = x264_frame_new( h );

x264_ratecontrol_new( h ) ;

1.2 x264_encoder_encode(x264_t *h, x264_nal_t **pp_nal, int *pi_nal, x264_picture_t *pic)

功能

处理编码帧队列,并设置编码帧类型。

初始化参考列表、码率控制等相关信息。

根据编码信息,写sps、pps位流。

调用int x264_slices_write( x264_t *h )函数编码一帧。

更新码率控制、噪声抑制等参数。

输入项目

x264_t *h

x264_nal_t **pp_nal

int *pi_nal

x264_picture_t *pic

输出项目

Log文件等。

程序逻辑

如附图1所示。

附图1: x264_encoder_encode流程图

1.3 x264_slice_write(x264_t *h, int i_nal_type, int i_nal_ref_idc)

功能

调用x264_slice_header_write函数向码流写入slice header

Load宏块到cache

宏块分析

宏块编码

宏块写cavlc/cabac

保存宏块到cache

输入项目

x264_t *h

int i_nal_type

int i_nal_ref_idc

程序逻辑

如附图2所示:

附图2: x264_slice_write流程图

1.4 x264_macroblock_analyse(x264_t *h )

功能

初始化;

对于I Slice,遍历所有16x16和4x4预测模式,得到最小Cost所对应的分块方式和预测模式;

对于P Slice,如果宏块周围有Skip模式的宏块,检测当前块是否是Skip块,如果不是Skip块,遍历所有可能的块划分模式,对每种模式进行运动估计并计算Cost,计算intra对应的16x16和4x4的Cost(包括色度),比较所有的Cost,选最小的Cost对应的模式为最终模式。

输入项目

x264_t *h

程序逻辑

如附图3所示:

附图3: x264_macroblock_analyse流程图

1.5 x264_macroblock_encode(x264_t *h )

功能

DCT;

量化;

Zigzag;

反量化;

运动补偿;

得到残差的dct域coff。

输入项目

x264_t *h

程序逻辑

如附图4所示:

附图4:x264_macroblock_encode流程图

运动补偿x264_mb_mc( x264_t *h )的大体流程,如附图5所示:

附图5: x264_mb_mc流程图

分类: X264

时间: 2024-10-25 06:41:51

源码分析系列(一)x264_main_dataflow的相关文章

SpringMVC源码分析系列

说到java的mvc框架,struts2和springmvc想必大家都知道,struts2的设计基本上完全脱离了Servlet容器,而springmvc是依托着Servlet容器元素来设计的,同时springmvc基于Spring框架,Spring框架想必搞java的同学都很熟悉. 一进Spring的官网就发现了这样一排醒目的文字, spring可以让我们构造简单的.便携的.又快又易于扩展的基于jvm的系统和应用程序. 没错,基于Spring的MVC框架SpringMVC同样也可以构造具有这些特

Cordova Android源码分析系列一(项目总览和CordovaActivity分析)

PhoneGap/Cordova是一个专业的移动应用开发框架,是一个全面的WEB APP开发的框架,提供了以WEB形式来访问终端设备的API的功能.这对于采用WEB APP进行开发者来说是个福音,这可以避免了原生开发的某些功能.Cordova 只是个原生外壳,app的内核是一个完整的webapp,需要调用的原生功能将以原生插件的形式实现,以暴露js接口的方式调用. Cordova Android项目是Cordova Android原生部分的Java代码实现,提供了Android原生代码和上层We

jQuery源码分析系列(33) : AJAX中的前置过滤器和请求分发器

jQuery1.5以后,AJAX模块提供了三个新的方法用于管理.扩展AJAX请求,分别是: 1.前置过滤器 jQuery. ajaxPrefilter 2.请求分发器 jQuery. ajaxTransport, 3.类型转换器 ajaxConvert 源码结构: jQuery.extend({ /** * 前置过滤器 * @type {[type]} */ ajaxPrefilter: addToPrefiltersOrTransports(prefilters), /** * 请求分发器 *

jQuery源码分析系列(38) : 队列操作

Queue队列,如同data数据缓存与Deferred异步模型一样,都是jQuery库的内部实现的基础设施 Queue队列是animate动画依赖的基础设施,整个jQuery中队列仅供给动画使用 Queue队列 队列是一种特殊的线性表,只允许在表的前端(队头)进行删除操作(出队),在表的后端(队尾)进行插入操作(入队).队列的特点是先进先出(FIFO-first in first out),即最先插入的元素最先被删除. 为什么要引入队列? 我们知道代码的执行流有异步与同步之分,例如 var a

jQuery源码分析系列(36) : Ajax - 类型转化器

什么是类型转化器? jQuery支持不同格式的数据返回形式,比如dataType为 xml, json,jsonp,script, or html 但是浏览器的XMLHttpRequest对象对数据的响应只有 responseText与responseXML 二种 所以现在我要定义dataType为jsonp,那么所得的最终数据是一个json的键值对,所以jQuery内部就会默认帮你完成这个转化工作 jQuery为了处理这种执行后数据的转化,就引入了类型转化器,如果没有指定类型就依据响应头Con

jQuery源码分析系列(34) : Ajax - 预处理jsonp

上一章大概讲了前置过滤器和请求分发器的作用,这一章主要是具体分析每种对应的处理方式 $.ajax()调用不同类型的响应,被传递到成功处理函数之前,会经过不同种类的预处理(prefilters). 预处理的类型取决于由更加接近默认的Content-Type响应,但可以明确使用dataType选项进行设置.如果提供了dataType选项, 响应的Content-Type头信息将被忽略. 有效的数据类型是text, html, xml, json,jsonp,和 script. dataType:预期

jquery2源码分析系列目录

学习jquery的源码对于提高前端的能力很有帮助,下面的系列是我在网上看到的对jquery2的源码的分析.等有时间了好好研究下.我们知道jquery2开始就不支持IE6-8了,从jquery2的源码中可以学到很多w3c新的标准( 如html5,css3,ECMAScript).原文地址是:http://www.cnblogs.com/aaronjs/p/3279314.html 关于1.x.x版的jquery源码分析系列,本博客也转载了一个地址http://www.cnblogs.com/jav

jQuery1.6源码分析系列

原文地址:http://www.cnblogs.com/nuysoft/archive/2011/11/14/2248023.html jQuery源码分析(版本1.6.1) 目录 00 前言开光 01 总体架构 02 正则表达式-RegExp-常用正则表达式 03 构造jQuery对象-源码结构和核心函数 03 构造jQuery对象-工具函数 04 选择器 Sizzle-工作原理 04 选择器 Sizzle-设计思路 04 选择器 Sizzle-从左向右的余热 04 选择器 Sizzle-块分

MyCat源码分析系列之——SQL下发

更多MyCat源码分析,请戳MyCat源码分析系列 SQL下发 SQL下发指的是MyCat将解析并改造完成的SQL语句依次发送至相应的MySQL节点(datanode)的过程,该执行过程由NonBlockingSession.execute()触发: public void execute(RouteResultset rrs, int type) { // clear prev execute resources clearHandlesResources(); if (LOGGER.isDe

jQuery-1.9.1源码分析系列完毕目录整理

jQuery 1.9.1源码分析已经完毕.目录如下 jQuery-1.9.1源码分析系列(一)整体架构 jQuery-1.9.1源码分析系列(一)整体架构续 jQuery-1.9.1源码分析系列(二)jQuery选择器 jQuery-1.9.1源码分析系列(二)jQuery选择器续1 jQuery-1.9.1源码分析系列(二)jQuery选择器续2——筛选 jQuery-1.9.1源码分析系列(三) Sizzle选择器引擎——词法解析 jQuery-1.9.1源码分析系列(三) Sizzle选择