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
This commit is contained in:
voroshil 2007-02-23 08:07:07 +00:00
parent 0a02ca6ec3
commit e33a1695ba
4 changed files with 38 additions and 27 deletions

View File

@ -104,14 +104,11 @@ DS_AudioDecoder * DS_AudioDecoder_Open(char* dllname, GUID* guid, WAVEFORMATEX*
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)

View File

@ -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)
{

View File

@ -278,14 +278,8 @@ void DS_VideoDecoder_StartInternal(DS_VideoDecoder *this)
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;
}

View File

@ -146,8 +146,14 @@ static HRESULT STDCALL MemAllocator_SetProperties(IMemAllocator * This,
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;