Exibindo o Teletexto Padrão Mundial

Observação

Essa funcionalidade foi removida do Windows Vista e dos sistemas operacionais posteriores. Ele está disponível para uso nos sistemas operacionais Microsoft Windows 2000, Windows XP e Windows Server 2003.

 

O WST (World Standard Teletext) é codificado no VBI (intervalo de espaços em branco vertical) do sinal de televisão analógico. O grafo de filtro para visualização de teletexto é semelhante ao grafo usado para exibir legendas fechadas. O diagrama a seguir ilustra este grafo.

wst preview graph

Este grafo usa os seguintes filtros para exibição do WST:

  • Conversor tee/coletor para coletor. Aceita as informações da VBI do filtro de captura e as divide em fluxos separados para cada um dos serviços de dados presentes no sinal.
  • WST Codec. Decodifica os dados de Teletexto dos exemplos de VBI.
  • Decodificador WST. Converte dados de teletexto e desenha o texto em bitmaps. O filtro downstream (nesse caso, a sobreposição Mixer) sobrepõe os bitmaps ao vídeo.

O método RenderStream do Capture Graph Builder não dá suporte diretamente aos filtros WST, portanto, seu aplicativo deve fazer algum trabalho extra.

  1. Adicione o filtro sobreposição Mixer ao grafo de filtro. O código a seguir usa a função AddFilterByCLSID descrita em Adicionar um Filtro por CLSID. (AddFilterByCLSID não é uma API DirectShow.)

    IBaseFilter *pOvMix = NULL;  // Pointer to the Overlay Mixer filter.
    hr = AddFilterByCLSID(pGraph, CLSID_OverlayMixer, L"OVMix", &pOvMix);
    if (FAILED(hr)) 
    {
        // Handle the error ...
    }
    
  2. Conexão o pino de visualização para o filtro renderizador de vídeo por meio da Mixer sobreposição. Você pode usar o método RenderStream da seguinte maneira:

    hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, 
        pCap, pOvMix, 0);
    
  3. Adicione o filtro Conversor tee/coletor a coletor ao grafo de filtro. O código a seguir usa a função CreateKernelFilter descrita em Criando filtros Kernel-Mode. (CreateKernelFilter não é uma API do DirectShow.)

    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. Adicione o filtro WST Codec ao grafo de filtro:

    IBaseFilter* pWstCodec = NULL;
    hr = CreateKernelFilter(AM_KSCATEGORY_VBICODEC, 
        OLESTR("WST Codec"), &pWstCodec);
    if (SUCCEEDED(hr))
    {
        hr = pGraph->AddFilter(pWstCodec, L"WST Codec");
    }
    
  5. Chame RenderStream para conectar o pino VBI do filtro de captura ao Conversor Tee/Coletor a Coletor e ao Conversor Tee/Coletor para Coletor ao filtro do Codec do WST:

    hr = pBuild->RenderStream(&PIN_CATEGORY_VBI, 0, pCap, 
        pKernelTee, pWstCodec);
    
  6. Chame RenderStream novamente para conectar o filtro WST Codec ao Mixer de Sobreposição. O filtro de decodificador WST é automaticamente trazido para o grafo.

    hr = pBuild->RenderStream(0, 0, pWstCodec, 0, pOvMix);
    
  7. Lembre-se de liberar todas as interfaces de filtro.

    pOvMix->Release();
    pKernelTee->Release();
    pWstCodec->Release();
    

Observação

Atualmente, o filtro de decodificador WST não dá suporte a conexões com o filtro VMR (Video Mixing Renderer). Portanto, você deve usar o filtro do Renderizador de Vídeo herdado para exibir o teletexto.

 

Se o filtro de captura tiver um pino de VBI de porta de vídeo (PIN_CATEGPORY_VIDEOPORT_VBI), conecte-o ao filtro do Alocador de Superfície da VBI . O grafo não será executado corretamente caso contrário. O exemplo de código a seguir usa a função AddFilterByCLSID, descrita em Adicionar um Filtro por CLSID e a função FindPinByCategory, descrita em Trabalhar com Categorias de Pino. (Nenhuma das funções é uma API do DirectShow.)

// Look for a video port VBI pin on the capture filter.
IPin *pVPVBI = NULL;
hr = FindPinByCategory(pCap, PINDIR_OUTPUT, 
    PIN_CATEGORY_VIDEOPORT_VBI, &pVPVBI);
if (FAILED(hr))
{
    // No video port VBI pin; nothing else to do. OK to run the graph.
}
else
{
    // Found one. Connect it to the VBI Surface Allocator.
    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))
    {
        // Handle the error (not shown). It is probably not safe to 
        // run the graph at this point.
    }
    pVPVBI->Release();
}

Legendas fechadas e teletexto