H264一分析和总结.docx

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

H.264一

2007-12-3017:05

H.264标准写得比较繁复,所以考虑在浏览完Whitepaper之后就开始研读X264

代码。X264代码风格还是比较清晰简洁的。

根据对标准得理解,PictureOrderCount在Slice解码的一开始就被提及:

I0B1B2P3B4B5P6I0P3B1B2P6B4B5

于是I0的POC是0,P3的POC是3,B1是1……

为了支持H264复杂的帧存机制,X264以专门的一个模块frame.c进行处理。

common/frame.c中包括一组帧缓冲操作函数。包括对帧进行FILO和FIFO存取,空闲帧队列的相应操作等。

以下逐个函数分析encoder.c中编码一帧的函数x264_encoder_encode中有关

frame的调用:

x264_reference_update

这个函数里最主要的工作的是将上一个参考帧放入参考帧队列,并从空闲帧队列中取出一帧作为当前的参考工作帧(即解码操作的目的帧),即h-fdec。

x264_t结构体维护着CODEC的诸多重要信息,其中成员frames是一个指示和控制帧编码过程的结构。其中current是已经准备就绪可以编码的帧,其类型已经确定;next是尚未确定类型的帧;unused用于回收不使用的frame结构体以备今后再次使用。frames结构体中i_input指示当前输入的帧的(播放顺序)序号。i_delay设置为由B帧个数(线程个数)确定的帧缓冲延迟,在多线程情况下为i_delay=i_bframe+i_threads-1。而判断B帧缓冲填充是否足够则通过条件判断:h-frames.i_input=h-frames.i_delay+1-

h-param.i_threads。

x264_encoder_encode每次会以参数送入一帧待编码的帧pic_in,函数首先会从空闲队列中取出一帧用于承载该新帧,而它的i_frame被设定为播放顺序计数,如:fenc-i_frame=h-frames.i_input++。

x264_encoder_encode在根据上述判据确定B帧缓冲充满的情况下才进行后续编码工作。

当当前队列(current队列)可用帧为0时,需要对next队列中的帧进行判决,需要进行如下过程:

调用x264_slicetype_decide

这个函数确定当前条带(帧)的类型

其中首先调用x264_ratecontrol_slice_type,依据码率控制逐个求出next列表中所有帧的类型(虽然在当前并不全部用到,见后)。

随后统计审查并调整next列表,保证IDR帧满足有关最大关键帧间隔的要求的正常出现:即针对frm-i_frame-h-frames.i_last_idr=

h-param.i_keyint_max作判断。审查按顺序针对所有被判定为B系或AUTO类型的帧进行(这些帧在审核过程中被确认为B帧),直到遇到第一个不是这样的帧。

如果某个帧被指定为IDR,则一个GOP在它之前结束。

而后,即将next列表中已经判定的一系列帧(先后是一些B帧和一个非B

帧)转移到current列表中。在这个过程中:

原始序列(播放顺序)B0,B1,B2,P,转移后的顺序为P,B0,B1,B2。在使用bframe_pyramid模式时,中间的B帧要前置,即上述顺序变为:P,B1,B0,B2。

此时,就可以从current队列中取出一帧,进行编码,现在记这帧叫h-fenc。首先做几项和帧有关的设置工作:

如果f_enc是IDR,则将最近IDR序号标记h-frames.i_last_idr设置为

i_frame。

根据f_enc的类型确定NAL和SLICE类型相关参数。

设置POC为2*(h-fenc-i_frame-h-frames.i_last_idr)。并使得h-fdec和h-fenc的主要帧参数一致。

随后进行以下一些过程:

x264_reference_build_list

在这个函数中,我们将遇到参考帧列表h-frames.reference和H.264很有特色的双列表(h-fref0、h-fref1)。前者中放置了所有可用于参考的参考帧。首先将所有reference列表中的帧按照POC和h-fenc的POC的大小关系不同复制到双列表中,其中h-fref0放置POC较小的那

文档评论(0)

tianya189 + 关注
官方认证
内容提供者

该用户很懒,什么也没介绍

认证主体阳新县融易互联网技术工作室
IP属地上海
统一社会信用代码/组织机构代码
92420222MA4ELHM75D

1亿VIP精品文档

相关文档