x264源码解读(一)- 关于颜色空间

目录

关于x64

main函数

结构体初始化

颜色空间

YUV

采样格式

4:4:4

4:2:2

4:2:0

YUV的存储方式

packet

Plane

RGB

YUV vs.RGB


关于x64

x264是h264的一个经典实现,x264其实不单单是对于h264的实现,里面包含了大量的视频相关知识,这个系列,我将和大家一起,通过研究x264的源码来探索音视频的世界。

源码下载:git clone https://code.videolan.org/videolan/x264.git

main函数

闲言少叙,在根目录中找到x264.c,搜索一下“main(”定位到main函数,扫一眼这个main函数:

REALIGN_STACK int main( int argc, char **argv )
{
    ... ...
    x264_param_default( &param );
    ... ...
    signal( SIGINT, sigint_handler );
    ... ...
    if( !ret )
        ret = encode( &param, &opt );

    /* clean up handles */
    if( filter.free )
        filter.free( opt.hin );
    else if( opt.hin )
        cli_input.close_file( opt.hin );
    if( opt.hout )
        cli_output.close_file( opt.hout, 0, 0 );
    if( opt.tcfile_out )
        fclose( opt.tcfile_out );
    if( opt.qpfile )
        fclose( opt.qpfile );
    x264_param_cleanup( &param );
... ...

    return ret;
}

可以看到主要做了四件事情:

  1. x264核心结构体进行初始化;
  2. 设置ctl+c事件响应(可以忽略,非核心操作);
  3. 编码;
  4. 资源释放

结构体初始化

我们逐一来看,首先看一下x264这个结构体的初始化:

REALIGN_STACK void x264_param_default( x264_param_t *param )
{
    /* */
    memset( param, 0, sizeof( x264_param_t ) );

    /* CPU autodetect */
    param->cpu = x264_cpu_detect();
    param->i_threads = X264_THREADS_AUTO;
    param->i_lookahead_threads = X264_THREADS_AUTO;
    param->b_deterministic = 1;
    param->i_sync_lookahead = X264_SYNC_LOOKAHEAD_AUTO;

    /* Video properties */
    param->i_csp           = X264_CHROMA_FORMAT ? X264_CHROMA_FORMAT : X264_CSP_I420; 
    ... ...
    param->b_annexb = 1;
    ... ....
}

这个结构体里面的属性定义可以一个大宝库,通过这个结构里面的数据,我们几乎可以窥见几乎整个视频处理核心对象,但是先不着急,我们先着重讲几个基础的字段,其他字段我们将在后面代码讲解中逐一讲解,解开视频处理的面纱。

颜色空间

第一个我想要讲的就是param->i_csp,csp是color space的缩写,中文意思是颜色空间,或者彩色空间;描述的是颜色集合的数学表示,颜色空间的表达方式称之为颜色格式,常见的有YUV以及RGB;其实在物理世界里面是有多种现象需要经过信息化的处理,将自然界或者物理世界存在的现象用信息化(也即二进制的方式表达出来),比如常见的像数模转化。所以,其本质是颜色编码系统,每种空间有不同的颜色组成方式,即不同的编码系统;

物理世界里面有的是连续,比如我们看到画面,颜色,都是无限连续的,但是在信息化表达方式里面无法表示无限的连续,于是就有了采样,即提取肉眼能够分辨程度的部分;主要介绍一下YVU以及RGB,明白这两个之后他们的变型,比如 YCbCr,YPbPr,BRG都可以明白了;下面体会一下什么是“编码系统”。

YUV

YUV颜色组成是由亮度和色度两部分组成,Y代表的是亮度(luma),UV分别存储了色度(chroma),分别描述色彩的颜色以及饱和度,这两个英文单词非常重要,在x264的代码很多地方都有使用;

YUV这种编码系统(颜色空间)的使用使用历史原因,就是彩色电视逐渐取代黑白电视时代,即需要颜色空间同时支持两种电视制式;黑白电视,只需要Y这个通道就可以了,彩色电视则是增加了UV通道,这样YUV完美的解决了黑白电视和彩色电视兼容问题;除此之外,因为人眼主要是对于亮度比色彩更加敏感,所以分离亮度和色度采样,即在采样的时候可以更大比例采样亮度信息,减少色度采样的比例;这种方式称之为采样格式,在x264也称之为像素格式(pixel format),采用4位来描述J:a:b:alpha,其中J亮度抽样数量,a代表水平分量色度采集的数量,b代表的垂直分量采集的色度数量。

采样格式

要明白YUV通常代表是YUV的家族,在YUV这个协议簇里面,最常用的就是YCbCr,JPEG以及MPEG都是采用此格式,其中Cb代表蓝色分量,Cr代表红色分量,常见的采样格式有如下三种:

4:4:4

YYYYCbCrCbCrCbCrCbCr,也称之为全像素帧点阵;每4个像素,有4个亮度分量,4个Cb和Cr分量;任何一个像素亮度采样和色度采样都是一样的,即每一个像素都有采样亮度和色度;这个也是实现了真正的无损,但是图像数据也是非常大,同行是专业的视频设备,演播室采用这种格式;

4:2:2

YYYYCbCrCbCr,每四个像素,有4个亮度分量,2个Cr和Cb分量;可以理解为亮度像素像素采样和像素比例是2:1,一半数量的像素采集全部色度亮度信息,一般数量的像素只是采集亮度信息,DVD,数字电视以及HDTV常用此格式,在CCIR601标准中,这种格式是分量彩色电视的标准;表示如下:

4:2:0

YYYYCbCr,这个比较特殊,描述的在水平和垂直分量上分别采集一个Cr和Cb,下图中实心圈代表亮度,空心圈以及带线的圈都标色度分量Cr以及Cb,可以理解第一行采样位4:2:0,第二行采样为4:0:2,广泛应用于数字电视、会议电视、DVD 等;表示为:

YUV的存储方式

Packet

下面我们再来看一下YUV格式存储方式,YUV有两种表达方式,第一种是packet,这种存储方式下,YUV通道交错存储,例如UYVY ,是YUV422的一种表达方式,即相邻的两个Y共享一个UV,存储的结构是U-Y-V-Y,这样本来是两个像素,分别是YUV-Y,即第一个像素采集YUV信息,第二个像素采集Y信息,不过第二个像素共享第一个像素的UV信息(这样做是因为相邻两个像素色度基本都是一样的,所以可以共享),如下所示,其中UV分量采用Cb和Cr来表示:

另外YUYV/YUY2存储方式类似,只不过顺序不同而已;

Plane

另外一种是planer(平板)方式,即首先存储Y的全部像素,然后再存储CrCb,例如下面就是YUV422P的存储结构,可以看到所谓的Pane模式就是聚堆存储,第一堆存储Y,第二堆粗出Cb,第三堆存储Cr:

其中,YU12,YV12是YUV420的Plane表达:

另外,NV12,NV21属于YUV420存储,不过NV系的存储是Packet和Plane融合在一起,其中亮度Y的存储遵循Plane,UV的存储则是packet,交叉进行:

RGB

根据三基色原理,任何颜色都可以通过红色(Red),绿色(Green),蓝色(Blue)组合而成,在RGB颜色编码也采用这种方式,显示器设备中彩色显像管(CRT),液晶显示器(LCD)可显示彩色图像都是基于RGB;

RGB在存储的格式也比较多,YUV有很多存储格式,RGB也不例外,常见的有RGB565以及RGB888,后面的3个数字分别代表RGB颜色的位数,RGB888代表RGB三个位格子可以表示2^8个颜色深度,我们讲的24位图就是值RGB888,24就是来与3通道,每个通道用8bit来表示;

YUV vs.RGB

其实可以看到在传输领域一般都是采用YUV,比如电视信号,这个是因为YUV在传输过程中有很大的优势,因为可以针对亮度色度分类,做差异化采样从而实现数据压缩,而作为终端显示,扫描枪扫描显示,无疑RGB编码是最简单实现的;所以2者各自有着领域;

YUV和RGB是可以互相转化的,转化的公式如下所示:

Y = 0.299R + 0.587G + 0.114B 
U = -0.147R - 0.289G + 0.436B 
V = 0.615R - 0.515G - 0.100B

R = Y + 1.14V 
G = Y - 0.39U - 0.58V 
B = Y + 2.03U

下一节,我们说一下annexb相关故事。

参考:

图文详解YUV420数据存储格式_laikaikai的博客-CSDN博客_yuv420p图像的数据存储方式

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张叫兽的技术研究院

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值