Класс QVideoFilterRunnable
Класс QVideoFilterRunnable представляет собой реализацию фильтра, который владеет всеми графическими и вычислительными ресурсами и выполняет фактическое фильтрацию или вычисления. Подробнее...
| Заголовок: | #include <QVideoFilterRunnable> |
| qmake: | QT += multimedia |
| С момента: | Qt 5.5 |
Публичные типы
| Перечисление | RunFlag { LastInChain } |
| флаги | RunFlags |
Публичные функции
| виртуальный QVideoFrame | run(QVideoFrame *input, const QVideoSurfaceFormat &surfaceFormat, QVideoFilterRunnable::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 является типом-синонимом для QFlags<RunFlag>. Он хранит логическое ИЛИ сочетание значений RunFlag.
Документация по функциям-членам
[pure virtual] QVideoFrame QVideoFilterRunnable::run(QVideoFrame *input, const QVideoSurfaceFormat &surfaceFormat, QVideoFilterRunnable::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/archives/qt-5.11/qvideofilterrunnable.html