Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Фреймворк GStreamer. Руководство разработчика плагинов. Качество сервиса (QoS)

Оригинал: GStreamer Plugin Writer's Guide
Авторы: Richard John Boulton, Erik Walthinsen, Steve Baker, Leif Johnson, Ronald S. Bultje, Stefan Kost, Tim-Philipp Muller, Wim Taymans
Дата публикации: 19 июля 2014 г.
Перевод: А.Панин
Дата перевода: 29 июля 2014 г.

Процесс исследования качества сервиса в рамках фреймворка GStreamer заключается в измерении и подстройке производительности конвейера в реальном времени. Измерение производительности конвейера всегда осуществляется в реальном времени относительно таймера конвейера обычно на уровне элементов для вывода данных в момент синхронизации буферов данных с таймером конвейера.

Если буферы данных доставляются элементу для вывода данных с запозданием, например, в том случае, когда их значение затраченного времени меньше значения затраченного времени, рассчитанного на основе значения таймера конвейера, мы можем сделать вывод о том, что существует проблема качества сервиса. Возможные причины этой проблемы:
  • Высокая нагрузка на центральный процессор, не позволяющая использовать достаточный ресурс центрального процессора для обработки мультимедийного потока и приводящая к доставке буферов данных элементу для вывода данных с запозданием.
  • Проблемы с сетевым соединением.
  • Другие проблемы с ресурсами, такие, как интенсивное использование жесткого диска сторонними приложениями, недостаточная пропускная способность оперативной памяти и.т.д.
На основании результатов измерений производительности конвейера генерируются события с информацией о качестве сервиса, предназначенные для подстройки интенсивности потока данных на уровне одного или нескольких находящихся в начале конвейера элементов. На уровне конвейера могут осуществляться подстройки двух типов:
  • Кратковременные "неотложные" коррекции, базирующиеся на новейших результатах исследований, которые выполняются на уровне элементов для вывода данных.
  • Долговременные коррекции интенсивности потока данных, базирующиеся на выявленных в ходе исследований тенденциях, которые выполняются на уровне элементов для вывода данных.

Также приложение может вносить искусственную задержку между операциями синхронизации буферов данных, причем описанный прием обычно называют дросселированием. Он может использоваться, к примеру, для ограничения или снижения частоты кадров видео.

19.1. Измерение параметров качества сервиса

Элементы, которые осуществляют синхронизацию буферов данных с использованием данных таймера конвейера, обычно также занимаются измерением параметров качества сервиса. Кроме того, им приходится хранить некоторый объем статистических данных для генерации событий с информацией о качестве сервиса.

При обработке каждого достигающего элемента для вывода данных буфера данных, этот элемент должен рассчитать насколько позже или раньше положенного времени был доставлен буфер данных. Полученный в результате этого расчета параметр называют джиттером (англ. jitter - дрожание). Отрицательные значения джиттера говорят о том, что буфер данных был доставлен раньше положенного времени, положительные - позже положенного времени. Само значение джиттера указывает на то, насколько раньше или позже положенного времени был доставлен буфер данных.

Осуществляющий синхронизацию элемент также должен рассчитывать время, прошедшее между приемом двух последовательно переданных буферов данных. Мы называем этот параметр временем обработки, так как это время, которое требуется расположенному против направления конвейера элементу для создания/обработки буфера данных. Мы можем сравнить это время обработки с продолжительностью фрагмента мультимедийного потока в буфере данных для оценки того, как быстро расположенный против направления конвейера элемент может генерировать данные, причем этот параметр называется пропорцией. В том случае, если, к примеру, расположенный против направления конвейера элемент может генерировать по одному буферу данных каждые 0.5 секунды, причем сам фрагмент мультимедийного потока в этом буфере будет иметь продолжительность, равную 1 секунде, элемент будет работать со скоростью, в два раза превышающей необходимую. Если же, с другой стороны, ему требуется 2 секунды для генерации буфера данных, полезные данные которого представляют фрагмент мультимедийного потока с продолжительностью, равной 1 секунде, этот расположенный против направления конвейера элемент генерирует буферы данных слишком медленно и нам не удастся поддерживать синхронизацию. Как правило, для пропорции используются среднее скользящее значение.

Осуществляющий синхронизацию элемент также должен измерять свою производительность для того, чтобы выяснить, являются ли источником проблемы расположенные против направления конвейера элементы или он сам.

Результаты описанных измерений используются для формирования события с информацией о качестве сервиса (QoS), которое будет передано против направления конвейера. Обратите внимание на то, что передача события с информацией о качестве сервиса (QoS) осуществляется для каждого из буферов данных, принятых элементом для вывода данных.

19.2. Обработка событий с информацией о качестве сервиса (QoS)

Для приема событий с информацией о качестве сервиса (QoS) на уровне элемента должна быть установлена функция обработки событий объекта выходной точки соединения этого элемента. Обычно на уровне элемента также приходится хранить значения, передаваемые вместе с описываемым событием, для их последующего использования в рамках функции обработки данных. В коде элемента необходимо использовать функцию блокировки для защиты этих значений таким образом, как показано в примере ниже. Также следует убедиться в том, что вы передаете событие с информацией о качестве сервиса дальше по конвейеру.

