Video 视频处理器MFT和颜色转换

Video 视频处理器MFT和颜色转换,video,format,video-processing,ms-media-foundation,Video,Format,Video Processing,Ms Media Foundation,MSDN表示它可以用于颜色空间转换。所以,我尝试使用这个MFT来进行从NV12格式到I420格式的转换 当我尝试将输出媒体类型设置为I420时,出现“MF_E_UNSUPPORTED_D3D_TYPE”错误(其余所有其他属性与输入相同) 你知道为什么基于D3D11的VP MFT不支持NV12到I420的颜色转换吗?或者在我请求此功能之前,是否还有其他需要配置的内容 背景: 最初,我尝试在D3D9中使用VP MFT,但它没有启用GPU加速。在本例中,NV12到I420的转换没有问题。由于D3D9不

MSDN表示它可以用于颜色空间转换。所以,我尝试使用这个MFT来进行从NV12格式到I420格式的转换

当我尝试将输出媒体类型设置为I420时,出现“MF_E_UNSUPPORTED_D3D_TYPE”错误(其余所有其他属性与输入相同)

你知道为什么基于D3D11的VP MFT不支持NV12到I420的颜色转换吗?或者在我请求此功能之前,是否还有其他需要配置的内容

背景:
最初,我尝试在D3D9中使用VP MFT,但它没有启用GPU加速。在本例中,NV12到I420的转换没有问题。由于D3D9不使用GPU加速,我正在尝试迁移到D3D11。

您的GPU可能无法处理NV12到I420的颜色转换

在软件模式下,这通常是可能的(不是说总是可能的),但在硬件模式下(GPU),你的GPU可能做不到这一点

首先检查你的GPU能力

        CComPtr<IMFMediaType> outputVideoType;
        hr = createVideoTypeFromSource(inputMediaType, MFVideoFormat_I420, TRUE, TRUE, &outputVideoType);
        ERROR_CHECK(hr);

        hr = vpTransform->SetOutputType(0, outputVideoType, 0); // this gives error
        IMFMediaType* pMediaTypeOutput = NULL;
        hr = MFCreateMediaType(&pMediaTypeOutput);
        if (FAILED(hr)) return hr;

        hr = vpTransform->GetOutputAvailableType(0, 0, &pMediaTypeOutput);

        GUID majorType;
        hr = pMediaTypeOutput->GetMajorType(&majorType);

        if (IsEqualGUID(majorType, MFMediaType_Video))
        {
            GUID subtype;
            hr = pMediaTypeOutput->GetGUID(MF_MT_SUBTYPE, &subtype);
            if (subtype == MFVideoFormat_IYUV)
            {
                printf("Format: IYUV\n");
            }
            else if (subtype == MFVideoFormat_NV12)
            {
                printf("Format: NV12\n");
            }
            else if (subtype == MFVideoFormat_I420)
            {
                printf("Format: I420\n");
            }
        }