EDID
HDMI EDID的长度一般是256字节,分成2个Block,分别是Block0和Block1
PS:VGA和DVI接口的EDID,是只有一个Block而已,即Block0,共128字节
如果想了解更多EDID的知识,可以参考这篇文章
https://www.cnblogs.com/fire909090/p/10523604.html
Block0
EDID Block0,共128字节,该block的格式是固定的,即每个字段的摆放位置是固定的,因此代码解析起来会相对简单些
一张长图了解一下,如图中的Example Data作为例子,对照来看就明白其中各个字节代表的意思了
注意:上图有一个First Detailed Timing Descriptor和一个Second Detailed Timing Descriptor,所谓Detailed Timing Descriptor,这里简称DTD,是用来详细描述一个分辨率(时序)的,一个DTD占18字节
Block1
CEA Extension Header
Block1的开头4个字节,名为CEA Extension Header,格式如下
- Byte0:CEA Extension Tag,固定是0x02
- Byte1:Revision Number,现在一般是0x03
- Byte2:是一个DTD的偏移,假设该值是0x50,表示从0x50位置开始就是描述DTD的了
- Byte3:看下图的解释就明白该字节各个bit代表的意思了
例如下图EDID的黄色背景部分,就是Block1的头(后面会以这个EDID来举例说明)
Tag 分类
接下来,Block1里的各个字段(Tag)的位置是不固定的,需要解析Tag类型才知道接下来的数据属于什么Tag数据
具体有哪些Tag类型呢?
常见的EDID,一般会有以下几种Tag类型,至今还在用
一般会有Video Data Block、Audio Data Block、Speaker Allocation Data Block、Vendor Specific Data Block(VSDB)
具体是哪种类型,由第1个字节的bit7~bit5这3bits决定,3bits的数据就决定了它最多只有8种类型
后5bits表示紧接着该Tag的数据长度
后续又添加了新的Tag,发现3bits的位宽不够,新的Tag有如下这些
不过幸好上面3bits最后一种情况是Use Extended Tag,即使用扩展的Tag,所以就有了下图的定义
意思是如果第1个字节的bit7~bit5的值是7(Use Extended Tag),就要看第2个字节了,根据第2个字节的值才知道是什么Tag类型的
接下来会用一个实际的EDID来分析各个Tag,在此我用三星电视的一个HDMI 2.0 EDID来作为例子说明
只截取它的Block1来分析就好
Video Data Block
看下图EDID的黄色背景部分
第1个字节是0x57,bit7~bit5是010,即十进制的2,2对应的Tag是Video Data Block;bit4~bit0是10111,即十进制的23,表示0x57后面还有23个字节,这23个字节都是属于Video Data Block的,即上图的黄色背景部分
接着就要看看这23个字节代表的是什么意思了
每一个字节都叫做Short Video Descriptor(SVD),SVD里包含着Video Identification Code(VIC)
如下图,有两种
第一种VIC是1~64的,bit7是表示该VIC是不是native分辨率,native有最佳分辨率的意思。最佳分辨率也可以是EDID Block0里的第一个DTD
第二种VIC是超过64的
这23个字节里的每一个字节都是独立的,VIC是HDMI里面用来表示分辨率的代号,VIC的值都是HDMI标准定义好的,如下3张图
4K30、4K25、4K24这几个一般会放在VSDB里,但也有放在Video Data Block里的,也有两处都放的
放在VSDB里的VIC分别是1、2、3,后续还会讲到;放在Video Data Block里的VIC分别是95、94、93
4K50和4K60
所以分析得到这23个字节分别表示三星电视支持的23种分辨率,列一下
VIC(十六进制) | VIC(十进制) | 分辨率 |
---|---|---|
0x61 | 97 | 3840x2160P@60 |
0x10 | 16 | 1920x1080P@60 |
0x1F | 21 | 1920x1080P@50 |
0x04 | 4 | 1280x720P@60 |
0x13 | 19 | 1280x720P@50 |
0x05 | 5 | 1920x1080I@60 |
0x14 | 20 | 1920x1080I@50 |
0x20 | 32 | 1920x1080P@24 |
0x21 | 33 | 1920x1080P@25 |
0x22 | 34 | 1920x1080P@30 |
0x5D | 93 | 3840x2160P@24 |
0x5E | 94 | 3840x2160P@25 |
0x5F | 95 | 3840x2160P@30 |
0x60 | 96 | 3840x2160P@50 |
0x65 | 101 | 4096x2160P@50 |
0x66 | 102 | 4096x2160P@60 |
0x62 | 98 | 4096x2160P@24 |
0x63 | 99 | 4096x2160P@25 |
0x64 | 100 | 4096x2160P@30 |
0x07 | 7 | 720x480I@60 |
0x16 | 22 | 720x576I@50 |
0x03 | 3 | 720x480P@60 |
0x12 | 18 | 720x576P@50 |
Audio Data Block
接着看下图EDID的黄色背景部分
第1个字节是0x29,bit7~bit5是001,即十进制的1,1对应的Tag是Audio Data Block;bit4~bit0是01001,即十进制的9,表示0x29后面还有9个字节,这9个字节都是属于Audio Data Block的,即上图的黄色背景部分
接着就要看看这9个字节代表的是什么意思了,它是3个字节成一组,所以此处有3组声音相关的描述,如下图
Byte1的bit6~bit3表示一种音频格式,有如下几种格式
当Audio Format Codes是 2 ~ 8 时,Byte3的意思又有新的含义了,如下图
当Audio Format Codes是 9 ~ 15 时,Byte3的意思又有新的含义了,如下图
所以分析得到这9个字节分别表示三星电视支持的3种音频格式,列一下
Index | Audio Format | Max Channels | Sample Rates(kHz) | Max Bit Rate |
---|---|---|---|---|
ADB1 | LPCM | 2 | 32, 44.1, 48 | 16bit, 20bit, 24bit |
ADB2 | AC-3 | 6 | 32, 44.1, 48 | 640kHz |
ADB3 | DTS | 6 | 48 | 1536kHz |
Speaker Allocation Data Block
按部就班,接着看下图EDID的黄色背景部分
第1个字节是0x83,bit7~bit5是100,即十进制的4,4对应的Tag是Speaker Allocation Data Block;bit4~bit0是00011,即十进制的3,表示0x83后面还有3个字节,这3个字节都是属于Speaker Allocation Data Block的,即上图的黄色背景部分
接着就要看看这3个字节代表的是什么意思了,它是3个字节成一组,所以此处有1组喇叭位置相关的描述,如下图
主要是看Byte1,所以分析得到三星电视只有 FL/FR (前左和前右)两个喇叭,这个Data Block的数据一般很少用
Video Capability Data Block
按部就班,接着看下图EDID的黄色背景部分
第1个字节是0xE2,bit7~bit5是111,即十进制的7,7对应的Tag是Use Extended Tag;所以还要看第2个字节才知道是什么Tag,第1个字节的bit4~bit0是00010,即十进制的2,表示0xE2后面还有2个字节,而第2个字节的值是0,对应的是Video Capability Data Block(VCDB),所以最后描述该Data Block的就剩下第3个字节了,即上图的黄色背景部分
接着就要看看这1个字节代表的是什么意思了
Byte3各个Bit的意思如下图
bit1~bit0:是否支持 CE video,如 480p, 480i, 576p, 576i, 240p, and 288p, 1080i, 1080p, and 720p,默认用 Limited range
bit3~bit2:是否支持 IT video,默认用 Full range
bit5~bit4:看字面意思,一般是0
bit6:QS,即 Quantization Range Selectable,RGB only. 如果该bit是1,则sink端接收到AVI info里的Q=1时用的是 Limited range,收到AVI info里的Q=2时用的是 Full range
bit7:QY,YCC only. 如果该bit是1,则sink端接收到AVI info里的YQ=0时用的是 Limited range,收到AVI info里的YQ=1时用的是 Full range
所以分析得到Byte3这1个字节分别表示三星电视支持CE mode的overscan和underscan,也支持IT mode的overscan和underscan
Colorimetry Data Block
接着看下图EDID的黄色背景部分
第1个字节是0xE3,bit7~bit5是111,即十进制的7,7对应的Tag是Use Extended Tag;所以还要看第2个字节才知道是什么Tag,第1个字节的bit4~bit0是00011,即十进制的3,表示0xE3后面还有3个字节,而第2个字节的值是5,对应的是Colorimetry Data Block,所以最后描述该Data Block的就剩下最后2个字节了,即上图的黄色背景部分
接着就要看看最后这2个字节代表的是什么意思了
Byte3的各个bit如果是1表示支持某种色域,Byte4的各个bit如果是1表示支持某种Metadata Profile
所以分析得到该三星电视支持的色域有:xvYCC-601、xvYCC-709、BT.2020-YCC、BT.2020-RGB,支持的Metadata有:Metadata Profile 0
支持BT.2020色域的,一般后面还会声明HDR Static Metadata Data Block,表明该电视支持HDR格式
Vendor Specific Data Block
在此要注意一下,现在HDMI 2.0的EDID,VSDB会有两种,一种是H14b VSDB,另一种是HF-VSDB。其中H14b VSDB是必须要有的,HF-VSDB则不一定
H14b VSDB
按部就班,接着看下图EDID的黄色背景部分
第1个字节是0x6E,bit7~bit5是011,即十进制的3,3对应的Tag是Vendor Specific Data Block(VSDB);第1个字节的bit4~bit0是01110,即十进制的14,表示0x6E后面还有14个字节,即上图的黄色背景部分
接着就要看看这14个字节代表的是什么意思了,如下图
对照上图,一个个字节解析它即可
-
Byte0:上面已经解释过,tag=3,Length=14
-
Byte1~Byte3:这个IEEE规定的3个字节,固定为0x000C03,表示这是H14b VSDB
-
Byte4~Byte5:CEC物理地址,此处是1.0.0.0,可以看出这份EDID是三星电视HDMI1口的EDID
-
Byte6
bit7:Support_AI,支持ACP、ISRC1/ISRC2包的处理
bit6:支持deep color为48bits,即16bits。此处为0表示不支持
bit5:支持deep color为36bits,即12bits。此处为1表示支持
bit4:支持deep color为30bits,即10bits。此处为1表示支持
bit3:支持YUV444的deep color mode。此处为1表示三星电视最高支持YUV444 12bits
bit0:DVI_Dual,支持DVI dual-link。此处为0表示不支持 -
Byte7:Max_TMDS_Clock,表示支持的最大TMDS时钟速率,该字节需要乘以5MHz,此处是 0x3C * 5 = 300MHz。即最大带宽为:300MHz * 10bit(TMDS为10bit编码) * 3(3个TMDS数据通道) = 9Gbps
-
Byte8
bit7:Latency_Fields_Present,如果此bit是1,表示接下来会有2个字节分别是指示Video_Latency和Audio_Latency的,这两个字节是告诉HDMI发送端对音视频做delay再发送出来,单位是ms,解决某些场合下音视频不同步的问题。此处是0表示不支持,则不存在这两个字节,即跳过上图中的Byte(9)、Byte(10)
bit6:I_Latency_Fields_Present,如果此bit是1,表示接下来还会有另外2个字节分别是指示Interlaced_Video_Latency和Interlaced_Audio_Latency的,这两个字节是告诉HDMI发送端对I mode的音视频做delay再发送出来,单位是ms,解决某些场合下音视频不同步的问题。此处是0表示不支持,则不存在这两个字节,即跳过上图中的Byte(11)、Byte(12)
bit5:HDMI_Video_present,如果此bit是1,表示接下来有多个字节,意思如上图Byte(13)、Byte(14)、Byte(15) …bit3~bit0:表示分别支持对Game、Cinema、Photo、Graphics图像的特殊处理。此处是0表示不支持
-
Byte9:因为Byte8的bit5 HDMI_Video_present=1,该字节包含3D_present相关的flag
bit7:3D_present,表示是否有3D相关的描述。此处是0说明三星电视不支持3D视频输入
bit6~bit5:3D_Multi_present:如果3D_Multi_present = 01,3D_Structure_ALL_15…0有效;如果3D_Multi_present = 10,3D_Structure_ALL_15…0和3D_MASK_15…0两个都有效。3D_Structure_ALL_15…0和3D_MASK_15…0各占2个字节
3D_Structure_ALL_15…0各个bit的含义是支持的3D格式,如下图
3D_MASK_15…0各个bit含义其实是一个bit map,对应Video Data Block前16个VIC,某个bit=1,则对应的VIC分辨率支持3D
bit4~bit3:Image_Size,这个跟屏幕尺寸有关,跟EDID Block0的0x15(屏幕最大水平尺寸)、0x16(屏幕最大垂直尺寸)有关系,此处是10,看三星电视的EDID Block0 0x15=>89cm,0x16=>50cmImage_Size 具体含义 00 无额外信息 01 EDID Block0的0x15、0x16的值的比例是对的,尺寸不一定对 10 EDID Block0的0x15、0x16写的尺寸是对的 11 EDID Block0的0x15、0x16写的尺寸,要乘以5才是屏幕实际尺寸 -
Byte10:因为Byte8的bit5 HDMI_Video_present=1,该字节包含HDMI_VIC_LEN和HDMI_3D_LEN
bit7~bit5:HDMI_VIC_LEN,表示接下来有多少个字节用以描述VIC,一个VIC占一个字节。此处是100,十进制的4,表示有4个VIC跟着在后面
bit4~bit0:HDMI_3D_LEN,同理,如果不为0,在HDMI_VIC后面还会跟着有3D的信息。此处为0
-
Byte11~Byte14,值分别是0x01、0x02、0x03、0x04,参照下图可知是4K30、4K25、4K24、4096x2160P@24
到此,H14b VSDB已经分析完
HF-VSDB
接着看下图EDID的黄色背景部分
第1个字节是0x67,bit7~bit5是011,即十进制的3,3对应的Tag又是Vendor Specific Data Block(VSDB);第1个字节的bit4~bit0是00111,即十进制的7,表示0x67后面还有7个字节,即上图的黄色背景部分
接着就要看看这7个字节代表的是什么意思了,如下图
对照上图,一个个字节解析它即可
- Byte0:上面已经解释过,tag=3,Length=7
- Byte1~Byte3:这个也是IEEE规定的3个字节,固定为0xC45DD8,表示这是HF-VSDB
- Byte4:Version,目前固定为0x01
- Byte5:Max_TMDS_Character_Rate,表示支持的最大TMDS时钟速率,该字节需要乘以5MHz,此处是 0x78 * 5 = 600MHz。虽然之前的H14b VSDB声明的是300MHz,但要以现在600MHz的为准。即最大带宽为:600MHz * 10bit(TMDS为10bit编码) * 3(3个TMDS数据通道) = 18Gbps
- Byte6:bit7,SCDC_Present,表示支持SCDC功能;其它bits参考上图即可
- Byte7:bit2~bit0,分别是声明支持YUV420 deep color的,可知该三星电视支持YUV420的10bits和12bits
HDR Static Metadata Data Block
接着看下图EDID的黄色背景部分
第1个字节是0xE3,bit7~bit5是111,即十进制的7,7对应的Tag是Use Extended Tag;所以还要看第2个字节才知道是什么Tag,第1个字节的bit4~bit0是00011,即十进制的3,表示0xE3后面还有3个字节,而第2个字节的值是6,对应的是HDR Static Metadata Data Block,所以最后描述该Data Block的就剩下最后2个字节了,即上图的黄色背景部分
接着就要看看最后这2个字节代表的是什么意思了
主要看Byte3,Byte4,分别的含义如下两图
Byte3的含义
可知该三星电视支持HDR格式的HDMI输入,支持的格式类型是Traditional gamma SDR和SMPTE ST 2084 [2]
Byte4的含义
可知该三星电视支持Type 1
YCbCr 4:2:0 Capability Map Data Block
接着看下图EDID的黄色背景部分
第1个字节是0xE3,bit7~bit5是111,即十进制的7,7对应的Tag是Use Extended Tag;所以还要看第2个字节才知道是什么Tag,第1个字节的bit4~bit0是00011,即十进制的3,表示0xE3后面还有3个字节,而第2个字节的值是15,对应的是YCbCr 4:2:0 Capability Map Data Block(Y420CMDB),所以最后描述该Data Block的就剩下最后2个字节了,即上图的黄色背景部分
该Data Block声明支持YUV420的分辨率有哪些,YUV420传输的好处是带宽只占YUV444的一半
接着就要看看最后这2个字节代表的是什么意思了
在此Byte3、Byte4的含义跟前面所介绍的Video Data Block其实是一个bit map对应关系,Byte3、Byte4两个字节所组成的16bits map,对应着Video Data Block里的SVD(分辨率),如果某bit=1,说明对应的SVD支持YUV420格式
Byte3=0x01、Byte4=0xE0,组成的16bits map就是:1110_0000_0000_0001,bit0=1、bit13=1、bit14=1、bit15=1
bit0对应着Video Data Block里的第1个SVD,即0x61,即分辨率3840x2160P@60支持YUV420
同理
bit13对应着Video Data Block里的第14个SVD,即0x60,即分辨率3840x2160P@50支持YUV420
bit14对应着Video Data Block里的第15个SVD,即0x65,即分辨率4096x2160P@50支持YUV420
bit15对应着Video Data Block里的第16个SVD,即0x66,即分辨率4096x2160P@60支持YUV420
DTD
接着看下图EDID的有色背景部分
这部分是继EDID Block0之后,描述的另外两个Detailed Timing,因为在EDID Block0里已经描述了两个Detailed Timing了
怎么知道这是描述DTD的,因为在前面CEA Extension Header章节,那里的Byte2=0x50,这是个偏移量,即从EDID Block1的0地址开始偏移0x50之后,就是开始描述DTD了。DTD各个字节的含义可参考Block0章节的长图
DTD之后的数据是0,因为后面没有用到的字节规定是要填充0的,最后一个为检验和
YCbCr 4:2:0 Video Data Block
到此,三星电视的EDID就分析完了,但是实际上还有另外一种有关YUV420的Data Block,那便是YCbCr 4:2:0 Video Data Block(Y420VDB),该Data Block是把only support YUV420的分辨率列出来。虽然该三星电视EDID没有声明,这里还是要介绍一下
看图说话
这个也是从Byte3开始看起,但跟前面的Y420CMDB不同的是,这里是把支持YUV420的分辨率的SVD直接写在这的,并不是bit map了,例如该三星电视only support YUV420的是3840x2160P@60、3840x2160P@50、4096x2160P@50、4096x2160P@60这4个分辨率,则放在Y420VDB的话,它十六进制应该是这样的:E5 0E 61 60 65 66
到此,常用的EDID Data Block就介绍完了
HDMI信号带宽计算方法
计算公式
参数详细说明
10/8:TMDS编码8bits -> 10bits
TMDS编码算法会将8位数据转换成10位数据,前8位数据由原始信号经运算后获得,第9位指示运算的方式,第10位用来对应直流平衡
举例说明
3840x2160@60Hz YUV444 8bit的速率是多少?
查表得,HTotal = 4400,VTotal = 2250,计算单通道带宽为:
4400 * 2250 * 60 * 1 * 8bit * 10/8 = 5.94Gbits/s
HDMI TMDS传输有3个数据通道,所以共需要约18Gbits的带宽
这也就是HDMI 2.0宣称它支持带宽为18Gbps的理论依据
参考资料
CEA-861-F
CEA-861.3
HDMI_Specification1_4b
HDMI_Specification2_0b
转自:https://blog.csdn.net/cfl927096306/article/details/108017501