将两个YV12图像缓冲区合并为一个并排图像

时间:2016-07-15 20:06:10

标签: c++ yuv color-space

我有两个YV12格式的图像缓冲区,我需要将它们组合成一个并排的图像。

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

YV12分为3个单独的平面。

YYYYYYYY VV UU

像素格式为每像素12位。

我创建了一个方法memcpy将一个缓冲区(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

我错过了什么?

1 个答案:

答案 0 :(得分:2)

你想要的是:

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;
}