2

Je travaille actuellement avec Windows Media Foundation. Cependant, en raison de certains problèmes avec le décodeur Microsoft H.264 et certains décodeurs manquants pour le format personnalisé, je voudrais savoir s'il serait possible d'instancier un décodeur DirectShow directement en utilisant CLSID, et de construire un proxy autour de ce qui expose IMFTransform pour obtenir un décodeur pour Media Foundation. Alors voici ma question:Utilisation de filtres DirectShow en dehors de DirectShow?

Puis-je instancier directement un filtre Directshow (de préférence des décodeurs) et les utiliser pour le décodage (c'est-à-dire mettre des images compressées et obtenir des images non compressées) pour créer une MFT?

Je sais comment instancier le filtre lui-même en utilisant son CLSID. Cependant, je n'ai aucune idée comment utiliser la fonctionnalité de décodage réelle.

Des idées, des conseils, des liens tout sera appréciée. Merci,

J.

+0

peut-être que vous pourriez simplement "à la main" appeler les différentes méthodes de filtrage sur elle ... – rogerdpack

+0

question connexe: http://stackoverflow.com/questions/6016329/about-usir-directshow-filters-outside-directshow – wimh

Répondre

5

(disclaimer: Je ne l'ai jamais vraiment fait cela, mais je ne vois aucune raison technique ne peut pas être fait YMMV.)

Si le décodeur est un filtre de DMO, il Sera beaucoup plus facile - vous pouvez parler à travers IMediaObject. Ce n'est pas vraiment différent de la façon dont DirectShow utilise les OMD; il enveloppe simplement le DMO avec un autre filtre de transformation qui gère la négociation de type de média et le passage d'échantillon, mais rien ne vous empêche vraiment de le faire dans votre propre application.

Il y a une capture: pour IMediaObject :: ProcessInput et IMediaObject :: ProcessOutput, vous aurez besoin de votre propre classe de tampon qui implémente IMediaBuffer. Mais c'est une interface assez basique, donc je ne pense pas que vous aurez trop de mal à l'implémenter. Voici un basic implementation. Pour les filtres DirectShow réguliers, cela va être beaucoup plus difficile, car la plupart des filtres DirectShow dépendent vraiment de l'existence d'un graphe externe disponible (par exemple: tout le type DirectShow suppose l'existence de ce graphe).). Si vous voulez vraiment utiliser un seul filtre DShow autonome, vous devrez probablement envelopper le graphe du filtre entier, puis disposer d'un filtre source personnalisé pour alimenter les échantillons. Vous pouvez utiliser l'outil de capture d'échantillons (ou un filtre de rendu personnalisé) pour arrachez les échantillons du graphique et exposez-les au reste de l'application. (Une sorte de folle idée serait même d'envelopper ce graphique dans une mise en œuvre du filtre DMO, puis utiliser IMediaObject pour lui parler - cela peut être difficile, cependant)

Heureusement la plupart décodeurs ont tendance à être mis en œuvre DMO filtres, donc je pense qu'il y a une forte probabilité que vous pouvez simplement utiliser IMediaObject.

2

Je ne suis pas sûr pourquoi vous voulez faire. Vous ne voulez pas vraiment qu'un filtre vive en dehors d'un graphique. Si vous ne souhaitez pas utiliser les filtres de source de fichiers/réseau traditionnels ou les moteurs de rendu traditionnels, vous pouvez écrire des rendus de tampon et des filtres de source de tampons auxquels vous passez des pointeurs et obtenez des pointeurs. Ensuite, vous pouvez déposer tout le désordre dans un graphique et l'exécuter, et obtenir l'utilisation du décodeur à peu près directement sans rien d'autre. Ce ne serait pas difficile à faire. Le décodeur attend probablement un flux de paquets PES.

+0

as J'ai mentionné ci-dessus, il s'agit d'utiliser des décodeurs DirectShow hérités qui n'exposent pas une interface DMO (où la transition serait très facile) dans une topologie Media Foundatino. –

Questions connexes