| /* GStreamer | |
| * Copyright <2006, 2007, 2008, 2009, 2010> Fluendo <support@fluendo.com> | |
| * Copyright (C) 2007 Sebastien Moutte <sebastien@moutte.net> | |
| * | |
| * gstdshowfakesrc.cpp: | |
| * | |
| * This library is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Library General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2 of the License, or (at your option) any later version. | |
| * | |
| * This library is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| * Library General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Library General Public | |
| * License along with this library; if not, write to the | |
| * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, | |
| * Boston, MA 02110-1301, USA. | |
| */ | |
| #include "gstdshowfakesrc.h" | |
| GST_DEBUG_CATEGORY_EXTERN (dshowdec_debug); | |
| #define GST_CAT_DEFAULT dshowdec_debug | |
| const GUID CLSID_DecodeFakeSrc = | |
| { 0x039527db, 0x6b48, 0x45a7, { 0xab, 0xcf, 0x21, 0xab, 0xc5, 0x44, 0xbb, 0xb6} }; | |
| static CCritSec g_pCriticSec; | |
| /* output pin*/ | |
| FakeOutputPin::FakeOutputPin (CBaseFilter *pFilter, CCritSec *sec): | |
| CBaseOutputPin("FakeOutputPin", pFilter, sec, &m_hres, L"output") | |
| { | |
| } | |
| FakeOutputPin::~FakeOutputPin() | |
| { | |
| } | |
| HRESULT FakeOutputPin::GetMediaType(int iPosition, | |
| CMediaType *pMediaType) | |
| { | |
| if(iPosition == 0) { | |
| *pMediaType = m_MediaType; | |
| return S_OK; | |
| } | |
| return VFW_S_NO_MORE_ITEMS; | |
| } | |
| #if 0 | |
| #define GUID_FORMAT "0x%.8x 0x%.4x 0x%.4x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x" | |
| #define GUID_ARGS(g) g.Data1, g.Data2, g.Data3, \ | |
| g.Data4[0], g.Data4[1], g.Data4[2], g.Data4[3], \ | |
| g.Data4[4], g.Data4[5], g.Data4[6], g.Data4[7] | |
| static void printMediaType (AM_MEDIA_TYPE *mt) | |
| { | |
| GST_DEBUG (":: majortype: "GUID_FORMAT, GUID_ARGS(mt->majortype)); | |
| GST_DEBUG (":: subtype: "GUID_FORMAT, GUID_ARGS(mt->subtype)); | |
| GST_DEBUG (":: bFixedSizeSamples: %d", mt->bFixedSizeSamples); | |
| GST_DEBUG (":: bTemporalCompression: %d", mt->bTemporalCompression); | |
| GST_DEBUG (":: cbFormat: %d", mt->cbFormat); | |
| GST_DEBUG (":: formattype: %x", mt->formattype); | |
| GST_DEBUG (":: lSampleSize: %lu", mt->lSampleSize); | |
| GST_DEBUG (":: pbFormat: %p", mt->pbFormat); | |
| } | |
| #endif | |
| HRESULT FakeOutputPin::CheckMediaType(const CMediaType *pmt) | |
| { | |
| if (m_MediaType == *pmt) { | |
| return S_OK; | |
| } | |
| return S_FALSE; | |
| } | |
| HRESULT FakeOutputPin::DecideBufferSize (IMemAllocator *pAlloc, | |
| ALLOCATOR_PROPERTIES *ppropInputRequest) | |
| { | |
| ALLOCATOR_PROPERTIES properties; | |
| ppropInputRequest->cbBuffer = m_SampleSize; | |
| ppropInputRequest->cBuffers = 1; | |
| HRESULT hres = pAlloc->SetProperties(ppropInputRequest, &properties); | |
| pAlloc->Commit(); | |
| return S_OK; | |
| } | |
| STDMETHODIMP FakeOutputPin::SetMediaType (AM_MEDIA_TYPE *pmt) | |
| { | |
| m_MediaType.Set (*pmt); | |
| m_SampleSize = m_MediaType.GetSampleSize(); | |
| return S_OK; | |
| } | |
| STDMETHODIMP FakeOutputPin::PushBuffer(byte *buffer, | |
| __int64 start, __int64 stop, | |
| unsigned int size, bool discont) | |
| { | |
| IMediaSample *pSample = NULL; | |
| if (start != -1) { | |
| start /= 100; | |
| stop /= 100; | |
| } | |
| HRESULT hres = GetDeliveryBuffer(&pSample, NULL, NULL, 0); | |
| if (hres == S_OK && pSample) | |
| { | |
| BYTE *sample_buffer; | |
| pSample->GetPointer(&sample_buffer); | |
| if(sample_buffer) | |
| { | |
| memcpy (sample_buffer, buffer, size); | |
| pSample->SetActualDataLength(size); | |
| } | |
| pSample->SetDiscontinuity(discont); | |
| pSample->SetSyncPoint(TRUE); | |
| pSample->SetPreroll(FALSE); | |
| if (start != -1) | |
| pSample->SetTime(&start, &stop); | |
| hres = Deliver(pSample); | |
| pSample->Release(); | |
| } | |
| else { | |
| GST_WARNING ("unable to obtain a delivery buffer"); | |
| } | |
| return S_OK; | |
| } | |
| STDMETHODIMP FakeOutputPin::Flush () | |
| { | |
| DeliverBeginFlush(); | |
| DeliverEndFlush(); | |
| return S_OK; | |
| } | |
| STDMETHODIMP FakeOutputPin::SetSampleSize (unsigned int size) | |
| { | |
| m_SampleSize = size; | |
| return S_OK; | |
| } | |
| /* filter */ | |
| FakeSrc::FakeSrc() : | |
| CBaseFilter("DshowFakeSink", NULL, &g_pCriticSec, CLSID_DecodeFakeSrc) | |
| { | |
| m_pOutputPin = new FakeOutputPin((CSource *)this, m_pLock); | |
| } | |
| FakeSrc::~FakeSrc() | |
| { | |
| if (m_pOutputPin) | |
| delete m_pOutputPin; | |
| } | |
| int FakeSrc::GetPinCount() | |
| { | |
| return 1; | |
| } | |
| CBasePin *FakeSrc::GetPin(int n) | |
| { | |
| return (CBasePin *)m_pOutputPin; | |
| } | |
| FakeOutputPin *FakeSrc::GetOutputPin() | |
| { | |
| return m_pOutputPin; | |
| } |