Exibindo o Teletexto Padrão Mundial

[O recurso associado a esta página, DirectShow, é um recurso herdado. Ele foi substituído por MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo na Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo no Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Observação

Essa funcionalidade foi removida do Windows Vista e de 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 esse 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, o Mixer de Sobreposição) sobrepõe os bitmaps no 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 Do Mixer de Sobreposição 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. Conecte o pino de visualização ao filtro renderizador de vídeo por meio do Mixer de 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 para coletor ao grafo de filtro. O código a seguir usa a função CreateKernelFilter descrita em Criando filtros de 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 de VBI do filtro de captura ao Conversor Tee/Sink-to-Sink e ao Conversor Tee/Sink-to-Sink ao filtro do Codec do WST:

    hr = pBuild->RenderStream(&PIN_CATEGORY_VBI, 0, pCap, 
        pKernelTee, pWstCodec);
    
  6. Chame RenderStream novamente para conectar o filtro do 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 (Renderizador de Combinação de Vídeo). Portanto, você deve usar o filtro herdado do Renderizador de Vídeo 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 Alocador de Superfície de VBI . Caso contrário, o grafo não será executado corretamente. 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 Trabalhando 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