Beispiel #1
0
static int DxSetupOutput(vlc_va_t *va, const GUID *input)
{
    directx_sys_t *dx_sys = &va->sys->dx_sys;
    HRESULT hr;

#ifndef NDEBUG
    BOOL bSupported = false;
    for (int format = 0; format < 188; format++) {
        hr = ID3D11VideoDevice_CheckVideoDecoderFormat((ID3D11VideoDevice*) dx_sys->d3ddec, input, format, &bSupported);
        if (SUCCEEDED(hr) && bSupported)
            msg_Dbg(va, "format %s is supported for output", DxgiFormatToStr(format));
    }
#endif

    DXGI_FORMAT processorInput[4];
    int idx = 0;
    if ( va->sys->render != DXGI_FORMAT_UNKNOWN )
        processorInput[idx++] = va->sys->render;
    processorInput[idx++] = DXGI_FORMAT_NV12;
    processorInput[idx++] = DXGI_FORMAT_UNKNOWN;

    /* */
    for (idx = 0; processorInput[idx] != DXGI_FORMAT_UNKNOWN; ++idx)
    {
        BOOL is_supported = false;
        hr = ID3D11VideoDevice_CheckVideoDecoderFormat((ID3D11VideoDevice*) dx_sys->d3ddec, input, processorInput[idx], &is_supported);
        if (SUCCEEDED(hr) && is_supported)
            msg_Dbg(va, "%s is supported for output", DxgiFormatToStr(processorInput[idx]));
        else
        {
            msg_Dbg(va, "Can't get a decoder for output format %s.", DxgiFormatToStr(processorInput[idx]));
            continue;
        }

        // check if we can create render texture of that format
        // check the decoder can output to that format
        const UINT i_quadSupportFlags = D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_SHADER_LOAD;
        UINT i_formatSupport;
        bool b_needsProcessor = true;
        if( SUCCEEDED( ID3D11Device_CheckFormatSupport((ID3D11Device*) dx_sys->d3ddev,
                                                       processorInput[idx],
                                                       &i_formatSupport)) &&
                ( i_formatSupport & i_quadSupportFlags ) == i_quadSupportFlags )
            b_needsProcessor = false;

        if ( !b_needsProcessor )
        {
            va->sys->render = processorInput[idx];
            return VLC_SUCCESS;
        }
    }

    msg_Dbg(va, "Output format from picture source not supported.");
    return VLC_EGENERIC;
}
Beispiel #2
0
static bool d3d11_format_supported(struct lavc_ctx *s, const GUID *guid,
                                   const struct d3d_decoded_format *format)
{
    struct priv *p = s->hwdec_priv;
    BOOL is_supported = FALSE;
    HRESULT hr = ID3D11VideoDevice_CheckVideoDecoderFormat(
        p->video_dev, guid, format->dxfmt, &is_supported);
    if (FAILED(hr)) {
        MP_ERR(p, "Check decoder output format %s for decoder %s: %s\n",
               format->name, d3d_decoder_guid_to_desc(guid),
               mp_HRESULT_to_str(hr));
    }
    return is_supported;
}