天天看點

巧用Media SDK檢查系統硬體加速

Media SDK是Intel強大的視音頻軟體開發包。它提供了相應的豐富的 DShow filters ,而且也提供了功能完備的視音頻APIs。本文主要将闡述如何巧用這些APIs來實作系統硬體加速功能。

在使用這些API之前,我們必須了解一點基本的知識。對于Media SDK提供的decoder,VPP和encoder子產品,在使用必須要先建立一個session。利用這個已建的session,相應的decoder,VPP和encoder才能被建立。如果它們使用同一個pipeline,那麼這些session必須是同一個。當然在以後的版本中,将會支援不同session建的元件連接配接。

對于Session的建立,Media SDK提供了4個函數,定義如下:

typedef struct _mfxSession *mfxSession;

mfxStatus MFXInit(mfxIMPL impl, mfxVersion *ver, mfxSession *session);

mfxStatus MFXClose(mfxSession session);

mfxStatus MFXQueryIMPL(mfxSession session, mfxIMPL *impl);

mfxStatus MFXQueryVersion(mfxSession session, mfxVersion *version);

正如名字所示,MFXInit()和MFXClose()分别是初始化和銷毀函數,MFXQueryIMPL()和MFXQueryVersion()是查詢參數配置函數。

對于MFXInit()的使用,在mfxIMPL類型必須被指定。在Intel平台,它的一般設定為MFX_IMPL_HARDWARE,而非Intel平台,一般為MFX_IMPL_SOFTWARE。

那麼如何獲知目前平台是Intel平台還是其他呢?Media SDK提供了很好的dispatch機制,它能夠自動識别目前平台是否支援硬體加速。請看mfxIMPL的定義:

typedef enum {

MFX_IMPL_AUTO=0,

MFX_IMPL_SOFTWARE,

MFX_IMPL_HARDWARE,

MFX_IMPL_UNSUPPORTED=0

} mfxIMPL;

細心的網友會發現MFX_IMPL_AUTO這項,它就是讓dispatcher自動選擇硬體加速還是軟體實作。

太好了!現在離成功越來越近了,那麼如何讓程式員獲知目前平台支援硬體加速呢?MFXQueryIMPL()提供了這個查詢的功能。

具體實作如下:

BOOL IsHwAcclSupported( void )

{

mfxIMPL impl = MFX_IMPL_AUTO;

mfxSession session = NULL;

mfxVersion ver = {MFX_VERSION_MINOR, MFX_VERSION_MAJOR};

MFXInit( MFX_IMPL_AUTO, &ver, &session );

MFXQueryIMPL( session, &impl );

MFXClose( session );

return impl == MFX_IMPL_HARDWARE ? TRUE : FALSE;

}

在這裡Session僅僅提供了一個臨時的角色,在查詢後會被釋放,不會占用系統的資源。通過dispatcher這個功能,我們巧妙的查詢出系統的硬體加速功能,而不需要再寫其他代碼做這個相對繁瑣的工作,非常的棒!