При наличии описанных значений, характеризующих качество сервиса, элемент может осуществлять два типа коррекций.

19.2.1. Кратковременная коррекция

Значения метки времени (timestamp) и джиттера (jitter) из события с информацией о качестве сервиса (QoS) могут использоваться для выполнения кратковременной коррекции. В том случае, если значение джиттера положительно, предыдущий буфер данных прибыл с запозданием и мы можем быть уверены в том, что буфер данных со значением метки времени timestamp < timestamp + jitter также прибудет с запозданием. Исходя из этого, мы можем отбросить все буферы данных со значением метки времени, меньшим, чем сумма значений timestamp + jitter.

В том случае, если известна продолжительность фрагмента мультимедийного потока в буфере данных (duration), следующее наиболее вероятное значение метки времени буфера данных может быть вычислено по формуле: timestamp + 2 * jitter + duration.

Реализация возможного алгоритма коррекции может выглядеть аналогичным образом:

9.2.2. Долговременная коррекция

Долговременные коррекции выполняются несколько сложнее. Они основываются на значении пропорции, передаваемом в рамках события с информацией о качестве сервиса (QoS). Элементы должны сокращать объем потребляемых ресурсов в соответствии со значением упомянутого поля пропорции сообщения с информацией о качестве сервиса (QoS).

Ниже приведены описания нескольких стратегий, направленных на достижение этой цели:
  • Постоянный пропуск кадров или сокращение требований к центральному процессору и пропускной способности оперативной памяти со стороны элемента. Некоторые декодеры могут пропускать этап декодирования обратных кадров (B-frames).
  • Переход к использованию алгоритма обработки мультимедийных данных с низким качеством или снижение алгоритмической сложности. В этом случае следует позаботиться о том, чтобы изменения не привели к появлению раздражающих визуальных или звуковых искажений.
  • Переход к использованию источника данных более низкого качества для уменьшения нагрузки на сеть.
  • Выделение большего количества циклов центрального процессора для критически важных частей конвейера. Это может быть сделано, например, путем повышения приоритета соответствующего программного потока.

Во всех случаях элементы должны быть подготовлены к переходу к своей нормальной интенсивности обработки данных в тот момент, когда поле пропорции из события с информацией о качестве сервиса (QoS) вновь будет содержать идеальное значение пропорции 1.0.

9.3. Дросселирование

Элементы, осуществляющие синхронизацию мультимедийных потоков на основе данных таймера конвейера, должны реализовывать свойство, позволяющее настроить их в работу в режиме дросселирования. В режиме дросселирования интервал времени между обработкой двух буферов данных поддерживается равным заданному интервалу дросселирования. Это значит, что эффективная интенсивность обработки буферов данных будет ограничиваться 1 буфером данных в течение интервала дросселирования. Описанный механизм может использоваться, например, для ограничения частоты кадров видео.

В том случае, если элемент настроен для работы в режиме дросселирования (обычно этот режим реализуется только в элементах для вывода данных), он должен генерировать события с информацией о качестве сервиса (QoS) и передавать их элементам, расположенным против направления конвейера, причем значение поля джиттера (jitter) должно быть установлено равным интервалу дросселирования. Это значение должно служить инструкцией для расположенных против направления конвейера элементов, в соответствии с которой они должны пропустить или отбросить оставшиеся буферы данных, которые невозможно обработать в рамках заданного интервала дросселирования.

Значение поля пропорции должно устанавливаться в соответствии с желаемым замедлением, необходимым для достижения желаемого интервала дросселирования. При реализации элементов для настройки их поведения может использоваться идентификатор типа дросселирования, а также значения полей пропорции и джиттера.

Стандартный базовый класс элемента для вывода данных имеет свойство периода дросселирования под названием "throttle-time", используемое для реализации описываемой возможности. Вы можете протестировать ее с помощью команды: gst-launch-1.0 videotestsrc ! xvimagesink throttle-time=500000000

9.4. Сообщения с информацией о качестве сервиса

В дополнение к событиям с информацией о качестве сервиса (QoS), которые передаются между элементами конвейера, существуют сообщения с информацией о качестве сервиса, которые передаются посредством шины сообщений конвейера с целью информирования приложения о решениях, принятых элементами на основе событий с информацией о качестве сервиса (QoS). Сообщение с информацией о качестве сервиса (QoS) содержит метки времени, соответствующие событиям пропуска фрагментов потока данных вместе со счетчиками количества пропущенных и обработанных фрагментов потока данных. Элементы должны отправлять сообщения с информацией о качестве сервиса в следующих ситуациях:
  • Элемент пропускает буфер данных в связи со значениями параметров качества сервиса (QoS).
  • Элемент изменяет свою стратегию обработки мультимедийного потока в связи со значениями параметров качества сервиса (QoS) (изменяет качество его обработки). Эта операция может осуществляться декодером, принимающим решение о пропуске каждого обратного кадра (B-frame) для повышения скорости обработки мультимедийного потока или элементом с реализацией эффекта, переходящим использованию алгоритма более низкого качества.

Следующий раздел : Поддержка динамических параметров.