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 [데스크톱 앱만 해당] |
헤더 |
|
추가 정보
-
ASF 헤더 개체