Ejemplo n.º 1
0
char *directx_va_GetDecoderName(const GUID *guid)
{
    for (unsigned i = 0; DXVA_MODES[i].name; i++) {
        if (IsEqualGUID(DXVA_MODES[i].guid, guid))
            return strdup(DXVA_MODES[i].name);
    }

    char *psz_name = malloc(36);
    if (likely(psz_name))
        asprintf(&psz_name, "Unknown decoder " GUID_FMT, GUID_PRINT(*guid));
    return psz_name;
}
Ejemplo n.º 2
0
/**
 * Find the best suited decoder mode GUID and render format.
 */
static int FindVideoServiceConversion(vlc_va_t *va, directx_sys_t *dx_sys, const es_format_t *fmt)
{
    input_list_t p_list = { 0 };
    int err = dx_sys->pf_get_input_list(va, &p_list);
    if (err != VLC_SUCCESS)
        return err;

    /* Retreive supported modes from the decoder service */
    for (unsigned i = 0; i < p_list.count; i++) {
        const GUID *g = &p_list.list[i];
        const directx_va_mode_t *mode = FindDxvaMode(g);
        if (mode) {
            msg_Dbg(va, "- '%s' is supported by hardware", mode->name);
        } else {
            msg_Warn(va, "- Unknown GUID = " GUID_FMT, GUID_PRINT( *g ) );
        }
    }

    /* Try all supported mode by our priority */
    const directx_va_mode_t *mode = DXVA_MODES;
    for (; mode->name; ++mode) {
        if (!mode->codec || mode->codec != dx_sys->codec_id)
            continue;

        /* */
        bool is_supported = false;
        for (const GUID *g = &p_list.list[0]; !is_supported && g < &p_list.list[p_list.count]; g++) {
            is_supported = IsEqualGUID(mode->guid, g);
        }
        if ( is_supported )
        {
            is_supported = profile_supported( mode, fmt );
            if (!is_supported)
                msg_Warn( va, "Unsupported profile for HWAccel: %d", fmt->i_profile );
        }
        if (!is_supported)
            continue;

        /* */
        msg_Dbg(va, "Trying to use '%s' as input", mode->name);
        if (dx_sys->pf_setup_output(va, mode->guid)==VLC_SUCCESS)
        {
            dx_sys->input = *mode->guid;
            err = VLC_SUCCESS;
            break;
        }
    }

    p_list.pf_release(&p_list);
    return err;
}
Ejemplo n.º 3
0
void CAtmoLightFilter::LogMediaType(char *pszPrefix,const CMediaType *temp)
{
    BITMAPINFOHEADER *bmiHeader = NULL;

    GUID format = *temp->FormatType();
    log("%s: MediaType.FormatType: " GUID_FMT "\n", pszPrefix, GUID_PRINT(format) );

    if( IsEqualGUID( *temp->FormatType(), FORMAT_VideoInfo) ) 
    {
        VIDEOINFO* pVI = (VIDEOINFO*) temp->Format( );

        log("%s: FORMAT_VideoInfo Image Size Source(%d,%d,%d,%d) Target: (%d,%d,%d,%d) \n", pszPrefix,
               pVI->rcSource.left, pVI->rcSource.top, pVI->rcSource.right, pVI->rcSource.bottom,
               pVI->rcTarget.left, pVI->rcTarget.top, pVI->rcTarget.right, pVI->rcTarget.bottom
           ) ;


        if(pVI->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER)) 
           bmiHeader = &pVI->bmiHeader;
    } else
    if( IsEqualGUID( *temp->FormatType(), FORMAT_VideoInfo2) ) 
    {
        VIDEOINFOHEADER2* pVI = (VIDEOINFOHEADER2*) temp->Format( );
        

        log("%s: FORMAT_VideoInfo2 Image Size Source(%d,%d,%d,%d) Target: (%d,%d,%d,%d) Aspect: %d : %d\n", pszPrefix,
               pVI->rcSource.left, pVI->rcSource.top, pVI->rcSource.right, pVI->rcSource.bottom,
               pVI->rcTarget.left, pVI->rcTarget.top, pVI->rcTarget.right, pVI->rcTarget.bottom,
               pVI->dwPictAspectRatioX,
               pVI->dwPictAspectRatioY
           ) ;

        if(pVI->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER))
           bmiHeader = &pVI->bmiHeader;
    }

    GUID tmp = *temp->Subtype();
    LogMediaSubType( pszPrefix, tmp );

    if(bmiHeader)
    {
        log("%s: biSize: %d, biSizeImage: %d, Width: %d, Height: %d, Planes: %d, BitCount: %d, Fourcc: %4.4s, \n", 
            pszPrefix, 
            bmiHeader->biSize, bmiHeader->biSizeImage,
            bmiHeader->biWidth, bmiHeader->biHeight, 
            bmiHeader->biPlanes, 
            bmiHeader->biBitCount,
            (char *)&bmiHeader->biCompression);
    }
}
Ejemplo n.º 4
0
HRESULT CAtmoLightFilter::CheckInputType(const CMediaType *mtIn)
{
    CheckPointer(mtIn,E_POINTER);

    log("CAtmoLightFilter::CheckInputType()\n");
    LogMediaType("CheckInputType", mtIn );

    GUID guid = *mtIn->Type();
    if( !IsEqualGUID(guid, MEDIATYPE_Video) )
    {
        log("CheckInputType: Mediatype is not MEDIATYPE_Video! ->" GUID_FMT "\n", GUID_PRINT(guid) );
        return E_INVALIDARG;
    }
    
    if( !IsEqualGUID( *mtIn->FormatType(), FORMAT_VideoInfo2) && !IsEqualGUID( *mtIn->FormatType(), FORMAT_VideoInfo) )
    {
       log("CheckInputType: FormatType is not VideoInfo2 or VideoInfo!\n");
       return E_INVALIDARG;
    }

    GUID mediaSubType = *mtIn->Subtype();

    if( IsEqualGUID( mediaSubType, MEDIASUBTYPE_YUY2) || IsEqualGUID( mediaSubType, MEDIASUBTYPE_YUYV) )
        return NOERROR;
    else  
    if( IsEqualGUID( mediaSubType, MEDIASUBTYPE_Y411) )
        return NOERROR;
    else
    if( IsEqualGUID( mediaSubType, MEDIASUBTYPE_Y41P) )
        return NOERROR;
    else
    if( IsEqualGUID( mediaSubType, MEDIASUBTYPE_YVYU) )
        return NOERROR;
    else 
    if( IsEqualGUID( mediaSubType, MEDIASUBTYPE_NV12) )
        return NOERROR;
    else
    if( IsEqualGUID( mediaSubType, MEDIASUBTYPE_NV21) )
        return NOERROR;
    else
    if( IsEqualGUID( mediaSubType, MEDIASUBTYPE_UYVY) )
        return NOERROR;
    else
    if( IsEqualGUID( mediaSubType, MEDIASUBTYPE_Y211) )
        return NOERROR;
    else
    if( IsEqualGUID( mediaSubType, MEDIASUBTYPE_CLJR) )
        return NOERROR;
    else
    if( IsEqualGUID( mediaSubType, MEDIASUBTYPE_IYUV ) || IsEqualGUID( mediaSubType, MEDIASUBTYPE_I420 ) ) 
        return NOERROR;
    else
    if( IsEqualGUID( mediaSubType, MEDIASUBTYPE_YV12 ) )  // YVU
        return NOERROR;
    else
    if( IsEqualGUID( mediaSubType, MEDIASUBTYPE_YVU9 ) )  // YVU9 I411 format 
        return NOERROR;
    else
    if( IsEqualGUID( mediaSubType, MEDIASUBTYPE_RGB565 ) )  // RGB 16bit 5-6-5
        return NOERROR;
    else
    if( IsEqualGUID( mediaSubType, MEDIASUBTYPE_RGB555 ) )  // RGB 15bit 5-5-5
        return NOERROR;
    else
    if( IsEqualGUID( mediaSubType, MEDIASUBTYPE_RGB24 ) )  // RGB 24bit 8-8-8
        return NOERROR;
    else
    if( IsEqualGUID( mediaSubType, MEDIASUBTYPE_RGB32 ) )  // RGB 24bit 8-8-8+Alpha?
        return NOERROR;
    else
        return E_INVALIDARG;
}
Ejemplo n.º 5
0
void CAtmoLightFilter::LogMediaSubType(char *pszPrefix, GUID &subType)
{
    log("%s: Subtype " GUID_FMT "(aka Pixelformat)\n",pszPrefix, GUID_PRINT(subType) );

    if(IsEqualGUID( subType, MEDIASUBTYPE_CLPL ))
        log("%s: MediaSubType: MEDIASUBTYPE_CLPL\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_YV12 ))
       log("%s: MediaSubType: MEDIASUBTYPE_YV12 should work\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_YUYV ))    // done! = YUY2
       log("%s: MediaSubType: MEDIASUBTYPE_YUYV should work\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_IYUV )) // done I420 Planar!
       log("%s: MediaSubType: MEDIASUBTYPE_IYUV should work\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_I420 )) // done I420 Planar!
       log("%s: MediaSubType: MEDIASUBTYPE_I420 should work\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_YVU9 )) // done!
       log("%s: MediaSubType: MEDIASUBTYPE_YVU9 should work\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_Y411 )) // done!
       log("%s: MediaSubType: MEDIASUBTYPE_Y411 should work\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_Y41P ))
       log("%s: MediaSubType: MEDIASUBTYPE_Y41P should work\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_NV12 ))
        log("%s: MediaSubType: MEDIASUBTYPE_NV12 should work\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_NV21 ))
        log("%s: MediaSubType: MEDIASUBTYPE_NV21 should work\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_YUY2 )) // done!
       log("%s: MediaSubType: MEDIASUBTYPE_YUY2 should work\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_YVYU ))
       log("%s: MediaSubType: MEDIASUBTYPE_YVYU should work\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_UYVY ))
       log("%s: MediaSubType: MEDIASUBTYPE_UYVY should work\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_Y211 ))
       log("%s: MediaSubType: MEDIASUBTYPE_Y211 should work\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_CLJR ))
       log("%s: MediaSubType: MEDIASUBTYPE_CLJR should work\n", pszPrefix); 
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_IF09 )) // ?
       log("%s: MediaSubType: MEDIASUBTYPE_IF09\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_CPLA )) // ?
       log("%s: MediaSubType: MEDIASUBTYPE_CPLA\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_MJPG )) // ?
       log("%s: MediaSubType: MEDIASUBTYPE_MJPG\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_TVMJ ))
       log("%s: MediaSubType: MEDIASUBTYPE_TVMJ\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_WAKE ))
       log("%s: MediaSubType: MEDIASUBTYPE_WAKE\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_CFCC ))
       log("%s: MediaSubType: MEDIASUBTYPE_CFCC\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_IJPG ))
       log("%s: MediaSubType: MEDIASUBTYPE_IJPG\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_Plum ))
       log("%s: MediaSubType: MEDIASUBTYPE_Plum\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_DVCS ))
       log("%s: MediaSubType: MEDIASUBTYPE_DVCS\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_DVSD ))
       log("%s: MediaSubType: MEDIASUBTYPE_DVSD\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_MDVF ))
       log("%s: MediaSubType: MEDIASUBTYPE_MDVF\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_RGB1 ))
       log("%s: MediaSubType: MEDIASUBTYPE_RGB1\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_RGB4 ))
       log("%s: MediaSubType: MEDIASUBTYPE_RGB4\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_RGB8 ))
       log("%s: MediaSubType: MEDIASUBTYPE_RGB8\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_RGB565 ))
       log("%s: MediaSubType: MEDIASUBTYPE_RGB565 should work\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_RGB555 ))
       log("%s: MediaSubType: MEDIASUBTYPE_RGB555 should work\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_RGB24 ))
       log("%s: MediaSubType: MEDIASUBTYPE_RGB24 should work\n", pszPrefix);
    else
    if(IsEqualGUID( subType, MEDIASUBTYPE_RGB32 ))
       log("%s: MediaSubType: MEDIASUBTYPE_RGB32 should work\n", pszPrefix);
    else
       log("%s: MediaSubType seems to be unknown to me??\n", pszPrefix);
}
Ejemplo n.º 6
0
/**
 * Find the best suited decoder mode GUID and render format.
 */
static int DxFindVideoServiceConversion(vlc_va_t *va, GUID *input, D3DFORMAT *output)
{
    vlc_va_sys_t *sys = va->sys;

    /* Retreive supported modes from the decoder service */
    UINT input_count = 0;
    GUID *input_list = NULL;
    if (FAILED(IDirectXVideoDecoderService_GetDecoderDeviceGuids(sys->vs,
               &input_count,
               &input_list))) {
        msg_Err(va, "IDirectXVideoDecoderService_GetDecoderDeviceGuids failed");
        return VLC_EGENERIC;
    }
    for (unsigned i = 0; i < input_count; i++) {
        const GUID *g = &input_list[i];
        const dxva2_mode_t *mode = Dxva2FindMode(g);
        if (mode) {
            msg_Dbg(va, "- '%s' is supported by hardware", mode->name);
        } else {
            msg_Warn(va, "- Unknown GUID = " GUID_FMT, GUID_PRINT( *g ) );
        }
    }

    /* Try all supported mode by our priority */
    for (unsigned i = 0; dxva2_modes[i].name; i++) {
        const dxva2_mode_t *mode = &dxva2_modes[i];
        if (!mode->codec || mode->codec != sys->codec_id)
            continue;

        /* */
        bool is_supported = false;
        for (const GUID *g = &input_list[0]; !is_supported && g < &input_list[input_count]; g++) {
            is_supported = IsEqualGUID(mode->guid, g);
        }
        if (!is_supported)
            continue;

        /* */
        msg_Dbg(va, "Trying to use '%s' as input", mode->name);
        UINT      output_count = 0;
        D3DFORMAT *output_list = NULL;
        if (FAILED(IDirectXVideoDecoderService_GetDecoderRenderTargets(sys->vs, mode->guid,
                   &output_count,
                   &output_list))) {
            msg_Err(va, "IDirectXVideoDecoderService_GetDecoderRenderTargets failed");
            continue;
        }
        for (unsigned j = 0; j < output_count; j++) {
            const D3DFORMAT f = output_list[j];
            const d3d_format_t *format = D3dFindFormat(f);
            if (format) {
                msg_Dbg(va, "%s is supported for output", format->name);
            } else {
                msg_Dbg(va, "%d is supported for output (%4.4s)", f, (const char*)&f);
            }
        }

        /* */
        for (unsigned j = 0; d3d_formats[j].name; j++) {
            const d3d_format_t *format = &d3d_formats[j];

            /* */
            bool is_supported = false;
            for (unsigned k = 0; !is_supported && k < output_count; k++) {
                is_supported = format->format == output_list[k];
            }
            if (!is_supported)
                continue;

            /* We have our solution */
            msg_Dbg(va, "Using '%s' to decode to '%s'", mode->name, format->name);
            *input  = *mode->guid;
            *output = format->format;
            CoTaskMemFree(output_list);
            CoTaskMemFree(input_list);
            return VLC_SUCCESS;
        }
        CoTaskMemFree(output_list);
    }
    CoTaskMemFree(input_list);
    return VLC_EGENERIC;
}