Класс 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 экземпляр QVideoFilterRunnable является последним в списке фильтров соответствующего типа 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.12/qvideofilterrunnable.html