今日はIntel Quick Sync Videoについて調べていた。Media Foundationで使うための Quick Sync Video Encoder MFTについてだ。これを使えばエンコードを速めてくれそうなので。
私の今のアプリがハードウェアエンコーダを使用しているのかを以下のコードを使用して調べてみた。
// ハードウェアエンコーダが使われているかの確認
{
IMFTransformPtr transform;
GUID guid;
CHK(sink_writer_->GetServiceForStream(stream_index_, GUID_NULL, IID_IMFTransform, &transform));
IMFAttributesPtr attributes;
CHK(transform->GetAttributes(&attributes));
UINT32 l = 0;
std::wstring str;
bool use_hw = false;
HRESULT hr = attributes->GetStringLength(MFT_ENUM_HARDWARE_URL_Attribute, &l);
if (SUCCEEDED(hr))
{
str.reserve(l + 1);
hr = attributes->GetString(MFT_ENUM_HARDWARE_URL_Attribute, (LPWSTR) str.data(), l + 1, &l);
if (SUCCEEDED(hr)){
use_hw = true;
DOUT2(L"/////// HARDWARE ENCODE IS USED. ////\n");
}
}
}
結果は使用していなかった。一応MF_READWRITE_ENABLE_HARDWARE_TRANSFORMSをtrueにしているのだが、効果はないようだ。ということはエンコード速度はまだ向上の余地があるわけだ。
次にIntel Media SDK 2014のドキュメント「Intel® Media SDK 2014 Developer’s Guide」を読んだ。これによるとEncoder/Decoder MFTを使用できるようだ。しかし明示的にHWエンコーダを使用すればよいかはくわしくは書いていなかった。どうもサンプルコードを読めということらしい。
それでサンプルコードも読んでみたのだが、Win8用のアプリは明確にQuick Sync VideoのエンコーダMFTを指定しているわけでもなくてやっぱりMF_READWRITE_ENABLE_HARDWARE_TRANSFORMSをtrueにしているだけだった。実行してみた結果はやっぱりソフトウェアエンコーダを使用していた。やり方があるのだろうか。
Media Foundation SDKのドキュメントも読み直す必要もありそうだ。なんとか使えるようになれば嬉しいのだが。Intel Media SDKもインストールしてみるか。でも使用許諾条件をちゃんと読んでいない。ランタイムは再配布可能なのか。そもそも利用してよい範囲は開発だけなのか。製品もOKなのか。よく読まないといけないな。