Partilhar via


atributo MF_PD_ASF_LANGLIST

Especifica uma lista de identificadores de idioma que especifica os idiomas contidos em um arquivo ASF (Advanced Systems Format). Esse atributo corresponde ao Objeto de Lista de Idiomas, definido na especificação do ASF.

Tipo de dados

Matriz de bytes

Comentários

Esse atributo se aplica a descritores de apresentação para conteúdo ASF.

O método IMFASFContentInfo::GeneratePresentationDescriptor cria o descritor de apresentação e gera esse atributo a partir do cabeçalho Objeto da Lista de Idiomas. A tabela a seguir mostra o formato do blob:

Campo Objeto de Lista de Idiomas Tipo de dados Tamanho Descrição
Contagem de registros de ID de idioma DWORD 4 bytes Número de idiomas
Registros de ID do idioma BYTE[] Varia Matriz de cadeias de caracteres de linguagem (veja abaixo).

 

O primeiro DWORD é o número de idiomas, seguido por uma matriz de cadeias de caracteres de identificador de idioma. Cada cadeia de caracteres tem o seguinte formato:

Campo Objeto de Lista de Idiomas Tipo de dados Tamanho Descrição
Comprimento da ID do idioma DWORD 4 bytes O comprimento da cadeia de caracteres em bytes, incluindo o tamanho do caractere NULL à direita.
ID do idioma WCHAR[] Varia Uma cadeia de caracteres terminada em nulo que contém o nome do idioma RFC 1766.

 

Cada cadeia de caracteres é uma marca de idioma compatível com RFC 1766.

Para obter a marca de idioma de um fluxo específico no arquivo ASF, consulte o descritor de fluxo para o atributo MF_SD_ASF_EXTSTRMPROP_LANGUAGE_ID_INDEX .

Exemplos

O exemplo a seguir mostra como analisar a 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 Valor
Cliente mínimo com suporte
Windows Vista [somente aplicativos da área de trabalho]
Servidor mínimo com suporte
Windows Server 2008 [somente aplicativos da área de trabalho]
Cabeçalho
Wmcontainer.h

Confira também

Lista alfabética de atributos da Media Foundation

IMFAttributes::GetBlob

IMFAttributes::SetBlob

IMFPresentationDescriptor

Atributos do Descritor de Apresentação

Objeto de cabeçalho ASF

Objeto de cabeçalho ASF

Descritores de apresentação