| www.sharp-i.com.cn |
|
|||||||
|
![]() |
|||
|
|
使用 8 位 YUV 格式的視頻呈現時間:2008-07-15 編輯:Gary Sullivan 和 Stephen Estrop
發布日期: 12/9/2004 | 更新日期: 12/9/2004 Gary Sullivan 和 Stephen Estrop Microsoft Digital Media Division 適用於: Microsoft® Windows®, Microsoft DirectShow®
摘要:本文講述了在 Microsoft Windows 操作系統中呈現視頻時推薦使用的 8 位 YUV 格式。本文講述了可用於在 YUV 格式和 RGB 格式之間進行轉換的技術,還提供了用於對 YUV 格式進行上采樣的技術。本文適用於在 Windows 中使用 YUV 視頻解碼或呈現的所有人員。
簡介
在整個視頻行業中,定義了很多 YUV 格式。本文講述的是在 Microsoft® Windows® 操作系統中呈現視頻時推薦使用的 8 位 YUV 格式。鼓勵解碼器供應商和顯示供應商支持本文所講述的格式。本文不對 YUV 顏色的其他用途(如靜止攝影)進行描述。
本文講述的格式全部使用每個像素位置 8 位的方式來編碼 Y 頻道(也稱為燈光頻道),並使用每樣例 8 位的方式來編碼每個 U 或 V 色度樣例。但是,大多數 YUV 格式平均使用的每像素位數都少於 24 位,這是因為它們包含的 U 和 V 樣例比 Y 樣例要少。本文不講述帶有 10 位和 12 位 Y 頻道的 YUV 格式。
注 在本文中,U 一詞相當於 Cb,V 一詞相當於 Cr。
本文包括以下主題:
在 DirectShow 中標識 YUV 格式
本文講述的每種 YUV 格式都指定了一個 FOURCC 碼。FOURCC 碼是一個 32 位、不帶正負號的整數,它是通過串聯四個 ASCII 字符創建而成的。
有很多 C/C++ 宏可使得在源代碼中聲明 FOURCC 值變得更加簡單。例如,MAKEFOURCC 宏是在 Mmsystem.h 中聲明的,FCC 宏則是在 Aviriff.h 中聲明的。請按照下列方式使用這些宏: DWORD fccYUY2 = MAKEFOURCC('Y','U','Y','2'); DWORD fccYUY2 = FCC('YUY2');
只需通過調轉字符的順序,您還可以將 FOURCC 碼直接聲明為字符文本。例如: DWORD fccYUY2 = '2YUY'; // Declares the FOURCC 'YUY2'
因為 Windows 操作系統使用的是 little-endian 體系結構,所以調轉順序是必需的。“Y”= 0x59,“U”= 0x55,“2”= 0x32,所以“2YUY”為 0x32595559。
在 DirectShow 中,格式是由一個主類型全局唯一標識符 (GUID) 和一個子類型 GUID 標識的。計算機視頻格式的主類型總是 MEDIATYPE_Video。子類型則可以通過將 FOURCC 碼與 GUID 進行映射的方式來構造,如下所示: XXXXXXXX-0000-0010-8000-00AA00389B71
其中 XXXXXXXX 為 FOURCC 碼。因此,YUY2 的子類型 GUID 為: 32595559-0000-0010-8000-00AA00389B71
很多這樣的 GUID 都已經在頭文件 Uuids.h 中進行了定義。例如,YUY2 子類型被定義為 MEDIASUBTYPE_YUY2。DirectShow 基類庫還提供了一個幫助器類 FOURCCMap,該類可用於將 FOURCC 碼轉換為 GUID 值。FOURCCMap 構造函數采用 FOURCC 碼作為輸入參數。然後,您可以將 FOURCCMap 對象強制轉換為相應的 GUID: FOURCCMap fccMap(FCC('YUY2')); GUID g1 = (GUID)fccMap;
// Equivalent: GUID g2 = (GUID)FOURCCMap(FCC('YUY2'));
YUV 采樣
YUV 的優點之一是,色度頻道的采樣率可比 Y 頻道低,同時不會明顯降低視覺質量。有一種表示法可用來描述 U 和 V 與 Y 的采樣頻率比例,這個表示法稱為 A:B:C 表示法:
圖 1 顯示了 4:4:4 圖片中使用的采樣網格。燈光樣例用叉來表示,色度樣例則用圈表示。
圖 1. YUV 4:4:4 樣例位置
4:2:2 采樣的這種主要形式在 ITU-R Recommendation BT.601 中進行了定義。圖 2 顯示了此標准定義的采樣網格。
圖 2. YUV 4:2:2 樣例位置
4:2:0 采樣有兩種常見的變化形式。其中一種形式用於 MPEG-2 視頻,另一種形式用於 MPEG-1 以及 ITU-T recommendations H.261 和 H.263。圖 3 顯示了 MPEG-1 方案中使用的采樣網格,圖 4 顯示了 MPEG-2 方案中使用的采樣網格。
圖 3. YUV 4:2:0 樣例位置(MPEG-1 方案)
圖 4. YUV 4:2:0 樣例位置(MPEG-2 方案)
與 MPEG-1 方案相比,在 MPEG-2 方案與為 4:2:2 和 4:4:4 格式定義的采樣網格之間進行轉換更簡單一些。因此,在 Windows 中首選 MPEG-2 方案,應該考慮將其作為 4:2:0 格式的默認轉換方案。
表面定義
本節講述推薦用於視頻呈現的 8 位 YUV 格式。這些格式可以分為幾個類別:
首先,您應該理解下列概念,這樣才能理解接下來的內容:
4:4:4 格式,每像素 32 位
推薦一個 4:4:4 格式,FOURCC 碼為 AYUV。這是一個打包格式,其中每個像素都被編碼為四個連續字節,其組織順序如下所示。
圖 5. AYUV 內存布局
標記了 A 的字節包含 alpha 的值。
4:2:2 格式,每像素 16 位
支持兩個 4:2:2 格式,FOURCC 碼如下:
兩個都是打包格式,其中每個巨像素都是編碼為四個連續字節的兩個像素。這樣會使得色度水平下采樣乘以系數 2。
YUY2
在 YUY2 格式中,數據可被視為一個不帶正負號的 char 值組成的數組,其中第一個字節包含第一個 Y 樣例,第二個字節包含第一個 U (Cb) 樣例,第三個字節包含第二個 Y 樣例,第四個字節包含第一個 V (Cr) 樣例,如圖 6 所示。
圖 6. YUY2 內存布局
如果該圖像被看作由兩個 little-endian WORD 值組成的數組,則第一個 WORD 在最低有效位 (LSB) 中包含 Y0,在最高有效位 (MSB) 中包含 U。第二個 WORD 在 LSB 中包含 Y1,在 MSB 中包含 V。
YUY2 是用於 Microsoft DirectX® Video Acceleration (DirectX VA) 的首選 4:2:2 像素格式。預期它會成為支持 4:2:2 視頻的 DirectX VA 加速器的中期要求。
UYVY
此格式與 YUY2 相同,只是字節順序是與之相反的 — 就是說,色度字節和燈光字節是翻轉的(圖 7)。如果該圖像被看作由兩個 little-endian WORD 值組成的數組,則第一個 WORD 在 LSB 中包含 U,在 MSB 中包含 Y0,第二個 WORD 在 LSB 中包含 V,在 MSB 中包含 Y1。
圖 7. UYVY 內存布局
4:2:0 格式,每像素 16 位
推薦兩個 4:2:0 每像素 16 位格式,FOURCC 碼如下:
兩個 FOURCC 碼都是平面格式。色度頻道在水平方向和垂直方向上都要以系數 2 來進行再次采樣。
IMC1
所有 Y 樣例都會作為不帶正負號的 char 值組成的數組首先顯示在內存中。後面跟著所有 V (Cr) 樣例,然後是所有 U (Cb) 樣例。V 和 U 平面與 Y 平面具有相同的跨距,從而生成如圖 8 所示的內存的未使用區域。
圖 8. IMC1 內存布局
IMC3
此格式與 IMC1 相同,只是 U 和 V 平面進行了交換:
圖 9. IMC3 內存布局
4:2:0 格式,每像素 12 位
推薦四個 4:2:0 每像素 12 位格式,FOURCC 碼如下:
在所有這些格式中,色度頻道在水平方向和垂直方向上都要以系數 2 來進行再次采樣。
IMC2
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
廣州銳目數碼科技有限公司 版權所有 @ 2006~2008 |