DirectShow DirectShow 레퍼런스 DirectShow 의 필터 SAMI (CC) 퍼서 필터 [목차열람] [주소복사] [슬롯비우기] |
Microsoft DirectX 9.0 |
SAMI (Synchronized Accessible Media Interchange) 파일로부터의 캡션 데이터를 해석한다.
SAMI 는, HTML 를 닮은 텍스트 포맷이며, 타임 베이스 캡션의 encode에 사용된다. 이 필터는, SAMI 데이터를 텍스트 스트림으로 변환한다. 스트림의 각 샘플에는, 1 개의 캡션 엔트리와 포맷 정보가 포함되어 있다. 샘플의 타임 스탬프는, SAMI 파일의 타임 정보로부터 생성된다.
이 필터는,내부 스크립 코맨드 렌더링 필터와 함께 사용하도록(듯이) 설계되고 있다. 내부 스크립 코맨드 렌더러는, 텍스트 샘플을 받아, 이벤트 통지로서 애플리케이션에 보낸다. 더 자세한 정보는, 「주의」를 참조할것.
필터 인터페이스 | IAMStreamSelect ,IBaseFilter |
입력 핀 미디어 타입 | MEDIATYPE_Stream |
입력 핀인타페이스 | IPin ,IQualityControl |
출력 핀 미디어 타입 | MEDIATYPE_Text, MEDIASUBTYPE_NULL |
출력 핀인타페이스 | IMediaSeeking ,IPin ,IQualityControl |
필터 CLSID | {33FACFE0-A9BE-11D0-A520-00A0D10129C0} |
프로퍼티 페이지 CLSID | 프로퍼티 페이지 없음. |
실행 모듈 | quartz.dll |
메리트 | MERIT_UNLIKELY |
필터 카테고리 | CLSID_LegacyAmFilterCategory |
주의
이하에, 간단한 SAMI 파일을 나타낸다.
<SAMI>
<Head>
<STYLE TYPE="text/css"> <! --
. ENCC {Name: English; lang:en-US; SAMI_TYPE: CC;}
. FRCC {Name: French; lang:fr-FR; SAMI_TYPE: CC;}
#NORMAL {Name: Normal; font-family: arial;}
#GREENTEXT {Name: GreenText; color:green; font-family: verdana;}
-->
</STYLE>
</Head>
<BODY>
<Sync Start=1000>
<P CLASS="ENCC">One
<P CLASS="FRCC">Un
<Sync Start=2000>
<P CLASS="ENCC">Two
<P CLASS="FRCC">Deux
<Sync Start=3000>
<P CLASS="ENCC">Three
<P CLASS="FRCC">Trois
</BODY>
</SAMI>
STYLE 태그는, 영어 (. ENCC)와 프랑스어 (. FRCC)의 2 개의 언어 설정을 정의한다. 또, #NORMAL 및 #GREENTEXT 라고 하는 2 개의 스타일도 정의한다. 각 SYNC 태그는, 캡션의 시작 타임을 밀리 세컨드로 정의한다. P 태그는 캡션 텍스트를 저장 해,CLASS 속성은 캡션의 언어 설정을 지정한다.
필터는, 각 언어와 스타일에 대해 1 개의 논리 스트림을 생성 한다. 항상, 1 개의 언어 스트림과 1 개의 스타일 스트림이 유효하다. 필터가 샘플을 생성할 때는, 현재의 언어의 캡션을 선택해, 현재의 스타일을 적용한다. 디폴트에서는, 파일로 선언하는 최초의 언어와 스타일이 유효하게 된다. 애플리케이션은 IAMStreamSelect::Enable 메서드를 사용해, 다른 스트림을 유효하게 할 수 있다.
기정의 설정에서는, 샘플 파일의 최초의 캡션에 의해, 다음의 출력이 생성 된다.
<P STYLE=" Name: English; lang:en-US; SAMI_TYPE: CC; Name: Normal; font-family: arial;">One
출력이 내부 스크립 코맨드 렌더러에 보내지면 이 필터는 EC_OLE_EVENT 이벤트 통지를 보낸다. 2 번째의 이벤트 파라미터는, 캡션 텍스트를 가지는 BSTR 이다. 애플리케이션은, 이벤트를 취득해 캡션을 표시할 수 있다.
다음 샘플 코드는, SAMI 파일의 렌더링 방법, 스트림 정보의 취득 방법, 스트림을 유효하게 하는 방법, 캡션 텍스트의 표시 방법에 대해 가리키고 있다. 이 예에서는, 이전의 SAMI 파일이 C:\Sami_test_file.sami 로서 보존되고 있는 것을 상정하고 있다.
간결하게 하기 위해서, 이 샘플 코드에서는,IAMStreamSelect::Enable 메서드를 호출할 때에 하드 코딩 된 스트림 인덱스를 사용하고 있다. 또, 최소한의 에러 체크를 실행한다.
void __cdecl main()
{
HRESULT hr;
IGraphBuilder *pGraph;
IMediaControl *pMediaControl;
IMediaEventEx *pEv;
IBaseFilter *pSAMI;
CoInitialize(NULL);
// 필터 그래프 매니저를 생성 한다.
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC,
IID_IGraphBuilder, (void **) &pGraph);
pGraph->QueryInterface(IID_IMediaControl, (void **) &pMediaControl);
pGraph->QueryInterface(IID_IMediaEventEx, (void**) &pEv);
// 그래프를 생성 해, SAMI 파서를 찾는다.
pGraph->RenderFile(L"C:\\Sami_test_file.sami", NULL);
hr = pGraph->FindFilterByName(L"SAMI (CC) Parser", &pSAMI);
if (SUCCEEDED(hr))
{
IAMStreamSelect *pStrm = NULL;
hr = pSAMI->QueryInterface(IID_IAMStreamSelect, (void**) &pStrm);
if (SUCCEEDED(hr))
{
DWORD dwStreams = 0;
pStrm->Count(&dwStreams);
printf("Stream count: %d\n", dwStreams);
// 프랑스어 및 "GreenText" 를 선택한다.
hr = pStrm->Enable(1, AMSTREAMSELECTENABLE_ENABLE);
hr = pStrm->Enable(3, AMSTREAMSELECTENABLE_ENABLE);
// 각론리스트림의 이름을 출력한다.
for (DWORD index = 0; index < dwStreams; index++)
{
DWORD dwFlags;
WCHAR *wszName;
hr = pStrm->Info(index, NULL, &dwFlags, NULL, NULL,
&wszName, NULL, NULL);
if (hr == S_OK)
{
wprintf(L"Stream %d: %s [%s]\n", index, wszName,
(dwFlags ? L"ENABLED" : L"DISABLED"));
CoTaskMemFree(wszName);
}
}
pStrm->Release();
}
pSAMI->Release();
}
// 그래프를 실행해, 캡션을 표시한다.
pMediaControl->Run();
while (1)
{
long evCode, lParam1, lParam2;
pEv->GetEvent(&evCode, &lParam1, &lParam2, 100);
if (evCode == EC_OLE_EVENT) {
wprintf(L"%s\n", (BSTR) lParam2);
}
pEv->FreeEventParams(evCode, lParam1, lParam2);
if (evCode == EC_USERABORT || evCode == EC_COMPLETE || evCode == EC_ERRORABORT)
break;
}
// 클린 업 한다.
pMediaControl->Release();
pEv->Release();
pGraph->Release();
CoUninitialize();
}
이 필터는,IAsyncReader 인터페이스를 사용해 소스 필터로부터 샘플을 취득하고 있다. 그 때문에, 이 필터는, 입력 핀상에서 IMemInputPin 인터페이스를 지원 하고 있지 않다.