У меня есть два буфера изображения в формате YV12, которые мне нужно объединить в одно параллельное изображение.
(1920×1080) + (1920×1080) = (3840 * 1080)
YV12 разделен на 3 отдельные плоскости.
YYYYYYYY VV UU
Формат пикселя составляет 12 бит на пиксель.
Я создал метод, который memcpy
s один буфер (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;
}
Я ожидал этого:
Вместо этого я получаю этот результат:
Что мне не хватает?
То, что вы хотели, это:
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;
}
Других решений пока нет …