YUV420SP, Y分量平面格式,UV打包格式, 即NV12。 NV12與NV21類似,U 和 V 交錯排列,不同在于UV順序。
I420: YYYYYYYY UU VV ? ?=>YUV420P
YV12:?YYYYYYYY?VV UU ? ?=>YUV420P
NV12:?YYYYYYYY?UVUV ? ? =>YUV420SP
NV21:?YYYYYYYY?VUVU ? ? =>YUV420SP
?
dxva 輸出?NV12
x264 輸入、輸出 I420
?
void yuv420p_to_yuv422(uint8_t * yuv420[3], uint8_t * dest, int width,
??????????????????????? int height)
{
??? unsigned int x, y;
?
?
???? for (y = 0; y < height; ++y) {
?????? uint8_t *Y = yuv420[0] + y * width;
??????? uint8_t *Cb = yuv420[1] + (y / 2) * (width / 2);
?????? uint8_t *Cr = yuv420[2] + (y / 2) * (width / 2);
??????? for (x = 0; x < width; x += 2) {
???????????? *(dest + 0) = Y[0];
?????????? *(dest + 1) = Cb[0];
?????????? *(dest + 2) = Y[1];
??????????? *(dest + 3) = Cr[0];
???????????? dest += 4;
???????????? Y += 2;
???????????? ++Cb;
???????????? ++Cr;
???????? }
???? }
}
?
?
YUV420P
最近一周整理了一下網上關于YUV數據的轉化和顯示方面的資料, 與大家共享一下.
?
1.?關于YUV.
百度百科:?http://baike.baidu.com/view/189685.htm
英文資料:?http://en.wikipedia.org/wiki/YUV#Y.27UV420p_.28and_Y.27V12.29
YUV轉換算法:?http://www.kldby.com/baidunews/index.php/article/jdgg/2010-10-04/10436.html
YUV格式:?http://www.fourcc.org/yuv.php
自定義數據結構參考:?http://www.rosoo.net/a/200604/6051.html
?
2. YUV數據的顯示.
目前嘗試了兩種顯示YUV數據的方法 YUV表面顯示和GDI顯示.
YUV表面顯示:
?????這個網上有很多源碼, 當然為了大家省去一些查找和編譯的苦惱, 提供我整理后的源碼.
這種顯示方式呢, 比較直接, CPU占用也不是很高, 而且不管是YUV420還是YUV420P(分辨率1280*720)都可以顯示出來.
但是有一個缺點是: 只能創建一個顯示畫面, 就是要同時顯示幾個畫面是不行的, 而且按下WIN鍵和D后, 畫面還在屏幕上,
很無語. (我不確定此點是否正確, 我在一天之內沒突破它的這個缺點后放棄).
?
GDI顯示:
?? 就是用相關算法將YUV420P數據--->RGB24之后,使用StretchDIBits函數將每一幀的圖像顯示出來.
?? 在轉化算法方面, 在網上找到不止10幾種, 除去一些存在錯誤無法編譯的外, 篩選了5種方法.
?? 此種顯示方法上, CPU占用肯定比YUV表面顯示高, 但至少可以多畫面顯示了,并且沒有其他缺點.
?? 轉化算法見下一篇隨筆.
?
YUV420 顯示源碼 http://files.cnblogs.com/doorsky/YUV%e6%98%be%e7%a4%ba.rar
YUV文件 http://files.cnblogs.com/doorsky/YUV%e6%96%87%e4%bb%b6.rar
?
(在本文中,U 一詞相當于 Cb,V 一詞相當于 Cr。)
YUV422 format as shown below
4:2:2 表示 2:1 的水平取樣,沒有垂直下采樣
?
?