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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

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

}<br />

} else {<br />

return CTransInPlaceFilter::NonDelegatingQueryInterface(riid, ppv);<br />

}<br />

La interfaz personalizada <strong>de</strong>l filtro <strong>de</strong> efectos típicam<strong>en</strong>te provee un método put y<br />

uno get para cada parámetro <strong>de</strong>l efecto. Por ejemplo la interfaz IGargle provee los métodos<br />

put_GargleRate y get_GargleRate. Cuando el usuario accesa a uno <strong>de</strong> los controles <strong>en</strong> la<br />

pagina propietaria, la página g<strong>en</strong>era un m<strong>en</strong>saje <strong>de</strong> la v<strong>en</strong>tana. La función miembro<br />

OnReceiveMessage <strong>de</strong> la página propietaria maneja este m<strong>en</strong>saje. El sigui<strong>en</strong>te código<br />

<strong>de</strong>muestra la g<strong>en</strong>eración <strong>de</strong>l m<strong>en</strong>saje y su manejo. IDB_DEFAULT es el ID <strong>de</strong>l botón<br />

Default. El usuario da clic <strong>en</strong> este botón para ajustar el contraste <strong>de</strong>l vi<strong>de</strong>o a un estado<br />

<strong>de</strong>fault. La clase CContrastPropierties implem<strong>en</strong>ta la pagina propietaria y el método<br />

IContrast::put_DefaultContrastLevel ajusta el nivel <strong>de</strong> contraste a su valor por <strong>de</strong>fault.<br />

BOOL CContrastProperties::OnReceiveMessage(HWND hwnd, UINT uMsg,<br />

WPARAM wParam, LPARAM lParam)<br />

{<br />

switch (uMsg)<br />

{<br />

case WM_COMMAND:<br />

{<br />

if (LOWORD(wParam) == IDB_DEFAULT)<br />

{<br />

pIContrast()->put_DefaultContrastLevel();<br />

S<strong>en</strong>dMessage(m_hwndSli<strong>de</strong>r, TBM_SETPOS, TRUE, 0L);<br />

SetDirty();<br />

}<br />

return (LRESULT) 1;<br />

}<br />

...<br />

Los filtros <strong>de</strong> efectos usan secciones criticas internas para proteger el estado global<br />

<strong>de</strong>l filtro. Los filtros <strong>de</strong> efectos pue<strong>de</strong>n cerrar una sección critica para asegurar que el flujo<br />

<strong>de</strong> datos a través <strong>de</strong>l gráfico <strong>de</strong> filtros es serializado y que el estado global <strong>de</strong>l filtro no<br />

cambie mi<strong>en</strong>tras el efecto está ocurri<strong>en</strong>do. DirectShow cierra una sección critica al <strong>de</strong>clarar<br />

un objeto <strong>de</strong> la clase CAutoLock . Típicam<strong>en</strong>te los filtros <strong>de</strong> efectos cierran la región critica<br />

tan pronto como ellos <strong>en</strong>tran a la función que aplica el efecto. En el sigui<strong>en</strong>te fragm<strong>en</strong>to, la<br />

función que aplica el efecto es MessItAbout:<br />

// Declare the critical section data member in<br />

// the effect filter class <strong>de</strong>finition.<br />

CCritSec m_GargleLock;<br />

void CGargle::MessItAbout(PBYTE pb, int cb)<br />

{<br />

CAutoLock foo(&m_GargleLock);<br />

Los métodos put y get <strong>de</strong> las propieda<strong>de</strong>s <strong>de</strong> los efectos cierran las secciones criticas<br />

así los valores <strong>de</strong> los efectos no cambian a la mitad <strong>de</strong> una actualización.<br />

5.6.9 Programación <strong>de</strong>l filtro <strong>en</strong> C++<br />

Como lo m<strong>en</strong>cionamos arriba <strong>de</strong>rivaremos nuestro filtro <strong>de</strong> la clase<br />

CtransformFilter.<br />

class CEZrgb24 : public CtransformFilter

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

Saved successfully!

Ooh no, something went wrong!