2016-07-15 171 views
0

我有兩個YV12格式的圖像緩衝區,需要將它們合併爲一個並排圖像。將兩個YV12圖像緩衝區合併爲一個並排圖像

(1920×1080)+(1920×1080)=(3840 * 1080)

YV12被分成3米單獨的平面上。

YYYYYYYY VV UU 

像素格式是每像素12位。

我創建了一個方法,memcpy s一個緩衝區(1920x1080)到一個更大的緩衝區(3840x1080),但它不起作用。

這是我的C++。

BYTE* source = buffer; 
BYTE* destination = convertBuffer3D; 

// copy over the Y 
for (int x = 0; x < height; x++) 
{ 
    memcpy(destination, source, width); 
    destination += width * 2; 
    source += width; 
} 

// copy over the V 
for (int x = 0; x < (height/2); x++) 
{ 
    memcpy(destination, source, width/2); 
    destination += width; 
    source += width/2; 
} 

// copy over the U 
for (int x = 0; x < (height/2); x++) 
{ 
    memcpy(destination, source, width/2); 
    destination += width; 
    source += width/2; 
} 

我預計:

Correct image

相反,我得到這樣的結果:

Incorrect image

我缺少什麼?

+0

代碼看起來約權。你可能錯過了其他的東西(跨越任何一個圖像被擴展?底部填充?)。 –

+0

沒有擴展我們的填充。我的1920x1080圖像的總緩衝區大小是3110400(1920x1080x1.5),所以沒有額外的數據。 –

+0

另外我想如果它是NV12而不是YV12,也會有類似的效果。然後你需要在循環之後簡單地檢查源和目標。如果它們是正確的,那麼問題不在於循環,而在於圖像結構與您期望的不同。 –

回答

1

你想這是什麼:

Y1 Y1 Y1 Y1 Y2 Y2 Y2 Y2 
Y1 Y1 Y1 Y1 Y2 Y2 Y2 Y2 
Y1 Y1 Y1 Y1 Y2 Y2 Y2 Y2 
Y1 Y1 Y1 Y1 Y2 Y2 Y2 Y2 
U1 U1 U2 U2 V1 V1 V2 V2 
U1 U1 U2 U2 V1 V1 V2 V2 

但你的代碼實際上是這樣做的:

Y1 Y1 Y1 Y1 Y2 Y2 Y2 Y2 
Y1 Y1 Y1 Y1 Y2 Y2 Y2 Y2 
Y1 Y1 Y1 Y1 Y2 Y2 Y2 Y2 
Y1 Y1 Y1 Y1 Y2 Y2 Y2 Y2 
U1 U1 V1 V1 U2 U2 V2 V2 
U1 U1 V1 V1 U2 U2 V2 V2 

下面是更正後的代碼(未經測試)

BYTE* source = buffer; 
BYTE* destination = convertBuffer3D; 

// copy over the Y 
for (int x = 0; x < height; x++) 
{ 
    memcpy(destination, source, width); 
    destination += width * 2; 
    source += width; 
} 

for (int x = 0; x < (height/2); x++) 
{ 
    // copy over the V 
    memcpy(destination, source, width/2); 
    destination += width; 
    source += width/2; 

    // copy over the U 
    memcpy(destination, source, width/2); 
    destination += width; 
    source += width/2; 
} 
相關問題