1. 程式人生 > >Intel--巧用Media SDK檢查系統硬體加速

Intel--巧用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。

        在建立和初始化編解碼Session時,我們需要制定編解碼的實現方式(硬體方式還是軟體方式)。最簡單的方法是強制使用硬體方式。這會帶來一個問題,在非Intel顯示卡支援平臺,應用程式將無法正常工作。當然,如果強制使用軟體方式,雖然應用程式能夠工作於其他平臺,但是在Intel顯示卡平臺,硬體加速特性將蕩然無存!可能網友會說,應用程式可以外加程式碼檢測平臺顯示卡來決定如何選擇。非常贊同,但是程式的複雜度和效率將受到影響。幸運的是,Media SDK提供了一種自動選擇功能,它會根據當前執行系統優化選擇方案。在MFXInit函式中,列舉型別mfxIMPL定義AUTO功能:
typedef enum {
MFX_IMPL_AUTO=0, /* Auto Selection/In or Not Supported/Out */
MFX_IMPL_SOFTWARE, /* Pure Software Implementation */
MFX_IMPL_HARDWARE, /* Hardware Accelerated Implementation */
MFX_IMPL_UNSUPPORTED=0 /* One of the MFXQueryIMPL returns */
} mfxIMPL;
相應的簡單實用方式如下:
mfxVersion version = {MFX_VERSION_MINOR, MFX_VERSION_MAJOR};
sts = m_mfxSession.Init(MFX_IMPL_AUTO, &version);
僅僅通過MFX_IMPL_AUTO的設定,問題迎刃而解。可能有網友會問,那麼如何知道當前的編解碼實用方法呢?不急,Media SDK考慮到了這種需求,它提供了mfxStatus MFXQueryIMPL(mfxSession session, mfxIMPL *impl)來查詢當前採用的方法。具體實現如下:
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這個功能,我們巧妙的查詢出系統的硬體加速功能,而不需要再寫其他程式碼做這個相對繁瑣的工作,非常的棒!