Re[2]: Re: Как задать размер буфера в DirectShow?
От: lavrov_alex  
Дата: 01.03.02 04:06
Оценка:
Мой класс MyPlugIn наследуется от CTransInPlaceFilter, CPersistStream, ISpecifyPropertyPages и моего класса Filter, в котором реализовано, как обрабатывать звук. Я так понял по документации и т. д., что когда приложение (звуковой редактор) коннектит свой OutputPin к моему InputPin, то вызывает через IMemInputPin*, относящиийся к моему InputPin, GetAllocatorRequirements, затем GetAllocator, а затем по результатам делает DecideBufferSize. Поскольку GetAllocator определён в CTransInPlaceInputPin, то надо написать свой GetAllocatorRequirements и задать в нём свои ALLOCATOR_PROPERTIES. Для этого я пишу MyTransInPlaceInputPin:

class MyTransInPlaceInputPin : public CTransInPlaceInputPin{

public:

NXPlugInInputPin(char* pObjectName, CTransInPlaceFilter* pFilter, HRESULT* phr, wchar_t* pName) :
CTransInPlaceInputPin(pObjectName, pFilter, phr, pName){}

HRESULT __stdcall GetAllocatorRequirements(ALLOCATOR_PROPERTIES*);

};

Дальше добавляю в класс MyPlugIn
CBasePin* MyPlugIn::GetPin(int n){

HRESULT hr = S_OK;

// Create an input pin if not already done

if(!m_pInput){

m_pInput=new MyTransInPlaceInputPin(NAME("My input pin"), this, &hr, L"Input");
// Constructor for MyTransInPlaceInputPin can't fail
ASSERT(SUCCEEDED(hr));

}

// Create an output pin if not already done

if(m_pInput && !m_pOutput){

m_pOutput=new CTransInPlaceOutputPin(NAME("NXInPlace output pin"), this, &hr, L"Output");
// a failed return code should delete the object
ASSERT(SUCCEEDED(hr));

if(!m_pOutput){

delete m_pInput;
m_pInput=0;

}

}

ASSERT(n==0 || n==1);

// Return the appropriate pin

switch(n){

case 0:

return m_pInput;

case 1:

return m_pOutput;

default:

return 0;

}

}

Он практически содран из CTransInPlaceFilter::GetPin.
Далее пишу GetAllocatorRequirements
HRESULT __stdcall MyTransInPlaceInputPin::GetAllocatorRequirements(ALLOCATOR_PROPERTIES* pProps){

CCritSec Lock; //Это надо?
CAutoLock foo(&Lock);

ALLOCATOR_PROPERTIES request={1, 8192, 1, 0};
*pProps=request;

DbgLog((LOG_TRACE, 2, TEXT("my allocator props %d,%d,%d,%d"), request.cBuffers, request.cbBuffer, request.cbAlign, request.cbPrefix));

return S_OK;
}

Здесь DbgLog выводит в файл, что я установил, поэтому я знаю,что этот код точно исполняется.

Когда начинается обработка звука в функции
HRESULT MyPlugIn::Transform(IMediaSample* pSample), то я тем же DbgLog вывожу
long int size_buf=pSample->GetActualDataLength(); Под этим значением я и понимаю размер буфера. И он равен в редакторе Cool Edit Pro 11024 для всех буферов. Для других редакторов другой размер, но он все равно не равен тому, что я выставил, т. е. 8192.

Ну так и что делать?!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.