DirectShow DirectShow 의 사용법 비디오 캡춰 아날로그 TV 클로즈드 캡션과 teletext World Standard Teletext 의 표시 [목차열람] [주소복사] [슬롯비우기] |
Microsoft DirectX 9.0 |
World Standard Teletext (WST)는 아날로그 TV 신호의 수직 동기 간격 (VBI)에 encode 된다. teletext 의 프리뷰용 필터 그래프는 자막 방송의 표시에 사용되는 그래프와 유사하다.
이 그래프는 WST 표시에 다음의 필터를 사용한다.
Capture Graph Builder 의 RenderStream 메서드는 WST 필터를 직접은 지원 하지 않기 때문에, 애플리케이션에서는 추가 작업이 필요하게 된다.
IBaseFilter *pOvMix = NULL; // 오버레이 믹서 필터의 포인터.
hr = AddFilterByCLSID(pGraph, CLSID_OverlayMixer, L"OVMix", &pOvMix);
if (FAILED(hr))
{
// 에러를 처리한다 ...
}
hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,
pCap, pOvMix, 0);
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");
}
IBaseFilter* pWstCodec = NULL;
hr = CreateKernelFilter(AM_KSCATEGORY_VBICODEC,
OLESTR("WST Codec"), &pWstCodec);
if (SUCCEEDED(hr))
{
hr = pGraph->AddFilter(pWstCodec, L"WST Codec");
}
hr = pBuild->RenderStream(&PIN_CATEGORY_VBI, 0, pCap,
pKernelTee, pWstCodec);
hr = pBuild->RenderStream(0, 0, pWstCodec, 0, pOvMix);
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();
}