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