Создание поверхности direct3d в формате YV12 и рендеринг видеокадров в формате yuv420 приводит к размытию видео. Похоже, на видео есть смог. Я думаю, это потому, что диапазон данных формата цветового пространства yuv 420 составляет 16-235 для плоскостей Y и 16-240 для плоскостей U и V. Они не находятся в диапазоне 0-255.
Я изменил формат цвета на BGRA в ЦП с помощью функции ffmpeg sws_scale (), и я создал Direct3D поверхность в формате BGRA, а затем отображаемое видео в порядке. Но потребление процессора очень велико из-за преобразования цветового пространства. Есть ли способ сделать преобразование цвета в графическом процессоре или есть еще один способ получить четкое отображение видео?
Так я создаю поверхность YV12
m_pDirect3DDevice->CreateOffscreenPlainSurface(_srcWidth, _srcHeight, (D3DFORMAT)MAKEFOURCC('Y', 'V', '1', '2'), D3DPOOL_DEFAULT, &m_pDirect3DSurfaceRender, NULL);
Здесь я копирую плоскости данных видеокадров камеры на поверхность direct3d
BYTE* pict = (BYTE*)d3d_rect.pBits;
BYTE* Y = pY;
BYTE* V = pV;
BYTE* U = pU;
for (int y = 0; y < _srcHeight; y++)
{
memcpy(pict, Y, p1);
pict += d3d_rect.Pitch;
Y += p1;
}
for (int y = 0; y < _srcHeight >> 1; y++)
{
memcpy(pict, V, p3);
pict += d3d_rect.Pitch >> 1;
V += p3;
}
for (int y = 0; y < _srcHeight >> 1; y++)
{
memcpy(pict, U, p2);
pict += d3d_rect.Pitch >> 1;
U += p2;
}
Я ценю вашу помощь, спасибо.