Traitement des données dans un DMO
[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement au nouveau code d’utiliser MediaPlayer, IMFMediaEngine et La capture audio/vidéo dans Media Foundation au lieu de DirectShow, lorsque cela est 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.]
Cette section explique comment traiter un flux de données à l’aide d’un DMO. Les étapes répertoriées dans cette section sont le comportement par défaut ; tous les DMO doivent prendre en charge les méthodes décrites ici. Ces méthodes utilisent des tampons distincts pour l’entrée et la sortie. Certains DMO prennent également en charge le traitement sur place, à l’aide d’une mémoire tampon unique. Pour plus d’informations sur le traitement sur place, consultez Traitement sur place.
Allocation de mémoires tampons
Le client est responsable de toute l’allocation de mémoire tampon. Une fois que vous avez défini les types de médias sur le DMO, interrogez le DMO pour connaître les exigences de mémoire tampon de chaque flux. Celles-ci peuvent changer en fonction du type de média. Pour chaque flux, appelez la méthode IMediaObject::GetInputSizeInfo ou IMediaObject::GetOutputSizeInfo . Ces méthodes retournent les informations suivantes :
- Taille minimale de la mémoire tampon, en octets.
- Exigences d’alignement, le cas échéant. Une mémoire tampon est alignée si l’adresse de début est un multiple d’un entier spécifié.
- Quantité maximale de données que le DMO contiendra pour le lookahead. Ce nombre s’applique uniquement aux flux d’entrée. Pour certains types de données (par exemple, l’encodage MPEG), un DMO peut avoir besoin de regarder vers l’avant dans le flux. La valeur de lookahead indique la quantité de données d’entrée dont le DMO aura besoin pour pouvoir produire une sortie.
Le client doit allouer des mémoires tampons qui correspondent à ces exigences. En outre, le DMO peut avoir des exigences concernant la façon dont le client package les données d’entrée. Par exemple, le DMO peut exiger que chaque mémoire tampon contienne exactement un exemple (ou une image vidéo). Pour déterminer ces exigences, appelez la méthode IMediaObject::GetInputStreamInfo . La méthode IMediaObject::GetOutputStreamInfo retourne des informations similaires sur un flux de sortie.
Dans le modèle de diffusion en continu par défaut, le client ne transmet pas de pointeurs de mémoire tampon bruts au DMO. Au lieu de cela, il utilise un objet COM léger qui expose l’interface IMediaBuffer . L’interface IMediaBuffer agit comme un wrapper COM pour un bloc de mémoire. Étant donné qu’il s’agit d’un objet COM, il prend en charge le comptage des références, ce qui permet de garantir que les mémoires tampons ne sont pas libérées pendant leur utilisation.
Notes
L’interface IMediaBuffer sert une fonction similaire à l’interface IMediaSample dans DirectShow.
Le client doit implémenter l’objet IMediaBuffer . Pour plus d’informations, consultez Implémentation d’IMediaBuffer.
Traitement des données
Pour traiter des données, procédez comme suit :
- Pour chaque flux d’entrée, remplissez une mémoire tampon avec des données d’entrée.
- Appelez IMediaObject::P rocessInput pour remettre chaque mémoire tampon.
- Appelez IMediaObject::P rocessOutput pour traiter les données. Cette méthode prend un tableau de mémoires tampons, une pour chaque flux de sortie.
- Répétez cette opération jusqu’à ce qu’il n’y ait plus de données d’entrée.
La méthode ProcessInput accepte les entrées pour un flux à la fois. En règle générale, la méthode retourne immédiatement et le DMO contient un nombre de références sur l’objet IMediaBuffer . Il libère l’objet après avoir traité toutes les données dans la mémoire tampon, ou lorsque l’application vide le DMO. Ne réutiliser une mémoire tampon que lorsque le DMO l’a libérée. Pour déterminer si un flux d’entrée peut accepter davantage de données, appelez la méthode IMediaObject::GetInputStatus . Cette méthode retourne l’indicateur DMO_INPUT_STATUSF_ACCEPT_DATA si le flux peut accepter davantage d’entrée.
La méthode ProcessOutput génère une sortie pour tous les flux de sortie à la fois. L’application passe dans un tableau de structures DMO_OUTPUT_DATA_BUFFER , une pour chaque flux de sortie. Chaque structure du tableau a un pointeur vers un objet IMediaBuffer . Le DMO écrit autant de données de sortie que possible dans les mémoires tampons. Il définit également différents indicateurs pour signaler la status de l’opération. L’indicateur DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE indique que le DMO peut produire plus de sortie à partir de l’entrée existante. Dans ce cas, le client peut à nouveau appeler ProcessOutput . Sinon, il doit appeler ProcessInput avec plus de données d’entrée. Le DMO ne modifie jamais les données dans les mémoires tampons d’entrée ; il écrit uniquement dans les mémoires tampons de sortie.
Une fois que vous avez remis toutes les données à un flux d’entrée, appelez la méthode IMediaObject::D iscontinuity . Le DMO n’accepte pas d’autres entrées dans ce flux tant que vous n’avez pas traité la sortie restante (ou vidé le DMO).
À tout moment après le début de la diffusion en continu, le DMO peut recevoir une entrée ou produire une sortie, ou les deux. Par conséquent, GetInputStatus retourne DMO_INPUT_STATUSF_ACCEPT_DATA ou ProcessOutput retourne DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE. L’application maintient la circulation des données en testant ces indicateurs et en appelant ProcessInput ou ProcessOutput en conséquence. Pour interrompre le flux de données, appelez la méthode IMediaObject::Flush . Cette méthode oblige le DMO à ignorer toutes les mémoires tampons qu’il contient en interne.
Rubriques connexes