Partager via


Génération du graphique de filtre de DVD

[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.]

Comme avec n’importe quelle application DirectShow, une application de lecture de DVD commence par générer un graphique de filtre. DirectShow fournit les composants suivants pour la lecture de DVD :

La lecture de DVD nécessite également un décodeur MPEG-2. Les décodeurs MPEG-2 matériels et logiciels sont disponibles auprès de tiers. Tout d’abord, créez un instance de l’objet Générateur de dvd Graph.

IDvdGraphBuilder *pBuild = NULL;
hr = CoCreateInstance(CLSID_DvdGraphBuilder, NULL, 
    CLSCTX_INPROC_SERVER, IID_IDvdGraphBuilder, (void **)&pBuild);

À ce stade, vous pouvez sélectionner et configurer le convertisseur vidéo avant de générer le reste du graphique. Cette étape, facultative, est décrite plus en détail dans la section suivante. Si vous omettez cette étape, le Générateur de graphiques DVD sélectionne un convertisseur par défaut. Ensuite, générez le graphe en appelant la méthode IDvdGraphBuilder::RenderDvdVideoVolume .

AM_DVD_RENDERSTATUS buildStatus;
hr = pBuild->RenderDvdVideoVolume(L"Z:\\video_ts", 0, &buildStatus);

Le premier paramètre est le nom d’un répertoire qui contient les fichiers DVD. Sur un disque DVD, ces fichiers se trouvent dans un répertoire nommé VIDEO_TS. Si le premier paramètre est NULL, le Générateur de graphiques DVD utilise le premier lecteur qui contient un volume de DVD.

Le deuxième paramètre contient différents indicateurs facultatifs permettant de choisir le type de décodeur (matériel ou logiciel) et d’autres options.

Le troisième paramètre est une structure AM_DVD_RENDERSTATUS qui reçoit des informations status. Si la méthode RenderDvdVideoVolume retourne S_FALSE, cela signifie que l’appel a partiellement réussi (ou partiellement échoué, si vous êtes pessimiste). Par exemple, la méthode peut ne pas afficher le flux de sous-image, même si les autres flux ont été correctement restitués. Si la méthode RenderDvdVideoVolume retourne un code d’erreur ou la valeur S_FALSE, vous pouvez examiner la structure AM_DVD_RENDERSTATUS pour plus d’informations sur l’erreur.

Ensuite, obtenez un pointeur vers le Gestionnaire de graphes de filtre en appelant IDvdGraphBuilder::GetFiltergraph. Cette méthode retourne un pointeur vers l’interface IGraphBuilder de Filter Graph Manager.

IGraphBuilder *pGraph = NULL;
hr =  pBuild->GetFiltergraph(&m_pGraph);

Utilisez la méthode IDvdGraphBuilder::GetDvdInterface pour récupérer les interfaces liées au DVD, notamment les suivantes :

  • IDvdControl2. Contrôle la lecture et les commandes DVD
  • IDvdInfo2. Retourne des informations sur l’état actuel du navigateur de DVD.
  • IAMLine21Decoder. Contrôle l’affichage légende fermé. L’affichage légende fermé est activé par défaut. Pour le désactiver, appelez IAMLine21Decoder::SetServiceState avec l’indicateur AM_L21_CCSTATE_Off.
  • IBasicAudio. Contrôle le volume et l’équilibre audio.

Par exemple, le code suivant retourne l’interface IDvdControl2 .

IDvdControl2 *pDvdControl = NULL;
hr = pBuild->GetDvdInterface(IID_IDvdControl2, (void**)&pDvdControl);

La méthode recommandée pour générer le graphique de filtre de lecture de DVD consiste à faire en sorte qu’un objet Générateur de graphiques DVD le fasse automatiquement pour vous. Cette approche est illustrée ci-dessous et dans l’exemple d’application DVD. Si vous avez besoin de créer manuellement votre graphique de filtre de DVD, vous pouvez le faire en suivant les règles de base de la création de graphiques décrites ailleurs dans la documentation DirectShow. En règle générale, vous ne devez pas ajouter, supprimer, connecter ou déconnecter manuellement des filtres individuels dans le graphique créé par le Générateur de graphiques DVD, car cela risque de perturber le code de nettoyage.

Configuration du convertisseur vidéo

DirectShow fournit plusieurs filtres de convertisseur vidéo. Avant de générer le graphique, vous pouvez choisir le convertisseur vidéo que vous préférez. Sélectionnez le convertisseur en appelant IDvdGraphBuilder::GetDvdInterface et en demandant une interface spécifique à ce convertisseur :

Si vous demandez l’une de ces interfaces avant de créer le graphe de filtres, le Générateur de graphiques DVD crée le convertisseur vidéo correspondant. Plus tard, lorsque vous générez le graphe, le Générateur de graphiques DVD essaiera d’utiliser ce convertisseur. Toutefois, s’il ne peut pas générer le graphe à l’aide du convertisseur que vous avez sélectionné, il peut basculer vers un autre convertisseur. Par exemple, votre décodeur MPEG-2 n’est peut-être pas compatible avec le filtre VMR, auquel cas le générateur de graphiques DVD est défini par défaut sur overlay Mixer.

