- 淺述YUV顏色格式
- 1 起因
- 2 根源
- 3 對比
- 4 參考
淺述
YUV顏色格式
——從Xvid解碼偏色問題說起
(陳雲川 ybc2084@163.com UESTC,CD 2007-04-19)
1 起因 事情的起因是兩個星期前,我在用Xvid對一個MPEG-4碼流進行解碼的時候,發現解碼出來的視頻序列存在偏藍的問題。當時指定的色場空間是YV12,我記得YV12是YUV4:2:0的顏色格式。但出來的結果顯然不對。
2 根源 昨晚對幾種YUV顏色格式進行了研究,恍然發現了問題的所在。
YUV格式分為兩種:緊縮YUV格式(packed)和平面YUV格式(planar)。
在緊縮YUV格式中,亮度分量Y(luminance)、兩個色度分量U和V(chrominance)是緊挨著存放在一個單獨的矩陣中的——這和RGB的存放方式類似,RGB都是以緊縮格式存放的。圖 1是一個大小為4x4的緊縮YUV格式的。
圖 1 緊縮YUV格式
對於YUV4:4:4格式而言,採用緊縮格式是很合適的,但是由於YUV的另外幾種格式都是通過亞採樣(subsample)來獲得的,其亮度分量與色度分量的解析度不相同。在這樣的情況下,如果仍然採用緊縮格式進行存放,就顯得不太方便了。
平面YUV格式把YUV的三個分量分別存放在不同的矩陣中,每一個矩陣看作是一個平面,最終看到的映像是將三個平面融合在一起得到的。
在Xvid中,定義了三種YUV4:2:2格式的顏色,它們都是採用緊縮格式存放的。這三種YUV4:2:2顏色格式的名稱分別是:YUY2、UYVY、YVYU,它們對應的FOURCC碼如下:0x32595559、0x59565955、0x55595659。有關FOURCC碼,請參見[1]。
Xvid定義了兩種YUV4:2:0格式的顏色,它們是採用平面格式存放的。這兩種YUV4:2:0顏色格式的名稱分別是:I420、YV12,它們對應的FOURCC碼分別是:0x30323449、0x32315659。
仍然以4x4大小的映像為例,說明I420格式的顏色資料的存放方式, 2所示。
圖 2 I420平面YUV格式
對於同樣大小的映像,YV12格式的存放方式 3所示。
圖 3 YV12平面YUV格式
可以看到,YV12格式和I420格式的不同之處在於:V平面和U平面的位置不同。在I420格式中,U平面緊跟在Y平面之後,然後才是V平面;但是對於YV12格式,情況剛好反過來,Y平面之後是V平面,然後才是U平面。
在存在偏色的程式中,我是將Xvid的解碼輸出以Y平面、然後U平面、最後V平面的順序輸出到檔案中的,也就是和I420的顏色平面順序相同,這也是YUV Viewer要求的平面順序。我犯下的錯誤是:把YV12和I420搞混了。我指定給Xvid的輸出格式是YV12,Xvid忠實地執行了我的命令,按照先Y平面、然後V平面、最後U平面的方式輸出瞭解碼後的映像,然而我在把資料儲存到檔案中的時候卻是按照I420的順序儲存的。顯然,這樣不出錯才怪呢。
3 對比 以下來對比一下偏色映像和正常解碼後得到的映像(通過YUV Viewer得到)。圖 4是指定YV12輸出格式時的映像,顏色明顯不對;圖 5是指定I420輸出格式後得到的正常映像,與圖 4對比,正誤立現。
圖 4 偏色映像
圖 5 正常映像
4 參考 [1] http://www.fourcc.org/ 。