Объединение двух буферов изображения YV12 в одно параллельное изображение

У меня есть два буфера изображения в формате YV12, которые мне нужно объединить в одно параллельное изображение.

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

YV12 разделен на 3 отдельные плоскости.

YYYYYYYY VV UU

Формат пикселя составляет 12 бит на пиксель.

Я создал метод, который memcpys один буфер (1920×1080) в больший буфер (3840×1080), но он не работает.

Вот мой с ++.

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

Я ожидал этого:

Правильное изображение

Вместо этого я получаю этот результат:

Неверное изображение

Что мне не хватает?

0

Решение

То, что вы хотели, это:

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

Другие решения

Других решений пока нет …