[MPlayer-cvslog] r22322 - in trunk/loader/dshow: DS_AudioDecoder.c DS_Filter.c DS_VideoDecoder.c allocator.c
voroshil
subversion at mplayerhq.hu
Fri Feb 23 09:07:10 CET 2007
Author: voroshil
Date: Fri Feb 23 09:07:07 2007
New Revision: 22322
Modified:
trunk/loader/dshow/DS_AudioDecoder.c
trunk/loader/dshow/DS_Filter.c
trunk/loader/dshow/DS_VideoDecoder.c
trunk/loader/dshow/allocator.c
Log:
Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
Modified: trunk/loader/dshow/DS_AudioDecoder.c
==============================================================================
--- trunk/loader/dshow/DS_AudioDecoder.c (original)
+++ trunk/loader/dshow/DS_AudioDecoder.c Fri Feb 23 09:07:07 2007
@@ -104,14 +104,11 @@
return NULL;
}
+ //Commit should be done before binary codec start
+ this->m_pDS_Filter->m_pAll->vt->Commit(this->m_pDS_Filter->m_pAll);
+
this->m_pDS_Filter->Start(this->m_pDS_Filter);
- props.cBuffers=1;
- props.cbBuffer=this->m_sOurType.lSampleSize;
- props.cbAlign=1;
- props.cbPrefix=0;
- this->m_pDS_Filter->m_pAll->vt->SetProperties(this->m_pDS_Filter->m_pAll, &props, &props1);
- this->m_pDS_Filter->m_pAll->vt->Commit(this->m_pDS_Filter->m_pAll);
}
/*
catch (FatalError& e)
Modified: trunk/loader/dshow/DS_Filter.c
==============================================================================
--- trunk/loader/dshow/DS_Filter.c (original)
+++ trunk/loader/dshow/DS_Filter.c Fri Feb 23 09:07:07 2007
@@ -37,24 +37,12 @@
{
HRESULT hr;
- if (This->m_pAll)
- return;
-
//Debug printf("DS_Filter_Start(%p)\n", This);
hr = This->m_pFilter->vt->Run(This->m_pFilter, (REFERENCE_TIME)0);
if (hr != 0)
{
Debug printf("WARNING: m_Filter->Run() failed, error code %x\n", (int)hr);
}
- hr = This->m_pImp->vt->GetAllocator(This->m_pImp, &This->m_pAll);
-
- if (hr || !This->m_pAll)
- {
- Debug printf("WARNING: error getting IMemAllocator interface %x\n", (int)hr);
- This->m_pImp->vt->Release((IUnknown*)This->m_pImp);
- return;
- }
- This->m_pImp->vt->NotifyAllocator(This->m_pImp, This->m_pAll, 0);
}
static void DS_Filter_Stop(DS_Filter* This)
@@ -114,6 +102,8 @@
int init = 0;
// char eb[250];
const char* em = NULL;
+ MemAllocator* tempAll;
+ ALLOCATOR_PROPERTIES props,props1;
HRESULT result;
DS_Filter* This = (DS_Filter*) malloc(sizeof(DS_Filter));
if (!This)
@@ -125,6 +115,13 @@
CoInitialize(0L);
#endif
+ /*
+ tempAll is not used anywhere.
+ MemAllocatorCreate() is called to ensure that RegisterComObject for IMemoryAllocator
+ will be called before possible call
+ to CoCreateInstance(...,&IID_IMemoryAllocator,...) from binary codec.
+ */
+ tempAll=MemAllocatorCreate();
This->m_pFilter = NULL;
This->m_pInputPin = NULL;
This->m_pOutputPin = NULL;
@@ -248,6 +245,22 @@
em = "could not connect to input pin";
break;
}
+ result = This->m_pImp->vt->GetAllocator(This->m_pImp, &This->m_pAll);
+ if (result || !This->m_pAll)
+ {
+ em="error getting IMemAllocator interface";
+ break;
+ }
+
+ //Seting allocator property according to our media type
+ props.cBuffers=1;
+ props.cbBuffer=This->m_pOurType->lSampleSize;
+ props.cbAlign=1;
+ props.cbPrefix=0;
+ This->m_pAll->vt->SetProperties(This->m_pAll, &props, &props1);
+
+ //Notify remote pin about choosed allocator
+ This->m_pImp->vt->NotifyAllocator(This->m_pImp, This->m_pAll, 0);
This->m_pOurOutput = COutputPinCreate(This->m_pDestType);
@@ -263,6 +276,7 @@
init++;
break;
}
+ tempAll->vt->Release(tempAll);
if (!init)
{
Modified: trunk/loader/dshow/DS_VideoDecoder.c
==============================================================================
--- trunk/loader/dshow/DS_VideoDecoder.c (original)
+++ trunk/loader/dshow/DS_VideoDecoder.c Fri Feb 23 09:07:07 2007
@@ -278,14 +278,8 @@
ALLOCATOR_PROPERTIES props, props1;
Debug printf("DS_VideoDecoder_StartInternal\n");
//cout << "DSSTART" << endl;
- this->m_pDS_Filter->Start(this->m_pDS_Filter);
-
- props.cBuffers = 1;
- props.cbBuffer = this->m_sDestType.lSampleSize;
- props.cbAlign = 1;
- props.cbPrefix = 0;
- this->m_pDS_Filter->m_pAll->vt->SetProperties(this->m_pDS_Filter->m_pAll, &props, &props1);
this->m_pDS_Filter->m_pAll->vt->Commit(this->m_pDS_Filter->m_pAll);
+ this->m_pDS_Filter->Start(this->m_pDS_Filter);
this->iv.m_State = START;
}
Modified: trunk/loader/dshow/allocator.c
==============================================================================
--- trunk/loader/dshow/allocator.c (original)
+++ trunk/loader/dshow/allocator.c Fri Feb 23 09:07:07 2007
@@ -146,8 +146,14 @@
return E_FAIL;
*pActual = *pRequest;
- //if (pActual->cbBuffer == 2)
- // pActual->cbBuffer = 576;
+ /*
+ DirectShow DOCS ("Negotiating Allocators" chapter) says that allocator might not
+ honor the requested properties. Thus, since WMSP audio codecs requests bufer with two
+ bytes length for unknown reason, we should correct requested value. Otherwise above
+ codec don't want to load.
+ */
+ if (pActual->cbBuffer == 2)
+ pActual->cbBuffer = 10240; //Enough for WMSP codec
me->props = *pActual;
More information about the MPlayer-cvslog
mailing list