视频处理器MFT和颜色转换

时间:2016-08-17 16:29:25

标签: video format video-processing ms-media-foundation mft

MSDN Video Processor MFT表示它可用于颜色空间转换。所以,我试图使用这个MFT从NV12格式转换为I420格式。

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

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

        hr = vpTransform->SetOutputType(0, outputVideoType, 0); // this gives error

但如果我将输出格式设置为NV12,则不会返回任何错误。在这里,我正在尝试使用Microsoft Direct3D 11进行GPU加速视频处理。

这里要注意的另一点是,当我使用下面的代码查询时返回的可用输出类型不是NV12。但它返回“MFVideoFormat_RGB32”

        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");
            }
        }

基于D3D11的VP MFT为什么不支持NV12到I420的颜色转换?或者在我申请此功能之前是否还有其他事情需要配置?

背景:

最初我尝试使用VP MFT和D3D9,它不支持GPU加速。在这种情况下,NV12到I420的转换很好。由于D3D9没有使用GPU加速,我正在尝试迁移到D3D11。

1 个答案:

答案 0 :(得分:0)

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

在软件模式下,通常可以(不用说总是可行),但在硬件模式(GPU)中,你的GPU可能无法做到。

首先检查您的GPU功能。