【问题标题】:DecideBufferSize values seem to be ignoredDecideBufferSize 值似乎被忽略了
【发布时间】: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


【解决方案1】:

MSDN states it 相当准确:

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

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

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

如何设置Allocator->GetBuffer()返回的Buffer的大小?

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

我给了你 MSDN 链接 a few question ago,它解释了为什么增加大小的缓冲区有时是有效的,甚至更是如此 - 它们是不可避免的。

【讨论】:

  • 问题是缓冲区太小了。我是否必须拆分数据并将其发送到步骤?
  • 您的评论实际上表明您不知道图表中发生了什么。而且您不会在此处发布这些详细信息以获得有根据的建议。您真正应该开始的是弄清楚如何获取有关您构建的 REAL 拓扑、真实连接、真实媒体类型和格式的信息。这也可以解释缓冲区大小,在您了解您一直在黑暗中拍摄的拓扑之前。
  • 我不明白。除了拆分,我还能做什么?拒绝数据?
  • 不拒绝,不分手。您的错误此时已经破坏了它,您需要退后一步并修复早期的东西。
  • 我没有看到错误在哪里
猜你喜欢
  • 2021-10-28
  • 2016-09-30
  • 2012-03-11
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 2012-03-08
  • 2015-12-11
  • 2014-04-15
相关资源
最近更新 更多