Mercurial > mplayer.hg
changeset 22304:254733f57707
Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
author | voroshil |
---|---|
date | Fri, 23 Feb 2007 08:07:07 +0000 |
parents | 14ed9bf94b71 |
children | 3d1b23cf3d08 |
files | loader/dshow/DS_AudioDecoder.c loader/dshow/DS_Filter.c loader/dshow/DS_VideoDecoder.c loader/dshow/allocator.c |
diffstat | 4 files changed, 38 insertions(+), 27 deletions(-) [+] |
line wrap: on
line diff
--- a/loader/dshow/DS_AudioDecoder.c Fri Feb 23 03:08:54 2007 +0000 +++ b/loader/dshow/DS_AudioDecoder.c Fri Feb 23 08:07:07 2007 +0000 @@ -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)
--- a/loader/dshow/DS_Filter.c Fri Feb 23 03:08:54 2007 +0000 +++ b/loader/dshow/DS_Filter.c Fri Feb 23 08:07:07 2007 +0000 @@ -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) {
--- a/loader/dshow/DS_VideoDecoder.c Fri Feb 23 03:08:54 2007 +0000 +++ b/loader/dshow/DS_VideoDecoder.c Fri Feb 23 08:07:07 2007 +0000 @@ -278,15 +278,9 @@ ALLOCATOR_PROPERTIES props, props1; Debug printf("DS_VideoDecoder_StartInternal\n"); //cout << "DSSTART" << endl; + 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_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->iv.m_State = START; }
--- a/loader/dshow/allocator.c Fri Feb 23 03:08:54 2007 +0000 +++ b/loader/dshow/allocator.c Fri Feb 23 08:07:07 2007 +0000 @@ -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;