GPU中的Direct3d色彩空间转换

时间:2019-06-12 09:29:43

标签: video ffmpeg directx rendering direct3d

以YV12格式创建direct3d表面并以yuv420格式渲染视频帧会导致视频模糊。视频上似乎有烟雾。我认为这是因为yuv 420色彩空间格式的数据范围在Y平面为16-235,在U和V平面为16-240。它们不在0-255范围内。

我通过使用ffmpeg的sws_scale()函数将颜色格式更改为CPU中的BGRA,并以BGRA格式创建了Direct3d表面,然后显示的视频正常。但是由于色彩空间转换,CPU消耗非常高。有什么方法可以在GPU中进行颜色转换,或者还有另一种方法可以显示清晰的视频?

这就是我创建YV12表面的方式

m_pDirect3DDevice->CreateOffscreenPlainSurface(_srcWidth, _srcHeight, (D3DFORMAT)MAKEFOURCC('Y', 'V', '1', '2'), D3DPOOL_DEFAULT, &m_pDirect3DSurfaceRender, NULL);

在这里,我将摄像机视频帧数据的yuv平面复制到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;
        }

感谢您的帮助,谢谢。

0 个答案:

没有答案