summaryrefslogtreecommitdiffstats
path: root/loader/dshow/DS_Filter.c
diff options
context:
space:
mode:
authorvoroshil <voroshil@b3059339-0415-0410-9bf9-f77b7e298cf2>2007-02-23 08:07:07 +0000
committervoroshil <voroshil@b3059339-0415-0410-9bf9-f77b7e298cf2>2007-02-23 08:07:07 +0000
commite33a1695bab717d2dd3a7e5c289ed822437b187f (patch)
tree2146e18e2a4b3eba6ea2c92468e22fee852513ec /loader/dshow/DS_Filter.c
parent0a02ca6ec3a8d7cd371b01f2def1269ea73b236e (diff)
downloadmpv-e33a1695bab717d2dd3a7e5c289ed822437b187f.tar.bz2
mpv-e33a1695bab717d2dd3a7e5c289ed822437b187f.tar.xz
Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@22322 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'loader/dshow/DS_Filter.c')
-rw-r--r--loader/dshow/DS_Filter.c38
1 files changed, 26 insertions, 12 deletions
diff --git a/loader/dshow/DS_Filter.c b/loader/dshow/DS_Filter.c
index 7d3b31ddc8..8d11c170cc 100644
--- a/loader/dshow/DS_Filter.c
+++ b/loader/dshow/DS_Filter.c
@@ -37,24 +37,12 @@ static void DS_Filter_Start(DS_Filter* This)
{
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 @@ DS_Filter* DS_FilterCreate(const char* dllname, const GUID* id,
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 @@ DS_Filter* DS_FilterCreate(const char* dllname, const GUID* id,
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 @@ DS_Filter* DS_FilterCreate(const char* dllname, const GUID* id,
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 @@ DS_Filter* DS_FilterCreate(const char* dllname, const GUID* id,
init++;
break;
}
+ tempAll->vt->Release(tempAll);
if (!init)
{