Exemple de filtre d’analyseur PSI

Description

Le filtre d’analyseur PSI reçoit des informations spécifiques du programme (PSI) à partir d’un flux de transport MPEG-2 et extrait les informations du programme de la table d’association de programmes (PAT) et des tables de mappage de programme (PMT). Ces informations permettent à une application de configurer le demultiplexer MPEG-2. Le filtre prend en charge une interface personnalisée, IMpeg2PsiParser, pour récupérer les informations PSI.

Ce filtre est conçu pour les appareils MPEG-2, tels que les camcordeurs MPEG-2 IEEE 1394 et les appareils D-VHS. Pour plus d’informations, consultez MSTape Driver . Les sources de diffusion de télévision numérique doivent utiliser un filtre TIF pour obtenir des informations sur le programme.

Utilisation

Vous pouvez tester le filtre d’analyseur PSI dans GraphEdit comme suit :

  1. Lancez GraphEdit.

  2. Insérez une source de transport MPEG-2. Les caméscopes MPEG-2 et les appareils D-VHS apparaissent sous la forme « Appareil sous-unité de bande Microsoft AV/C » dans la catégorie Sources de capture vidéo.

  3. Connecter le filtre source au filtre Demultiplexer MPEG-2.

  4. Utilisez la page de propriétés du demux pour créer une broche de sortie avec un type de média « MPEG-2 PSI ». Cette broche fournit les sections PAT et PMT.

  5. Utilisez la page de propriétés demux pour mapper les 0x00 PID à l’épingle de sortie. Définissez le type de contenu sur « Sections PSI MPEG2 ».

  6. Connecter l’épingle de sortie demux à l’analyseur PSI, comme illustré dans le diagramme suivant.

    psi parser filter graph

  7. Exécutez le graphique pour alimenter les données PSI dans le filtre d’analyseur PSI. Comme le filtre décode les sections PAT, il mappe automatiquement les PID PMT à la même broche de sortie sur le demux, afin qu’il reçoive les sections PMT.

  8. Utilisez la page de propriétés de l’analyseur PSI pour sélectionner un numéro de programme. La liste des flux élémentaires dans la page de propriétés affiche le type de données personnelles et de flux associé à chaque flux élémentaire dans le programme sélectionné. La page de propriétés est conçue pour reconnaître les types de flux définis dans la norme ISO/IEC 13818-1.

  9. Entrez le numéro piD audio dans la zone d’édition Audio PID et le numéro piD vidéo dans la zone d’édition piD vidéo .

  10. Cliquez sur le bouton Afficher le programme . L’analyseur PSI configure les broches de sortie sur le demux pour qu’elles correspondent aux informations du flux de programme et affichent les broches.

Notes

La page de propriétés de l’analyseur PSI est fournie pour faciliter les tests et fournir un exemple de code qui configure le démultiplexeur MPEG-2. Il n’est pas recommandé aux applications d’utiliser. Les applications doivent configurer le demux par programmation.

 

Pour utiliser le filtre d’analyseur PSI dans une application, commencez par créer le graphique de filtre à partir de la source MPEG-2 au demux MPEG-2. Le code de cette étape n’est pas affiché ici, car la configuration exacte du graphe dépend de la source.

Ensuite, créez une broche de sortie sur le demux pour les données PSI. Mappez 0x00 PID, qui est réservé aux sections PAT, à cette broche, comme indiqué dans le code suivant :

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

Pour plus d’informations, consultez Using the MPEG-2 Demultiplexer.

Ajoutez le filtre d’analyseur PSI au graphique et connectez-le à la broche de sortie sur le demux. Interrogez l’analyseur PSI pour l’interface IMpeg2PsiParser . Exécutez maintenant le graphique et attendez EC_PROGRAM_CHANGED événements, qui signalent une nouvelle section PAT ou PMT. Cet événement est un événement personnalisé défini par le filtre d’analyseur PSI. Lorsque vous recevez un événement EC_PROGRAM_CHANGED, vous pouvez obtenir les informations PSI disponibles en appelant des méthodes IMpeg2PsiParser . Cette section décrit les méthodes dont vous aurez besoin le plus souvent.

Pour obtenir le nombre de programmes, utilisez la méthode IMpeg2PsiParser::GetCountOfPrograms :

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

Pour obtenir le numéro de programme d’un programme spécifique, utilisez la méthode IMpeg2PsiParser::GetRecordProgramNumber :

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

Le numéro de programme est utilisé pour obtenir les entrées PMT pour les programmes individuels. Pour obtenir le nombre de flux élémentaires dans un programme, utilisez la méthode GetCountOfElementaryStreams :

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

Pour chaque flux élémentaire, la méthode IMpeg2PsiParser::GetRecordElementaryPid retourne le PID, et la méthode IMpeg2PsiParser::GetRecordStreamType retourne le type de flux :

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

Le PID et le type de flux vous permettent de configurer de nouvelles broches de sortie sur le démultiplexeur MPEG-2. Cela peut nécessiter une connaissance de la source d’origine. Par exemple, ISO/IEC 13818-1 définit les types de flux 0x80 via 0xFF comme « utilisateur privé », mais d’autres normes basées sur MPEG-2 peuvent affecter d’autres significations à ces types.

Le démultiplexeur MPEG-2 peut créer de nouvelles broches et de nouveaux mappages PID pendant l’exécution du graphe, mais vous devez arrêter le graphe pour connecter des broches.

Téléchargement de l’exemple

Pour télécharger les exemples de sdk DirectShow, installez la dernière version du SDK Windows.

Cet exemple est installé sous le chemin suivant : [SDK Root]\Samples\Multimedia\DirectShow\Filters\PSIParser.

exemples de DirectShow

IMpeg2PsiParser, interface