X265研究

资料、工具和方法

文献综述(version2.4)

http://x265.readthedocs.io/en/default/cli.html:x265官方文档。

针对x265的论文和书籍很少,但博客很多。

  • http://blog.csdn.net/cabbage2008/article/category/6077644。 几乎每个文件都注释到了。但比较零碎。

  • http://blog.csdn.net/column/details/x265.html。仅仅注释部分文件,但比较系统,属于实战型的。

HEVC码流分析软件(version2.4)

  • GitHub有开源的HEVC分析器,具体网址如下https://github.com/lheric/GitlHEVCAnalyzer

  • Elecard。网址为: http://www.elecard.com/en/index.html。 csdn下可以下载破解版。

其他的还有商业的分析软件。记录如下。

  • CodecVisa。网址为: http://www.codecian.com/。

  • Intel video pro analyzer。网址为: https://software.intel.com/en-us/media-solutions-portal。

概念解析

  • B struction GOP:其长度为GOPSize=number of B frame + 1。显示次序:PBBP,编码次序:PPBB,则B struction GOP为PBB,长度为3。在x265 help的术语为B struction GOP,在x265源码为minigop。

编码库的使用

编码配置和帮助文档(version2.4)

cli文件夹为主程序所在的文件,应将其设置为启动项目。

具体文档详见http://x265.readthedocs.org,即–help运行后,最后一行有提示。

–pools的理解。NUMA为多处理器的一种架构,NUMA node为NUMA节点,其为一个处理器,而非一个核。一个处理器可以有多个核,比如双核、四核、八核、16核。

–pools “4”:在第一个处理器上分配4个线程。

–pools “1,1,1,1” 在4个处理器上,每个处理器分配一个线程,如果只有一个处理器,则只有一个线程。

数据的多线程读写(v10437_20150514)

YCBCR数据采用多线程的方式读入,数据结构为循环buf队列。在创建的子线程中,从文件读数据到循环buffer队列中,在主线程将循环buffer队列中的数据送入编码器编码。

  • 从文件读数据线程在模块CLIOptions::parse()中启动。

  • YUVInput::populateFrameQueue():将数据从文件读取到循环buffer中。

  • YUVInput::readPicture():数据从循环buffer读取,送到编码器编码。

其多线程和循环队列算法,非常具有参考意义。

核心总体编码流程(Version2.4)

Encoder::encode()

在这里插入图片描述

FrameEncoder::compressFrame()

在这里插入图片描述

核心算法流程

选择最优的编码模式

类: Analysis。

文件:analysis.cpp和analysis.h。

入口函数

  • Analysis():初始化

  • create():初始化

  • compressCTU():核心实现模块,选择最优的编码模式。

  • destroy():资源释放模块。

其他

x265命名风格(v10437_20150514)

结构体类型。在底层,单词小写,以_间隔,比如x265_param。在顶层,单词首字符大写,比如CLIOptions。

类类型。单词首字母大写,其他小写。比如Encoder。

结构体变量和普通变量。首单词小写,其他单词第一个字母大写。比如vbvMaxBitrate。

结构体和类成员,以m_为前缀。

关于命名风格,以后记录到c和c++的相关文档中。

y4m的格式详解

Y4m格式可以看作是对YCBCR文件的一封装。其信息主要分为三类:YCBCR文件的头信息,帧间隔符,YCBCR数据。

YCBCR文件的头信息,位于文件的开始。前10个字符是"YUV4MPEG2"+“0x20”(0x20表示字符空格),同理,每个paramter后都有一个"0x20"。写完所有参数之后跟一个"0x0A"(0x0A表示字符换行,来表示头部结束符)。

Y4M文件以一段明文开始。其前10个字符是署名"YUV4MPEG2 "(注意最后一个字符是空格(ASCII 0x20)。紧跟在署名后面的是各种视频参数信息,各参数信息都以空格(ASCII 0x20)分隔。参数信息通常包括 宽、高和帧率。

  • 帧宽:'W’后跟明文整数;如:W720

  • 帧高:'H’后跟明文整数;如:H480

  • 帧率: 'F’后跟每秒的整数,表示为一个分数的分子,分母。如下:

‘F30:1’ = 30 FPS

‘F25:1’ = 25 FPS (PAL/SECAM standard)

‘F24:1’ = 24 FPS (Film)

‘F30000:1001’ = 29.97 FPS (NTSC standard)

‘F24000:1001’ = 23.976 FPS (Film transferred to NTSC)

  • interlacing: 'I’后跟一个单独的字母表明交错的模式:

‘Ip’ = Progressive

‘It’ = Top field first

‘Ib’ = Bottom field first

‘Im’ = Mixed modes (detailed in FRAME headers)

  • 参数’A’: 像素宽高比。 注意这里只是表明像素的比率,不表示是图片的宽高比:

‘A0:0’ = unknown

‘A1:1’ = square pixels

‘A4:3’ = NTSC-SVCD (480x480 stretched to 4:3 screen)

‘A4:5’ = NTSC-DVD narrow-screen (720x480 compressed to a 4:3 display)

‘A32:27’ = NTSC-DVD wide-screen (720x480 stretched to a 16:9 display)

  • 参数’C’: 色彩空间(Color space)

‘C420jpeg’ = 4:2:0 with biaxially-displaced chroma planes

‘C420paldv’ = 4:2:0 with vertically-displaced chroma planes

‘C420’ = 4:2:0 with coincident chroma planes

‘C422’ = 4:2:2

‘C444’ = 4:4:4

  • 参数’X’: 注释。将被 YUV4MPEG2 解析器所忽略。

跟在参数信息后面的是按照Y-Cb-Cr存储的原始YUV数据。每帧数据都以’FRAME’开始再在后面加一个0x0A,其后就是原始的图像帧了(注意参数信息和帧头之间也要用0x0A)。每一帧原始图像的计算公式如下:

帧大小 = width * height * 3 / 2 (4:2:0)

帧大小 = width * height * 2 (4:2:2)

帧大小 = width * height * 3 (4:4:4)

如何将其转换为YCBCR?下载mencoder,具体命令行如下:

mencoder **.y4m -ovc raw -of rawvideo -vf format=i420 -o **.yuv。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部