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