Это действительно заставляет меня рвать на себе волосы. Я написал фильтр преобразования DirectShow, производный от CTransformFilter. Я получил входной контакт от CTransformInputPin. Когда вызывается метод Receive моего входного вывода, он записывает время презентации IMediaSample в файл. Все это работает нормально, пока я не остановлю график и не запущу его снова (я использую MS graphedt). В большинстве случаев при повторном запуске проблем не возникает. Но примерно в одном из каждых дюжин или около того раз, когда я останавливаюсь, а затем снова запускаю график, начальное время презентации отрицательное. В конечном итоге оно увеличивается до нуля и поднимается выше нуля по мере выполнения графика, но никогда не догоняет время потока, в результате чего время потока остается значительно опережающим время начала представления для каждого образца.
Я наблюдал это с Logitech Webcam Pro 9000 и камерой Logitech C600, но не с камерой Winbook, поэтому мне интересно, является ли это проблемой Logitech. Кто-нибудь еще видел отрицательное время презентации на видео IMediaSamples после остановки и повторного запуска? (Я посмотрел на флаг preroll в IMediaSample: он всегда S_FALSE.)
ОБНОВЛЕНИЕ:
Я переопределил метод Run CTransformFilter (на самом деле, CBaseFilter) следующим образом:
STDMETHODIMP MyTransformFilter::Run(REFERENCE_TIME tStart)
{
char buff[1000];
REFERENCE_TIME rTime;
m_pClock->GetTime(&rTime);
sprintf(buff, "Run tstart = %lld, rTime = %lld", tStart, rTime);
Trace(buff); // open my log file, add buff, close my log file
return CTransformFilter::Run(tStart);
}
Я использовал graphedt, чтобы запустить график, запустить его на 10 секунд, сделать паузу на 5 секунд, а затем запустить снова. Вот результат:
Run tstart = 7855978550000, rTime = 7855978450000
Run tstart = 7856030610000, rTime = 7856126960000
Два времени, переданные для запуска, отличаются на 5,2 секунды (примерно на время, в течение которого я сделал паузу). Время двух эталонных часов отличается на 14,6 секунды (приблизительно общее время между вызовами Run). За исключением небольшого увеличения, которое диспетчер графов фильтров добавляет ко времени, переданному в Run (10 мс при первом вызове), я ожидаю, что они будут почти одинаковыми каждый раз, когда вызывается Run. Вместо этого время, переданное Run во втором вызове, примерно на 10 секунд отстает от эталонных часов. Я был бы чрезвычайно признателен за помощь в понимании того, почему время, переданное в Run при втором вызове, не совпадает (почти) со временем, возвращаемым эталонными часами при втором вызове.
ОБНОВЛЕНИЕ 2:
Проблема связана с драйвером Logitech версии 13.31.1044.0. См. ответ ниже.