MF_PD_ASF_LANGLIST属性
Advanced Systems Format (ASF) ファイルに含まれる言語を指定する言語識別子の一覧を指定します。 この属性は、ASF 仕様で定義されている言語リスト オブジェクトに対応します。
データ型
Byte array
解説
この属性は、ASF コンテンツのプレゼンテーション記述子に適用されます。
IMFASFContentInfo::GeneratePresentationDescriptor メソッドは、プレゼンテーション記述子を作成し、Language List Object ヘッダーからこの属性を生成します。 次の表に、BLOB の形式を示します。
[Language List Object]\(言語リスト オブジェクト\) フィールド | データ型 | サイズ | Description |
---|---|---|---|
言語 ID レコード数 | DWORD | 4 バイト | 言語の数 |
言語 ID レコード | BYTE[] | 場合により異なる | 言語文字列の配列 (下記参照)。 |
最初の DWORD は言語の数で、その後に言語識別子文字列の配列が続きます。 各文字列の形式は次のとおりです。
[Language List Object]\(言語リスト オブジェクト\) フィールド | データ型 | サイズ | Description |
---|---|---|---|
言語 ID の長さ | DWORD | 4 バイト | 末尾の NULL 文字のサイズを含む、文字列の長さ (バイト単位)。 |
言語 ID | WCHAR[] | 場合により異なる | RFC 1766 言語名を含む null で終わる文字列。 |
各文字列は、RFC 1766 に準拠した言語タグです。
ASF ファイル内の特定のストリームの言語タグを取得するには、 MF_SD_ASF_EXTSTRMPROP_LANGUAGE_ID_INDEX 属性のストリーム記述子に対してクエリを実行します。
例
次の例は、言語リストを解析する方法を示しています。
class LanguageList
{
private:
UINT8 *pRawList; // Unparsed blob
UINT32 cbList; // Size of the blob, in bytes
DWORD cLangs; // Number of languages
WCHAR **ppszLanguages; // Array of pointers to strings.
// These are pointers into pRawList.
public:
LanguageList() :
pRawList(NULL), cbList(0), ppszLanguages(NULL), cLangs(0)
{
}
~LanguageList()
{
Clear();
}
// Clear: Clears the list.
void Clear()
{
CoTaskMemFree(pRawList);
cbList = 0;
cLangs = 0;
delete [] ppszLanguages;
ppszLanguages = NULL;
}
// GetCount: Returns the number of languages.
DWORD GetCount() const { return cLangs; }
// GetLanguage: Return the i'th string in the list.
const WCHAR* GetLanguage(DWORD i)
{
if (i >= cLangs)
{
return NULL;
}
return ppszLanguages[i];
}
// Initialize: Get the language list, if specified, and parse it.
HRESULT Initialize(IMFPresentationDescriptor *pPD)
{
if (pPD == NULL)
{
return E_POINTER;
}
Clear();
HRESULT hr = pPD->GetAllocatedBlob(
MF_PD_ASF_LANGLIST, &pRawList, &cbList);
if (FAILED(hr))
{
goto done;
}
// Parse the language blob.
// Record count.
if (cbList < sizeof(DWORD))
{
hr = E_FAIL;
goto done;
}
cLangs = ((DWORD*)pRawList)[0];
// Allocate an array of pointers to language strings.
ppszLanguages = new (std::nothrow) WCHAR*[cLangs];
if (ppszLanguages == NULL)
{
hr = E_OUTOFMEMORY;
goto done;
}
ZeroMemory(ppszLanguages, cLangs * sizeof(WCHAR*));
BYTE *pNext = pRawList + sizeof(DWORD); // Next byte.
BYTE *pEnd = pRawList + cbList; // End of the blob.
for (DWORD i = 0; i < cLangs; i++)
{
if (pNext > pEnd - sizeof(DWORD))
{
hr = E_FAIL;
goto done;
}
// Language ID length
DWORD cbStr = ((DWORD*)pNext)[0];
pNext += sizeof(DWORD);
// Calculate the pointer to the language ID string.
if ((cbStr > (size_t)(pEnd - pNext)) ||
(cbStr < sizeof(WCHAR)) ||
(cbStr % sizeof(WCHAR) != 0))
{
hr = E_FAIL;
goto done;
}
ppszLanguages[i] = (WCHAR*)pNext;
// Verify the string is NULL-terminated.
if (ppszLanguages[i][(cbStr / sizeof(WCHAR)) - 1] != L'\0')
{
hr = E_FAIL;
goto done;
}
pNext += cbStr;
}
done:
if (FAILED(hr))
{
Clear();
}
if (hr == MF_E_ATTRIBUTENOTFOUND)
{
// There was no language list attribute in the PD.
// This is not a failure case.
hr = S_OK;
}
return hr;
}
private:
LanguageList(const LanguageList& lang);
LanguageList& operator=(const LanguageList& lang);
};
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント |
Windows Vista [デスクトップ アプリのみ] |
サポートされている最小のサーバー |
Windows Server 2008 [デスクトップ アプリのみ] |
ヘッダー |
|
関連項目
-
ASF ヘッダー オブジェクト