diff options
author | Lorn Potter <lorn.potter@gmail.com> | 2023-04-13 11:22:21 +1000 |
---|---|---|
committer | Lorn Potter <lorn.potter@gmail.com> | 2023-05-05 06:03:19 +1000 |
commit | 0ecf83de7bc1d012a563a0eb25023eb0e608f3a1 (patch) | |
tree | 655c447ca15dc178bc07371f4d99e60e132af378 | |
parent | 9830f6593868be875465b8ed9b3796685600adb0 (diff) | |
download | qtmultimedia-0ecf83de7bc1d012a563a0eb25023eb0e608f3a1.tar.gz |
wasm: fix local video file playing
Pick-to: 6.5
Change-Id: I8edd18d78815795262a5bca5523fe82587dd469f
Reviewed-by: MikoĊaj Boc <Mikolaj.Boc@qt.io>
-rw-r--r-- | src/plugins/multimedia/wasm/common/qwasmvideooutput.cpp | 62 | ||||
-rw-r--r-- | src/plugins/multimedia/wasm/mediaplayer/qwasmmediaplayer.cpp | 6 |
2 files changed, 41 insertions, 27 deletions
diff --git a/src/plugins/multimedia/wasm/common/qwasmvideooutput.cpp b/src/plugins/multimedia/wasm/common/qwasmvideooutput.cpp index 94a8173c7..878b67139 100644 --- a/src/plugins/multimedia/wasm/common/qwasmvideooutput.cpp +++ b/src/plugins/multimedia/wasm/common/qwasmvideooutput.cpp @@ -7,6 +7,9 @@ #include <QRect> #include <QMediaPlayer> #include <QVideoFrame> +#include <QFile> +#include <QBuffer> +#include <QMimeDatabase> #include "qwasmvideooutput_p.h" #include <qvideosink.h> @@ -14,6 +17,7 @@ #include <private/qplatformvideosink_p.h> #include <private/qmemoryvideobuffer_p.h> #include <private/qvideotexturehelper_p.h> +#include <private/qstdweb_p.h> #include <emscripten/bind.h> #include <emscripten/html5.h> @@ -60,7 +64,8 @@ void QWasmVideoOutput::setVideoMode(QWasmVideoOutput::WasmVideoMode mode) void QWasmVideoOutput::start() { - if (m_video.isUndefined() || m_video.isNull()) { + if (m_video.isUndefined() || m_video.isNull() + || !m_wasmSink) { // error emit errorOccured(QMediaPlayer::ResourceError, QStringLiteral("video surface error")); return; @@ -68,12 +73,10 @@ void QWasmVideoOutput::start() switch (m_currentVideoMode) { case QWasmVideoOutput::VideoOutput: { - emscripten::val sourceObj = - m_video.call<emscripten::val>("getAttribute", emscripten::val("src")); - + emscripten::val sourceObj = m_video["src"]; if ((sourceObj.isUndefined() || sourceObj.isNull()) && !m_source.isEmpty()) { qCDebug(qWasmMediaVideoOutput) << Q_FUNC_INFO << "calling load" << m_source; - m_video.call<void>("setAttribute", emscripten::val("src"), m_source.toStdString()); + m_video.set("src", m_source); m_video.call<void>("load"); } } break; @@ -206,12 +209,13 @@ void QWasmVideoOutput::setSource(const QUrl &url) return; } if (url.isLocalFile()) { - qDebug() << "no local files allowed, so we need to blob"; - // QFile mFile(url.toString()); - // if (!mFile.open(QIODevice::readOnly)) {// some error - // return; - // QDataStream dStream(&mFile); // ? - // setSource(dStream); + QFile localFile(url.toLocalFile()); + if (localFile.open(QIODevice::ReadOnly)) { + QDataStream buffer(&localFile); // we will serialize the data into the file + setSource(buffer.device()); + } else { + qWarning() << "Failed to open file"; + } return; } @@ -282,27 +286,34 @@ void QWasmVideoOutput::addCameraSourceElement(const std::string &id) void QWasmVideoOutput::setSource(QIODevice *stream) { - Q_UNUSED(stream) - - if (m_video.isUndefined() || m_video.isNull() || m_videoElementSource.isUndefined() - || m_videoElementSource.isNull()) { + if (stream->bytesAvailable() == 0) { + qWarning() << "data not available"; + emit errorOccured(QMediaPlayer::ResourceError, QStringLiteral("data not available")); + return; + } + if (m_video.isUndefined() || m_video.isNull()) { emit errorOccured(QMediaPlayer::ResourceError, QStringLiteral("video surface error")); return; } - // src (depreciated) or srcObject - // MediaStream, MediaSource Blob or File + QMimeDatabase db; + QMimeType mime = db.mimeTypeForData(stream); - // TODO QIOStream to - // SourceBuffer.appendBuffer() // ArrayBuffer - // SourceBuffer.appendStream() // WriteableStream ReadableStream (to sink) - // SourceBuffer.appendBufferAsync() - // emscripten::val document = emscripten::val::global("document"); + QByteArray buffer = stream->readAll(); - // stream to blob + qstdweb::Blob contentBlob = qstdweb::Blob::copyFrom(buffer.data(), buffer.size(), mime.name().toStdString()); + + emscripten::val window = qstdweb::window(); + + if (window["safari"].isUndefined()) { + emscripten::val contentUrl = window["URL"].call<emscripten::val>("createObjectURL", contentBlob.val()); + m_video.set("src", contentUrl); + m_source = QString::fromStdString(contentUrl.as<std::string>()); + } else { + // only Safari currently supports Blob with srcObject + m_video.set("srcObject", contentBlob.val()); + } - // Create/add video source - m_video.call<void>("setAttribute", emscripten::val("srcObject"), m_source.toStdString()); m_video.call<void>("load"); } @@ -372,6 +383,7 @@ bool QWasmVideoOutput::isVideoSeekable() void QWasmVideoOutput::createVideoElement(const std::string &id) { + // TODO: there can be more than one element !! qCDebug(qWasmMediaVideoOutput) << Q_FUNC_INFO << id; // Create <video> element and add it to the page body emscripten::val document = emscripten::val::global("document"); diff --git a/src/plugins/multimedia/wasm/mediaplayer/qwasmmediaplayer.cpp b/src/plugins/multimedia/wasm/mediaplayer/qwasmmediaplayer.cpp index 39074b31d..f8bc60e9f 100644 --- a/src/plugins/multimedia/wasm/mediaplayer/qwasmmediaplayer.cpp +++ b/src/plugins/multimedia/wasm/mediaplayer/qwasmmediaplayer.cpp @@ -207,11 +207,13 @@ void QWasmMediaPlayer::setMedia(const QUrl &mediaContent, QIODevice *stream) if (mediaContent.isEmpty()) { if (stream) { m_mediaStream = stream; - if (isVideoAvailable()) + if (isVideoAvailable()) { m_videoOutput->setSource(m_mediaStream); - else + } else { m_audioOutput->setSource(m_mediaStream); + } } else { + setMediaStatus(QMediaPlayer::NoMedia); } } else { |