Ces interfaces vous permettent également de configurer le convertisseur avant qu’il ne soit connecté au décodeur. Par exemple, vous pouvez définir le VMR pour qu’il utilise le mode sans fenêtre au lieu du mode fenêtré par défaut. Pour plus d’informations sur les convertisseurs vidéo, consultez la rubrique À propos du rendu vidéo dans DirectShow.

Sur Windows XP et versions ultérieures, le Générateur de dvd Graph utilise toujours le convertisseur de mixage vidéo 7 (VMR-7), sauf si :

  • Les interfaces de requêtes de l’appelant ont trouvé uniquement overlay Mixer, comme IMixerPinConfig2. Cela envoie un indicateur au Générateur DE DVD Graph indiquant que l’application souhaite utiliser overlay Mixer et non le VMR. Lecteur multimédia Windows dispose également d’une option de boîte de dialogue pour forcer l’utilisation du mélangeur de superposition.
  • Le décodeur installé n’est pas compatible avec VMR. Lors de la génération de graphiques, la nouvelle interface IAMDecoderCaps est utilisée pour case activée pour la prise en charge de VMR du décodeur. Si ce n’est pas le cas, le Générateur de graphiques DE DVD utilise le mélangeur de superposition.
  • Lors de l’utilisation d’un décodeur matériel, le décodeur ne peut pas se connecter au Gestionnaire de port vidéo (VPM). Si un décodeur matériel ne peut pas utiliser le VPM, il ne peut pas utiliser la machine virtuelle, et le générateur de graphiques DVD tente alors de créer un graphique à l’aide du mélangeur de superposition.
  • Le carte d’affichage est connu pour avoir des ressources et/ou des fonctionnalités insuffisantes pour prendre en charge le VMR, mais ne signale pas correctement cela dans le pilote. (Certains cas connus sont spécifiquement exclus par le Générateur DE DVD Graph.)
  • La connexion entre le décodeur et le VMR échoue pour une raison quelconque, généralement en raison d’un manque de VRAM pour créer les surfaces nécessaires. Dans ce cas, dvd Graph Builder désactive l’utilisation de VMR et tente d’utiliser overlay Mixer pour créer un graphe.

Mode fenêtré

En mode fenêtré (Overlay Mixer ou VMR), le convertisseur crée sa propre fenêtre vidéo. Pour faire de cette fenêtre un enfant de la fenêtre d’application, appelez IVideoWindow::p ut_Owner avec un handle pour l’application. Appelez également IVideoWindow::p ut_WindowStyle pour définir les styles WS_CHILD et WS_CLIPSIBLINGS sur la fenêtre vidéo du convertisseur. Pour obtenir des messages de souris à partir de la fenêtre vidéo du convertisseur, appelez IVideoWindow::p ut_MessageDrain avec un handle dans la fenêtre d’application. Cette méthode configure un « drain de messages » : la fenêtre vidéo transfère tous les messages de souris qu’elle reçoit vers la fenêtre de drainage des messages.

pVideoWindow->put_Owner((OAHWND)hwnd);
pVideoWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
pVideoWindow->put_MessageDrain((OAHWND)hwnd) ;

Le drainage des messages rend la sélection des boutons de menu DVD quelque peu compliquée. En supposant que la fenêtre vidéo ne remplit pas la totalité de la zone cliente de l’application, certains événements de souris seront en dehors de la fenêtre vidéo. Lorsque vous obtenez un événement de souris à l’intérieur de la fenêtre vidéo, vous devez le traiter pour la navigation dans le menu DVD. Les événements de souris provenant de l’extérieur de la fenêtre vidéo ne doivent pas être traités. Avec le drain de messages, il n’existe aucun moyen de faire la distinction entre les deux. En outre, les coordonnées des événements de souris de la fenêtre vidéo sont relatives à la zone cliente de la fenêtre vidéo ; mais les événements de souris en dehors de la fenêtre vidéo sont relatifs à la zone cliente de l’application.

Mode sans fenêtre

Le mode sans fenêtre évite complètement les problèmes liés aux messages de souris. Vous n’avez pas besoin d’un drain de messages, car la machine virtuelle virtuelle (ou EVR) ne crée pas sa propre fenêtre en mode sans fenêtre. Au lieu de cela, il s’appuie directement sur la fenêtre de votre application. Si le rectangle de destination est plus petit que la zone cliente de l’application, le Navigateur de DVD en tient compte lorsqu’il calcule les positions des boutons DVD. Par conséquent, lorsque vous obtenez un message de souris, vous pouvez passer les coordonnées directement au navigateur de DVD, comme décrit dans la section Navigation dans le menu.

DVD Applications