Класс 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 заблокирован в это время, но запись может стать проблематичной.
Примечание: Избегайте длительных операций в этой функции, поскольку они блокируют весь процесс рендеринга приложения.
Примечание: Тип 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.14/qvideofilterrunnable.html