0 votes

Transmettre une texture à l'aide d'un pointeur à travers le processus

Il est difficile d'exprimer cela dans le titre, alors laissez-moi vous expliquer.

J'ai une application qui utilise Direct3D pour afficher un maillage et directshow(vmr9 + allocator) pour lire une vidéo, puis envoyer l'image vidéo comme texture à la partie Direct3D pour qu'elle soit appliquée sur le maillage. L'application doit fonctionner 24 heures sur 24 et 7 jours sur 7. Au moins, elle est autorisée à être redémarrée toutes les 24 heures, mais pas plus fréquemment que cela.

Le problème est que directshow semble poser des problèmes après quelques heures de lecture, soit à cause du codec, soit à cause du pilote vidéo, soit à cause du fichier vidéo lui-même. A ce moment-là, l'application refuse tout simplement de lire d'autres vidéos. Mais la partie Direct3D fonctionne toujours correctement, le maillage est toujours affiché. Une fois l'application redémarrée, tout revient à la normale.

J'envisage donc de scinder les deux parties en deux processus différents. Ainsi, lorsque le processus vidéo ne parvient pas à lire la vidéo, je peux au moins le redémarrer immédiatement, sans perdre la partie Direct3D.

La question est donc de savoir s'il est possible de passer la texture du lecteur vidéo au processus direct3d en passant le pointeur, c'est-à-dire de récupérer la texture d'un autre processus à partir du pointeur. Je pense d'abord que ce n'est pas possible à cause de l'adressage en mémoire protégée.

J'ai mis en place une communication TCP sur les deux processus, et ne nous préoccupons pas de la communication du pointeur à ce stade.

C'est peut-être une idée folle, mais elle fonctionnera à merveille si jamais elle est possible

1voto

Jeremiah Morrill Points 3693

Oui, vous pouvez le faire avec Direct3D 9Ex. Cela ne fonctionne qu'avec Vista et vous devez utiliser un Direct3DDevice9Ex. Pour en savoir plus sur le partage ici.

0voto

EBGreen Points 14478

Si vous le séparez en tant que processus Je pense que cela ne serait pas possible, mais s'il s'agissait d'un enfant, cela ne serait pas possible. fil ils auraient alors un adressage en mémoire partagée, je crois.

0voto

Paul Betts Points 41354

Le problème est que directshow semble poser des problèmes après quelques heures de lecture, soit à cause du codec, soit à cause du pilote vidéo, soit à cause du fichier vidéo lui-même. A ce moment là, l'application refuse tout simplement de lire d'autres vidéos.

Pourquoi ne pas corriger ce bogue à la place ?

0voto

Le passage de textures ne fonctionne pas.

Je le ferais en utilisant les méthodes suivantes :

  • Remplacer le VMR par un moteur de rendu+allocateur personnalisé qui place l'image en mémoire
  • Vous allouez de la mémoire pour les images à partir d'un pool de mémoire partagée
  • Lorsque vous recevez une autre image, vous signalez un événement
  • Le processus Direct3D attend cet événement et met à jour le maillage avec la nouvelle texture.

Notez que vous devrez transférer les données de l'image vers la carte graphique. La grande différence est que ce transfert se fait maintenant dans l'application Direct3D et non plus dans l'application DirectShow.

Vous pouvez également essayer d'utiliser le VMR à cette fin. Je ne suis pas sûr que les parties personnalisées de l'allocateur/rendeur vous permettent d'effectuer le rendu dans la mémoire partagée.

0voto

Lucas Points 459

Vous pourriez peut-être utiliser le Sample Grabber dans votre processus hôte DirectShow pour obtenir l'image en tant que mémoire tampon du système. Vous pourriez ensuite utiliser WriteProcessMemory pour écrire les données à une adresse convenue à l'avance (que vous configurez via TCP ou autre) dans votre application Direct3D.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X