attributo MF_PD_ASF_LANGLIST
Specifica un elenco di identificatori di lingua che specifica le lingue contenute in un file ASF (Advanced Systems Format). Questo attributo corrisponde all'oggetto Elenco linguaggio, definito nella specifica ASF.
Tipo di dati
Matrice di byte
Commenti
Questo attributo si applica ai descrittori di presentazione per il contenuto ASF.
Il metodo IMFASFContentInfo::GeneratePresentationDescriptor crea il descrittore di presentazione e genera questo attributo dall'intestazione Language List Object. La tabella seguente illustra il formato del BLOB:
Campo Oggetto elenco lingue | Tipo di dati | Dimensione | Descrizione |
---|---|---|---|
Conteggio record ID lingua | DWORD | 4 byte | Numero di lingue |
Record ID lingua | BYTE[] | Varia | Matrice di stringhe di linguaggio (vedere di seguito). |
Il primo DWORD è il numero di lingue, seguito da una matrice di stringhe di identificatori di lingua. Ogni stringa ha il formato seguente:
Campo Oggetto elenco lingue | Tipo di dati | Dimensione | Descrizione |
---|---|---|---|
Lunghezza ID lingua | DWORD | 4 byte | Lunghezza della stringa in byte, inclusa la dimensione del carattere NULL finale. |
ID lingua | WCHAR[] | Varia | Stringa con terminazione Null contenente il nome della lingua RFC 1766. |
Ogni stringa è un tag di lingua conforme a RFC 1766.
Per ottenere il tag di lingua per un determinato flusso nel file ASF, eseguire una query sul descrittore di flusso per l'attributo MF_SD_ASF_EXTSTRMPROP_LANGUAGE_ID_INDEX .
Esempio
Nell'esempio seguente viene illustrato come analizzare l'elenco di lingue.
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);
};
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato |
Windows Vista [solo app desktop] |
Server minimo supportato |
Windows Server 2008 [solo app desktop] |
Intestazione |
|
Vedi anche
-
Oggetto Intestazione ASF