Procesamiento digital de video en tiempo real y - Maestría en ...
Procesamiento digital de video en tiempo real y - Maestría en ...
Procesamiento digital de video en tiempo real y - Maestría en ...
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Procesami<strong>en</strong>to</strong> <strong>digital</strong> <strong>de</strong> vi<strong>de</strong>o <strong>en</strong> <strong>tiempo</strong> <strong>real</strong> y “vi<strong>de</strong>o wall” con la PC 63<br />
5.6.5 Instanciar el filtro<br />
Todos los filtros <strong>de</strong>b<strong>en</strong> añadir código para permitir a la clase base instanciar el<br />
filtro. Para instanciar un filtro, se <strong>de</strong>b<strong>en</strong> incluir dos piezas <strong>de</strong> código <strong>en</strong> el filtro: una<br />
función miembro estática CreateInstance <strong>en</strong> la clase CtransformFilter y un medio para<br />
informar a la class factory <strong>de</strong> como acce<strong>de</strong>r a esta función.<br />
Típicam<strong>en</strong>te, la función miembro CreateInstance llama al constructor para la clase<br />
filtro <strong>de</strong>rivada. A continuación se muestra como implem<strong>en</strong>tar la función miembro<br />
CreateInstance:<br />
CUnknown *CGargle::CreateInstance(LPUNKNOWN punk, HRESULT *phr) {<br />
CGargle *pNewObject = new CGargle(NAME("Gargle Filter"), punk, phr);<br />
if (pNewObject == NULL) {<br />
*phr = E_OUTOFMEMORY;<br />
}<br />
return pNewObject;<br />
} // CreateInstance<br />
Para comunicarse con la class factory, se <strong>de</strong>clara un arreglo global<br />
CfactoryTemplate y se provee el nombre <strong>de</strong>l filtro, el i<strong>de</strong>ntificador <strong>de</strong> la clase (CLSID) <strong>de</strong>l<br />
filtro, y un apuntador a la función miembro estática CocreateInstance que crea nuestro<br />
objeto filtro.<br />
// Necesario para el mecanismo CreateInstance<br />
CFactoryTemplate g_Templates[2]=<br />
{ { L"Gargle filter" , &CLSID_Gargle , CGargle::CreateInstance }<br />
, { L"Gargle filter Property Page", &CLSID_GargProp, CGargleProperties::CreateInstance}<br />
};<br />
int g_cTemplates = sizeof(g_Templates)/sizeof(g_Templates[0]);<br />
Finalm<strong>en</strong>te, se <strong>en</strong>ca<strong>de</strong>na el filtro a Strmbase.lib y exporta DllGetClassObject y<br />
DllCanUnloadNow utilizando un archivo .<strong>de</strong>f .<br />
5.6.6 Adición <strong>de</strong> interfaces<br />
En nuestro proyecto se añadirá una interfaz para po<strong>de</strong>r crear una pagina propietaria<br />
y así el usuario modifique las propieda<strong>de</strong>s <strong>de</strong>l filtro. DirectShow <strong>de</strong>fine una clase especial<br />
llamada INonDelegatingUnknown cuyos métodos hac<strong>en</strong> las mismas cosas que IUnknow.<br />
El método NonDelegatingQueryInterface será llamado por cualquier objeto o aplicación<br />
que quiera consultar un pin o un filtro por alguna interfaz que este implem<strong>en</strong>te. El sigui<strong>en</strong>te<br />
código ejemplo sobrescribe la función miembro que distribuye refer<strong>en</strong>cias a las interfaces<br />
ISpecifyPropertyPages y IPersistFlujo:<br />
// Muestra las interfaces persist<strong>en</strong>t flujo, property pages y Igargle.<br />
STDMETHODIMP CGargle::NonDelegatingQueryInterface(REFIID riid, void **ppv) {<br />
if (riid == IID_IGargle) {<br />
return GetInterface((IGargle *) this, ppv);<br />
} else if (riid == IID_ISpecifyPropertyPages) {<br />
return GetInterface((ISpecifyPropertyPages *) this, ppv);<br />
} else if (riid == IID_IPersistFlujo) {<br />
AddRef(); // add a refer<strong>en</strong>ce count to ourselves