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 44<br />
#<strong>de</strong>fine WM_GRAPHNOTIFY WM_APP + 1 // M<strong>en</strong>saje privado.<br />
pEv<strong>en</strong>t->SetNotifyWindow((OAHWND)g_hwnd, WM_GRAPHNOTIFY, 0);<br />
Este m<strong>en</strong>saje es un m<strong>en</strong>saje ordinario Windows, y es <strong>en</strong>viado separadam<strong>en</strong>te <strong>de</strong> la<br />
cola <strong>de</strong> notificación <strong>de</strong> ev<strong>en</strong>tos DirectShow. La v<strong>en</strong>taja <strong>de</strong> esta aproximación es que<br />
muchas aplicaciones ya ti<strong>en</strong><strong>en</strong> implem<strong>en</strong>tado un lazo <strong>de</strong> m<strong>en</strong>sajes. Así mismo pue<strong>de</strong><br />
incorporar un manejador <strong>de</strong> ev<strong>en</strong>tos DirectShow sin mucho trabajo adicional.<br />
El sigui<strong>en</strong>te código muestra como respon<strong>de</strong>r al m<strong>en</strong>saje <strong>de</strong> notificación.<br />
LRESULT CALLBACK WindowProc( HWND hwnd, UINT msg, UINT wParam, LONG lParam)<br />
{<br />
switch (msg)<br />
{<br />
case WM_GRAPHNOTIFY:<br />
HandleEv<strong>en</strong>t(); // Función <strong>de</strong>finida <strong>en</strong> la aplicación.<br />
break;<br />
}<br />
// Maneja otros m<strong>en</strong>sajes <strong>de</strong> Windows aquí también.<br />
}<br />
return (DefWindowProc(hwnd, msg, wParam, lParam));<br />
Debido a que la notificación <strong>de</strong> ev<strong>en</strong>tos, y el lazo <strong>de</strong> m<strong>en</strong>sajes son ambos<br />
asíncronos, la cola pue<strong>de</strong> cont<strong>en</strong>er mas <strong>de</strong> un ev<strong>en</strong>to para el <strong>tiempo</strong> que su aplicación<br />
responda al m<strong>en</strong>saje. También, los ev<strong>en</strong>tos pue<strong>de</strong>n algunas veces ser quitados <strong>de</strong> la cola si<br />
ellos fues<strong>en</strong> inválidos. Así mismo, <strong>en</strong> el código manejador <strong>de</strong>l ev<strong>en</strong>to, hay que llamar a<br />
GetEv<strong>en</strong>t hasta que este regrese un código <strong>de</strong> falla, indicando que la cola está vacía.<br />
3.8.4.4 Manejadores <strong>de</strong> ev<strong>en</strong>tos<br />
El gráfico <strong>de</strong> filtros guarda un ev<strong>en</strong>to manual-reset que refleja el estado <strong>de</strong> la cola<br />
<strong>de</strong> ev<strong>en</strong>tos. Si la cola conti<strong>en</strong>e notificaciones <strong>de</strong> ev<strong>en</strong>tos p<strong>en</strong>di<strong>en</strong>tes, el gráfico <strong>de</strong> filtros<br />
señala los ev<strong>en</strong>tos manual-reset. Si la cola está vacía, una llamada al método<br />
IMediaEv<strong>en</strong>t::GetEv<strong>en</strong>t reinicializa el ev<strong>en</strong>to. Una aplicación pue<strong>de</strong> usar este ev<strong>en</strong>to para<br />
<strong>de</strong>terminar el estado <strong>de</strong> la cola.<br />
El método IMediaEv<strong>en</strong>t::GetEv<strong>en</strong>tHandle obti<strong>en</strong>e un manejador a el ev<strong>en</strong>to<br />
manual-reset. Espera para que el ev<strong>en</strong>to sea señalado mediante un llamado a una función tal<br />
como WaitForMultipleObjects. Al mismo <strong>tiempo</strong> que el ev<strong>en</strong>to es señalado, la llamada al<br />
ev<strong>en</strong>to IMediaEv<strong>en</strong>t::GetEv<strong>en</strong>t obti<strong>en</strong>e la notificación <strong>de</strong>l ev<strong>en</strong>to.<br />
El sigui<strong>en</strong>te código <strong>de</strong> ejemplo ilustra este método. Este obti<strong>en</strong>e el manejador <strong>de</strong><br />
ev<strong>en</strong>to, <strong>en</strong>tonces espera <strong>en</strong> intervalos <strong>de</strong> 100 milisegundos para ser señalado. Si el ev<strong>en</strong>to es<br />
señalado, este llama a GetEv<strong>en</strong>t e imprime el código <strong>de</strong> ev<strong>en</strong>to y los parámetros <strong>de</strong>l ev<strong>en</strong>to<br />
a la v<strong>en</strong>tana. El lazo termina cuando ocurre el ev<strong>en</strong>to EC_COMPLETE.<br />
HANDLE hEv<strong>en</strong>t;<br />
long evCo<strong>de</strong>, param1, param2;<br />
BOOLEAN bDone = FALSE;<br />
HRESULT hr = S_OK;<br />
hr = pEv<strong>en</strong>t->GetEv<strong>en</strong>tHandle((OAEVENT*)&hEv);<br />
while(!bDone)<br />
{