\r
class DsSFEnumMediaTypes: public IEnumMediaTypes {
public:
- DsSFEnumMediaTypes(DsSourcePin* papa,ULONG pos=0);
- virtual ~DsSFEnumMediaTypes();
- virtual HRESULT STDMETHODCALLTYPE Next(ULONG nummedia, AM_MEDIA_TYPE **pins,ULONG *fetched);\r
- virtual HRESULT STDMETHODCALLTYPE Skip(ULONG numpin);\r
- virtual HRESULT STDMETHODCALLTYPE Reset();\r
- virtual HRESULT STDMETHODCALLTYPE Clone(IEnumMediaTypes **enuma);\r
- virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID id,void ** object);
- virtual ULONG STDMETHODCALLTYPE AddRef();\r
+ DsSFEnumMediaTypes(DsSourcePin* papa,ULONG pos=0);
+ virtual ~DsSFEnumMediaTypes();
+ virtual HRESULT STDMETHODCALLTYPE Next(ULONG nummedia, AM_MEDIA_TYPE **pins,ULONG *fetched);\r
+ virtual HRESULT STDMETHODCALLTYPE Skip(ULONG numpin);\r
+ virtual HRESULT STDMETHODCALLTYPE Reset();\r
+ virtual HRESULT STDMETHODCALLTYPE Clone(IEnumMediaTypes **enuma);\r
+ virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID id,void ** object);
+ virtual ULONG STDMETHODCALLTYPE AddRef();\r
virtual ULONG STDMETHODCALLTYPE Release();\r
protected:\r
- DsSourcePin* parent;\r
- ULONG curpos;
- volatile long refs;\r
+ DsSourcePin* parent;\r
+ ULONG curpos;
+ volatile long refs;\r
};\r
\r
DsSFEnumMediaTypes::DsSFEnumMediaTypes(DsSourcePin* papa,ULONG pos){\r
- parent=papa;\r
- curpos=pos;\r
- parent->AddRef();\r
- refs=0;\r
+ parent=papa;\r
+ curpos=pos;\r
+ parent->AddRef();\r
+ refs=0;\r
}\r
\r
DsSFEnumMediaTypes::~DsSFEnumMediaTypes(){
- parent->Release();
+ parent->Release();
}
\r
-HRESULT STDMETHODCALLTYPE DsSFEnumMediaTypes::Next(ULONG numpin, AM_MEDIA_TYPE **pins,ULONG *fetched) {\r
- int i;\r
- if (fetched==NULL) return E_POINTER;\r
- if (pins==NULL) return E_POINTER;\r
- *fetched=0;\r
-\r
- for (i=0;(i<numpin);i++) {\r
- if (parent->GetMediaType(curpos+i,pins[i])!=S_OK) return S_FALSE;\r
- curpos++;\r
- (*fetched)++;\r
- }\r
- return S_OK;\r
-}\r
+HRESULT STDMETHODCALLTYPE DsSFEnumMediaTypes::Next(ULONG numpin, AM_MEDIA_TYPE **pins,ULONG *fetched) {
+ int i;
+
+ if (pins==NULL) return E_POINTER;
+ if (numpin!=1 && fetched==NULL) return E_INVALIDARG;
+ *fetched=0;
+
+ for (i=0;(i<numpin);i++) {
+ pins[i]=(AM_MEDIA_TYPE*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));
+ if (parent->GetMediaType(curpos+i,pins[i])!=S_OK) return S_FALSE;
+ curpos++;
+ if (fetched!=NULL) (*fetched)++;
+ }
+ return S_OK;
+}
\r
HRESULT STDMETHODCALLTYPE DsSFEnumMediaTypes::Skip(ULONG numpin){\r
- curpos+=numpin;\r
- if (curpos>1) return S_FALSE;\r
- return S_OK;\r
+ curpos+=numpin;\r
+ if (curpos>1) return S_FALSE;\r
+ return S_OK;\r
}\r
HRESULT STDMETHODCALLTYPE DsSFEnumMediaTypes::Reset(){\r
- curpos=0;\r
- return S_OK;\r
+ curpos=0;\r
+ return S_OK;\r
}\r
HRESULT STDMETHODCALLTYPE DsSFEnumMediaTypes::Clone(IEnumMediaTypes **enuma){\r
- if (enuma==NULL) return E_POINTER;\r
- *enuma=new DsSFEnumMediaTypes(parent,curpos);\r
- (*enuma)->AddRef();\r
- return S_OK;\r
+ if (enuma==NULL) return E_POINTER;\r
+ *enuma=new DsSFEnumMediaTypes(parent,curpos);\r
+ (*enuma)->AddRef();\r
+ return S_OK;\r
}\r
\r
HRESULT STDMETHODCALLTYPE DsSFEnumMediaTypes::QueryInterface(REFIID id,void ** object){
- if (object==NULL) return E_POINTER;
- if (id==IID_IUnknown ||id == IID_IEnumMediaTypes) {
- *object=(IUnknown*)this;
- ((IUnknown*)object)->AddRef();
- return NOERROR;
- } else {
- *object=NULL;
- return E_NOINTERFACE;
- }
+ if (object==NULL) return E_POINTER;
+ if (id==IID_IUnknown ||id == IID_IEnumMediaTypes) {
+ *object=(IUnknown*)this;
+ ((IUnknown*)object)->AddRef();
+ return NOERROR;
+ } else {
+ *object=NULL;
+ return E_NOINTERFACE;
+ }
}
\r
ULONG STDMETHODCALLTYPE DsSFEnumMediaTypes::AddRef(){\r
- InterlockedIncrement(&refs);\r
- long tempref=refs;\r
- if (tempref>1) return tempref;\r
- else return 1;\r
+ InterlockedIncrement(&refs);\r
+ long tempref=refs;\r
+ if (tempref>1) return tempref;\r
+ else return 1;\r
}\r
\r
ULONG STDMETHODCALLTYPE DsSFEnumMediaTypes::Release(){\r
- long tempref=InterlockedDecrement(&refs);\r
- \r
- if (tempref==0) {\r
- refs++;\r
- delete this;\r
- return NULL;\r
- } else {\r
- if (tempref>1) return tempref;\r
- else return 1;\r
- }\r
+ long tempref=InterlockedDecrement(&refs);\r
+\r
+ if (tempref==0) {\r
+ refs++;\r
+ delete this;\r
+ return NULL;\r
+ } else {\r
+ if (tempref>1) return tempref;\r
+ else return 1;\r
+ }\r
}\r
\r
\r
void CopyMType(AM_MEDIA_TYPE* dest,const AM_MEDIA_TYPE*source) {\r
- memcpy(dest,source,sizeof(AM_MEDIA_TYPE));\r
- if (source->pbFormat!=NULL) {\r
- dest->pbFormat=(BYTE*)CoTaskMemAlloc(dest->cbFormat);\r
- memcpy(dest->pbFormat,source->pbFormat,dest->cbFormat);\r
- }\r
+ memcpy(dest,source,sizeof(AM_MEDIA_TYPE));\r
+ if (source->pbFormat!=NULL) {\r
+ dest->pbFormat=(BYTE*)CoTaskMemAlloc(dest->cbFormat);\r
+ memcpy(dest->pbFormat,source->pbFormat,dest->cbFormat);\r
+ }\r
}\r
void ReleaseMType(AM_MEDIA_TYPE* free) {\r
- if (free->cbFormat!=NULL) CoTaskMemFree(free->pbFormat);\r
- free->pbFormat=NULL;\r
+ if (free->cbFormat!=NULL) CoTaskMemFree(free->pbFormat);\r
+ free->pbFormat=NULL;\r
}\r
\r
DsSourcePin::DsSourcePin(DsSourceFilter *pFilter,\r
- HRESULT *phr,LPCWSTR pName,bool audio)\r
+ HRESULT *phr,LPCWSTR pName,bool audio)\r
{\r
- isaudiopin=audio;\r
- m_pFilter=pFilter;\r
- connected=NULL;\r
- connectedinput=NULL;\r
- allocator=NULL;\r
+ isaudiopin=audio;\r
+ m_pFilter=pFilter;\r
+ connected=NULL;\r
+ connectedinput=NULL;\r
+ allocator=NULL;\r
+\r
\r
- \r
\r
}\r
\r
DsSourcePin::~DsSourcePin()\r
{\r
- \r
- \r
+\r
+\r
\r
}\r
\r
HRESULT STDMETHODCALLTYPE DsSourcePin::QueryInterface(REFIID id,void ** object){
- if (object==NULL) return E_POINTER;
- if (id==IID_IUnknown) {
- *object=(IUnknown*)this;
- ((IUnknown*)object)->AddRef();
- return NOERROR;
- } else if (id==IID_IPin) {
- *object=(IPin*)this;
- ((IPin*)object)->AddRef();
- return NOERROR;
- } else {
- *object=NULL;
- return E_NOINTERFACE;
- }
+ if (object==NULL) return E_POINTER;
+ if (id==IID_IUnknown) {
+ *object=(IUnknown*)this;
+ ((IUnknown*)object)->AddRef();
+ return NOERROR;
+ } else if (id==IID_IPin) {
+ *object=(IPin*)this;
+ ((IPin*)object)->AddRef();
+ return NOERROR;
+ } else {
+ *object=NULL;
+ return E_NOINTERFACE;
+ }
}
ULONG STDMETHODCALLTYPE DsSourcePin::AddRef(){\r
- return m_pFilter->AddRef();\r
+ return m_pFilter->AddRef();\r
\r
}\r
ULONG STDMETHODCALLTYPE DsSourcePin::Release(){\r
- return m_pFilter->Release();\r
+ return m_pFilter->Release();\r
}\r
\r
\r
/*IPin*/\r
HRESULT STDMETHODCALLTYPE DsSourcePin::Connect(IPin *pinempf,const AM_MEDIA_TYPE *mtype) {\r
- if (pinempf==NULL) return E_POINTER;\r
- EnterCriticalSection(&m_pFilter->filterlock);\r
- \r
- if (connected!=NULL) {LeaveCriticalSection(&m_pFilter->filterlock);return VFW_E_ALREADY_CONNECTED;}\r
- if (m_pFilter->mystate!=State_Stopped) {LeaveCriticalSection(&m_pFilter->filterlock);return VFW_E_NOT_STOPPED;}\r
-\r
- \r
- bool gotmt=false;\r
-\r
- if (mtype!=NULL) {\r
- if (CheckMediaType(mtype)==S_OK){\r
- pinempf->AddRef();\r
- if (pinempf->ReceiveConnection((IPin*)this,mtype)==S_OK) {\r
- CopyMType(&medtype,mtype);\r
- LeaveCriticalSection(&m_pFilter->filterlock);\r
- } else {\r
- LeaveCriticalSection(&m_pFilter->filterlock);\r
- CoTaskMemFree(mtype->pbFormat);\r
- pinempf->Release();\r
- return VFW_E_TYPE_NOT_ACCEPTED;\r
- }\r
-\r
- } else {\r
- LeaveCriticalSection(&m_pFilter->filterlock);\r
- CoTaskMemFree(mtype->pbFormat);\r
- return VFW_E_TYPE_NOT_ACCEPTED;\r
- }\r
- CoTaskMemFree(mtype->pbFormat);\r
- }else {\r
- IEnumMediaTypes * emt;\r
- EnumMediaTypes(&emt);\r
- AM_MEDIA_TYPE emtype_np;\r
- AM_MEDIA_TYPE * emtype;\r
- emtype=&emtype_np;\r
- ULONG fetched=0;\r
- pinempf->AddRef();\r
- while (emt->Next(1,&emtype,&fetched)==S_OK) {\r
- if (CheckMediaType(emtype)==S_OK){\r
- if (pinempf->ReceiveConnection((IPin*)this,emtype)==S_OK) {\r
- connected=pinempf;\r
- CopyMType(&medtype,emtype);\r
- CoTaskMemFree(emtype->pbFormat);\r
- gotmt=true;\r
- break;\r
- }\r
- \r
- }\r
- CoTaskMemFree(emtype->pbFormat);\r
- }\r
- emt->Release();\r
- if (gotmt==false) {\r
- pinempf->EnumMediaTypes(&emt);\r
- while (emt->Next(1,&emtype,&fetched)==S_OK) {\r
- if (CheckMediaType(emtype)==S_OK){\r
- if (pinempf->ReceiveConnection((IPin*)this,emtype)==S_OK) {\r
- connected=pinempf;\r
- CopyMType(&medtype,emtype);\r
- CoTaskMemFree(emtype->pbFormat);\r
- gotmt=true;\r
- break;\r
- }\r
- \r
- }\r
- CoTaskMemFree(emtype->pbFormat);\r
- }\r
- emt->Release();\r
- if (gotmt==false) {\r
- pinempf->Release();\r
- LeaveCriticalSection(&m_pFilter->filterlock);\r
- return VFW_E_NO_ACCEPTABLE_TYPES;\r
- }\r
- }\r
- }\r
-\r
- if (pinempf->QueryInterface(IID_IMemInputPin,(void**)&connectedinput)!=S_OK) {\r
- LeaveCriticalSection(&m_pFilter->filterlock);\r
- connected->Release();\r
- connected=NULL;\r
- /* connectedinput->Release();\r
- connectedinput=NULL;*/\r
- return VFW_E_NO_TRANSPORT;\r
- }\r
- ALLOCATOR_PROPERTIES eigenall;\r
- ZeroMemory(&eigenall,sizeof(eigenall));\r
- connectedinput->GetAllocatorRequirements(&eigenall);\r
- if (eigenall.cbAlign==0) eigenall.cbAlign=1;\r
- connectedinput->GetAllocator(&allocator);\r
- if (DecideBufferSize(allocator,&eigenall)==S_OK) {\r
- if (connectedinput->NotifyAllocator(allocator,FALSE)==S_OK){\r
- connected=pinempf;\r
- LeaveCriticalSection(&m_pFilter->filterlock);\r
- return S_OK;\r
- }\r
- } \r
- if (allocator!=NULL) allocator->Release();\r
- allocator=NULL;\r
-\r
- if (CoCreateInstance(CLSID_MemoryAllocator,0,CLSCTX_INPROC_SERVER,\r
- IID_IMemAllocator,(void **)allocator)==S_OK) {\r
- if (DecideBufferSize(allocator,&eigenall)==S_OK) {\r
- if (connectedinput->NotifyAllocator(allocator,FALSE)==S_OK){\r
- connected=pinempf;\r
- LeaveCriticalSection(&m_pFilter->filterlock);\r
- return S_OK;\r
- }\r
- }\r
- }\r
- if (allocator!=NULL) allocator->Release();\r
- allocator=NULL;\r
- connected->Release();\r
- connected=NULL;\r
- connectedinput->Release();\r
- connectedinput=NULL;\r
- LeaveCriticalSection(&m_pFilter->filterlock);\r
- return VFW_E_NO_TRANSPORT;\r
- \r
-\r
- \r
+ if (pinempf==NULL) return E_POINTER;\r
+ EnterCriticalSection(&m_pFilter->filterlock);\r
+\r
+ if (connected!=NULL) {LeaveCriticalSection(&m_pFilter->filterlock);return VFW_E_ALREADY_CONNECTED;}\r
+ if (m_pFilter->mystate!=State_Stopped) {LeaveCriticalSection(&m_pFilter->filterlock);return VFW_E_NOT_STOPPED;}\r
+\r
+\r
+ bool gotmt=false;\r
+\r
+ if (mtype!=NULL) {\r
+ if (CheckMediaType(mtype)==S_OK){\r
+ pinempf->AddRef();\r
+ if (pinempf->ReceiveConnection((IPin*)this,mtype)==S_OK) {\r
+ CopyMType(&medtype,mtype);\r
+ LeaveCriticalSection(&m_pFilter->filterlock);\r
+ } else {\r
+ LeaveCriticalSection(&m_pFilter->filterlock);\r
+ CoTaskMemFree(mtype->pbFormat);\r
+ pinempf->Release();\r
+ return VFW_E_TYPE_NOT_ACCEPTED;\r
+ }\r
+\r
+ } else {\r
+ LeaveCriticalSection(&m_pFilter->filterlock);\r
+ CoTaskMemFree(mtype->pbFormat);\r
+ return VFW_E_TYPE_NOT_ACCEPTED;\r
+ }\r
+ CoTaskMemFree(mtype->pbFormat);\r
+ }else {\r
+ IEnumMediaTypes * emt;\r
+ EnumMediaTypes(&emt);\r
+ AM_MEDIA_TYPE emtype_np;\r
+ AM_MEDIA_TYPE * emtype;\r
+ emtype=&emtype_np;\r
+ ULONG fetched=0;\r
+ pinempf->AddRef();\r
+ while (emt->Next(1,&emtype,&fetched)==S_OK) {\r
+ if (CheckMediaType(emtype)==S_OK){\r
+ if (pinempf->ReceiveConnection((IPin*)this,emtype)==S_OK) {\r
+ connected=pinempf;\r
+ CopyMType(&medtype,emtype);\r
+ CoTaskMemFree(emtype->pbFormat);\r
+ gotmt=true;\r
+ break;\r
+ }\r
+\r
+ }\r
+ CoTaskMemFree(emtype->pbFormat);\r
+ }\r
+ emt->Release();\r
+ if (gotmt==false) {\r
+ pinempf->EnumMediaTypes(&emt);\r
+ while (emt->Next(1,&emtype,&fetched)==S_OK) {\r
+ if (CheckMediaType(emtype)==S_OK){\r
+ if (pinempf->ReceiveConnection((IPin*)this,emtype)==S_OK) {\r
+ connected=pinempf;\r
+ CopyMType(&medtype,emtype);\r
+ CoTaskMemFree(emtype->pbFormat);\r
+ gotmt=true;\r
+ break;\r
+ }\r
+\r
+ }\r
+ CoTaskMemFree(emtype->pbFormat);\r
+ }\r
+ emt->Release();\r
+ if (gotmt==false) {\r
+ pinempf->Release();\r
+ LeaveCriticalSection(&m_pFilter->filterlock);\r
+ return VFW_E_NO_ACCEPTABLE_TYPES;\r
+ }\r
+ }\r
+ }\r
+\r
+ if (pinempf->QueryInterface(IID_IMemInputPin,(void**)&connectedinput)!=S_OK) {\r
+ LeaveCriticalSection(&m_pFilter->filterlock);\r
+ connected->Release();\r
+ connected=NULL;\r
+ /* connectedinput->Release();\r
+ connectedinput=NULL;*/\r
+ return VFW_E_NO_TRANSPORT;\r
+ }\r
+ ALLOCATOR_PROPERTIES eigenall;\r
+ ZeroMemory(&eigenall,sizeof(eigenall));\r
+ connectedinput->GetAllocatorRequirements(&eigenall);\r
+ if (eigenall.cbAlign==0) eigenall.cbAlign=1;\r
+ connectedinput->GetAllocator(&allocator);\r
+ if (DecideBufferSize(allocator,&eigenall)==S_OK) {\r
+ if (connectedinput->NotifyAllocator(allocator,FALSE)==S_OK){\r
+ connected=pinempf;\r
+ LeaveCriticalSection(&m_pFilter->filterlock);\r
+ return S_OK;\r
+ }\r
+ }\r
+ if (allocator!=NULL) allocator->Release();\r
+ allocator=NULL;\r
+\r
+ if (CoCreateInstance(CLSID_MemoryAllocator,0,CLSCTX_INPROC_SERVER,\r
+ IID_IMemAllocator,(void **)allocator)==S_OK) {\r
+ if (DecideBufferSize(allocator,&eigenall)==S_OK) {\r
+ if (connectedinput->NotifyAllocator(allocator,FALSE)==S_OK){\r
+ connected=pinempf;\r
+ LeaveCriticalSection(&m_pFilter->filterlock);\r
+ return S_OK;\r
+ }\r
+ }\r
+ }\r
+ if (allocator!=NULL) allocator->Release();\r
+ allocator=NULL;\r
+ connected->Release();\r
+ connected=NULL;\r
+ connectedinput->Release();\r
+ connectedinput=NULL;\r
+ LeaveCriticalSection(&m_pFilter->filterlock);\r
+ return VFW_E_NO_TRANSPORT;\r
+\r
+\r
+\r
\r
}\r
HRESULT STDMETHODCALLTYPE DsSourcePin::ReceiveConnection(IPin *connect,\r
- const AM_MEDIA_TYPE *mtype){\r
- return VFW_E_TYPE_NOT_ACCEPTED; //We have only output pins\r
+ const AM_MEDIA_TYPE *mtype){\r
+ return VFW_E_TYPE_NOT_ACCEPTED; //We have only output pins\r
}\r
HRESULT STDMETHODCALLTYPE DsSourcePin::Disconnect() {\r
- EnterCriticalSection(&m_pFilter->filterlock);\r
- if (connected!=NULL) {\r
- if (m_pFilter->mystate!=State_Stopped) {LeaveCriticalSection(&m_pFilter->filterlock);return VFW_E_NOT_STOPPED;}\r
- /*TODO: Decommit allocator*/\r
- allocator->Decommit();\r
- allocator->Release();\r
- allocator=NULL;\r
- ReleaseMType(&medtype);\r
- connectedinput->Release();\r
- connectedinput=NULL;\r
- connected->Release();\r
- connected=NULL;\r
- LeaveCriticalSection(&m_pFilter->filterlock);\r
- return S_OK;\r
- }\r
- LeaveCriticalSection(&m_pFilter->filterlock);\r
- return S_FALSE;\r
+ EnterCriticalSection(&m_pFilter->filterlock);\r
+ if (connected!=NULL) {\r
+ if (m_pFilter->mystate!=State_Stopped) {LeaveCriticalSection(&m_pFilter->filterlock);return VFW_E_NOT_STOPPED;}\r
+ /*TODO: Decommit allocator*/\r
+ allocator->Decommit();\r
+ allocator->Release();\r
+ allocator=NULL;\r
+ ReleaseMType(&medtype);\r
+ connectedinput->Release();\r
+ connectedinput=NULL;\r
+ connected->Release();\r
+ connected=NULL;\r
+ LeaveCriticalSection(&m_pFilter->filterlock);\r
+ return S_OK;\r
+ }\r
+ LeaveCriticalSection(&m_pFilter->filterlock);\r
+ return S_FALSE;\r
}\r
\r
HRESULT STDMETHODCALLTYPE DsSourcePin::ConnectedTo(IPin **pin){\r
- if (pin==NULL) return E_POINTER;\r
- IPin* pinn=connected;\r
- *pin=pinn;\r
- if (pinn!=NULL) {\r
- pinn->AddRef();\r
- return S_OK;\r
- } else {\r
- return VFW_E_NOT_CONNECTED;\r
- }\r
+ if (pin==NULL) return E_POINTER;\r
+ IPin* pinn=connected;\r
+ *pin=pinn;\r
+ if (pinn!=NULL) {\r
+ pinn->AddRef();\r
+ return S_OK;\r
+ } else {\r
+ return VFW_E_NOT_CONNECTED;\r
+ }\r
}\r
HRESULT STDMETHODCALLTYPE DsSourcePin::ConnectionMediaType(AM_MEDIA_TYPE *mtype){\r
- if (mtype==NULL) return E_POINTER;\r
- if (connected!=NULL){\r
- CopyMType(mtype,&medtype);\r
- return S_OK;\r
- } else {\r
- ZeroMemory(mtype,sizeof(mtype));\r
- return VFW_E_NOT_CONNECTED;\r
- }\r
+ if (mtype==NULL) return E_POINTER;\r
+ if (connected!=NULL){\r
+ CopyMType(mtype,&medtype);\r
+ return S_OK;\r
+ } else {\r
+ ZeroMemory(mtype,sizeof(mtype));\r
+ return VFW_E_NOT_CONNECTED;\r
+ }\r
}\r
HRESULT STDMETHODCALLTYPE DsSourcePin::QueryPinInfo(PIN_INFO *info){\r
- if (info==NULL) return E_POINTER;\r
- info->dir=PINDIR_OUTPUT;\r
- info->pFilter=(IBaseFilter*)m_pFilter;\r
- if (m_pFilter) m_pFilter->AddRef();\r
- if (isaudiopin) wcscpy(info->achName,L"Audio");\r
- else wcscpy(info->achName,L"Video");\r
- return S_OK;\r
+ if (info==NULL) return E_POINTER;\r
+ info->dir=PINDIR_OUTPUT;\r
+ info->pFilter=(IBaseFilter*)m_pFilter;\r
+ if (m_pFilter) m_pFilter->AddRef();\r
+ if (isaudiopin) wcscpy(info->achName,L"Audio");\r
+ else wcscpy(info->achName,L"Video");\r
+ return S_OK;\r
}\r
\r
HRESULT STDMETHODCALLTYPE DsSourcePin::QueryDirection(PIN_DIRECTION *dir){\r
- if (dir==NULL) return E_POINTER;\r
- *dir=PINDIR_OUTPUT;\r
- return S_OK;\r
+ if (dir==NULL) return E_POINTER;\r
+ *dir=PINDIR_OUTPUT;\r
+ return S_OK;\r
}\r
HRESULT STDMETHODCALLTYPE DsSourcePin::QueryId(LPWSTR *id){\r
- if (id==NULL) return E_POINTER;\r
- *id=(LPWSTR)CoTaskMemAlloc(12);\r
- if (*id==NULL) return E_OUTOFMEMORY;\r
- \r
-\r
- if (isaudiopin) wcscpy(*id,L"Audio");\r
- else wcscpy(*id, L"Video");\r
- return S_OK;\r
+ if (id==NULL) return E_POINTER;\r
+ *id=(LPWSTR)CoTaskMemAlloc(12);\r
+ if (*id==NULL) return E_OUTOFMEMORY;\r
+\r
+\r
+ if (isaudiopin) wcscpy(*id,L"Audio");\r
+ else wcscpy(*id, L"Video");\r
+ return S_OK;\r
}\r
HRESULT STDMETHODCALLTYPE DsSourcePin::QueryAccept(const AM_MEDIA_TYPE *mtype) {\r
- if (mtype==NULL) return S_FALSE;\r
- if (CheckMediaType(mtype)==S_OK) return S_OK;\r
- else return S_FALSE;\r
+ if (mtype==NULL) return S_FALSE;\r
+ if (CheckMediaType(mtype)==S_OK) return S_OK;\r
+ else return S_FALSE;\r
}\r
HRESULT STDMETHODCALLTYPE DsSourcePin::EnumMediaTypes(IEnumMediaTypes **enuma){\r
if (enuma==NULL) return E_POINTER;
- *enuma=new DsSFEnumMediaTypes( this);
- (*enuma)->AddRef();
- return S_OK;
+ *enuma=new DsSFEnumMediaTypes( this);
+ (*enuma)->AddRef();
+ return S_OK;
}\r
\r
HRESULT STDMETHODCALLTYPE DsSourcePin::QueryInternalConnections(IPin **pin,ULONG *numpin){\r
- return E_NOTIMPL;\r
+ return E_NOTIMPL;\r
}\r
HRESULT STDMETHODCALLTYPE DsSourcePin::EndOfStream(){\r
- return E_UNEXPECTED; //we are a output pin!\r
+ return E_UNEXPECTED; //we are a output pin!\r
}\r
\r
HRESULT STDMETHODCALLTYPE DsSourcePin::NewSegment(REFERENCE_TIME start,REFERENCE_TIME stop,double rate){\r
- return E_UNEXPECTED;//we are a output pin!\r
+ return E_UNEXPECTED;//we are a output pin!\r
}\r
\r
HRESULT DsSourcePin::getCurrentMediaSample(IMediaSample**ms){\r
- if (allocator!=NULL) return allocator->GetBuffer(ms,NULL,NULL,0);\r
- else return E_NOINTERFACE;\r
+ if (allocator!=NULL) return allocator->GetBuffer(ms,NULL,NULL,0);\r
+ else return E_NOINTERFACE;\r
}\r
\r
HRESULT DsSourcePin::deliver(IMediaSample * ms){\r
- //EnterCriticalSection(&m_pFilter->filterlock);\r
- HRESULT hres;\r
- if (connectedinput!=NULL)hres= connectedinput->Receive(ms);\r
- else hres= VFW_E_NOT_CONNECTED;\r
- //LeaveCriticalSection(&m_pFilter->filterlock);\r
- return hres;\r
+ //EnterCriticalSection(&m_pFilter->filterlock);\r
+ HRESULT hres;\r
+ if (connectedinput!=NULL)hres= connectedinput->Receive(ms);\r
+ else hres= VFW_E_NOT_CONNECTED;\r
+ //LeaveCriticalSection(&m_pFilter->filterlock);\r
+ return hres;\r
\r
}\r
\r
HRESULT DsSourcePin::GetMediaType(int iPosition, AM_MEDIA_TYPE *pmt)\r
{\r
- HRESULT hr;\r
- \r
- if (isaudiopin){\r
- if (iPosition==0) {\r
- ZeroMemory(pmt,sizeof(*pmt));\r
- pmt->lSampleSize = 1;\r
- pmt->bFixedSizeSamples = TRUE;\r
- pmt->majortype=MEDIATYPE_Audio;\r
- MPEG1WAVEFORMAT wfe;\r
- ZeroMemory(&wfe,sizeof(wfe));\r
- wfe.wfx.cbSize=22;\r
- wfe.wfx.nSamplesPerSec=48000;\r
- wfe.wfx.nChannels=2;\r
- wfe.wfx.nAvgBytesPerSec=32000;\r
- wfe.wfx.nBlockAlign=768;\r
- wfe.wfx.wFormatTag=WAVE_FORMAT_MPEG;\r
- wfe.fwHeadLayer=2;\r
- wfe.dwHeadBitrate=256000;\r
- wfe.fwHeadMode=ACM_MPEG_STEREO;\r
- wfe.fwHeadModeExt=1;\r
- wfe.wHeadEmphasis=1;\r
- wfe.fwHeadFlags=ACM_MPEG_ID_MPEG1 |ACM_MPEG_ORIGINALHOME | ACM_MPEG_PROTECTIONBIT;\r
- pmt->subtype=MEDIASUBTYPE_MPEG2_AUDIO;\r
- pmt->formattype=FORMAT_WaveFormatEx;\r
- pmt->cbFormat=sizeof(wfe);\r
- pmt->pbFormat=(BYTE*)CoTaskMemAlloc(sizeof(wfe));\r
- memcpy(pmt->pbFormat,&wfe,sizeof(wfe));\r
- pmt->lSampleSize=0;\r
- hr=S_OK;\r
-\r
- \r
+ HRESULT hr;\r
+\r
+ if (isaudiopin){\r
+ if (iPosition==0) {\r
+ ZeroMemory(pmt,sizeof(*pmt));\r
+ pmt->lSampleSize = 1;\r
+ pmt->bFixedSizeSamples = TRUE;\r
+ pmt->majortype=MEDIATYPE_Audio;\r
+ MPEG1WAVEFORMAT wfe;\r
+ ZeroMemory(&wfe,sizeof(wfe));\r
+ wfe.wfx.cbSize=22;\r
+ wfe.wfx.nSamplesPerSec=48000;\r
+ wfe.wfx.nChannels=2;\r
+ wfe.wfx.nAvgBytesPerSec=32000;\r
+ wfe.wfx.nBlockAlign=768;\r
+ wfe.wfx.wFormatTag=WAVE_FORMAT_MPEG;\r
+ wfe.fwHeadLayer=2;\r
+ wfe.dwHeadBitrate=256000;\r
+ wfe.fwHeadMode=ACM_MPEG_STEREO;\r
+ wfe.fwHeadModeExt=1;\r
+ wfe.wHeadEmphasis=1;\r
+ wfe.fwHeadFlags=ACM_MPEG_ID_MPEG1 |ACM_MPEG_ORIGINALHOME | ACM_MPEG_PROTECTIONBIT;\r
+ pmt->subtype=MEDIASUBTYPE_MPEG2_AUDIO;\r
+ pmt->formattype=FORMAT_WaveFormatEx;\r
+ pmt->cbFormat=sizeof(wfe);\r
+ pmt->pbFormat=(BYTE*)CoTaskMemAlloc(sizeof(wfe));\r
+ memcpy(pmt->pbFormat,&wfe,sizeof(wfe));\r
+ pmt->lSampleSize=0;\r
+ hr=S_OK;\r
+\r
+\r
} else {\r
- hr=VFW_S_NO_MORE_ITEMS ;\r
- }\r
- } else {\r
- if (iPosition == 0) {\r
- ZeroMemory(pmt,sizeof(*pmt));\r
- pmt->lSampleSize = 1;\r
- pmt->bFixedSizeSamples = TRUE;\r
- pmt->majortype=MEDIATYPE_Video;\r
- hr=S_OK;\r
- pmt->subtype=MEDIASUBTYPE_MPEG2_VIDEO;\r
+ hr=VFW_S_NO_MORE_ITEMS ;\r
+ }\r
+ } else {\r
+ if (iPosition == 0) {\r
+ ZeroMemory(pmt,sizeof(*pmt));\r
+ pmt->lSampleSize = 1;\r
+ pmt->bFixedSizeSamples = TRUE;\r
+ pmt->majortype=MEDIATYPE_Video;\r
+ hr=S_OK;\r
+ pmt->subtype=MEDIASUBTYPE_MPEG2_VIDEO;\r
pmt->formattype=FORMAT_MPEG2Video;\r
\r
MPEG2VIDEOINFO hdr;\r
hdr.hdr.bmiHeader.biSize = sizeof(hdr.hdr.bmiHeader);\r
hdr.hdr.bmiHeader.biWidth = 720;\r
hdr.hdr.bmiHeader.biHeight = 568;\r
- pmt->cbFormat=sizeof(hdr);\r
- pmt->pbFormat=(BYTE*)CoTaskMemAlloc(sizeof(hdr));\r
- memcpy(pmt->pbFormat,&hdr,sizeof(hdr));\r
- \r
- } else {\r
- hr=VFW_S_NO_MORE_ITEMS;\r
- }\r
- }\r
- return hr ;\r
+ pmt->cbFormat=sizeof(hdr);\r
+ pmt->pbFormat=(BYTE*)CoTaskMemAlloc(sizeof(hdr));\r
+ memcpy(pmt->pbFormat,&hdr,sizeof(hdr));\r
+\r
+ } else {\r
+ hr=VFW_S_NO_MORE_ITEMS;\r
+ }\r
+ }\r
+ return hr ;\r
}\r
\r
HRESULT DsSourcePin::Inactive() {\r
- if (allocator!=NULL) return allocator->Decommit();\r
- return VFW_E_NO_ALLOCATOR;\r
+ if (allocator!=NULL) return allocator->Decommit();\r
+ return VFW_E_NO_ALLOCATOR;\r
}\r
\r
HRESULT DsSourcePin::Active() {\r
- if (allocator!=NULL) return allocator->Commit();\r
- return VFW_E_NO_ALLOCATOR;\r
+ if (allocator!=NULL) return allocator->Commit();\r
+ return VFW_E_NO_ALLOCATOR;\r
}\r
\r
HRESULT DsSourcePin::Run(REFERENCE_TIME reftime){\r
- return NOERROR;\r
+ return NOERROR;\r
}\r
\r
// No description\r
HRESULT DsSourcePin::CheckMediaType(const AM_MEDIA_TYPE *pmt)\r
{\r
HRESULT res;\r
- \r
+\r
if (isaudiopin) {\r
bool subtype=false;\r
#if 0 /* For future demands ac3 */\r
- subtype=pmt->subtype==(MEDIASUBTYPE_DOLBY_AC3);\r
+ subtype=pmt->subtype==(MEDIASUBTYPE_DOLBY_AC3);\r
#endif\r
- subtype=(pmt->subtype==(MEDIASUBTYPE_MPEG2_AUDIO));\r
+ subtype=(pmt->subtype==(MEDIASUBTYPE_MPEG2_AUDIO));\r
if (pmt->majortype==MEDIATYPE_Audio && subtype) {\r
- res = S_OK ;\r
+ res = S_OK ;\r
} else {\r
res = S_FALSE ;\r
- } \r
+ }\r
} else {\r
if (pmt->majortype==MEDIATYPE_Video &&\r
pmt-> subtype==MEDIASUBTYPE_MPEG2_VIDEO) {\r
- res = S_OK ;\r
+ res = S_OK ;\r
} else {\r
res = S_FALSE ;\r
- } \r
+ }\r
}\r
return res;\r
}\r
\r
HRESULT DsSourcePin::DecideBufferSize(IMemAllocator *pa,ALLOCATOR_PROPERTIES *all_pp){\r
- HRESULT hr;\r
- \r
+ HRESULT hr;\r
+\r
if (pa==NULL)return E_POINTER;\r
if (all_pp==NULL) return E_POINTER;\r
- if (isaudiopin) {\r
- if (all_pp->cBuffers*all_pp->cbBuffer < 300*64*1024)\r
- {\r
- //all_pp->cBuffers = 300;//old\r
- all_pp->cBuffers = 10;\r
- all_pp->cbBuffer = 64*1024;\r
- }\r
- } else {\r
- if (all_pp->cBuffers*all_pp->cbBuffer < 300*64*1024)\r
- {\r
- //all_pp->cBuffers = 300;//old\r
- all_pp->cBuffers = 30;\r
- all_pp->cbBuffer = 64*1024;\r
- }\r
- }\r
+ if (isaudiopin) {\r
+ if (all_pp->cBuffers*all_pp->cbBuffer < 300*64*1024)\r
+ {\r
+ //all_pp->cBuffers = 300;//old\r
+ all_pp->cBuffers = 10;\r
+ all_pp->cbBuffer = 64*1024;\r
+ }\r
+ } else {\r
+ if (all_pp->cBuffers*all_pp->cbBuffer < 300*64*1024)\r
+ {\r
+ //all_pp->cBuffers = 300;//old\r
+ all_pp->cBuffers = 30;\r
+ all_pp->cbBuffer = 64*1024;\r
+ }\r
+ }\r
\r
ALLOCATOR_PROPERTIES all_pp_cur;\r
hr =pa->SetProperties(all_pp,&all_pp_cur);\r
- if (FAILED(hr)) \r
+ if (FAILED(hr))\r
{\r
return hr;\r
}\r
- if (all_pp_cur.cbBuffer*all_pp_cur.cBuffers < all_pp->cBuffers*all_pp->cbBuffer) \r
+ if (all_pp_cur.cbBuffer*all_pp_cur.cBuffers < all_pp->cBuffers*all_pp->cbBuffer)\r
{\r
return E_FAIL;\r
}\r
\r
Colour c;\r
UINT value;\r
+\r
for(UINT q = 0; q < Nd; q++)\r
{\r
value = (UINT)(dst[q] * 182); // Apparently this is a better number than 255 for the colour value\r
\r
void Wwss::drawNTSC()\r
{\r
- static UCHAR startCode[] = {1,0};\r
- static UCHAR aspect43[] = {0,0};\r
- static UCHAR aspect169[] = {1,0};\r
- static UCHAR theRest[] = {0,0,0,0,0,0,0,0,0,0,0,0};\r
+/*\r
+ static UCHAR startCode[] = {1,0,0,0,0,0,0};\r
+ static UCHAR aspect43[] = {0};\r
+ static UCHAR aspect169[] = {1};\r
+ static UCHAR theRest[] = {0,0,0,0,0,0,0,0};\r
static UCHAR crc43[] = {0,0,0,0,0,0};\r
- static UCHAR crc169[] = {1,0,0,1,0,1};\r
-\r
+ static UCHAR crc169[] = {0,0,1,1,0,0};\r
+*/\r
/*\r
Real NTSC pixel frequency: 13.5 MHz\r
WSS bit frequency: 447.443125 kHz\r
\r
const UINT Ns = 22; // Num pix src\r
const UINT Nd = 664; // Num pix dst\r
+// const UINT Nd = 518; // Num pix dst\r
UINT Nl = lcm(Ns, Nd); // Num pix in lcm\r
UINT Ss = Nl / Ns; // Source split (how many lcm px = 1 src px)\r
UINT Sd = Nl / Nd; // Dst split\r
- UCHAR src[Ns];\r
+// UCHAR src[Ns];\r
\r
- memcpy(&src[0], startCode, 2);\r
- if (wide) memcpy(&src[2], aspect169, 2);\r
- else memcpy(&src[2], aspect43, 2);\r
- memcpy(&src[4], theRest, 12);\r
+/*\r
+ memcpy(&src[0], startCode, 7);\r
+ if (wide) memcpy(&src[7], aspect169, 1);\r
+ else memcpy(&src[7], aspect43, 1);\r
+ memcpy(&src[8], theRest, 8);\r
if (wide) memcpy(&src[16], crc169, 6);\r
else memcpy(&src[16], crc43, 6);\r
+*/\r
+\r
+static UCHAR src[22] = {1,0, 0,0,0,0,1,1, 0,0,0,0, 0,0,0,0, 0,0,1,0,0,1 };\r
+\r
\r
float dst[Nd];\r
UINT lcmpxbase = 0;\r
Colour c;\r
UINT value;\r
\r
+// This one is the real one\r
/*\r
for(UINT q = 0; q < Nd; q++)\r
{\r
}\r
*/\r
\r
+// This one is testing active\r
for(int yy = 0; yy < 100; yy++)\r
{\r
for(UINT q = 0; q < Nd; q++)\r
{\r
value = (UINT)(dst[q] * 182); // Apparently this is a better number than 255 for the colour value\r
c.set(value, value, value);\r
- drawPixel(q+20, yy, c);\r
+ drawPixel(q+0, yy, c);\r
}\r
}\r
\r
static UCHAR aspect169[] = {1,0};\r
static UCHAR theRest[] = {0,0,0,0,0,0,0,0,0,0,0,0};\r
static UCHAR crc43[] = {0,0,0,0,0,0};\r
-static UCHAR crc169[] = {1,0,0,1,0,1};\r
+static UCHAR crc169[] = {0,0,1,0,0,1};\r
\r
Message 4:3\r
\r