Bonjour à tous,
J'aurais besoin de quelqu'un qui maîtrise (un peu) les filtres directShow, et qui pourrait ainsi m'éviter la crise d'apoplexie...
J'ai créé un filtre source tout mignon tout propre avec la structure nécessaire et uniquement la structure, c'est à dire la classe pin avec constructeur et destructeur, la classe filtre avec constructeur, destructeur et CreateInstance et le setup avec la définition des pins. Je n'ai rien d'autre.
La compilation fonctionne, l'édition aussi, l'enregistrement du filtre dans la base de registre tout va bien, jusqu'à l'ouverture de regedit et l'ajout du filtre dans le graph... et là c'est le drame ! j'ai droit à une très jolie erreur "The filter could not be created, resources used by this filter may already be used. Mémoire insuffisante (Return code : 0x8007000e)"
si quelqu'un pouvait m'aider avant que le craquage ne m'atteigne complètement (comment ça c'est déjà fait) je lui en serait éternellement reconnaissante...
Au cas où, mon code...
Fichiers en-tête
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 #pragma once #ifndef __AFXWIN_H__ #error "incluez 'stdafx.h' avant d'inclure ce fichier pour PCH" #endif #include <streams.h> #include "initguid.h" #include "DirectHikvisionGuids.h" #define g_wszPushHikvision L"Hikvision DirectShow Filter" #define imageSize 352*288*3 class CDirectShowHikvision; class CDirectPinHikvision : public CSourceStream { protected: CDirectShowHikvision *filter; public: CDirectPinHikvision(CSource *pFilter, HRESULT *phr); ~CDirectPinHikvision(); }; class CDirectShowHikvision : public CSource { friend class CPinHikvision; private: // Constructor is private because you have to use CreateInstance CDirectShowHikvision(IUnknown *pUnk, HRESULT *phr); ~CDirectShowHikvision(); public: static CUnknown * WINAPI CreateInstance(IUnknown *pUnk, HRESULT *phr); };Fichier de définition du filtre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 #ifndef __HIKGUIDS_DEFINED #define __HIKGUIDS_DEFINED // 190418CC-3808-11DF-8581-1DA255D89593 DEFINE_GUID(CLSID_DirectShowHikvision, 0x190418CC, 0x3808, 0x11DF, 0x85, 0x81, 0x1d, 0xa2, 0x55, 0xd8, 0x95, 0x93); #endif
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 // DirectShowHikvision.cpp : définit les fonctions d'initialisation pour la DLL. // #include "stdafx.h" #include "DirectShowHikvision.h" #ifdef _DEBUG #define new DEBUG_NEW #endif CDirectShowHikvision::CDirectShowHikvision(IUnknown *pUnk, HRESULT *phr) : CSource(NAME("DirectShowHikvision"), pUnk, CLSID_DirectShowHikvision) { } CDirectShowHikvision::~CDirectShowHikvision() { } CUnknown * WINAPI CDirectShowHikvision::CreateInstance(IUnknown *pUnk, HRESULT *phr) { return NULL; }
Fichier de définition des pins
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 #include "stdafx.h" #include "DirectShowHikvision.h" #ifdef _DEBUG #define new DEBUG_NEW #endif CDirectPinHikvision::CDirectPinHikvision(CSource *pFilter, HRESULT *phr) : CSourceStream(NAME("CDirectPinHikvision"), phr, pFilter, L"Out") { } CDirectPinHikvision::~CDirectPinHikvision() { }
Fichier d'"installation"
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 #include "stdafx.h" #include <initguid.h> #include "DirectShowHikvision.h" const AMOVIESETUP_MEDIATYPE sudOpPinTypes = { &MEDIATYPE_Video, // Major type &MEDIASUBTYPE_NULL // Minor type }; const AMOVIESETUP_PIN sudOutputPinHikvision = { L"Output", // Obsolete, not used. FALSE, // Is this pin rendered? TRUE, // Is it an output pin? FALSE, // Can the filter create zero instances? FALSE, // Does the filter create multiple instances? &CLSID_NULL, // Obsolete. L"Input", // Connect to pin. 1, // Number of media types. &sudOpPinTypes // Pin Type Information. }; const AMOVIESETUP_FILTER sudDirectHikvision = { &CLSID_DirectShowHikvision,// Filter CLSID g_wszPushHikvision, // String name MERIT_DO_NOT_USE, // Filter merit 1, // Number pins &sudOutputPinHikvision // Pin details }; CFactoryTemplate g_Templates[1] = { { L"Direct Hikvision", // Name &CLSID_DirectShowHikvision, // CLSID CDirectShowHikvision::CreateInstance, // Method to create an instance of MyComponent NULL, // Initialization function &sudDirectHikvision // Set-up information (for filters) } }; int g_cTemplates = sizeof(g_Templates) / sizeof(g_Templates[0]); //////////////////////////////////////////////////////////////////////// // // Exported entry points for registration and unregistration // (in this case they only call through to default implementations). // //////////////////////////////////////////////////////////////////////// STDAPI DllRegisterServer() { return AMovieDllRegisterServer2( TRUE ); } 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); }
Partager