atributo MF_PD_ASF_LANGLIST
Especifica una lista de identificadores de idioma que especifica los idiomas contenidos en un archivo de formato de sistemas avanzados (ASF). Este atributo corresponde al objeto de lista de lenguajes, definido en la especificación de ASF.
Tipo de datos
Byte array
Observaciones
Este atributo se aplica a los descriptores de presentación para el contenido de ASF.
El método IMFASFContentInfo::GeneratePresentationDescriptor crea el descriptor de presentación y genera este atributo a partir del encabezado Objeto de lista de idioma. En la tabla siguiente se muestra el formato del blob:
Campo Objeto de lista de idioma | Tipo de datos | Size | Descripción |
---|---|---|---|
Recuento de registros de identificador de idioma | DWORD | 4 bytes | Número de idiomas |
Registros de identificador de idioma | BYTE[] | Varía | Matriz de cadenas de lenguaje (consulte a continuación). |
El primer DWORD es el número de idiomas, seguido de una matriz de cadenas de identificador de idioma. Cada cadena tiene el formato siguiente:
Campo Objeto de lista de idioma | Tipo de datos | Size | Descripción |
---|---|---|---|
Longitud del identificador de idioma | DWORD | 4 bytes | Longitud de la cadena en bytes, incluido el tamaño del carácter NULL final. |
Id. de idioma | WCHAR[] | Varía | Cadena terminada en null que contiene el nombre de idioma RFC 1766. |
Cada cadena es una etiqueta de idioma compatible con RFC 1766.
Para obtener la etiqueta de idioma de un flujo determinado en el archivo ASF, consulte el descriptor de secuencia para el atributo MF_SD_ASF_EXTSTRMPROP_LANGUAGE_ID_INDEX .
Ejemplos
En el ejemplo siguiente se muestra cómo analizar la lista de idiomas.
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);
};
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible |
Windows Vista [solo aplicaciones de escritorio] |
Servidor mínimo compatible |
Windows Server 2008 [solo aplicaciones de escritorio] |
Encabezado |
|
Consulte también
-
Asf Header (objeto)