我遇到的问题是,当使用网络摄像头作为源时,输入样本大于分配器提供的缓冲区大小,如本代码中的ASSERT语句所示。
HRESULT MCMyOutputPin::Deliver(IMediaSample* sample)
{
HRESULT hr = NO_ERROR;
myLogger->LogDebug("In Outputpin Deliver", L"D:\\TEMP\\yc.log");
if (sample->GetActualDataLength() > 0)
{
IMediaSample *outsample;
hr = m_pAllocator->GetBuffer(&outsample, NULL, NULL, NULL);
if (FAILED(hr))
{
return hr;
}
BYTE* sampleBuffer = NULL;
BYTE* newBuffer = NULL;
long ulDataLen = sample->GetSize();
long datalenout = outsample->GetSize(); //this is always 92160
outsample->GetPointer(&newBuffer);
ASSERT(datalenout >= ulDataLen); //This fails
memcpy((void *)newBuffer, (void *)sampleBuffer, ulDataLen);
m_pInputPin->Receive(outsample);
outsample->Release();
sample->Release();
}
return hr;
//Forward to filter
}
因此,memcpy肯定会失败,因为您无法将某些内容复制到小于数据的缓冲区中。
所以我尝试在DecideBufferSize
中调整buffersize:
HRESULT MCMyOutputPin::DecideBufferSize(IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *pProps)
{
myLogger->LogDebug("On DecideBufferSIze", L"D:\\TEMP\\yc.log");
ALLOCATOR_PROPERTIES act;
HRESULT hr;
// by default we do something like this...
pProps->cbAlign = 1;
pProps->cBuffers = 30;
long buffersize = this->CurrentMediaType().lSampleSize * 3;
pProps->cbBuffer = 10 * 10 * 1000;
pProps->cbPrefix = 0;
hr = pAlloc->SetProperties(pProps, &act);
if (FAILED(hr)) return hr;
// make sure the allocator is OK with it.
if ((pProps->cBuffers > act.cBuffers) ||
(pProps->cbBuffer > act.cbBuffer) ||
(pProps->cbAlign > act.cbAlign))
return E_FAIL;
return NOERROR;
}
被忽略了。 alocator返回的样本大小始终为92160。
我还确保实际调用了DecideBufferSize方法。
如何设置Allocator返回的缓冲区大小 - > GetBuffer()?
答案 0 :(得分:3)
MSDN states it非常准确:
通常,派生类将遵循输入引脚的缓冲要求,但不需要。
缓冲区大小决定是一个谈判的问题。您的设置要求并不意味着它们将被接受。
分配器返回的样本大小始终为92160。
如何设置Allocator-> GetBuffer()返回的Buffer的大小?
92160究竟出了什么问题,是什么让你觉得它无效?您正在寻找错误问题的答案。如果您拥有allocator,则设置其缓冲区大小。如果你不拥有和管理它,那么你必须拥有它已经拥有的大小。
我给了你MSDN链接a few question ago,它解释了为什么增加大小的缓冲区有时是有效的,甚至更多 - 它们是不可避免的。