123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- #include "CWAVideoRenderer.h"
- #include "Main.h"
- char *toChar(const GUID &guid, char *target)
- {
- // {1B3CA60C-DA98-4826-B4A9-D79748A5FD73}
- StringCchPrintfA(target, 39, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
- (int)guid.Data1, (int)guid.Data2, (int)guid.Data3,
- (int)guid.Data4[0], (int)guid.Data4[1],
- (int)guid.Data4[2], (int)guid.Data4[3],
- (int)guid.Data4[4], (int)guid.Data4[5],
- (int)guid.Data4[6], (int)guid.Data4[7] );
- return target;
- }
- CWAVideoRenderer::CWAVideoRenderer()
- : CBaseRenderer(CLSID_WAVideoRend, TEXT("WAVideoRenderer"), NULL, NULL)
- {
- m_callback = NULL;
- m_reent = 0;
- }
- CWAVideoRenderer::~CWAVideoRenderer()
- {
- delete m_callback;
- }
- HRESULT CWAVideoRenderer::DoRenderSample(IMediaSample *pMediaSample)
- {
- if (m_callback)
- {
- REFERENCE_TIME StartTime, StopTime;
- pMediaSample->GetTime( &StartTime, &StopTime);
- StartTime += m_pInputPin->CurrentStartTime( );
- StopTime += m_pInputPin->CurrentStartTime( );
- m_callback->sample_cb(StartTime, StopTime, pMediaSample);
- }
- return NOERROR;
- }
- HRESULT CWAVideoRenderer::CheckMediaType(const CMediaType *pmt)
- {
- if (pmt->majortype != MEDIATYPE_Video) return E_INVALIDARG;
- if (pmt->formattype != FORMAT_VideoInfo && pmt->formattype != FORMAT_VideoInfo2) return E_INVALIDARG;
- #if 0
- {
- char blah[512] = {0};
- toChar(pmt->subtype, blah);
- OutputDebugString(blah);
- }
- #endif
- if (pmt->subtype != MEDIASUBTYPE_YUY2 &&
- pmt->subtype != MEDIASUBTYPE_YV12 &&
- pmt->subtype != MEDIASUBTYPE_RGB32 &&
- pmt->subtype != MEDIASUBTYPE_RGB24 &&
- pmt->subtype != MEDIASUBTYPE_RGB8 /* &&
- pmt->subtype!=MEDIASUBTYPE_YVYU*/) return E_INVALIDARG;
- return NOERROR;
- }
- HRESULT CWAVideoRenderer::SetMediaType(const CMediaType *pmt)
- {
- m_mt = *pmt;
- //fix for upside down videos
- if (!m_reent && (pmt->subtype == MEDIASUBTYPE_YUY2 || pmt->subtype == MEDIASUBTYPE_YV12) )
- {
- m_reent = 1;
- IPin *p = m_pInputPin->GetConnected();
- p->Disconnect();
- m_pInputPin->Disconnect();
- if (pmt->formattype == FORMAT_VideoInfo)
- {
- VIDEOINFOHEADER *pHeader = (VIDEOINFOHEADER*)pmt->pbFormat;
- pHeader->bmiHeader.biHeight = -pHeader->bmiHeader.biHeight;
- }
- else
- {
- VIDEOINFOHEADER2 *pHeader = (VIDEOINFOHEADER2*)pmt->pbFormat;
- pHeader->bmiHeader.biHeight = -pHeader->bmiHeader.biHeight;
- }
- if (p->Connect(m_pInputPin, pmt))
- {
- //oops it failed (like with MJPEG decompressor) so lets get it back to normal
- if (pmt->formattype == FORMAT_VideoInfo)
- {
- VIDEOINFOHEADER *pHeader = (VIDEOINFOHEADER*)pmt->pbFormat;
- pHeader->bmiHeader.biHeight = -pHeader->bmiHeader.biHeight;
- }
- else
- {
- VIDEOINFOHEADER2 *pHeader = (VIDEOINFOHEADER2*)pmt->pbFormat;
- pHeader->bmiHeader.biHeight = -pHeader->bmiHeader.biHeight;
- }
- p->Connect(m_pInputPin, pmt);
- }
- m_reent = 0;
- }
- return NOERROR;
- }
- // GUID GetAcceptedType() {
- CMediaType *CWAVideoRenderer::GetAcceptedType()
- {
- return &m_mt;
- // return m_mt.subtype;
- }
- HRESULT CWAVideoRenderer::SetCallback(CSampleCB *Callback)
- {
- m_callback = Callback;
- return NOERROR;
- }
- HRESULT CWAVideoRenderer::ShouldDrawSampleNow(IMediaSample *pMediaSample, REFERENCE_TIME *pStartTime, REFERENCE_TIME *pEndTime)
- {
- return S_OK;
- }
- HRESULT CWAVideoRenderer::GetSampleTimes(IMediaSample *pMediaSample, REFERENCE_TIME *pStartTime, REFERENCE_TIME *pEndTime)
- {
- return S_OK;
- }
- HRESULT CWAVideoRenderer::EndOfStream(void)
- {
- if (m_callback)
- m_callback->endofstream();
- return CBaseRenderer::EndOfStream();
- }
|