Наш ответ Чемберлену.
На форуме Doom9 был такой пост:
Цитата: For those guys working on fullscreen options, I beg of you to improve this, to read the frame rate of the content, not from the media info, but from whatever is input from external filters.
Until then, it is not usable if anything like de-interlacing is used, or if frame rate changes are introduced by external filters. I don't think it should be difficult as this frame rate is already used and displayed by the renderers obviously.
Если более конкретно, то почему не работает автосмена частоты при использовании Reclock. Деинтерлейсинг на самом деле тут не причем. При деинтерлейсинге получается кратная частота. Пришлось детально разбираться, какие методы определения FPS есть в программе.
Такое разное FPS.
Сначала предлагаю посмотреть небольшой ролик, на примере которого буду детально рассказывать о методах определения FPS в MPC-HC.
http://www.youtube.com/watch?v=nv2vruH5fcI Главное, что хочется сказать в первую очередь - все методы измерения FPS в DirectShow Output являются "пассивными".
1.Первый способ.
Метод измерения FPS является простым статистическим. Описан в процедуре CDX9AllocatorPresenter::CalculateJitter()
Значения измеренной FPS записываются в переменную m_fAvrFps.
Особо не вникал, но, кажется, используется только для вывода статистики. И, по-моему, именно она используется в окне статистики, вызываемом по CTRL+4. Ее сильно глючит, зачастую показывает значения далекие от реальных. А при начале просмотра фильма показывает просто фантастические значения.
2.Второй способ.
Метод основан на считывании данных из Pin. Данные о FPS туда должен закидывать декодер. Значения FPS записываются в переменную m_fps и получаются так:
Сначала вытаскивается значение средней длительности кадра в сотнях наносекунд
Код: if (SUCCEEDED (m_pOuterEVR->FindPin(L"VMR Input0", &pPin)) && SUCCEEDED (pPin->ConnectionMediaType(&mt)) )
{
ExtractAvgTimePerFrame (&mt, m_rtTimePerFrame);
}