DirectShow DirectShow 의 사용법 비디오 캡춰 아날로그 TV 클로즈드 캡션과 teletext World Standard Teletext 의 표시   [목차열람] [주소복사] [슬롯비우기]
World Standard Teletext 의 표시
 
Microsoft DirectX 9.0

World Standard Teletext 의 표시

World Standard Teletext (WST)는 아날로그 TV 신호의 수직 동기 간격 (VBI)에 encode 된다. teletext 의 프리뷰용 필터 그래프는 자막 방송의 표시에 사용되는 그래프와 유사하다.

WST 프리뷰 그래프

이 그래프는 WST 표시에 다음의 필터를 사용한다.

Capture Graph Builder 의 RenderStream 메서드는 WST 필터를 직접은 지원 하지 않기 때문에, 애플리케이션에서는 추가 작업이 필요하게 된다.

  1. 오버레이 믹서 필터를 필터 그래프에 추가한다. 다음 코드는, 「CLSID 에 의한 필터의 추가」에 설명되고 있는 AddFilterByCLSID 함수를 사용한다. (AddFilter 는 DirectShow API 는 아니다. )
    IBaseFilter *pOvMix = NULL;  // 오버레이 믹서 필터의 포인터.
    hr = AddFilterByCLSID(pGraph, CLSID_OverlayMixer, L"OVMix", &pOvMix);
    if (FAILED(hr)) 
    {
        // 에러를 처리한다 ...
    }
    
  2. 오버레이 믹서를 개입시켜 프리뷰 핀을 비디오 렌더러 파일에 접속한다. 다음과 같이 RenderStream 메서드를 사용한다.
    hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, 
        pCap, pOvMix, 0);
    
  3. 티/싱크 투 싱크 컨버터 필터를 필터 그래프에 추가한다. 다음 코드는, 「커널 모드 필터의 생성」에 설명되고 있는 CreateKernalFilter 함수를 사용한다. (CreateKernelFilter 는 DirectShow API 는 아니다. )
    IBaseFilter* pKernelTee = NULL;
    hr = CreateKernelFilter(AM_KSCATEGORY_SPLITTER, 
        OLESTR("Tee/Sink-to-Sink Converter"), &pKernelTee);
    if (SUCCEEDED(hr))
    {
        hr = pGraph->AddFilter(pKernelTee, L"Kernel Tee");
    }
    
  4. WST CODEC 필터를 필터 그래프에 추가한다.
    IBaseFilter* pWstCodec = NULL;
    hr = CreateKernelFilter(AM_KSCATEGORY_VBICODEC, 
        OLESTR("WST Codec"), &pWstCodec);
    if (SUCCEEDED(hr))
    {
        hr = pGraph->AddFilter(pWstCodec, L"WST Codec");
    }
    
  5. RenderStream 를 호출해, 캡춰 필터의 VBI 핀을 티/싱크 투 싱크 컨버터에 접속해, 티/싱크 투 싱크 컨버터를 WST CODEC 필터에 접속한다.
    hr = pBuild->RenderStream(&PIN_CATEGORY_VBI, 0, pCap, 
        pKernelTee, pWstCodec);
    
  6. 한번 더 RenderStream 를 호출해, WST CODEC 필터를 오버레이 믹서에 접속한다. WST 디코더 필터는 그래프에 자동적으로 도입된다.
    hr = pBuild->RenderStream(0, 0, pWstCodec, 0, pOvMix);
    
  7. 모든 필터 인터페이스를 잊지 않고 릴리즈 한다.
    pOvMix->Release();
    pKernelTee->Release();
    pWstCodec->Release();
    

 :  현재 WST 디코더 필터는 Video Mixing Renderer (VMR) 필터에의 접속을 지원 하고 있지 않다. 따라서, teletext 를 표시하려면 종래의 비디오 렌더러 필터를 사용한다.

캡춰 필터에 비디오 포트 VBI 핀 (PIN_CATEGPORY_VIDEOPORT_VBI)이 있는 경우는,VBI 표면 할당자 필터에 접속한다. 그렇게 하지 않으면 그래프는 올바르게 실행되지 않는다. 다음 샘플 코드는, 「CLSID 에 의한 필터의 추가」에 설명되고 있는 AddFilterByCLSID 함수, 및 「핀 카테고리의 조작」에 설명되고 있는 FindPinByCategory 함수를 사용하고 있다. (어느 쪽의 함수도 DirectShow API 는 아니다. )

// 캡춰 필터의 비디오 포트 VBI 핀을 검색한다.
IPin *pVPVBI = NULL;
hr = FindPinByCategory(pCap, PINDIR_OUTPUT, 
    PIN_CATEGORY_VIDEOPORT_VBI, &pVPVBI);
if (FAILED(hr))
{
    // 비디오 포트 VBI 핀이 없다. 다른 처리는 필요없다. 그래프를 실행해 문제 없다.
}
else
{
    // 발견되었다. VBI 표면 할당자에 접속한다.
    IBaseFilter *pSurf = NULL;
    hr = AddFilterByCLSID(pGraph, CLSID_VBISurfaces, L"VBI Surf", &pSurf);
    if (SUCCEEDED(hr))
    {
        hr = pBuild->RenderStream(NULL, NULL, pVPVBI, 0, pSurf);
        pSurf->Release();
    }
    if (FAILED(hr))
    {
        // 에러를 처리한다 (생략). 이 시점에서 그래프를 실행하는 것은 안전하지 않다
        // 가능성이 있다.
    }
    pVPVBI->Release();
}
↑TOP