Attributes (IMFAttributes)

オブジェクトにキーと値の組み合わせを格納する方法が提供されます。

MFCreateAttributes()

空のIMFAttributesを作成できます。

HRESULT MFCreateAttributes(
  IMFAttributes **ppMFAttributes,
  UINT32        cInitialSize // 属性ストアに割り当てる要素の最初の数。必要に応じて増加する
);
MFCreateAttributes function | Microsoft Learn

CopyAllItems()

すべての属性を、他の属性ストアへコピーできます。

HRESULT CopyAllItems(
  [in] IMFAttributes *pDest
);
IMFAttributes::CopyAllItems (mfobjects.h) - Win32 apps | Microsoft Learn
IMFMediaType* pTo;
HRESULT hr = MFCreateMediaType(&pTo);
hr = pFrom->CopyAllItems(pTo);

GetItemType()

HRESULT GetItemType(
  [in]  REFGUID           guidKey,
  [out] MF_ATTRIBUTE_TYPE *pType
);
IMFAttributes::GetItemType (mfobjects.h) - Win32 apps | Microsoft Learn
IMFMediaType* pType = ...

UINT32 cAttrCount;
HRESULT hr = pType->GetCount(&cAttrCount);

for (UINT32 nIndex = 0; nIndex < cAttrCount; nIndex++)
{
    GUID guidId;
    hr = pType->GetItemByIndex(nIndex, &guidId, NULL);

    MF_ATTRIBUTE_TYPE attrType;
    hr = pType->GetItemType(guidId, &attrType);

    switch (attrType)
    {
    case MF_ATTRIBUTE_GUID:
        GUID Val;
        hr = pType->GetGUID(guidId, &Val);
        break;

    case MF_ATTRIBUTE_STRING:
        UINT32 cchLength = 0;
        hr = pType->GetStringLength(guidId, &cchLength);

        WCHAR* pString = NULL;
        hr = pType->GetString(guidId, pString, cchLength + 1, &cchLength);
        break;
    }
}

値の設定

関数 機能
SetUINT32 UINT32値を、キーに関連付けられる
SetUINT64 UINT64値を、キーに関連付けられる
SetDouble double値を、キーに関連付けられる
SetString ワイド文字列を、キーに関連付けられる
SetUnknown IUnknownポインタを、キーに関連付けられる
関数 機能
SetBlob byte配列を、キーに関連付けられる
SetGUID GUID値を、キーに関連付けられる

SetGUID()

GUIDで示すキーに、新しい値を設定できます。

HRESULT SetGUID(
  REFGUID guidKey,  // 設定する値を識別するGUID
  REFGUID guidValue // キーの新しい値
);
IMFAttributes::SetGUID | Microsoft Learn

guidKeyに指定するGUIDは、Media Foundation Attributesで確認できます。たとえば、

pMediaType->SetGUID(MF_MT_SUBTYPE, guidValue);

のように映像にサブタイプを設定するときには、guidValueにはVideo Subtype GUIDsにある値を指定します。

SetUnknown()

HRESULT SetUnknown(
  [in] REFGUID  guidKey,
  [in] IUnknown *pUnknown
);
IMFAttributes::SetUnknown (mfobjects.h) - Win32 apps | Microsoft Learn

値の取得

関数 機能
GetUINT32 キーに関連付けられているUINT32値を、取得できる
GetUINT64 キーに関連付けられているUINT64値を、取得できる
GetDouble キーに関連付けられているdouble値を、取得できる
GetString キーに関連付けられているワイド文字列を、取得できる
GetUnknown キーに関連付けられているインターフェイス ポインタを、取得できる
関数 機能
GetGUID Retrieves a GUID value associated with a key.
GetItem Retrieves the value associated with a key.
GetItemByIndex Retrieves an attribute at the specified index.
GetItemType Retrieves the data type of the value associated with a key.
関数 機能
GetBlob Retrieves a byte array associated with a key. This method copies the array into a caller-allocated buffer.
GetAllocatedBlob Retrieves a byte array associated with a key. This method allocates the memory for the array.
GetAllocatedString Gets a wide-character string associated with a key. This method allocates the memory for the string.

