Spec-Zone.ru › Qt 5.9

Класс QVideoFilterRunnable

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

Заголовок: #include <QVideoFilterRunnable>
qmake: QT += multimedia
С момента: Qt 5.5
  • Список всех членов, включая унаследованные

Типы общего доступа

Перечисление RunFlag { LastInChain }
Флаги RunFlags

Функции общего доступа

virtual QVideoFrame run(QVideoFrame *input, const QVideoSurfaceFormat &surfaceFormat, RunFlags flags) = 0

Подробное описание

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

Видеофильтры разделены на экземпляры QAbstractVideoFilter и соответствующие экземпляры QVideoFilterRunnable, аналогично QQuickItem и QSGNode. Это необходимо для поддержки многопоточных сценариев рендеринга. При использовании многопоточной петли рендеринга графического движка Qt Quick все рендеринг выполняется в отдельном потоке. Экземпляры QVideoFilterRunnable всегда находятся в этом потоке, и все его функции, run(), конструктор и деструктор, гарантированно вызываются в этом потоке с привязанным контекстом OpenGL. Экземпляры QAbstractVideoFilter находятся в основном (GUI) потоке, как и любой другой QObject и экземпляры QQuickItem, созданные из QML.

После создания экземпляры QVideoFilterRunnable управляются Qt Multimedia и будут автоматически уничтожаться и пересоздаваться при необходимости, например, при недействительности графического движка или изменении или закрытии QQuickWindow. Создание происходит через фабричную функцию QAbstractVideoFilter::createFilterRunnable().

См. также QAbstractVideoFilter.

Документация по типам членов

Перечисление QVideoFilterRunnable::RunFlagФлаги QVideoFilterRunnable::RunFlags

Константа Значение Описание
QVideoFilterRunnable::LastInChain 0x01 Указывает, что связанный с фильтром QAbstractVideoFilter является последним в списке фильтров соответствующего типа VideoOutput, что означает, что возвращаемый кадр — это тот, который будет представлен графическому движку без вызова дополнительных фильтров.

Тип RunFlags является typedef для QFlags<RunFlag>. Он хранит логическое ИЛИ сочетание значений RunFlag.

Документация по функциям-членам

[pure virtual] QVideoFrame QVideoFilterRunnable::run(QVideoFrame *input, const QVideoSurfaceFormat &surfaceFormat, RunFlags flags)

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

Реализации, которые не изменяют видеокадр, могут просто вернуть input.

Безопасно обращаться к свойствам связанного экземпляра QAbstractVideoFilter из этой функции.

input не будет отображаться, эта функция должна вызвать QVideoFrame::map() и QVideoFrame::unmap() по мере необходимости.

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

flags содержит дополнительную информацию о вызове фильтра. Например, флаг LastInChain указывает, что фильтр является последним в списке фильтров, связанных с VideoOutput. Это может быть очень полезно в тех случаях, когда несколько фильтров объединены вместе, и работа выполняется над данными изображения в некотором пользовательском формате (например, формате, специфичном для какой-либо компьютерной платформы). Чтобы избежать преобразования в каждом фильтре цепочки, все промежуточные фильтры могут возвращать QVideoFrame, содержащий данные в пользовательском формате. Только последний, где установлен флаг, возвращает QVideoFrame в формате, совместимом с Qt.

Фильтры, которые хотят экспонировать результаты своих вычислений коду Javascript в QML, могут объявлять свои собственные пользовательские сигналы в подклассе QAbstractVideoFilter, чтобы указать завершение операции. Для фильтров, которые только рассчитывают некоторые результаты и не изменяют видеокадр, также возможно выполнять операции асинхронно. Они могут помещать необходимые операции в очередь, используя API вычислений, и возвращаться из этой функции без отправки каких-либо сигналов. Сигнал, указывающий на завершение, затем отправляется только тогда, когда API вычислений указывает, что операции были выполнены и результаты доступны. Рекомендуется представлять выходные данные фильтра как отдельный экземпляр QJSValue или производный от QObject класс, который передается в качестве параметра сигналу и становится доступным для Javascript-движка. В случае QObject владение этим объектом контролируется стандартными правилами QML: если у него нет родителя, владение передается Javascript-движку, в противном случае оно остается у отправителя. Обратите внимание, что соединение сигнала может быть помещено в очередь, например, при использовании многопоточной петли рендеринга Qt Quick, поэтому объект должен оставаться допустимым в течение более длительного времени; уничтожение его сразу после вызова этой функции небезопасно. Использование отдельного объекта результатов гарантирует безопасность даже при использовании многопоточного рендеринга. Это не обязательно относится к свойствам самого экземпляра QAbstractVideoFilter: свойства можно безопасно читать в run(), поскольку GUI-поток заблокирован в это время, но запись может стать проблематичной.

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

Примечание: Тип handleType() и pixelFormat() объекта input полностью зависит от бэкенда декодирования видео на используемой платформе. На некоторых платформах используются различные формы ввода в зависимости от графического стека. Например, при воспроизведении видео на Windows с бэкендом WMF, QVideoFrame содержит обернутые в OpenGL текстуры Direct3D в случае использования ANGLE, но обычные пиксельные данные при использовании настольного OpenGL (opengl32.dll). Аналогичным образом, формат видеофайла часто определяет, является ли данные RGB или YUV, но это также может зависеть от декодера и используемой конфигурации. Возвращаемый видеокадр не обязательно должен быть в том же формате, что и входной, например, фильтр с входным QVideoFrame, поддерживаемым системной памятью, может выводить QVideoFrame с дескриптором текстуры OpenGL.

См. также QVideoFrame и QVideoSurfaceFormat.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.9/qvideofilterrunnable.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API