I wish to achieve the following scenario in a QAbstractVideoSurface derived class called FrameHandler: class FrameInfo { public: unsigned int frameNumber; std::function<void(const FrameInfo &info)> frameFunction; // not sure this is right QImage image; };
class FrameHandler: public QAbstractVideoSurface { std::function<void(const FrameInfo &info)> frameFunction; FrameInfo *_currentFrameInfo; FrameHandler(std::function<void(const FrameInfo &info)> func, QObject *parent = NULL); ... }; bool FrameHandler::present(const QVideoFrame &frame) { frameInfo = new FrameInfo; frameInfo->frameFunction = frameFunction; frameInfo->frameNumber = frameCount; if (frame.pixelFormat() == QVideoFrame::Format_ARGB32) { QVideoFrame frame2 = frame; QSize size = frame2.size(); int bytes = frame.size().width() * frame.size().height() * 4; // 4=ARGB frameInfo->image = QImage(size, QImage::Format_ARGB32); frame2.map(QAbstractVideoBuffer::ReadOnly); memcpy(_currentFrameInfo->image.bits(), frame2.bits(), bytes); // takes about 1280x720 takes ~750 usec on a MBP frame2.unmap(); QFuture<void> future = QtConcurrent::run(frameFunction, frameInfo); // I can't find any way to pass these to work // QFuture<void> future = QtConcurrent::run(frameInfo, &FrameInfo::frameFunction); // QFuture<void> future = QtConcurrent::run(frameFunction, frameInfo); QFuture<void> future = QtConcurrent::run(frameFunction, frameInfo); } } // else where in the application (main.cpp) I'd like to do FrameHandler saver([] { QString filename = QString("test_%1.png").arg(info.frameNumber); info.image(filename); // will run on another core because of QtConcurrent::run(), takes about 600ms due to PNG compression }); How can I do this? _______________________________________________ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest