Класс QVideoFilterRunnable
Класс QVideoFilterRunnable представляет реализацию фильтра, который владеет всеми графическими и вычислительными ресурсами и выполняет фактическое фильтрацию или вычисления. Подробнее...
| Заголовок: | #include <QVideoFilterRunnable> |
| qmake: | QT += multimedia |
| С момента: | Qt 5.5 |
Этот класс был представлен в Qt 5.5.
Типы публичного доступа
| Перечисление | RunFlag { LastInChain } |
| флаги | RunFlags |
Функции публичного доступа
| virtual 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 содержит текстуры 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.15/qvideofilterrunnable.html