Direct3d преобразование цветового пространства в графическом процессоре - PullRequest
0 голосов
/ 12 июня 2019

Создание поверхности 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;
        }

Я ценю вашу помощь, спасибо.

...