【发布时间】:2014-03-14 15:39:00
【问题描述】:
我遇到的问题是,当使用网络摄像头作为源时,输入样本大于分配器提供的缓冲区大小,正如您在此代码的 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中的缓冲区大小:
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;
}
会被忽略。分配器返回的样本大小始终为 92160。
我还确保实际调用了 DecideBufferSize 方法。
如何设置Allocator->GetBuffer()返回的Buffer的大小?
【问题讨论】:
-
在
DecideBufferSize中,变量buffersize是一个被赋值的局部变量,但从未在任何地方使用。它在DecideBufferSize末尾超出范围,对代码的任何部分都没有影响。 -
是的,好的。无论如何,那不应该在那里。关键是我将缓冲区设置为 10 * 10 *1000 (100'000) 似乎没有应用
标签: c++ directshow