DirectShow DirectShow 레퍼런스 DirectShow 의 필터 SAMI (CC) 퍼서 필터   [목차열람] [주소복사] [슬롯비우기]
SAMI (CC) 파서 필터
 
Microsoft DirectX 9.0

SAMI (CC) 파서 필터

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 인터페이스를 지원 하고 있지 않다.

↑TOP