Integration de mon filtre directshow [Résolu]

Messages postés
2
Date d'inscription
vendredi 27 octobre 2006
Statut
Membre
Dernière intervention
3 octobre 2008
- - Dernière réponse : cs_louis14
Messages postés
788
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
8 mars 2017
- 6 oct. 2009 à 13:37
Bonjour,

Je travaille sur un filtre de transformation directshow que je veux integrer à mon application de lecture de flux video venant d'un module d'encodage qui ne me laisse pas trop le choix pour le traitement video.

J'ai créer mon filtre de transformation que j'ai appelé DTransform et il est integré dans la base de registre de windows et utilisable sous GraphEdit (j'ai testé, ca marche)

Maintenant je veux l'integrer dans mon application (j'ai déja ajouté les filtres correspondant au module et le filtre de rendu) pour l'inserer entre le filtre de rendu et le filtre ffmpeg.

Comment je récupère ce filtre dans mon programme pour le mettre en IBaseFilter ?(son CLSID n'est pas connu de visual)
Y a t'il une méthode de recherche de filtre par nom dans la base de registre?

Merci
Afficher la suite 

6 réponses

Meilleure réponse
Messages postés
36
Date d'inscription
jeudi 16 mai 2002
Statut
Membre
Dernière intervention
6 octobre 2009
3
Merci
Bonjour,

Il faut dans ton programme inclure le header de ton filtre DirectShow pour pouvoir l'utiliser et avoir accès à son interface et ses méthodes.
Et dans ce header, tu déclare son CLSID.

Le CLSID doit être unique bien sur (il y a un programme avec le SDK pour en générer un).

Mais si vraiment tu ne veux pas t'embetter avec le CLSID, j'ai une fonction qui recherche par nom... (Forcément plus longue que de prendre directement le CLSID).

Je te la posterai quand j'aurai remis la main dessus :-)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 140 internautes nous ont dit merci ce mois-ci

Commenter la réponse de bigzooloo
Messages postés
2
Date d'inscription
vendredi 27 octobre 2006
Statut
Membre
Dernière intervention
3 octobre 2008
3
Merci
Merci d'avoir répondu,

Après avoir beaucoup cherché dans les méthodes disponibles de directshow, je suis tombé sur l'objet IFilterMapper2 qui m'a permis d'énumerer tout les filtres connus dans la base de registre :

Ex du code :
IEnumMoniker* pFilterEnum=NULL;
IFilterMapper2 *pMapper=NULL;
    hr = CoCreateInstance(CLSID_FilterMapper2, NULL, CLSCTX_INPROC, IID_IFilterMapper2,(void **) &pMapper);

hr = pMapper->EnumMatchingFilters(
        &pFilterEnum,
        0,                  // Reserved.
        FALSE,               // Use exact match?
        MERIT_DO_NOT_USE, // Minimum merit.
        TRUE,               // At least one input pin?
        0,                  // Number of major type/subtype pairs for input.
        NULL,       // Array of major type/subtype pairs for input.
        NULL,               // Input medium.
        NULL,               // Input pin category.
        FALSE,              // Must be a renderer?
        FALSE,               // At least one output pin?
        0,                  // Number of major type/subtype pairs for output.
        NULL,               // Array of major type/subtype pairs for output.
        NULL,               // Output medium.
        NULL);              // Output pin category.

Puis après grâce à l'enumération donné dans pFilterEnum, j'ai verifié le Nom de chaque filtre grâce au "IMoniker" et au "IPropertyBag", et dès que le nom du filtre obtenu à correspondu à mon attente, j'ai fait un "BindToObject" avec le "IMoniker" pour pouvoir associer ce filtre avec un "IBaseFilter".

Ensuite en ayant inclus les fichier avec mes CLSID (définies par "static const GUID" et non DEFINE_GUID) et leur classe associés j'ai pu utiliser les propriétés de mon objet

Merci encore.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 140 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_pilulu
Messages postés
36
Date d'inscription
jeudi 16 mai 2002
Statut
Membre
Dernière intervention
6 octobre 2009
0
Merci
Bonjour, désolé de ne pas avoir répondu plus tôt...
J'ai retrouvé le code dans une sauvegarde de 2005, et je ne voulais pas dire de betise avant de vérifier...

Effectivement, il faut bien utiliser IEnumMoniker comme tu as fais. Puis tu dis :

"Ensuite en ayant inclus les fichier avec mes CLSID (définies par "static const GUID" et non DEFINE_GUID) et leur classe associés j'ai pu utiliser les propriétés de mon objet "

Donc tu as quand même tes CLSID... dans ce cas, essaye cette fonction plus rapide que l'énumération :

HRESULT AddFilterByCLSID (IGraphBuilder *pG,

const GUID& clsid, LPCWSTR wszName, IBaseFilter **ppF)
{

if (! ppF) DXTrace(__FILE__,__LINE__,E_POINTER,NULL,TRUE);
SAFE_TEST(CoCreateInstance(clsid, 0, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (

void**)(ppF)))
SAFE_TEST(pG->AddFilter(*ppF, wszName))

return S_OK;
}

Avec un exemple d'utilisation :

AddFilterByCLSID(pGraph, CLSID_VideoMixingRenderer9,  L

"VMR9", &pVMR9);

A+
Commenter la réponse de bigzooloo
Messages postés
788
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
8 mars 2017
5
0
Merci
Bonjour,
je veux débuter avec DirectShow. Est-il possible d'avoir les sources de votre projet? On ne trouve pas beaucoup de projet sur le net concernant la vidéo, mais beaucoup pour le son.
merci pour votre réponse.

louis14
Commenter la réponse de cs_louis14
Messages postés
36
Date d'inscription
jeudi 16 mai 2002
Statut
Membre
Dernière intervention
6 octobre 2009
0
Merci
Slt,
Ca ne me parait pas la meilleure façon de débuter avec directshow avec les sources d'un filtre de transformation...

Je te conseillerai plutôt de commancer avec graphedit pour "voir" les traitements de ton flux de la source jusqu'au rendu. Puis de reproduire ces schémas en C++ en utilisant les filtres déjà prêt.

Ensuite, si tu veux approfondir, tu peux te mettre à la création de tes propres filtres.

Après si tu y tiens, j'ai quelques sources simple de mes débuts (genre: lire un mp3, enregistrer la webcam en divX, ...), d'autres qui sont les bases de projets plus complexe : un filtre qui crée une image noire (à la place de la webcam par exemple et tu envoi ce que tu veux), un filtre de transformation qui ne transforme rien :-)...
Commenter la réponse de bigzooloo
Messages postés
788
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
8 mars 2017
5
0
Merci
Excuse-moi? mais j'ai déjà vu graph edit et j'ai quelques sources compilés pour ce qui concerne le flux de données : acquisition et visualisation de la webcam. Mais mon intérêt pour tes sources est que je voudrais bien créé 2 filtres bien spécifiques pour transformer une application qui utilise video for windows et dont le flux d'images n'est pas assez rapide.
Merci pour ta réponse et je suis preneur de tes premiers sources de filtres.


louis14
Commenter la réponse de cs_louis14