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