/* GStreamer * Copyright (C) 2007 Sebastien Moutte * * 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., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "gstdshowfakesrc.h" 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(); } 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; }