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

UnixForum





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

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

Оригинал: 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 г.
Перевод: А.Панин
Дата перевода: 27 июля 2014 г.

Глава 14. Согласование возможностей

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

14.1. Основные аспекты процесса согласования возможностей

Согласование используемого мультимедийного формата в рамках фреймворка GStreamer всегда осуществляется в соответствии со следующими простыми правилами:
  • Элемент, расположенный по направлению конвейера, предлагает формат с помощью своей входной точки соединения и передает информацию о предложенном формате в ответе на запрос информации о возможностях CAPS, отправленный его на входную точку соединения. Также следует обратиться к разделу под названием "Реализация функции обработки запроса информации о возможностях CAPS".
  • Элемент, расположенный против направления конвейера, может выбрать формат. Он отправит информацию о выбранном мультимедийном формате по направлению конвейера вместе с событием согласования возможностей CAPS. Элементы, расположенные по направлению конвейера произведут перенастройку для обработки типа мультимедийных данных, который был описан в рамках события согласования возможностей CAPS, принятого с помощью входных точек соединения.
  • Элемент, расположенный по направлению конвейера, может проинформировать элементы, находящиеся против направления конвейера, о том, что он хочет предложить новый формат, путем отправки события повторной настройки RECONFIGURE против направления конвейера. Событие повторной настройки RECONFIGURE просто инструктирует расположенный против направления конвейера элемент о том, что следует повторно начать фазу согласования возможностей. Так как элемент, отправивший событие повторной настройки RECONFIGURE предлагает отличный формат, используемый в рамках конвейера формат может измениться.

В дополнение к событиям согласования возможностей CAPS и повторной настройки RECONFIGURE, а также запросу информации о возможностях CAPS, существует запрос соответствия возможностей ACCEPT_CAPS, используемый для быстрой проверки соответствия определенных возможностей возможностям элемента.

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

14.2. Случаи использования механизма согласования возможностей

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

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

14.2.1. Фиксированное согласование возможностей

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

Элементы, которые могут реализовывать механизм фиксированного согласования возможностей (с помощью своих выходных точек соединения), в основном являются элементами, которые не поддерживают повторную настройку. Примерами таких элементов являются:
  • Элементы определения типа мультимедийного потока, так как тип этого потока задан на уровне самого потока данных и, таким образом, не может быть повторно согласован. Элемент определения типа мультимедийного потока будет исследовать поток байт, определять тип потока данных и отправлять событие согласования возможностей CAPS с информацией о возможностях, после чего начинать отправку буферов данных установленного типа.
  • Практически все демультиплексоры, так как содержащиеся в основном потоке данных элементарные потоки данных описываются в заголовочных секциях файлов и, таким образом, их типы не могут повторно согласовываться.
  • Некоторые декодеры, работающие с потоками данных, формат которых устанавливается на уровне этих потоков и не обуславливается возможностями связанного элемента, а также сам декодер не является перенастраиваемым.
  • Некоторые элементы для ввода данных, которые генерируют данные фиксированного формата.
Функция gst_pad_use_fixed_caps () используется по отношению к объекту выходной точки соединения с фиксированными возможностями. В то время, когда возможности точки соединения не согласованы, обычный запрос информации о возможностях CAPS будет возвращать информацию о возможностях, описанных в шаблоне точки соединения. Как только возможности точки соединения согласовываются, запрос информации о возможностях CAPS будет возвращать информацию о согласованных возможностях (и ничего более). Ниже приведены соответствующие фрагменты кода для работы с выходными точками соединения с фиксированными возможностями.
[..]
  pad = gst_pad_new_from_static_template (..);
  gst_pad_use_fixed_caps (pad);
[..]
После этого фиксированные возможности могут быть поставлены в соответствие точке соединения с помощью функции gst_pad_set_caps ().
[..]
    caps = gst_caps_new_simple ("audio/x-raw",
        "format", G_TYPE_STRING, GST_AUDIO_NE(F32),
        "rate", G_TYPE_INT, <samplerate>,
        "channels", G_TYPE_INT, <num-channels>, NULL);
    if (!gst_pad_set_caps (pad, caps)) {
      GST_ELEMENT_ERROR (element, CORE, NEGOTIATION, (NULL),
          ("Дополнительная отладочная информация"));
      return GST_FLOW_ERROR;
    }
[..]

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

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

14.2.2. Согласование возможностей с преобразованием

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

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

Элементы рассматриваемого типа обычно устанавливают возможности на уровне своей выходной точки соединения из функции обработки событий _event (), связанной с входной точкой соединения, в момент приема события согласования возможностей CAPS. Это значит, что функция преобразования возможностей преобразует фиксированные возможности в другие фиксированные возможности. Примерами таких элементов являются:
  • Элемент добавления обрамления в видео. Он добавляет настраиваемую рамку вокруг изображения в зависимости от параметров соответствующего объекта.
  • Элементы для модификации данных. Это все элементы, которые не изменяют формат данных, а изменяют исключительно сами данные. Элементы с реализациями аудио- и видеоэффектов являются примерами таких элементов. Другими примерами таких элементов являются элементы, которые исследуют поток данных.
  • Некоторые декодеры и кодировщики, которые предусматривают зависимость выходного формата потока данных от его входного формата, такие, как mulawdec и mulawenc. Эти декодеры обычно не используют заголовки, в которых указывается тип содержимого потока данных. Чаще всего они выполняют больше функций, чем обычные элементы для преобразования потока данных.

Ниже приведен пример реализации этапов согласования возможностей в рамках типичного элемента преобразования потока данных. В обработчике события согласования возможностей CAPS входной точки соединения мы определяем возможности выходной точки соединения и устанавливаем их.

14.2.3. Динамическое согласование возможностей

