Exemple de filtre d’analyseur PSI

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture in Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation au lieu de DirectShow, si possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Description

Le filtre de l’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 à partir de la table d’association de programmes (PAT) et des tables de mappage de programmes (PMT). Ces informations permettent à une application de configurer le démultiplexeur 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 caméscopes IEEE 1394 MPEG-2 et les appareils D-VHS. Pour plus d’informations, consultez Pilote MSTape . 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 de l’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 de sous-unité de bande Microsoft AV/C » dans la catégorie Sources de capture vidéo.

  3. Connectez le filtre source au filtre demultiplexeur MPEG-2.

  4. Utilisez la page de propriétés sur le 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 à la broche de sortie. Définissez le type de contenu sur « SECTIONS PSI MPEG2 ».

  6. Connectez la broche de sortie demux à l’analyseur PSI, comme illustré dans le diagramme suivant.

    Graphe du filtre de l’analyseur psi

  7. Exécutez le graphique afin de fournir des données PSI au filtre de l’analyseur PSI. Lorsque 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 psi Parser pour sélectionner un numéro de programme. La liste des flux élémentaires dans la page de propriétés affiche le PID et le type de flux associés à 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 du 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 de flux de programme et restituent les broches.

Notes

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

 

Pour utiliser le filtre de l’analyseur PSI dans une application, commencez par générer le graphique de filtre à partir de la source MPEG-2 vers le demux MPEG-2. Le code de cette étape n’est pas affiché ici, car la configuration exacte du graphique 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 Utilisation du démultiplexeur MPEG-2.

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 . À présent, exécutez 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 de l’analyseur PSI. Lorsque vous recevez un événement EC_PROGRAM_CHANGED, vous pouvez obtenir les informations PSI disponibles en appelant les méthodes IMpeg2PsiParser . Cette section décrit les méthodes dont vous aurez le plus souvent besoin.

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 des 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 renvoie 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 certaine connaissance de la source d’origine. Par exemple, la norme 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 attribuer 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 graphique, mais vous devez arrêter le graphique pour connecter des broches.

Téléchargement de l’exemple

Pour télécharger les exemples du Kit de développement logiciel (SDK) DirectShow, installez la dernière version du Kit de développement logiciel (SDK) Windows.

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

Exemples DirectShow

IMpeg2PsiParser, interface