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
Wmcontainer.h

Consulte también

Lista alfabética de atributos de Media Foundation

IMFAttributes::GetBlob

IMFAttributes::SetBlob

IMFPresentationDescriptor

Atributos del descriptor de presentación

Asf Header (objeto)

Asf Header (objeto)

Descriptores de presentación