summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLorn Potter <lorn.potter@gmail.com>2023-04-13 11:22:21 +1000
committerLorn Potter <lorn.potter@gmail.com>2023-05-05 06:03:19 +1000
commit0ecf83de7bc1d012a563a0eb25023eb0e608f3a1 (patch)
tree655c447ca15dc178bc07371f4d99e60e132af378
parent9830f6593868be875465b8ed9b3796685600adb0 (diff)
downloadqtmultimedia-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.cpp62
-rw-r--r--src/plugins/multimedia/wasm/mediaplayer/qwasmmediaplayer.cpp6
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 {