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 31<br />

podremos crear un objeto concreto <strong>de</strong> esa clase. Estar registrado <strong>en</strong> el sistema significa que<br />

el sistema operativo conoce don<strong>de</strong> resi<strong>de</strong> "físicam<strong>en</strong>te" la implem<strong>en</strong>tación <strong>de</strong> la clase<br />

i<strong>de</strong>ntificada por el GUID. En el sistema Windows esta información se almac<strong>en</strong>a <strong>en</strong> una<br />

base <strong>de</strong> datos c<strong>en</strong>tralizada llamada registro. Este registro se utiliza para configurar el<br />

software y hardware que se ejecute <strong>en</strong> el ambi<strong>en</strong>te Windows. De esta manera, po<strong>de</strong>mos<br />

disponer <strong>de</strong> toda una librería <strong>de</strong> compon<strong>en</strong>tes que po<strong>de</strong>mos usar librem<strong>en</strong>te, siempre y<br />

cuando estén registrados <strong>en</strong> nuestro sistema.<br />

Una interfase es un conjunto <strong>de</strong> métodos (funciones) y atributos (datos) que ti<strong>en</strong><strong>en</strong><br />

una fuerte relación lógica <strong>en</strong>tre ellos. Un compon<strong>en</strong>te es la implem<strong>en</strong>tación <strong>de</strong> una o más<br />

interfaces y queda <strong>de</strong>finida por las interfaces que implem<strong>en</strong>ta. La her<strong>en</strong>cia <strong>de</strong> un<br />

compon<strong>en</strong>te se concibe a nivel <strong>de</strong> interfaces. Así todas las interfaces <strong>de</strong>rivan <strong>de</strong> la interfase<br />

IUnknown. Esta interfase se <strong>en</strong>carga <strong>de</strong> la gestión <strong>de</strong> memoria <strong>de</strong> los objetos. La gestión<br />

<strong>de</strong> memoria se basa <strong>en</strong> un contador <strong>de</strong> refer<strong>en</strong>cias, y la interfase IUnknown esta formada<br />

por tres métodos AddRef, Release y QueryInterface para controlar este contador. Las dos<br />

primeras permit<strong>en</strong> llevar la cu<strong>en</strong>ta <strong>de</strong> si el compon<strong>en</strong>te está si<strong>en</strong>do utilizado y cuantos<br />

cli<strong>en</strong>tes lo están utilizando; <strong>de</strong> esta forma el sistema pue<strong>de</strong> <strong>de</strong>scargar un compon<strong>en</strong>te<br />

cuando no se esté utilizando. La tercera permite averiguar si el objeto <strong>en</strong> cuestión<br />

implem<strong>en</strong>ta una interfase <strong>en</strong> particular o no, a<strong>de</strong>más <strong>de</strong> obt<strong>en</strong>er un acceso al objeto a través<br />

<strong>de</strong> esa interfase.<br />

3.5.1 Creación y gestión <strong>de</strong> objetos<br />

Los objetos se crean mediante la función CoCreateInstance, y se acce<strong>de</strong>n a través<br />

<strong>de</strong> apuntadores a interfaces. Inicialm<strong>en</strong>te, obt<strong>en</strong>emos un apuntador a una interfase a raíz <strong>de</strong><br />

la creación <strong>de</strong>l propio objeto. Posteriorm<strong>en</strong>te, po<strong>de</strong>mos acce<strong>de</strong>r a las otras interfaces que se<br />

implem<strong>en</strong>t<strong>en</strong> con el método QueryInterface <strong>de</strong> ésta. Por ejemplo, si t<strong>en</strong>emos un<br />

compon<strong>en</strong>te i<strong>de</strong>ntificado por el GUID GUID_MYCOMPONENT, que implem<strong>en</strong>ta las<br />

interfaces InterfaceA e InterfaceB po<strong>de</strong>mos escribir el sigui<strong>en</strong>te código:<br />

InterfaceA *pIA;<br />

InterfaceB *pIB;<br />

CoInitialize(NULL);<br />

CoCreateInstance(GUID_MYCOMPONENT, NULL, CLSCTX_INPROC, GUID_INTERFACEA, (LPVOID *) &pIA);<br />

// Ahora po<strong>de</strong>mos acce<strong>de</strong>r a los métodos y atributos <strong>de</strong> la InterfaceA a través <strong>de</strong> pIA<br />

pIA->QueryInterface(GUID_INTERFACEB, (LPVOID *) &pIB);<br />

// ... Ahora también po<strong>de</strong>mos acce<strong>de</strong>r a la InterfaceB a través <strong>de</strong> pIB<br />

pIA->Release();<br />

// ... Ahora el objeto aún no se ha <strong>de</strong>struido porque aún t<strong>en</strong>emos una interfase activa<br />

pIB->Release();<br />

// ... Ahora sí que se <strong>de</strong>struye el objeto<br />

CoUninitialize();<br />

Po<strong>de</strong>mos <strong>en</strong>tonces com<strong>en</strong>tar que:<br />

• Primero, t<strong>en</strong>emos que comunicar al sistema que nuestra aplicación va a ser cli<strong>en</strong>te<br />

(o usuaria) <strong>de</strong> objetos COM mediante la función CoInitialize, que se <strong>de</strong>berá llamar

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

Saved successfully!

Ooh no, something went wrong!