diff --git a/src/timeline/InputBar.cpp b/src/timeline/InputBar.cpp index b1877cd7..cdb5305f 100644 --- a/src/timeline/InputBar.cpp +++ b/src/timeline/InputBar.cpp @@ -55,33 +55,7 @@ MediaUpload::thumbnailDataUrl() const bool InputVideoSurface::present(const QVideoFrame &frame) { - QImage::Format format = QImage::Format_Invalid; - - switch (frame.pixelFormat()) { - case QVideoFrame::Format_ARGB32: - format = QImage::Format_ARGB32; - break; - case QVideoFrame::Format_ARGB32_Premultiplied: - format = QImage::Format_ARGB32_Premultiplied; - break; - case QVideoFrame::Format_RGB24: - format = QImage::Format_RGB888; - break; - case QVideoFrame::Format_BGR24: - format = QImage::Format_BGR888; - break; - case QVideoFrame::Format_RGB32: - format = QImage::Format_RGB32; - break; - case QVideoFrame::Format_RGB565: - format = QImage::Format_RGB16; - break; - case QVideoFrame::Format_RGB555: - format = QImage::Format_RGB555; - break; - default: - format = QImage::Format_Invalid; - } + QImage::Format format = QVideoFrame::imageFormatFromPixelFormat(frame.pixelFormat()); if (format == QImage::Format_Invalid) { emit newImage({}); @@ -95,11 +69,14 @@ InputVideoSurface::present(const QVideoFrame &frame) } // this is a shallow operation. it just refer the frame buffer - QImage image(frametodraw.bits(), + QImage image(qAsConst(frametodraw).bits(), frametodraw.width(), frametodraw.height(), frametodraw.bytesPerLine(), format); + image.detach(); + + frametodraw.unmap(); emit newImage(std::move(image)); return true; @@ -820,14 +797,16 @@ MediaUpload::MediaUpload(std::unique_ptr source_, } else if (mimeClass_ == u"video" || mimeClass_ == u"audio") { auto mediaPlayer = new QMediaPlayer( this, - mimeClass_ == u"video" ? QFlags{QMediaPlayer::StreamPlayback, QMediaPlayer::VideoSurface} - : QFlags{QMediaPlayer::StreamPlayback}); + mimeClass_ == u"video" ? QFlags{QMediaPlayer::VideoSurface} : QMediaPlayer::Flags{}); mediaPlayer->setMuted(true); if (mimeClass_ == u"video") { auto newSurface = new InputVideoSurface(this); connect( newSurface, &InputVideoSurface::newImage, this, [this, mediaPlayer](QImage img) { + if (img.size().isEmpty()) + return; + mediaPlayer->stop(); auto orientation = mediaPlayer->metaData(QMediaMetaData::Orientation).toInt(); @@ -882,10 +861,14 @@ MediaUpload::MediaUpload(std::unique_ptr source_, if (mediaPlayer->duration() > 0) this->duration_ = mediaPlayer->duration(); - dimensions_ = mediaPlayer->metaData(QMediaMetaData::Resolution).toSize(); - auto orientation = mediaPlayer->metaData(QMediaMetaData::Orientation).toInt(); - if (orientation == 90 || orientation == 270) { - dimensions_.transpose(); + auto dimensions = mediaPlayer->metaData(QMediaMetaData::Resolution).toSize(); + if (!dimensions.isEmpty()) { + dimensions_ = dimensions; + auto orientation = + mediaPlayer->metaData(QMediaMetaData::Orientation).toInt(); + if (orientation == 90 || orientation == 270) { + dimensions_.transpose(); + } } }); connect(mediaPlayer, &QMediaPlayer::durationChanged, [this, mediaPlayer](qint64 duration) {