オブジェクトにキーと値の組み合わせを格納する方法が提供されます。
空のIMFAttributesを作成できます。
HRESULT MFCreateAttributes(
IMFAttributes **ppMFAttributes,
UINT32 cInitialSize // 属性ストアに割り当てる要素の最初の数。必要に応じて増加する
);
MFCreateAttributes function | Microsoft Learn
すべての属性を、他の属性ストアへコピーできます。
HRESULT CopyAllItems( [in] IMFAttributes *pDest );IMFAttributes::CopyAllItems (mfobjects.h) - Win32 apps | Microsoft Learn
IMFMediaType* pTo; HRESULT hr = MFCreateMediaType(&pTo); hr = pFrom->CopyAllItems(pTo);
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値を、キーに関連付けられる |
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にある値を指定します。
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. |
HRESULT GetGUID( REFGUID guidKey, GUID *pguidValue );IMFAttributes::GetGUID | Microsoft Learn
guidKeyに一致する値が見つからなかったときは、pguidValueの値は変更されません。
キーに関連付けられている、インターフェイス ポインタを取得できます。
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);
HRESULT DeleteItem( [in] REFGUID guidKey );IMFAttributes::DeleteItem (mfobjects.h) - Win32 apps | Microsoft Learn