Последним методом согласования возможностей является наиболее сложный и мощный метод динамического согласования возможностей.

Как и в случае согласования возможностей с преобразованием, описанном в разделе под названием "Согласование возможностей с преобразованием", при динамическом согласовании возможностей будет выполняться преобразование возможностей связанных элементов, расположенных по обоим направлениям. Но в отличие от согласования возможностей с преобразованием, в данном случае будет осуществляться преобразование фиксированных возможностей в нефиксированные. Это значит, что возможности входной точки соединения могут быть преобразованы в нефиксированные возможности (описывающие множество форматов). На уровне выходной точки соединения будет необходимо осуществить выбор одного формата из всех возможных. Можно предположить, что этот выбор заключается в подборе формата, при использовании которого затрачивается меньшее количество ресурсов, но на самом деле он не должен быть именно таким. Выбор формата должен также зависеть от возможностей, которые поддерживаются элементом, расположенным по направлению конвейера (обратитесь к описанию функции запроса информации о возможностях QUERY_CAPS в разделе "Реализация функции обработки запроса информации о возможностях CAPS").

Обычно процесс динамического согласования возможностей протекает следующим образом:
  • Информация о возможностях принимается с помощью входной точки соединения элемента.
  • В том случае, если элемент предпочитает работать в режиме передачи данных, осуществляется проверка совместимости возможностей с возможностями элемента, расположенного по направлению конвейера, посредством отправки запроса соответствия возможностей ACCEPT_CAPS. В том случае, если возможности совместимы, мы можем завершить процесс согласования возможностей и начать работу в режиме передачи потока данных.
  • Осуществляется выбор приемлемых возможностей выходной точки соединения.
  • Запрос списка возможностей направляется входной точке соединения находящегося по направлению конвейера элемента.
  • Осуществляется выбор возможностей из списка возможностей, полученного от расположенного по направлению конвейера элемента, в соответствии с которыми будет осуществляться преобразование потока, а также устанавливаются выходные возможности. При необходимости работы с фиксированными возможностями, вы можете зафиксировать их, использовав какие-либо подходящие стандартные значения.
Примерами таких элементов являются:
  • Элементы для преобразования форматов потоков данных, такие, как videoconvert, audioconvert, audioresample, videoscale, ...
  • Элементы для ввода данных, такие, как audiotestsrc, videotestsrc, v4l2src, pulsesrc, ...

Давайте рассмотрим пример элемента, который может преобразовывать частоты дискретизации аудиопотока, поэтому входная и выходная частоты дискретизации не должны быть равными:

14.3. Повторное согласование возможностей с находящимся против направления конвейера элементом

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

Запрос повторного согласования возможностей с находящимися против направления конвейера элементами осуществляется путем отправки события повторной настройки элементов GST_EVENT_RECONFIGURE против направления конвейера. Идея заключается в том, что это событие должно проинструктировать находящийся против направления конвейера элемент о необходимости повторной настройки его возможностей путем отправки нового запроса информации о поддерживаемых возможностях с последующим выбором новых возможностей. Элемент, который отправляет событие повторной настройки элемента RECONFIGURE, должен влиять на выбор новых возможностей, возвращая информацию о новых предпочтительных возможностях из функции обработки запроса информации о возможностях GST_QUERY_CAPS. В ходе передачи события повторной настройки элемента RECONFIGURE будет установлен флаг GST_PAD_FLAG_NEED_RECONFIGURE всех объектов участвующих в передаче события точек соединения.

Важно понимать, что разные элементы на самом деле имеют разные обязанности в процессе повторной настройки:
  • Элементы, которые желают предложить новый формат расположенным против направления конвейера элементам должны в первую очередь проверить, совместимы ли предлагаемые возможности с возможностями расположенного против направления конвейера элемента путем отправки запроса соответствия возможностей ACCEPT_CAPS. После этого они должны отправлять событие повторной настройки элемента RECONFIGURE и быть готовыми к отправке ответа на запрос информации о возможностях CAPS, содержащего информацию о новом предпочтительном формате. Важно помнить о том, что в ситуации, когда против направления конвейера не существует элемента, который способен (или желает) провести повторную настройку, рассматриваемый элемент должен продолжить работу с ранее выбранным форматом.
  • Элементы, которые осуществляют согласование возможностей с преобразованием, в соответствии с информацией из раздела под названием "Согласование возможностей с преобразованием", передают событие повторной настройки элемента RECONFIGURE против направления конвейера. Так как эти элементы просто выполняют фиксированное преобразование потока данных на основе возможностей расположенного против направления конвейера элемента, они должны отправлять событие находящемуся против направления конвейера элементу для того, чтобы он выбрал новый формат.
  • Элементы, которые осуществляют фиксированное согласование возможностей (описанные в разделе под названием "Фиксированное согласование возможностей") отбрасывают событие повторной настройки элемента RECONFIGURE. Эти элементы не могут осуществить повторную настройку и возможности их выходных точек соединения не зависят от возможностей находящихся против направления конвейера элементов, поэтому событие может быть просто отброшено.
  • Элементы, которые могут повторно настроить формат данных, передаваемых с помощью их выходных точек соединения (выходные точки соединения участвуют в динамическом согласовании возможностей, которое описано в разделе под названием "Динамическое согласование возможностей"), должны проверять состояние флага NEED_RECONFIGURE соответствующего объекта с помощью вызова функции gst_pad_check_reconfigure () и начинать повторную настройку в том случае, если упомянутая функция возвращает значение TRUE.

14.4. Реализация функции обработки запроса информации о возможностях CAPS

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

14.5. Согласование возможностей при работе элемента в режиме заполнения

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

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


Следующий раздел : Резервирование памяти.