Using Complex Metadata Attributes
[The feature associated with this page, Windows Media Format 11 SDK, is a legacy feature. It has been superseded by Source Reader and Sink Writer. Source Reader and Sink Writer have been optimized for Windows 10 and Windows 11. Microsoft strongly recommends that new code use Source Reader and Sink Writer instead of Windows Media Format 11 SDK, when possible. Microsoft suggests that existing code that uses the legacy APIs be rewritten to use the new APIs if possible.]
The Windows Media Format SDK supports complex metadata attributes, which are attributes that have values represented by a structure. Because all attributes must have a data type defined in the WMT_ATTR_DATATYPE enumeration, all complex metadata attributes are treated as WMT_TYPE_BINARY. When writing a complex attribute, cast the pointer to the structure as a byte pointer. When you retrieve a complex attribute, cast the array of bytes set by IWMHeaderInfo3::GetAttributeByIndexEx as the appropriate structure.
The following code examples show how to set and retrieve a complex metadata attribute. The first function adds a user text attribute, the second function retrieves one. For more information about how to use these examples, see Using the Code Examples.
HRESULT AddText(IWMHeaderInfo3* pHeaderInfo,
WCHAR* pwszDesc,
WCHAR* pwszText,
WORD* pwIndex)
{
HRESULT hr = S_OK;
WORD wIndex = 0;
WM_USER_TEXT textStruct;
// Populate the text structure.
textStruct.pwszDescription = pwszDesc;
textStruct.pwszText = pwszText;
// Add the attribute.
hr = pHeaderInfo->AddAttribute(0,
g_wszWMText,
&wIndex,
WMT_TYPE_BINARY,
0,
(BYTE*)&textStruct,
sizeof(WM_USER_TEXT));
// Pass the index of the text attribute back to the caller.
if(SUCCEEDED(hr))
{
*pwIndex = wIndex;
}
return hr;
}
HRESULT DisplayText(IWMHeaderInfo3* pHeaderInfo, WORD wIndex)
{
HRESULT hr = S_OK;
WCHAR* pwszName = NULL;
WORD cchName = 0;
WORD Language = 0;
BYTE* pbValue = NULL;
DWORD cbValue = 0;
WM_USER_TEXT* pText = NULL;
WMT_ATTR_DATATYPE AttType;
// Find the lengths of the attribute name and value.
hr = pHeaderInfo->GetAttributeByIndexEx(0,
wIndex,
NULL,
&cchName,
NULL,
NULL,
NULL,
&cbValue);
GOTO_EXIT_IF_FAILED(hr);
// Allocate memory for the name and value.
pwszName = new WCHAR[cchName];
pbValue = new BYTE[cbValue];
if(pwszName == NULL || pbValue == NULL)
{
hr = E_OUTOFMEMORY;
goto Exit;
}
// Get the attribute.
hr = pHeaderInfo->GetAttributeByIndexEx(0,
wIndex,
pwszName,
&cchName,
&AttType,
&Language,
pbValue,
&cbValue);
GOTO_EXIT_IF_FAILED(hr);
// Make sure the attribute is WM/Text, as expected.
if(wcscmp(pwszName, g_wszWMText))
{
// Somehow we got the wrong attribute.
hr = E_UNEXPECTED;
goto Exit;
}
// Set the structure pointer to the retrieved value.
pText = (WM_USER_TEXT*) pbValue;
// Print the strings from the structure.
printf("Description : %S\n", pText->pwszDescription);
printf("Text : %S\n", pText->pwszText);
Exit:
SAFE_ARRAY_DELETE(pwszName);
SAFE_ARRAY_DELETE(pbValue);
return hr;
}
Related topics