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;