atribut MF_PD_ASF_LANGLIST
Menentukan daftar pengidentifikasi bahasa yang menentukan bahasa yang terkandung dalam file Advanced Systems Format (ASF). Atribut ini sesuai dengan Objek Daftar Bahasa, yang ditentukan dalam spesifikasi ASF.
Jenis Data
Byte array
Keterangan
Atribut ini berlaku untuk deskriptor presentasi untuk konten ASF.
Metode IMFASFContentInfo::GeneratePresentationDescriptor membuat deskriptor presentasi dan menghasilkan atribut ini dari header Objek Daftar Bahasa. Tabel berikut ini memperlihatkan format blob:
Bidang Objek Daftar Bahasa | Jenis Data | Ukuran | Deskripsi |
---|---|---|---|
Jumlah Rekaman ID Bahasa | DWORD | 4 byte | Jumlah bahasa |
Rekaman ID Bahasa | BYTE[] | Bervariasi | Array string bahasa (lihat di bawah). |
DWORD pertama adalah jumlah bahasa, diikuti dengan array string pengidentifikasi bahasa. Setiap string memiliki format berikut:
Bidang Objek Daftar Bahasa | Jenis Data | Ukuran | Deskripsi |
---|---|---|---|
Panjang ID Bahasa | DWORD | 4 byte | Panjang string dalam byte, termasuk ukuran karakter NULL berikutnya. |
ID Bahasa | WCHAR[] | Bervariasi | String null-terminated yang berisi nama bahasa RFC 1766. |
Setiap string adalah tag bahasa yang sesuai dengan RFC 1766.
Untuk mendapatkan tag bahasa untuk aliran tertentu dalam file ASF, kueri deskriptor aliran untuk atribut MF_SD_ASF_EXTSTRMPROP_LANGUAGE_ID_INDEX .
Contoh
Contoh berikut menunjukkan cara mengurai daftar bahasa.
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);
};
Persyaratan
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung |
Windows Vista [hanya aplikasi desktop] |
Server minimum yang didukung |
Windows Server 2008 [hanya aplikasi desktop] |
Header |
|
Lihat juga
-
Objek Header ASF
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk