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

Implem<strong>en</strong>tamos la interfaz IUnknown, <strong>en</strong> la sección public <strong>de</strong> la <strong>de</strong>finición <strong>de</strong> nuestra clase<br />

filtro creamos una instancia <strong>de</strong> CUnknown, y <strong>en</strong>tonces llamamos la macro<br />

DECLER_IUNKNOWN.<br />

public:<br />

DECLARE_IUNKNOWN;<br />

static CUnknown * WINAPI CreateInstance(LPUNKNOWN punk, HRESULT *phr);<br />

Definimos el constructor <strong>en</strong> la sección private <strong>de</strong> la clase filtro.<br />

private:<br />

// Constructor<br />

CEZrgb24(TCHAR *tszName, LPUNKNOWN punk, HRESULT *phr);<br />

Añadimos el código para <strong>real</strong>izar las funciones transform y chequeo <strong>de</strong>l InputType.<br />

// Transform<br />

// Copia la muestra <strong>de</strong> <strong>en</strong>trada hacia la muestra <strong>de</strong> salida - <strong>en</strong>tonces transforma<br />

// la muestra <strong>de</strong> salida 'in place'.<br />

HRESULT CEZrgb24::Transform(IMediaSample *pIn, IMediaSample *pOut)<br />

{<br />

// Copia las propieda<strong>de</strong>s<br />

HRESULT hr = Copy(pIn, pOut);<br />

if (FAILED(hr)) {<br />

return hr;<br />

}<br />

// Checa para ver si es <strong>tiempo</strong> <strong>de</strong> hacer la muestra<br />

CRefTime tStart, tStop ;<br />

pIn->GetTime((REFERENCE_TIME *) &tStart, (REFERENCE_TIME *) &tStop);<br />

if (tStart >= m_effectStartTime) {<br />

if (tStop FormatType() != FORMAT_Vi<strong>de</strong>oInfo) {<br />

return E_INVALIDARG;<br />

}<br />

}<br />

// Se pue<strong>de</strong> transformar este tipo?<br />

if (CanPerformEZrgb24(mtIn)) {<br />

return NOERROR;<br />

}<br />

return E_FAIL;<br />

La estructura VIDEOINFOHEADER <strong>de</strong>scribe el mapa <strong>de</strong> bits e información <strong>de</strong> la<br />

imag<strong>en</strong> <strong>de</strong> vi<strong>de</strong>o.<br />

Se implem<strong>en</strong>ta CreateInstance para nuestro objeto filtro.<br />

// CreateInstance<br />

//<br />

// Usada por las clases base <strong>de</strong> DirectShow para crear instancias<br />

//<br />

CUnknown *CEZrgb24Properties::CreateInstance(LPUNKNOWN lpunk, HRESULT *phr)<br />

{<br />

CUnknown *punk = new CEZrgb24Properties(lpunk, phr);<br />

if (punk == NULL) {<br />

*phr = E_OUTOFMEMORY;<br />

}<br />

return punk;<br />

} // CreateInstance

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

Saved successfully!

Ooh no, something went wrong!