mirror of
https://github.com/Nheko-Reborn/nheko.git
synced 2024-11-23 19:38:48 +03:00
Fix char out of range and media player signals
This commit is contained in:
parent
c775a93f77
commit
159bec3654
6 changed files with 91 additions and 103 deletions
|
@ -4040,9 +4040,8 @@ Cache::displayName(const QString &room_id, const QString &user_id)
|
||||||
static bool
|
static bool
|
||||||
isDisplaynameSafe(const std::string &s)
|
isDisplaynameSafe(const std::string &s)
|
||||||
{
|
{
|
||||||
for (uint32_t cc : QString::fromStdString(s).toStdU32String()) {
|
for (char32_t c : QString::fromStdString(s).toUcs4()) {
|
||||||
auto c = QChar(cc);
|
if (QChar::isPrint(c) && !QChar::isSpace(c))
|
||||||
if (c.isPrint() && !c.isSpace())
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
14
src/main.cpp
14
src/main.cpp
|
@ -285,15 +285,17 @@ main(int argc, char *argv[])
|
||||||
QLocale::setDefault(QLocale(QLocale::English, QLocale::UnitedKingdom));
|
QLocale::setDefault(QLocale(QLocale::English, QLocale::UnitedKingdom));
|
||||||
|
|
||||||
QTranslator qtTranslator;
|
QTranslator qtTranslator;
|
||||||
if(qtTranslator.load(QLocale(),
|
if (qtTranslator.load(QLocale(),
|
||||||
QStringLiteral("qt"),
|
QStringLiteral("qt"),
|
||||||
QStringLiteral("_"),
|
QStringLiteral("_"),
|
||||||
QLibraryInfo::path(QLibraryInfo::TranslationsPath)))
|
QLibraryInfo::path(QLibraryInfo::TranslationsPath)))
|
||||||
app.installTranslator(&qtTranslator);
|
app.installTranslator(&qtTranslator);
|
||||||
|
|
||||||
QTranslator appTranslator;
|
QTranslator appTranslator;
|
||||||
if(appTranslator.load(
|
if (appTranslator.load(QLocale(),
|
||||||
QLocale(), QStringLiteral("nheko"), QStringLiteral("_"), QStringLiteral(":/translations")))
|
QStringLiteral("nheko"),
|
||||||
|
QStringLiteral("_"),
|
||||||
|
QStringLiteral(":/translations")))
|
||||||
app.installTranslator(&appTranslator);
|
app.installTranslator(&appTranslator);
|
||||||
|
|
||||||
MainWindow w;
|
MainWindow w;
|
||||||
|
|
|
@ -5,20 +5,20 @@
|
||||||
|
|
||||||
#include "InputBar.h"
|
#include "InputBar.h"
|
||||||
|
|
||||||
#include <QVideoSink>
|
|
||||||
#include <QBuffer>
|
#include <QBuffer>
|
||||||
#include <QClipboard>
|
#include <QClipboard>
|
||||||
#include <QDropEvent>
|
#include <QDropEvent>
|
||||||
#include <QFileDialog>
|
#include <QFileDialog>
|
||||||
#include <QGuiApplication>
|
#include <QGuiApplication>
|
||||||
#include <QInputMethod>
|
#include <QInputMethod>
|
||||||
#include <QVideoFrame>
|
|
||||||
#include <QMediaMetaData>
|
#include <QMediaMetaData>
|
||||||
#include <QMediaPlayer>
|
#include <QMediaPlayer>
|
||||||
#include <QMimeData>
|
#include <QMimeData>
|
||||||
#include <QMimeDatabase>
|
#include <QMimeDatabase>
|
||||||
#include <QStandardPaths>
|
#include <QStandardPaths>
|
||||||
#include <QTextBoundaryFinder>
|
#include <QTextBoundaryFinder>
|
||||||
|
#include <QVideoFrame>
|
||||||
|
#include <QVideoSink>
|
||||||
|
|
||||||
#include <QRegularExpression>
|
#include <QRegularExpression>
|
||||||
#include <mtx/responses/common.hpp>
|
#include <mtx/responses/common.hpp>
|
||||||
|
@ -753,82 +753,80 @@ MediaUpload::MediaUpload(std::unique_ptr<QIODevice> source_,
|
||||||
QString::fromStdString(blurhash::encode(data_.data(), img.width(), img.height(), 4, 3));
|
QString::fromStdString(blurhash::encode(data_.data(), img.width(), img.height(), 4, 3));
|
||||||
} else if (mimeClass_ == u"video" || mimeClass_ == u"audio") {
|
} else if (mimeClass_ == u"video" || mimeClass_ == u"audio") {
|
||||||
auto mediaPlayer = new QMediaPlayer(this);
|
auto mediaPlayer = new QMediaPlayer(this);
|
||||||
|
|
||||||
mediaPlayer->setAudioOutput(nullptr);
|
mediaPlayer->setAudioOutput(nullptr);
|
||||||
|
|
||||||
if (mimeClass_ == u"video") {
|
if (mimeClass_ == u"video") {
|
||||||
auto newSurface = new QVideoSink(this);
|
auto newSurface = new QVideoSink(this);
|
||||||
connect(
|
connect(newSurface,
|
||||||
newSurface, &QVideoSink::videoFrameChanged, this, [this, mediaPlayer](const QVideoFrame& frame) {
|
&QVideoSink::videoFrameChanged,
|
||||||
QImage img = frame.toImage();
|
this,
|
||||||
|
[this, mediaPlayer](const QVideoFrame &frame) {
|
||||||
|
QImage img = frame.toImage();
|
||||||
|
|
||||||
if (img.size().isEmpty())
|
if (img.size().isEmpty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
mediaPlayer->stop();
|
mediaPlayer->stop();
|
||||||
|
|
||||||
auto orientation = mediaPlayer->metaData().value(QMediaMetaData::Orientation).toInt();
|
auto orientation =
|
||||||
if (orientation == 90 || orientation == 270 || orientation == 180) {
|
mediaPlayer->metaData().value(QMediaMetaData::Orientation).toInt();
|
||||||
img =
|
if (orientation == 90 || orientation == 270 || orientation == 180) {
|
||||||
img.transformed(QTransform().rotate(orientation), Qt::SmoothTransformation);
|
img = img.transformed(QTransform().rotate(orientation),
|
||||||
}
|
Qt::SmoothTransformation);
|
||||||
|
}
|
||||||
|
|
||||||
nhlog::ui()->debug("Got image {}x{}", img.width(), img.height());
|
nhlog::ui()->debug("Got image {}x{}", img.width(), img.height());
|
||||||
|
|
||||||
this->setThumbnail(img);
|
this->setThumbnail(img);
|
||||||
|
|
||||||
if (!dimensions_.isValid())
|
if (!dimensions_.isValid())
|
||||||
this->dimensions_ = img.size();
|
this->dimensions_ = img.size();
|
||||||
|
|
||||||
if (img.height() > 200 && img.width() > 360)
|
if (img.height() > 200 && img.width() > 360)
|
||||||
img = img.scaled(360, 200, Qt::KeepAspectRatioByExpanding);
|
img = img.scaled(360, 200, Qt::KeepAspectRatioByExpanding);
|
||||||
std::vector<unsigned char> data_;
|
std::vector<unsigned char> data_;
|
||||||
for (int y = 0; y < img.height(); y++) {
|
for (int y = 0; y < img.height(); y++) {
|
||||||
for (int x = 0; x < img.width(); x++) {
|
for (int x = 0; x < img.width(); x++) {
|
||||||
auto p = img.pixel(x, y);
|
auto p = img.pixel(x, y);
|
||||||
data_.push_back(static_cast<unsigned char>(qRed(p)));
|
data_.push_back(static_cast<unsigned char>(qRed(p)));
|
||||||
data_.push_back(static_cast<unsigned char>(qGreen(p)));
|
data_.push_back(static_cast<unsigned char>(qGreen(p)));
|
||||||
data_.push_back(static_cast<unsigned char>(qBlue(p)));
|
data_.push_back(static_cast<unsigned char>(qBlue(p)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
blurhash_ = QString::fromStdString(
|
blurhash_ = QString::fromStdString(
|
||||||
blurhash::encode(data_.data(), img.width(), img.height(), 4, 3));
|
blurhash::encode(data_.data(), img.width(), img.height(), 4, 3));
|
||||||
});
|
});
|
||||||
mediaPlayer->setVideoOutput(newSurface);
|
mediaPlayer->setVideoOutput(newSurface);
|
||||||
}
|
}
|
||||||
|
|
||||||
connect(mediaPlayer,
|
connect(mediaPlayer, &QMediaPlayer::errorChanged, this, [mediaPlayer]() {
|
||||||
&QMediaPlayer::error,
|
nhlog::ui()->debug("Media player error {} and errorStr {}",
|
||||||
this,
|
mediaPlayer->error(),
|
||||||
[mediaPlayer]() {
|
mediaPlayer->errorString().toStdString());
|
||||||
nhlog::ui()->debug("Media player error {} and errorStr {}",
|
});
|
||||||
mediaPlayer->error(),
|
|
||||||
mediaPlayer->errorString().toStdString());
|
|
||||||
});
|
|
||||||
connect(mediaPlayer,
|
connect(mediaPlayer,
|
||||||
&QMediaPlayer::mediaStatusChanged,
|
&QMediaPlayer::mediaStatusChanged,
|
||||||
[mediaPlayer](QMediaPlayer::MediaStatus status) {
|
[mediaPlayer](QMediaPlayer::MediaStatus status) {
|
||||||
nhlog::ui()->debug(
|
nhlog::ui()->debug(
|
||||||
"Media player status {} and error {}", status, mediaPlayer->error());
|
"Media player status {} and error {}", status, mediaPlayer->error());
|
||||||
});
|
});
|
||||||
connect(mediaPlayer,
|
connect(mediaPlayer, &QMediaPlayer::metaDataChanged, [this, mediaPlayer]() {
|
||||||
&QMediaPlayer::metaDataChanged,
|
nhlog::ui()->debug("Got metadata");
|
||||||
[this, mediaPlayer]() {
|
|
||||||
nhlog::ui()->debug("Got metadata");
|
|
||||||
|
|
||||||
if (mediaPlayer->duration() > 0)
|
if (mediaPlayer->duration() > 0)
|
||||||
this->duration_ = mediaPlayer->duration();
|
this->duration_ = mediaPlayer->duration();
|
||||||
|
|
||||||
auto dimensions = mediaPlayer->metaData().value(QMediaMetaData::Resolution).toSize();
|
auto dimensions = mediaPlayer->metaData().value(QMediaMetaData::Resolution).toSize();
|
||||||
if (!dimensions.isEmpty()) {
|
if (!dimensions.isEmpty()) {
|
||||||
dimensions_ = dimensions;
|
dimensions_ = dimensions;
|
||||||
auto orientation =
|
auto orientation =
|
||||||
mediaPlayer->metaData().value(QMediaMetaData::Orientation).toInt();
|
mediaPlayer->metaData().value(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) {
|
||||||
this->duration_ = mediaPlayer->duration();
|
this->duration_ = mediaPlayer->duration();
|
||||||
|
@ -841,7 +839,7 @@ MediaUpload::MediaUpload(std::unique_ptr<QIODevice> source_,
|
||||||
auto originalFile = qobject_cast<QFile *>(source.get());
|
auto originalFile = qobject_cast<QFile *>(source.get());
|
||||||
|
|
||||||
mediaPlayer->setSourceDevice(
|
mediaPlayer->setSourceDevice(
|
||||||
source.get(), QUrl(originalFile ? originalFile->fileName() : originalFilename_) );
|
source.get(), QUrl(originalFile ? originalFile->fileName() : originalFilename_));
|
||||||
|
|
||||||
mediaPlayer->play();
|
mediaPlayer->play();
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,27 +24,20 @@ MxcMediaProxy::MxcMediaProxy(QObject *parent)
|
||||||
{
|
{
|
||||||
connect(this, &MxcMediaProxy::eventIdChanged, &MxcMediaProxy::startDownload);
|
connect(this, &MxcMediaProxy::eventIdChanged, &MxcMediaProxy::startDownload);
|
||||||
connect(this, &MxcMediaProxy::roomChanged, &MxcMediaProxy::startDownload);
|
connect(this, &MxcMediaProxy::roomChanged, &MxcMediaProxy::startDownload);
|
||||||
connect(this,
|
connect(this, &MxcMediaProxy::error, [this]() {
|
||||||
&MxcMediaProxy::error,
|
nhlog::ui()->info(
|
||||||
[this]() {
|
"Media player error {} and errorStr {}", error(), this->errorString().toStdString());
|
||||||
nhlog::ui()->info("Media player error {} and errorStr {}",
|
});
|
||||||
error(),
|
|
||||||
this->errorString().toStdString());
|
|
||||||
});
|
|
||||||
connect(this, &MxcMediaProxy::mediaStatusChanged, [this](QMediaPlayer::MediaStatus status) {
|
connect(this, &MxcMediaProxy::mediaStatusChanged, [this](QMediaPlayer::MediaStatus status) {
|
||||||
nhlog::ui()->info("Media player status {} and error {}", status, this->error());
|
nhlog::ui()->info("Media player status {} and error {}", status, this->error());
|
||||||
});
|
});
|
||||||
connect(this,
|
connect(this, &MxcMediaProxy::metaDataChanged, [this]() { emit orientationChanged(); });
|
||||||
&MxcMediaProxy::metaDataChanged,
|
|
||||||
[this]() {
|
|
||||||
emit orientationChanged();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
MxcMediaProxy::orientation() const
|
MxcMediaProxy::orientation() const
|
||||||
{
|
{
|
||||||
//nhlog::ui()->debug("metadata: {}", metaData().
|
// nhlog::ui()->debug("metadata: {}", metaData().
|
||||||
auto orientation = metaData().value(QMediaMetaData::Orientation).toInt();
|
auto orientation = metaData().value(QMediaMetaData::Orientation).toInt();
|
||||||
nhlog::ui()->debug("Video orientation: {}", orientation);
|
nhlog::ui()->debug("Video orientation: {}", orientation);
|
||||||
return orientation;
|
return orientation;
|
||||||
|
@ -109,7 +102,7 @@ MxcMediaProxy::startDownload()
|
||||||
QTimer::singleShot(0, this, [this, filename] {
|
QTimer::singleShot(0, this, [this, filename] {
|
||||||
nhlog::ui()->info(
|
nhlog::ui()->info(
|
||||||
"Playing buffer with size: {}, {}", buffer.bytesAvailable(), buffer.isOpen());
|
"Playing buffer with size: {}, {}", buffer.bytesAvailable(), buffer.isOpen());
|
||||||
this->setSourceDevice( &buffer, QUrl(filename.fileName()));
|
this->setSourceDevice(&buffer, QUrl(filename.fileName()));
|
||||||
emit loadedChanged();
|
emit loadedChanged();
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
@ -5,15 +5,15 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <QVideoSink>
|
|
||||||
#include <QBuffer>
|
#include <QBuffer>
|
||||||
#include <QMediaPlayer>
|
#include <QMediaPlayer>
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QPointer>
|
#include <QPointer>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
#include <QVideoSink>
|
||||||
|
|
||||||
#include "timeline/TimelineModel.h"
|
|
||||||
#include "Logging.h"
|
#include "Logging.h"
|
||||||
|
#include "timeline/TimelineModel.h"
|
||||||
|
|
||||||
class TimelineModel;
|
class TimelineModel;
|
||||||
|
|
||||||
|
|
|
@ -142,24 +142,21 @@ CallManager::CallManager(QObject *parent)
|
||||||
player_.play();
|
player_.play();
|
||||||
});
|
});
|
||||||
|
|
||||||
connect(&player_,
|
connect(&player_, &QMediaPlayer::errorChanged, this, [this]() {
|
||||||
&QMediaPlayer::error,
|
stopRingtone();
|
||||||
this,
|
switch (player_.error()) {
|
||||||
[this]() {
|
case QMediaPlayer::FormatError:
|
||||||
stopRingtone();
|
case QMediaPlayer::ResourceError:
|
||||||
switch (player_.error()) {
|
nhlog::ui()->error("WebRTC: valid ringtone file not found");
|
||||||
case QMediaPlayer::FormatError:
|
break;
|
||||||
case QMediaPlayer::ResourceError:
|
case QMediaPlayer::AccessDeniedError:
|
||||||
nhlog::ui()->error("WebRTC: valid ringtone file not found");
|
nhlog::ui()->error("WebRTC: access to ringtone file denied");
|
||||||
break;
|
break;
|
||||||
case QMediaPlayer::AccessDeniedError:
|
default:
|
||||||
nhlog::ui()->error("WebRTC: access to ringtone file denied");
|
nhlog::ui()->error("WebRTC: unable to play ringtone");
|
||||||
break;
|
break;
|
||||||
default:
|
}
|
||||||
nhlog::ui()->error("WebRTC: unable to play ringtone");
|
});
|
||||||
break;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -496,10 +493,9 @@ CallManager::retrieveTurnServer()
|
||||||
void
|
void
|
||||||
CallManager::playRingtone(const QUrl &ringtone, bool repeat)
|
CallManager::playRingtone(const QUrl &ringtone, bool repeat)
|
||||||
{
|
{
|
||||||
player_.setLoops(repeat ? QMediaPlayer::Infinite :
|
player_.setLoops(repeat ? QMediaPlayer::Infinite : 1);
|
||||||
1);
|
|
||||||
player_.setSource(ringtone);
|
player_.setSource(ringtone);
|
||||||
//player_.audioOutput()->setVolume(100);
|
// player_.audioOutput()->setVolume(100);
|
||||||
player_.play();
|
player_.play();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue