28.11.2012 Views

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 ...

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!