summaryrefslogtreecommitdiff
path: root/src/plugins/multimedia/wasm/common/qwasmvideooutput.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/multimedia/wasm/common/qwasmvideooutput.cpp')
-rw-r--r--src/plugins/multimedia/wasm/common/qwasmvideooutput.cpp62
1 files changed, 37 insertions, 25 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");