У меня проблема с пропуском кадров при воспроизведении видео. Мы только что перешли с ICS на KK4.4. Видео очень маленькое, разрешение 320х240. Нет звука, чтобы упростить задачу.
Systrace находится по следующему адресу: https://www.dropbox.com/s/bee6xymg3kpn4ft/mytrace2.html?dl=0
Я включил тройную буферизацию, и hwcomposer генерирует поддельные vsync для SurfaceFlinger.
Я вижу следующие проблемы:
Тройная буферизация не включена должным образом, так как видеодекодер выделяет очередь из 7 буферов. В случае, если тройная буферизация работала нормально для каждого кадра, поставленного в очередь из TimedEventQueue(OnVideoEvent), буфер, который должен быть исключен из очереди, должен отставать на 2 слота. Например: если мы ставим в очередь buf 4, то buf 2 должен быть исключен из очереди, но то, что удаляется из очереди, — это непосредственный предыдущий буфер, который SurfaceFlinger освобождает только тогда, когда у него появляется возможность запуститься в следующий раз. Отсюда задержка, которая, в свою очередь, приводит к отмене буферов для видео.
Сам SurfaceFlinger требует некоторого времени для завершения.
Vsync не включается в подходящее время, скажем, каждые 33 мс для видео с частотой 30 кадров в секунду. Проблема с логикой генерации vsync в HWComposer или vsync, не включенной eventControl из-за того, что фактические буферы не поставлены в очередь?
Обновление из приведенного ниже комментария: Другие вещи, которые я отметил, это то, что флаги async и mDequeueBufferCannotBlock являются ложными, и, следовательно, getMinUndequeuedBufferCount() возвращает 1, и, таким образом, мы видим, что непосредственный предыдущий буфер запрашивается для удаления из очереди, а не буфер 2 слота позади . Пожалуйста, дайте мне знать, если есть дыра в понимании выше. И все, что я могу сделать, чтобы обойти это
Любая помощь приветствуется.