Inscription d’un type de fichier personnalisé

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

Cet article décrit comment le Gestionnaire de graphe de filtres localise un filtre source, en fonction d’un nom de fichier. Vous pouvez utiliser ce mécanisme pour inscrire vos propres types de fichiers personnalisés. Une fois le type de fichier inscrit, DirectShow charge automatiquement le filtre source approprié chaque fois qu’une application appelle IGraphBuilder::RenderFile ou IGraphBuilder::AddSourceFilter.

Vue d’ensemble

Pour localiser un filtre source à partir d’un nom de fichier donné, le Gestionnaire de graphes de filtre tente d’effectuer les opérations suivantes, dans l’ordre :

  1. Correspond au protocole, le cas échéant.
  2. Correspond à l’extension de fichier.
  3. Mettre en correspondance des modèles d’octets dans le fichier, appelés octets case activée.

Protocoles

Les noms de protocole tels que « ftp » ou « http » sont enregistrés sous le

HKEY_CLASSES_ROOT

clé, avec la structure suivante :

HKEY_CLASSES_ROOT
    <protocol>
        Source Filter = <Source filter CLSID>
        Extensions
            <.ext1> = <Source filter CLSID>
            <.ext2> = <Source filter CLSID>

Si le nom de fichier ou l’URL contient un signe deux-points (« : »), le Gestionnaire de graphes de filtre tente d’utiliser la partie avant « : » comme nom de protocole. Par exemple, si le nom est « myprot://myfile.ext », il recherche une clé de Registre nommée myprot. Si cette clé existe et contient une sous-clé nommée « Extensions », le Gestionnaire de graphes de filtre recherche dans cette sous-clé les entrées qui correspondent à l’extension de fichier. La valeur de la clé doit être un GUID sous forme de chaîne ; par exemple, «{00000000-0000-0000-0000-000000000000} ». Si le Gestionnaire de graphe de filtres ne peut pas correspondre à quoi que ce soit dans la sous-clé Extensions , il recherche une sous-clé nommée Filtre source, qui doit également être un GUID sous forme de chaîne.

Si le Gestionnaire de graphe de filtre trouve un GUID correspondant, il l’utilise comme CLSID du filtre source et tente de charger le filtre. S’il ne trouve pas de correspondance, il utilise le filtre Source de fichier (URL), qui traite le nom de fichier comme une URL.

Il existe deux exceptions à cet algorithme :

  • Pour exclure les lettres de pilote, les chaînes à caractère unique ne sont pas considérées comme des protocoles.
  • Si la chaîne est « file: » ou « file:// », elle n’est pas traitée comme un protocole.

Extensions de fichier

S’il n’existe aucun protocole dans le nom de fichier, le Gestionnaire de graphes de filtre recherche dans le Registre les entrées avec la clé HKEY_CLASSES_ROOT\Media Type\Extensions\. ext\, où . ext est l’extension de fichier. Si cette clé existe, la valeur Filtre source contient le CLSID du filtre source, sous forme de chaîne. Si vous le souhaitez, la clé peut avoir des valeurs pour Type de média et Sous-type, qui donnent les GUID de type principal et de sous-type.

Vérifier les octets

Certains types de fichiers peuvent être identifiés par des modèles spécifiques de bits se produisant à des décalages d’octets spécifiques dans le fichier. Le Gestionnaire de graphe de filtres recherche dans le Registre les clés au format suivant :

HKEY_CLASSES_ROOT\MediaType\{ major type }\{ subtype }

le type principal et le sous-type sont des GUID qui définissent le type de média pour le flux d’octets. Chaque clé contient une ou plusieurs sous-clés, généralement nommées 1, 2, etc., qui définissent les octets case activée ; et une sous-clé nommée Filtre source qui donne le CLSID du filtre source, sous forme de chaîne. Les sous-clés case activée octets sont des chaînes qui contiennent un ou plusieurs quads de nombres appelés :

offset, cb, mask, val

Pour faire correspondre le fichier, le Gestionnaire de graphiques de filtre lit les octets cb, en commençant par le décalage du nombre d’octets. Il effectue ensuite une opération AND au niveau du bit par rapport à la valeur dans mask. Si le résultat est égal à val, le fichier correspond à ce quad. Les valeurs mask et val sont données en hexadécimal. Une entrée vide pour mask est traitée comme une chaîne de 1s de longueur cb. Une valeur négative pour offset indique un décalage par rapport à la fin du fichier. Pour faire correspondre la clé, le fichier doit correspondre à tous les quads de l’une des sous-clés.

Par exemple, supposons que le Registre contient les clés suivantes sous HKCR\Media Type :

{e436eb83-524f-11ce-9f53-0020af0ba770}
    {7364696D-0000-0010-8000-00AA00389B71}
        0                    "0,4,,52494646,8,4,,524D4944"
        1                    "0,4,,4D546864"
        Source Filter        "{E436EBB5-524F-11CE-9F53-0020AF0BA770}"

La première clé correspond au type principal MEDIATYPE_Stream. Sous-clé ci-dessous qui correspond au sous-type MEDIATYPE_Midi. La valeur de la sous-clé Filtre source est CLSID_AsyncReader, clSID du filtre source de fichier (Async).

Chaque entrée peut avoir plusieurs quadruplés ; tous doivent correspondre. Dans l’exemple suivant, les 4 premiers octets du fichier doivent être 0xAB, 0xCD, 0x12 0x34 ; et les 4 derniers octets du fichier doivent être 0xAB, 0xAB, 0x00, 0xAB :

    0, 4, , ABCD1234,  -4, 4, , ABAB00AB 

En outre, plusieurs entrées peuvent être répertoriées sous un seul type de média. Une correspondance à l’un d’entre eux suffit. Ce schéma permet d’avoir un ensemble de masques de remplacement; pour instance, les fichiers .wav qui peuvent ou non avoir un en-tête RIFF.

Notes

Ce schéma est similaire à celui utilisé par la fonction GetClassFile .

 

Chargement du filtre source

En supposant que le Gestionnaire de graphe de filtre trouve un filtre source correspondant pour le fichier, il ajoute ce filtre au graphique, interroge le filtre pour l’interface IFileSourceFilter et appelle IFileSourceFilter::Load. Les arguments de la méthode Load sont le nom de fichier et le type de média, tels que déterminés à partir du Registre.

Si le Gestionnaire de graphe de filtres ne trouve rien dans le Registre, il utilise par défaut le filtre Source de fichier asynchrone. Dans ce cas, il définit le type de média sur MEDIATYPE_Stream, MEDIASUBTYPE_None.

Types de fichiers personnalisés dans Lecteur multimédia Windows

Lecteur multimédia Windows utilise un ensemble supplémentaire d’entrées de Registre. Pour plus d’informations, consultez Paramètres du registre de l’extension de nom de fichier dans le Kit de développement logiciel (SDK) Lecteur multimédia Windows.

Écriture de filtres DirectShow