Esempio di filtro parser PSI

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Descrizione

Il filtro parser PSI riceve informazioni specifiche del programma (PSI) da un flusso di trasporto MPEG-2 ed estrae le informazioni sul programma dalla tabella di associazione programmi (PAT) e dalle tabelle delle mappe programma (PMT). Queste informazioni consentono a un'applicazione di configurare MPEG-2 Demultiplexer. Il filtro supporta un'interfaccia personalizzata , IMpeg2PsiParser, per il recupero delle informazioni PSI.

Questo filtro è progettato per i dispositivi MPEG-2, ad esempio i dispositivi IEEE 1394 MPEG-2 e D-VHS. Per altre informazioni, vedere DRIVER MSTape . Le fonti di trasmissione televisiva digitale devono utilizzare un filtro TIF per ottenere informazioni sul programma.

Utilizzo

È possibile testare il filtro parser PSI in GraphEdit come indicato di seguito:

  1. Avviare GraphEdit.

  2. Inserire un'origine di trasporto MPEG-2. I dispositivi MPEG-2 e D-VHS vengono visualizzati come "Microsoft AV/C Tape Subunit Device" nella categoria Origini acquisizione video.

  3. Connettere il filtro di origine al filtro Demultiplexer MPEG-2.

  4. Usare la pagina delle proprietà nel demux per creare un pin di output con un tipo di supporto "MPEG-2 PSI". Questo pin consentirà di recapitare le sezioni PAT e PMT.

  5. Utilizzare la pagina delle proprietà demux per eseguire il mapping dei 0x00 PID al pin di output. Impostare il tipo di contenuto su "Sezioni PSI MPEG2".

  6. Connettere il pin di output demux al parser PSI, come illustrato nel diagramma seguente.

    grafico del filtro psi parser

  7. Eseguire il grafo per inserire i dati PSI nel filtro parser PSI. Quando il filtro decodifica le sezioni PAT, esegue automaticamente il mapping dei PID PMT allo stesso pin di output sul demux, in modo che riceva le sezioni PMT.

  8. Utilizzare la pagina delle proprietà Parser PSI per selezionare un numero di programma. L'elenco dei flussi elementari nella pagina delle proprietà mostrerà il PID e il tipo di flusso associati a ogni flusso elementare nel programma selezionato. La pagina delle proprietà è progettata per riconoscere i tipi di flusso definiti in ISO/IEC 13818-1.

  9. Immettere il numero PID audio nella casella di modifica PID audio e il numero PID video nella casella di modifica del PID video .

  10. Fare clic sul pulsante Visualizza programma . Il parser PSI configurerà i pin di output nel demux in modo che corrispondano alle informazioni sul flusso di programma ed eseguirà il rendering dei pin.

Nota

La pagina delle proprietà PSI Parser viene fornita per semplificare il test e fornire codice di esempio che configura MPEG-2 Demultiplexer. Non è consigliabile usare le applicazioni. Le applicazioni devono configurare l'demux a livello di codice.

 

Per usare il filtro parser PSI in un'applicazione, iniziare creando il grafico dei filtri dall'origine MPEG-2 alla demux MPEG-2. Il codice per questo passaggio non viene visualizzato qui, perché la configurazione esatta del grafico dipende dall'origine.

Creare quindi un pin di output sul demux per i dati PSI. Eseguire il mapping di pid 0x00, riservato per le sezioni PAT, a questo pin, come illustrato nel codice seguente:

// Set the media type to MPEG-2 table sections.
AM_MEDIA_TYPE mt;
ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
mt.majortype = KSDATAFORMAT_TYPE_MPEG2_SECTIONS;

// Create the pin.
IPin *pPsiPin;
hr = pDemux->CreateOutputPin(&mt, L"PSI", &pPsiPin);
if (SUCCEEDED(hr))
{
    // Map to PID 0.
    ULONG Pid = 0x00;
    hr = pPid->MapPID(1, &Pid, MEDIA_MPEG2_PSI);
}

Per altre informazioni, vedere Uso di MPEG-2 Demultiplexer.

Aggiungere il filtro parser PSI al grafico e connetterlo al pin di output nel demux. Eseguire una query sul parser PSI per l'interfaccia IMpeg2PsiParser . Eseguire ora il grafico e attendere EC_PROGRAM_CHANGED eventi, che segnalano una nuova sezione PAT o PMT. Questo evento è un evento personalizzato definito dal filtro parser PSI. Quando si riceve un evento EC_PROGRAM_CHANGED, è possibile ottenere le informazioni PSI disponibili chiamando i metodi IMpeg2PsiParser . In questa sezione vengono descritti i metodi necessari più spesso.

Per ottenere il numero di programmi, usare il metodo IMpeg2PsiParser::GetCountOfPrograms :

int NumProgs = 0;
hr = pPsi->GetCountOfPrograms(&NumProgs);

Per ottenere il numero di programma per un programma specifico, usare il metodo IMpeg2PsiParser::GetRecordProgramNumber :

WORD ProgNum = 0;
for (int i = 0; i < NumProgs; i++)
{
    hr = pPsi->GetRecordProgramNumber(i, &ProgNum);
    ...
}

Il numero di programma viene usato per ottenere le voci PMT per i singoli programmi. Per ottenere il numero di flussi elementari in un programma, utilizzare il metodo GetCountOfElementaryStreams :

WORD cElemStreams = 0;
hr = pPsi->GetCountOfElementaryStreams(ProgNum, &cElemStreams);

Per ogni flusso elementare, il metodo IMpeg2PsiParser::GetRecordElementaryPid restituisce il PID e il metodo IMpeg2PsiParser::GetRecordStreamType restituisce il tipo di flusso:

BYTE ESType = 0;
WORD ESPid = 0;
for (WORD j = 0; j < cElemStreams; j++)
{
    hr = pPsi->GetRecordElementaryPid(ProgNum, j, &ESPid);
    hr = pPsi->GetRecordStreamType(ProgNum, j, &ESType);
}

Il PID e il tipo di flusso consentono di configurare nuovi pin di output in MPEG-2 Demultiplexer. Ciò potrebbe richiedere una certa conoscenza dell'origine originale. Ad esempio, ISO/IEC 13818-1 definisce i tipi di flusso 0x80 tramite 0xFF come "utente privato", ma altri standard basati su MPEG-2 possono assegnare altri significati a questi tipi.

Mpeg-2 Demultiplexer può creare nuovi pin e nuovi mapping PID durante l'esecuzione del grafico, ma è necessario arrestare il grafico per connettere i pin.

Download dell'esempio

Per scaricare gli esempi di DirectShow SDK, installare la versione più recente di Windows SDK.

Questo esempio viene installato nel percorso seguente: [SDK Root]\Samples\Multimedia\DirectShow\Filters\PSIParser.

Esempi di DirectShow

Interfaccia IMpeg2PsiParser