struct Sampler : public CBaseVideoRenderer {
Sampler( IUnknown* unk, HRESULT *hr ) : CBaseVideoRenderer(__uuidof(CLSID_Sampler), NAME("Frame Sampler"), unk, hr) {};
HRESULT CheckMediaType(const CMediaType *media ) {
VIDEOINFO* vi; if(!IsEqualGUID( *media->Subtype(), MEDIASUBTYPE_RGB24) || !(vi=(VIDEOINFO *)media->Format()) ) return E_FAIL;
bmih=vi->bmiHeader; SetWindowPos(hwnd,0,0,0,20+(w=vi->bmiHeader.biWidth),60+(h=vi->bmiHeader.biHeight),SWP_NOZORDER|SWP_NOMOVE);
return S_OK;
}
HRESULT DoRenderSample(IMediaSample *sample){
BYTE* data; sample->GetPointer( &data );
// Process RGB Frame data* here. For Example: ZeroMemory(data+w*h,w*h);
BITMAPINFO bmi={0}; bmi.bmiHeader=bmih; RECT r; GetClientRect( hwnd, &r );
HDC dc=GetDC(hwnd);
StretchDIBits(dc,0,16,r.right,r.bottom-16,0,0,w,h,data,&bmi,DIB_RGB_COLORS,SRCCOPY);
ReleaseDC(dc);
return S_OK;
}
HRESULT ShouldDrawSampleNow(IMediaSample *sample, REFERENCE_TIME *start, REFERENCE_TIME *stop) {
return S_OK; // disable droping of frames
}
};