diff options
Diffstat (limited to 'Src/Plugins/Input/in_dshow/CWAVideoRenderer.cpp')
-rw-r--r-- | Src/Plugins/Input/in_dshow/CWAVideoRenderer.cpp | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/Src/Plugins/Input/in_dshow/CWAVideoRenderer.cpp b/Src/Plugins/Input/in_dshow/CWAVideoRenderer.cpp new file mode 100644 index 00000000..40065a3d --- /dev/null +++ b/Src/Plugins/Input/in_dshow/CWAVideoRenderer.cpp @@ -0,0 +1,131 @@ +#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(); +} + |