Viewing World Standard Teletext

Hinweis

Diese Funktionalität wurde aus Windows Vista und späteren Betriebssystemen entfernt. Es ist für die Verwendung in den Betriebssystemen Microsoft Windows 2000, Windows XP und Windows Server 2003 verfügbar.

World Standard Teletext (WST) wird im vertikalen Leerungsintervall (Vertical Blanking Interval, VBI) des analogen Fernsehsignals codiert. Das Filterdiagramm für die Vorschau von Teletext ähnelt dem Diagramm, das zum Anzeigen von Untertiteln verwendet wird. Dieses Diagramm wird im folgenden Diagramm veranschaulicht.

wst preview graph

In diesem Diagramm werden die folgenden Filter für die WST-Anzeige verwendet:

  • Tee/Sink-to-Sink Converter. Akzeptiert die VBI-Informationen aus dem Erfassungsfilter und teilt sie für jeden datendienst, der auf dem Signal vorhanden ist, in separate Datenströme auf.
  • WST-Codec. Decodiert die Teletext-Daten aus den VBI-Beispielen.
  • WST-Decoder. Übersetzt Teletextdaten und zeichnet den Text in Bitmaps. Der Downstreamfilter (in diesem Fall overlay Mixer) überlagert die Bitmaps auf dem Video.

Die RenderStream-Methode von Capture Graph Builder unterstützt die WST-Filter nicht direkt, sodass Ihre Anwendung zusätzliche Arbeit leisten muss.

  1. Fügen Sie dem Filterdiagramm den Filter Overlay Mixer hinzu. Im folgenden Code wird die Funktion AddFilterByCLSID verwendet, die unter Hinzufügen eines Filters nach CLSIDbeschrieben ist. (AddFilterByCLSID ist keine DirectShow-API.)

    IBaseFilter *pOvMix = NULL;  // Pointer to the Overlay Mixer filter.
    hr = AddFilterByCLSID(pGraph, CLSID_OverlayMixer, L"OVMix", &pOvMix);
    if (FAILED(hr)) 
    {
        // Handle the error ...
    }
    
  2. Verbinden die Vorschau-Stecknadel an den Filter Video Renderer über das Overlay-Mixer. Sie können die RenderStream-Methode wie folgt verwenden:

    hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, 
        pCap, pOvMix, 0);
    
  3. Fügen Sie dem Filterdiagramm den Filter Tee/Sink-to-Sink Converter hinzu. Im folgenden Code wird die CreateKernelFilter-Funktion verwendet, die unter Erstellen Kernel-Mode Filterbeschrieben wird. (CreateKernelFilter ist keine 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. Fügen Sie dem Filterdiagramm den WST-Codecfilter hinzu:

    IBaseFilter* pWstCodec = NULL;
    hr = CreateKernelFilter(AM_KSCATEGORY_VBICODEC, 
        OLESTR("WST Codec"), &pWstCodec);
    if (SUCCEEDED(hr))
    {
        hr = pGraph->AddFilter(pWstCodec, L"WST Codec");
    }
    
  5. Rufen Sie RenderStream auf, um den VBI-Pin des Erfassungsfilters mit dem Tee/Sink-to-Sink Converter und den Tee/Sink-to-Sink Converter mit dem WST-Codecfilter zu verbinden:

    hr = pBuild->RenderStream(&PIN_CATEGORY_VBI, 0, pCap, 
        pKernelTee, pWstCodec);
    
  6. Rufen Sie RenderStream erneut auf, um den WST-Codecfilter mit dem Overlay-Mixer zu verbinden. Der WST-Decoderfilter wird automatisch in das Diagramm aufgenommen.

    hr = pBuild->RenderStream(0, 0, pWstCodec, 0, pOvMix);
    
  7. Denken Sie daran, alle Filterschnittstellen freizugeben.

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

Hinweis

Derzeit unterstützt der WST-Decoderfilter keine Verbindungen mit dem Filter Video Mixing Renderer (VMR). Daher müssen Sie den Legacyfilter Video Renderer verwenden, um Teletext anzuzeigen.

Wenn der Erfassungsfilter über einen Videoport-VBI-Pin (PIN _ CATEGPORY _ VIDEOPORT _ VBI) verfügt, verbinden Sie ihn mit dem Filter VBI Surface Allocator. Andernfalls wird das Diagramm nicht ordnungsgemäß ausgeführt. Im folgenden Codebeispiel werden die Funktion AddFilterByCLSID verwendet, die unter Hinzufügen eines Filters nach CLSIDbeschrieben ist, und die FindPinByCategory-Funktion, die unter Arbeiten mit Pinkategorienbeschrieben wird. (Keine der Funktionen ist eine DirectShow-API.)

// 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();
}

Untertitel und Teletext