运行10多个小时后,ISampleGrabber :: BufferCB返回缓冲区长度为0

时间:2019-04-25 15:01:17

标签: c++ directshow

订阅了静止销的bufferCB会以缓冲区长度为0 的方式重复调用,即使仍未触发。

预览针已连接到VMR9渲染器。静止引脚通过samplegrabber连接到null渲染器,并且buffercb回调已订阅到该静止引脚。我们运行脚本以使用setmode()API每隔3分钟触发一次触发,以从静态图钉捕获。

运行 10〜20 小时后,即使不使用setmode()进行触发,每一帧也会调用buffercb。

我们检查了内存使用情况,对象创建和销毁以及DirectShow图。一切看起来都很好。

我们试图忽略未触发的回调,因为触发的回调返回了有效的缓冲区和长度。但是几个小时后,触发的回调也会返回缓冲区长度为0。

以下是DirectShow过滤器的创建和渲染:

hr = m_pBuilder->RenderStream(0, &MEDIATYPE_Video, m_pStillPin, m_pSG_Filter,m_pNull);
hr = m_pBuilder->FindPin(
        m_pVCap,              // Filter.
        PINDIR_OUTPUT,         // Look for an output pin.
        &PIN_CATEGORY_STILL,   // Pin category.
        NULL,                  // Media type (don't care).
        FALSE,                 // Pin must be unconnected.
        0,                     // Get the 0'th pin.
        &m_pStillPin                  // Receives a pointer to thepin.
        );

hr = m_pSG_Filter->QueryInterface(IID_ISampleGrabber, (void**)&m_pSG);

hr = m_pSG->SetCallback(&g_StillCapCB, 1);

以下代码用于触发静止图像:

hr = m_pAMVidControl->SetMode(m_pStillPin,(long)VideoControlFlag_Trigger);

我想知道,

  1. 为什么在仍未触发的情况下反复调用buffercb?
  2. 为什么bufferlength不为null时,bufferlength返回0?

谢谢。

0 个答案:

没有答案