Класс QVideoFilterRunnable
Класс QVideoFilterRunnable представляет собой реализацию фильтра, владеющего всеми графическими и вычислительными ресурсами и выполняющего фактическое фильтрацию или вычисления. Подробнее...
| Заголовок: | #include <QVideoFilterRunnable> |
| qmake: | QT += multimedia |
| С момента: | Qt 5.5 |
Этот класс был представлен в Qt 5.5.
Типы публичного доступа
| Перечисление | RunFlag { LastInChain } |
| флаги | RunFlags |
Публичные функции
| виртуальный QVideoFrame | run(QVideoFrame *input, const QVideoSurfaceFormat &surfaceFormat, QVideoFilterRunnable::RunFlags flags) = 0 |
Подробное описание
Видеофильтры разделены на 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 заблокирован в это время, но запись может стать проблематичной.
Примечание: Избегайте длительных операций в этой функции, так как они блокируют весь рендеринг приложения.
Примечание: Обработка input полностью зависит от платформы и бэкенда декодирования видео. На некоторых платформах используются различные формы ввода, в зависимости от графического стека. Например, при воспроизведении видео на Windows с бэкендом WMF, QVideoFrame содержит текстуры Direct3D, обернутые OpenGL в случае использования 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.13/qvideofilterrunnable.html