mirror of
https://github.com/mpv-player/mpv
synced 2025-01-15 03:23:23 +00:00
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:
parent
0a02ca6ec3
commit
e33a1695ba
@ -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)
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user