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; }
/** * 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; }
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); } }
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; }
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); }
/** * 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; }