Small fixes to video thumbnailing

This commit is contained in:
Nicolas Werner 2022-03-22 01:19:48 +01:00
parent 15c946207a
commit 96aacf8068
No known key found for this signature in database
GPG key ID: C8D75E610773F2D9

View file

@ -55,33 +55,7 @@ MediaUpload::thumbnailDataUrl() const
bool bool
InputVideoSurface::present(const QVideoFrame &frame) InputVideoSurface::present(const QVideoFrame &frame)
{ {
QImage::Format format = QImage::Format_Invalid; QImage::Format format = QVideoFrame::imageFormatFromPixelFormat(frame.pixelFormat());
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;
}
if (format == QImage::Format_Invalid) { if (format == QImage::Format_Invalid) {
emit newImage({}); emit newImage({});
@ -95,11 +69,14 @@ InputVideoSurface::present(const QVideoFrame &frame)
} }
// this is a shallow operation. it just refer the frame buffer // this is a shallow operation. it just refer the frame buffer
QImage image(frametodraw.bits(), QImage image(qAsConst(frametodraw).bits(),
frametodraw.width(), frametodraw.width(),
frametodraw.height(), frametodraw.height(),
frametodraw.bytesPerLine(), frametodraw.bytesPerLine(),
format); format);
image.detach();
frametodraw.unmap();
emit newImage(std::move(image)); emit newImage(std::move(image));
return true; return true;
@ -820,14 +797,16 @@ MediaUpload::MediaUpload(std::unique_ptr<QIODevice> source_,
} else if (mimeClass_ == u"video" || mimeClass_ == u"audio") { } else if (mimeClass_ == u"video" || mimeClass_ == u"audio") {
auto mediaPlayer = new QMediaPlayer( auto mediaPlayer = new QMediaPlayer(
this, this,
mimeClass_ == u"video" ? QFlags{QMediaPlayer::StreamPlayback, QMediaPlayer::VideoSurface} mimeClass_ == u"video" ? QFlags{QMediaPlayer::VideoSurface} : QMediaPlayer::Flags{});
: QFlags{QMediaPlayer::StreamPlayback});
mediaPlayer->setMuted(true); mediaPlayer->setMuted(true);
if (mimeClass_ == u"video") { if (mimeClass_ == u"video") {
auto newSurface = new InputVideoSurface(this); auto newSurface = new InputVideoSurface(this);
connect( connect(
newSurface, &InputVideoSurface::newImage, this, [this, mediaPlayer](QImage img) { newSurface, &InputVideoSurface::newImage, this, [this, mediaPlayer](QImage img) {
if (img.size().isEmpty())
return;
mediaPlayer->stop(); mediaPlayer->stop();
auto orientation = mediaPlayer->metaData(QMediaMetaData::Orientation).toInt(); auto orientation = mediaPlayer->metaData(QMediaMetaData::Orientation).toInt();
@ -882,11 +861,15 @@ MediaUpload::MediaUpload(std::unique_ptr<QIODevice> source_,
if (mediaPlayer->duration() > 0) if (mediaPlayer->duration() > 0)
this->duration_ = mediaPlayer->duration(); this->duration_ = mediaPlayer->duration();
dimensions_ = mediaPlayer->metaData(QMediaMetaData::Resolution).toSize(); auto dimensions = mediaPlayer->metaData(QMediaMetaData::Resolution).toSize();
auto orientation = mediaPlayer->metaData(QMediaMetaData::Orientation).toInt(); if (!dimensions.isEmpty()) {
dimensions_ = dimensions;
auto orientation =
mediaPlayer->metaData(QMediaMetaData::Orientation).toInt();
if (orientation == 90 || orientation == 270) { if (orientation == 90 || orientation == 270) {
dimensions_.transpose(); dimensions_.transpose();
} }
}
}); });
connect(mediaPlayer, &QMediaPlayer::durationChanged, [this, mediaPlayer](qint64 duration) { connect(mediaPlayer, &QMediaPlayer::durationChanged, [this, mediaPlayer](qint64 duration) {
if (duration > 0) { if (duration > 0) {