MF_PD_ASF_LANGLIST 특성

ASF(Advanced Systems Format) 파일에 포함된 언어를 지정하는 언어 식별자 목록을 지정합니다. 이 특성은 ASF 사양에 정의된 언어 목록 개체에 해당합니다.

데이터 형식

바이트 배열

설명

이 특성은 ASF 콘텐츠에 대한 프레젠테이션 설명자에 적용됩니다.

IMFASFContentInfo::GeneratePresentationDescriptor 메서드는 프레젠테이션 설명자를 만들고 언어 목록 개체 헤더에서 이 특성을 생성합니다. 다음 표에서는 Blob의 형식을 보여줍니다.

언어 목록 개체 필드 데이터 형식 크기 설명
언어 ID 레코드 수 DWORD 4바이트 언어 수
언어 ID 레코드 BYTE[] 상황에 따라 다름 언어 문자열의 배열입니다(아래 참조).

 

첫 번째 DWORD 는 언어 수와 언어 식별자 문자열의 배열입니다. 각 문자열의 형식은 다음과 같습니다.

언어 목록 개체 필드 데이터 형식 크기 설명
언어 ID 길이 DWORD 4바이트 후행 NULL 문자의 크기를 포함하여 문자열의 길이(바이트)입니다.
언어 ID WCHAR[] 상황에 따라 다름 RFC 1766 언어 이름을 포함하는 null로 끝나는 문자열입니다.

 

각 문자열은 RFC 1766을 준수하는 언어 태그입니다.

ASF 파일에서 특정 스트림에 대한 언어 태그를 얻으려면 MF_SD_ASF_EXTSTRMPROP_LANGUAGE_ID_INDEX 특성에 대한 스트림 설명자를 쿼리합니다.

예제

다음 예제에서는 언어 목록을 구문 분석하는 방법을 보여 줍니다.

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);
};

요구 사항

요구 사항
지원되는 최소 클라이언트
Windows Vista [데스크톱 앱만 해당]
지원되는 최소 서버
Windows Server 2008 [데스크톱 앱만 해당]
헤더
Wmcontainer.h

추가 정보

미디어 파운데이션 특성의 사전순 목록

IMFAttributes::GetBlob

IMFAttributes::SetBlob

IMFPresentationDescriptor

프레젠테이션 설명자 특성

ASF 헤더 개체

ASF 헤더 개체

프레젠테이션 설명자