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

Lihat juga

Daftar Alfabet Atribut Media Foundation

IMFAttributes::GetBlob

IMFAttributes::SetBlob

IMFPresentationDescriptor

Atribut Deskriptor Presentasi

Objek Header ASF

Objek Header ASF

Deskriptor Presentasi