IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

DirectX Discussion :

Creation d'un filtre directshow pour Matrox Orion


Sujet :

DirectX

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2004
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 19
    Points : 14
    Points
    14
    Par défaut Creation d'un filtre directshow pour Matrox Orion
    Bonjour,

    Ca fait une semaine que je suis sur un probleme

    Le voici:
    J'ai un filtre d'acquisition video directshow pour Matrox Orion a coder,
    mais la je dois dire que j'en perds un peu mon C++
    Pour l'instant j'ai cree deux classes:

    - une pour le filtre qui herite de IClassFactory et de CSource
    - une pour les pins du filtre qui herite de CSourceStream.

    (Je suis pas certain que ca fonctionne mais bon ... ca compile... )

    Je sais aussi qu'il faut exporter 4 fonctions dont dllMain().

    Je suis pas non plus sur d'avoir bien compris comment les methodes de IClassFactory et IUnknown fonctionnent.

    Est ce que qq'un a deja code un filtre ou aurait des info sur le sujet
    parce que la ...

    Merci

  2. #2
    Membre à l'essai
    Inscrit en
    Septembre 2004
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 19
    Points : 14
    Points
    14
    Par défaut
    Salut!

    Bon, j'ai decidé de remettre ce problème à plus tard, je pense qu'il ne sert a rien de s'acharner sur un problème trop longtemps, il vaut mieux y revenir un peu plus tard...

    A l'heure actuelle, je dispose des infos suivantes:
    - les filtres sont des objets COM
    - Ils doivent hériter des interfaces IUnknown et IClassFactory
    - Pour créer un filtre d'acquisition, il faut qu'il hérite de la classe de base CSource et qu'il posséde au moins deux Pins, héritant de CSourceStream. (Pin de capture et Pin de Preview (ou VideoPort en fonction de la carte)).
    - Il faut générer un identifiant unique (CLSID)

    Si je trouve un jour la solution, je la mettrai en ligne et je vous indiquerai l'URL.

    Aller, A+

  3. #3
    mat.M
    Invité(e)
    Par défaut
    FAIRE UNE RECHERCHE SUR LE FORUM

    Plusieurs fois ce genre de question a déja été posée ,
    voir si Matrox ne propose pas un SDK et exemples
    dans le SDK de Direct X il ya un exemple de player Direct Show qui utilise tous les composants de base

  4. #4
    Membre à l'essai
    Inscrit en
    Septembre 2004
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 19
    Points : 14
    Points
    14
    Par défaut
    Salut!

    Merci bcp et que la force soit avec toi...

  5. #5
    Membre à l'essai
    Inscrit en
    Septembre 2004
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 19
    Points : 14
    Points
    14
    Par défaut
    Salut!

    J'ai une bonne et une mauvaise nouvelle...

    Je commence par la bonne:
    J'ai fait un filtre pour la Matrox Orion qui fonctionne sous graphEdit

    Mais la mauvaise nouvelle, c'est que je n'arrive pas à l'utiliser dans le programme pour lequel ce filtre est destiné.

    Quelques explications, le programme enumère tous les filtres de capture et affiche leur nom dans une fenêtre, quand on clique sur un nom, le filtre est utilisé dans le graph. Le programme fonctionne bien pour les filtres fournis avec les cartes Pinnacles et ATI, le problème vient donc de mon filtre.Je pense que le filtre pour la matrox n'est pas enregistré comme filtre de capture video... Est ce que quelqu'un aurait une petite idée...

    Voici le code du filtre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
     
     
    #include "filtre_orion.h"
    #include <Mil.h>
    #include <winbase.h>
    #include <Windows.h>
     
    /*definition de l'identifiant unique du filtre dans la base de registre*/
     
    DEFINE_GUID(CLSID_Matrox_Orion,0x252d6dea, 0xeec5, 0x49ac, 0xb5, 0x46, 0x6a, 0xa4, 0x7d, 0xd4, 0x44, 0x44);
     
     
     
    /*=============================================================*/
    /*Declaration des structures de données pour les pins et la dll*/
    /*=============================================================*/
    //---------------------------------------------------------------------------------------------
     
    const AMOVIESETUP_MEDIATYPE sudOpPinTypes =
    {
        &MEDIATYPE_Video,       // Major type
        &MEDIASUBTYPE_NULL      // Minor type
    };
     
    const AMOVIESETUP_PIN sudOpPin[] =
    {
        {L"Capture",              // Pin string name
        FALSE,                  // Is it rendered
        TRUE,                   // Is it an output
        FALSE,                  // Can we have none
        FALSE,                  // Can we have many
        &CLSID_NULL,            // Connects to filter
        NULL,                   // Connects to pin
        1,                      // Number of types
        &sudOpPinTypes},{
    	L"Preview",              // Pin string name
        FALSE,                  // Is it rendered
        TRUE,                   // Is it an output
        FALSE,                  // Can we have none
        FALSE,                  // Can we have many
        &CLSID_NULL,            // Connects to filter
        NULL,                   // Connects to pin
        1,                      // Number of types
        &sudOpPinTypes
    	}
    };       // Pin details
     
    const AMOVIESETUP_FILTER sudOrionax =
    {
        &CLSID_Matrox_Orion,    // Filter CLSID
        L"Orion",       // String name
        MERIT_DO_NOT_USE,       // Filter merit
        2,                      // Number pins
        sudOpPin               // Pin details
    };
     
     
     
    // COM global table of objects in this dll
     
    CFactoryTemplate g_Templates[] = {
      { L"Matrox Orion Capture Filter"
      , &CLSID_VideoInputDeviceCategory
      , COrion::CreateInstance
      , NULL
      , &sudOrionax }
    };
    int g_cTemplates = sizeof(g_Templates) / sizeof(g_Templates[0]);
     
     
    /*===============================================*/
    /*Fonction d'entree et d'initialisation de la dll*/
    /*===============================================*/
    //---------------------------------------------------------------------------------------------
     
    /* DllRegisterServer
    Exported entry points for registration and unregistration*/
    STDAPI DllRegisterServer()
    {
       return  AMovieDllRegisterServer2(TRUE);
    }
     
     
    /*DllUnregisterServer*/
    STDAPI DllUnregisterServer()
    {
        return AMovieDllRegisterServer2(FALSE);
     
    }
     
     
    /*DllEntryPoint*/
    extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID);
     
    BOOL APIENTRY DllMain(HANDLE hModule, 
                          DWORD  dwReason, 
                          LPVOID lpReserved)
    {
    	return DllEntryPoint((HINSTANCE)(hModule), dwReason, lpReserved);
    }
     
     
     
     
    /*================================*/
    /*Methodes pour le corps du filtre                           */
    /*================================*/
    //---------------------------------------------------------------------------------------------
     
    /*Fonction appelée par CoCreateInstance*/
    CUnknown * WINAPI COrion::CreateInstance(LPUNKNOWN lpunk, HRESULT *phr){
    	/*teste la valeur de phr et affiche le message d'erreur associe si faux*/
    	ASSERT(phr);
     
    	/*on demande la creation du filtre*/
    	CUnknown * pUnk = new COrion(lpunk, phr);
    	if(!pUnk){
    		if(phr)
    			*phr = E_OUTOFMEMORY;
    	}
     
    	return pUnk;
    }
     
     
    /*Constructeur de la classe COrion*/
    COrion::COrion(LPUNKNOWN lpunk, HRESULT *phr):
    CSource(NAME("Orion"), lpunk, CLSID_Matrox_Orion){
    	ASSERT(phr);
     
     
    	CAutoLock cAutoLock(&m_cStateLock);
     
    	/*On alloue de la place pour 
    	les pins du filtre*/
    	m_paStreams = (CSourceStream **) new COrionCapturePin*[2];
    	if (!m_paStreams){
    		if (phr)
    			*phr = E_OUTOFMEMORY;
     
    		return ;
    	}
     
    	/*==============================*/
    	/*initialisation du systeme MIL*/
    	/*==============================*/
    	int n;
     
    	/*Allocation de l'application MIL*/
    	MappAlloc(M_DEFAULT, &MilApplication);
     
    	/*Allocation du systeme MIL*/
    	MsysAlloc(M_SYSTEM_ORION, M_DEV0, M_DEFAULT, &MilSystem);
     
     
    	/*Allocation du digitizer*/
    	MdigAlloc(MilSystem, M_DEV0, "c:/Program Files/Matrox Imaging/drivers/orion/dcf/PAL.DCF", M_DEFAULT, &MilDigitizer);
     
    	MdigChannel(MilDigitizer, M_CH1);
     
    	/* Allocate sequence storage image buffers. */
    	for (n=0; n<NBGRAB; n++)
    	{
    		MbufAllocColor( M_DEFAULT, 3L,  IMAGE_WIDTH, IMAGE_HEIGHT, 8L+M_UNSIGNED, M_IMAGE+M_GRAB+M_PROC, &MilImage[n]);
    		MbufAllocColor( M_DEFAULT, 3L,  IMAGE_WIDTH, IMAGE_HEIGHT, 8L+M_UNSIGNED, M_IMAGE+M_GRAB+M_PROC, &MilImageCapt[n]);
    	}
     
     
    	/*Creation du display*/
    	MdispAlloc(MilSystem, M_DEV0, "M_PAL" , M_DEFAULT, &MilDisplay);
    	MbufAllocColor(M_DEFAULT, 3L, IMAGE_WIDTH, IMAGE_HEIGHT, 8L+M_UNSIGNED, M_IMAGE+M_DISP+M_PROC, &MilImageDisplay);
    	MdispSelect(MilDisplay, MilImageDisplay);
     
    	/*Une fois que la memoire est reservee,
    	on construit les pins*/
     
    	/*le pin de capture*/
    	m_paStreams[0] = new COrionCapturePin(phr, this, L"Capture Pin");
    	if(!m_paStreams[0]){
    		if(phr)
    			*phr = E_OUTOFMEMORY;
     
    		return ;
    	}	
     
    	/*le pin de pre-visualisation*/
    	m_paStreams[1] = new COrionPreviewPin(phr, this, L"Preview Pin");
    	if(!m_paStreams[1]){
    		if(phr)
    			*phr = E_OUTOFMEMORY;
     
    		return ;
    	}	
     
    }
     
     
    COrion::~COrion(){
    	int n;
     
    	for (n=0; n<NBGRAB; n++)
    	{
    		MbufFree(MilImage[n]);
    		MbufFree(MilImageCapt[n]);
    	}
     
    	MbufFree(MilImageDisplay);
    	MdispFree(MilDisplay);
    	MdigFree(MilDigitizer);
    	MsysFree(MilSystem);
    	MappFree(MilApplication);
    }

    Le reste du code, c'est la definition des pins et je ne pense pas que le problème vienne de la... :

    Je vous rassure, je n'ai pas fait que ca depuis le dernier poste, mais la ca commence a faire pas mal de temps que je galaire alors un petit coup de pouce serait le bien venu ...

    Un grand merci d'avance,
    Et que la Force soit avec vous

  6. #6
    Membre à l'essai
    Inscrit en
    Septembre 2004
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 19
    Points : 14
    Points
    14
    Par défaut
    Bj,

    Bon ben ca y est, ca marche,
    j'arrive meme a capturer de la video

    aller, A+
    Et que la Force soit avec vous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Filtre directshow
    Par afan dans le forum DirectX
    Réponses: 2
    Dernier message: 04/02/2004, 21h41
  2. []filtre sepia pour les images
    Par nabil dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 27/01/2004, 20h41
  3. DirectShow pour faire de la 2d
    Par Blustuff dans le forum DirectX
    Réponses: 8
    Dernier message: 15/07/2003, 23h46
  4. Filtre DirectShow
    Par masterfangorn dans le forum DirectX
    Réponses: 4
    Dernier message: 23/05/2003, 14h57
  5. interfaces pour Filtres DirectShow
    Par Chupakabra dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2003, 14h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo