|qmake:||QT += multimedia|
|virtual QVideoFrame||run(QVideoFrame *input, const QVideoSurfaceFormat &surfaceFormat, QVideoFilterRunnable::RunFlags flags) = 0|
The QVideoFilterRunnable class represents the implementation of a filter that owns all graphics and computational resources, and performs the actual filtering or calculations.
Video filters are split into QAbstractVideoFilter and corresponding QVideoFilterRunnable instances, similar to QQuickItem and QSGNode. This is necessary to support threaded rendering scenarios. When using the threaded render loop of the Qt Quick scene graph, all rendering happens on a dedicated thread. QVideoFilterRunnable instances always live on this thread and all its functions, run(), the constructor, and the destructor, are guaranteed to be invoked on that thread with the OpenGL context bound. QAbstractVideoFilter instances live on the main (GUI) thread, like any other QObject and QQuickItem instances created from QML.
Once created, QVideoFilterRunnable instances are managed by Qt Multimedia and will be automatically destroyed and recreated when necessary, for example when the scene graph is invalidated or the QQuickWindow changes or is closed. Creation happens via the QAbstractVideoFilter::createFilterRunnable() factory function.
See also QAbstractVideoFilter.
||Indicates that the filter runnable's associated QAbstractVideoFilter is the last in the corresponding VideoOutput type's filters list, meaning that the returned frame is the one that is going to be presented to the scene graph without invoking any further filters.|
The RunFlags type is a typedef for QFlags<RunFlag>. It stores an OR combination of RunFlag values.
[pure virtual]QVideoFrame QVideoFilterRunnable::run(QVideoFrame *input, const QVideoSurfaceFormat &surfaceFormat, QVideoFilterRunnable::RunFlags flags)
Reimplement this function to perform filtering or computation on the input video frame. Like the constructor and destructor, this function is always called on the render thread with the OpenGL context bound.
Implementations that do not modify the video frame can simply return input.
It is safe to access properties of the associated QAbstractVideoFilter instance from this function.
surfaceFormat provides additional information, for example it can be used to determine which way is up in the input image as that is important for filters to operate on multiple platforms with multiple cameras.
flags contains additional information about the filter's invocation. For example the LastInChain flag indicates that the filter is the last in a VideoOutput's associated filter list. This can be very useful in cases where multiple filters are chained together and the work is performed on image data in some custom format (for example a format specific to some computer vision framework). To avoid conversion on every filter in the chain, all intermediate filters can return a QVideoFrame hosting data in the custom format. Only the last, where the flag is set, returns a QVideoFrame in a format compatible with Qt.
Note: Avoid time consuming operations in this function as they block the entire rendering of the application.
Note: The handleType() and pixelFormat() of input is completely up to the video decoding backend on the platform in use. On some platforms different forms of input are used depending on the graphics stack. For example, when playing back videos on Windows with the WMF backend, QVideoFrame contains OpenGL-wrapped Direct3D textures in case of using ANGLE, but regular pixel data when using desktop OpenGL (opengl32.dll). Similarly, the video file format will often decide if the data is RGB or YUV, but this may also depend on the decoder and the configuration in use. The returned video frame does not have to be in the same format as the input, for example a filter with an input of a QVideoFrame backed by system memory can output a QVideoFrame with an OpenGL texture handle.