decisibuffersize值似乎被忽略了

DecideBufferSize values seem to be ignored

本文关键字:被忽略了 decisibuffersize      更新时间:2023-10-16

我遇到的问题是,当使用网络摄像头作为源时,输入样本大于分配器提供的缓冲区的大小,您可以在此代码中的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。

我还确保了实际调用了decisibuffersize方法。

如何设置由Allocator->GetBuffer()返回的缓冲区的大小?

MSDN的表述相当准确:

通常,派生类将满足输入引脚的缓冲区要求,但不需要。

缓冲区大小的决定是协商的问题。你的设置要求并不意味着他们会被接受。

分配器返回的样本大小始终为92160。

如何设置由Allocator->GetBuffer()返回的缓冲区的大小?

92160到底出了什么问题,是什么让你认为它无效?你在寻找错误问题的答案。如果您拥有分配器,那么您可以设置它的缓冲区大小。如果你不拥有和管理它,那么你就不得不忍受它已经拥有的规模。

我在几个问题之前给了你MSDN链接,它解释了为什么增加大小的缓冲区有时是有效的,甚至更多-它们是不可避免的。