この回答に基づいて、 Qt を使用QGLWidget
してビデオをレンダリングしようとしていますが、いくつか問題があります。ビデオ デコード スレッドでデコードした直後にフレームを保存すると、問題なく出力されます。
しかし、それを描くと、ひどく壊れてしまいます。
画像をコピーしているようで、コピーが完了していませんが、
ミューテックスを使用して、描画コードの描画中に画像が触れられないようにしています。
へのポインターを
QImage
描画コードに渡すので、同じメモリ チャンクにする必要があります。
デコードスレッドには、次のものがあります。
/* Read in the frame up here, skipped for brevity */
// Set a new image
auto frameImage = make_shared<QImage>(nextFrame->getPixels(),
nextFrame->getWidth(),
nextFrame->getHeight(),
QImage::Format_RGB888);
canvas->setImage(frameImage);
// Post a new order to repaint.
// Done this way because another thread cannot directly call repaint()
QCoreApplication::postEvent(canvas, new QPaintEvent(canvas->rect()));
次に、キャンバス ( から派生QGLWidget
) で:
void QGLCanvas::setImage(const std::shared_ptr<QImage>& image)
{
// Keep the QGL canvas from drawing while we change the image
lock_guard<mutex> pixelLock(pixelsMutex);
img = image; // img is just a shared_ptr
}
void QGLCanvas::paintEvent(QPaintEvent*)
{
QPainter painter(this);
painter.setRenderHint(QPainter::SmoothPixmapTransform, 1);
// Lock the image so that other threads can't access it at the same time
lock_guard<mutex> pixelLock(pixelsMutex);
painter.drawImage(this->rect(), *img);
}
何が起きてる?