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