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

{

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

Saved successfully!

Ooh no, something went wrong!