GetGUID()

HRESULT GetGUID(
  REFGUID guidKey,
  GUID    *pguidValue
);
IMFAttributes::GetGUID | Microsoft Learn

guidKeyに一致する値が見つからなかったときは、pguidValueの値は変更されません。

GetUnknown()

キーに関連付けられている、インターフェイス ポインタを取得できます。

HRESULT GetUnknown(
  [in]  REFGUID guidKey,
  [in]  REFIID  riid,
  [out] LPVOID  *ppv
);
IMFAttributes::GetUnknown (mfobjects.h) - Win32 apps | Microsoft Learn

SetUnknown()とは異なり取得時にはGUIDが必要なため、それが指定された構造体などを継承している場合には、その継承元の型を指定してポインタを取得します。

特定のオブジェクト

オブジェクトに格納されているIMFAttributesオブジェクトの値は、下表の関数から取得できます。

関数 機能 代替
MFGetAttributeRatio() Retrieves an attribute whose value is a ratio. MFGetAttribute2UINT32asUINT64()
MFGetAttributeSize() Retrieves an attribute whose value is a size, expressed as a width and height. MFGetAttribute2UINT32asUINT64()
MFGetAttributesAsBlob() 属性ストアの内容を、バイト配列で取得できる MFSerializeAttributesToStream()
MFGetAttributesAsBlobSize() MFGetAttributesAsBlob()で必要なバッファのサイズを取得できる  
MFGetAttributeString() Gets a string value from an attribute store. IMFAttributes::GetAllocatedString()
MFGetAttribute2UINT32asUINT64() Gets an attribute whose value is two UINT32 values packed into a UINT64. IMFAttributes::GetUINT64()で取得した値を、Unpack2UINT32AsUINT64()で分割
MFGetAttributeUINT32() 属性があれば属性ストアから、なければ指定のUINT32値を取得できる IMFAttributes::GetUINT32()
MFGetAttributeUINT64() 属性があれば属性ストアから、なければ指定のUINT64値を取得できる IMFAttributes::GetUINT64()
MFGetAttributeDouble() 属性があれば属性ストアから、なければ指定のdouble値を取得できる IMFAttributes::GetDouble()
HRESULT hr = S_OK;

IMFMediaType* pMediaType = NULL;
hr = pSourceReader->GetCurrentMediaType(MF_SOURCE_READER_FIRST_VIDEO_STREAM, &pMediaType);

// サブタイプを取得する
GUID subtype;
hr = pMediaType->GetGUID(MF_MT_SUBTYPE, &subtype);

// ビデオフレームの幅と高さを取得する
UINT32 width;
UINT32 height;
hr = MFGetAttributeSize(pMediaType, MF_MT_FRAME_SIZE, &width, &height);

// 既定のストライド (次のピクセルの行へ移動するのに必要なバイト数) を取得する
LONG lStride = 0;
LONG unDefault = 1; // 属性がなかったときに戻される値
lStride = (LONG)MFGetAttributeUINT32(pMediaType, MF_MT_DEFAULT_STRIDE, unDefault);

// ピクセルアスペクト比 (ピクセル縦横比) を取得する
UINT32 numerator;
UINT32 denominator;
hr = MFGetAttributeRatio(pMediaType, MF_MT_PIXEL_ASPECT_RATIO, &numerator, &denominator);
VideoThumbnail Sample - Win32 apps | Microsoft Learn

ビデオフレームの大きさを設定するときは、既定のストライドも設定します。

hr = MFSetAttributeSize(pMediaType, MF_MT_FRAME_SIZE, width, height);
hr = pMediaType->SetUINT32(MF_MT_DEFAULT_STRIDE, width * 4);

値の除去

DeleteItem()

HRESULT DeleteItem(
  [in] REFGUID guidKey
);
IMFAttributes::DeleteItem (mfobjects.h) - Win32 apps | Microsoft Learn
Microsoft Learnから検索