ISampleGrabber :: BufferCB возвращает длину буфера как 0 после работы в течение 10+ часов - PullRequest
0 голосов
/ 25 апреля 2019

Буферный CB, подписанный на неподвижный вывод , повторно вызывается с длиной буфера как 0 , даже если он еще не запущен.

Вывод предварительного просмотра подключен к средству визуализации VMR9,Неподвижный контакт подключен к нулевому рендереру через samplegrabber, а обратный вызов buffercb подписан на неподвижный контакт.Мы запускаем сценарий, чтобы запускать неподвижное изображение для захвата с неподвижного контакта, используя setmode () API, каждые 3 минуты .

После запуска в течение 10 ~ 20 ч. Buffercb вызывается для каждого кадра, даже не вызывая при этом setmode ().

Мы проверили использование памяти, создание объекта иГрафик разрушений и наводок.Все выглядит хорошо.

Мы пытались игнорировать обратные вызовы, которые не были запущены, поскольку сработавшие обратные вызовы вернули правильный буфер и длину.Но через несколько часов инициированные обратные вызовы также возвращают длину буфера как 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. Почему длина буфера возвращается как 0, а буфер не равен нулю?

Спасибо.

...