5#include <common/qwasmvideooutput_p.h>
6#include <common/qwasmaudiooutput_p.h>
9#include <QtCore/qloggingcategory.h>
12#include <QMimeDatabase>
17Q_STATIC_LOGGING_CATEGORY(lcMediaPlayer,
"qt.multimedia.wasm.mediaplayer");
19using namespace Qt::Literals;
22 : QPlatformMediaPlayer(parent),
23 m_videoOutput(
new QWasmVideoOutput),
26 qCDebug(lcMediaPlayer) << Q_FUNC_INFO <<
this;
37 m_videoOutput->setVideoMode(QWasmVideoOutput::VideoDisplay);
38 QUuid videoElementId = QUuid::createUuid();
39 qCDebug(lcMediaPlayer) << Q_FUNC_INFO <<
"videoElementId"<< videoElementId <<
this;
41 m_videoOutput->createVideoElement(videoElementId.toString(QUuid::WithoutBraces).toStdString());
42 m_videoOutput->doElementCallbacks();
43 m_videoOutput->createOffscreenElement(QSize(1280, 720));
44 m_videoOutput->updateVideoElementGeometry(QRect(0, 0, 1280, 720));
46 connect(m_videoOutput, &QWasmVideoOutput::bufferingChanged,
this,
47 &QWasmMediaPlayer::bufferingChanged);
48 connect(m_videoOutput, &QWasmVideoOutput::errorOccured,
this,
49 &QWasmMediaPlayer::errorOccured);
50 connect(m_videoOutput, &QWasmVideoOutput::stateChanged,
this,
51 &QWasmMediaPlayer::mediaStateChanged);
52 connect(m_videoOutput, &QWasmVideoOutput::progressChanged,
this,
53 &QWasmMediaPlayer::setPositionChanged);
54 connect(m_videoOutput, &QWasmVideoOutput::durationChanged,
this,
55 &QWasmMediaPlayer::setDurationChanged);
56 connect(m_videoOutput, &QWasmVideoOutput::sizeChange,
this,
57 &QWasmMediaPlayer::videoSizeChanged);
58 connect(m_videoOutput, &QWasmVideoOutput::readyChanged,
this,
59 &QWasmMediaPlayer::videoOutputReady);
60 connect(m_videoOutput, &QWasmVideoOutput::statusChanged,
this,
61 &QWasmMediaPlayer::onMediaStatusChanged);
62 connect(m_videoOutput, &QWasmVideoOutput::metaDataLoaded,
this,
63 &QWasmMediaPlayer::videoMetaDataChanged);
64 connect(m_videoOutput, &QWasmVideoOutput::seekableChanged,
this,
65 &QWasmMediaPlayer::seekableMediaChanged);
67 setVideoAvailable(
true);
72 connect(m_audioOutput->q, &QAudioOutput::deviceChanged,
73 this, &QWasmMediaPlayer::updateAudioDevice);
74 connect(m_audioOutput->q, &QAudioOutput::volumeChanged,
75 this, &QWasmMediaPlayer::volumeChanged);
76 connect(m_audioOutput->q, &QAudioOutput::mutedChanged,
77 this, &QWasmMediaPlayer::mutedChanged);
79 connect(m_audioOutput, &QWasmAudioOutput::bufferingChanged,
this,
80 &QWasmMediaPlayer::bufferingChanged);
81 connect(m_audioOutput, &QWasmAudioOutput::errorOccured,
this,
82 &QWasmMediaPlayer::errorOccured);
83 connect(m_audioOutput, &QWasmAudioOutput::progressChanged,
this,
84 &QWasmMediaPlayer::setPositionChanged);
85 connect(m_audioOutput, &QWasmAudioOutput::durationChanged,
this,
86 &QWasmMediaPlayer::setDurationChanged);
87 connect(m_audioOutput, &QWasmAudioOutput::statusChanged,
this,
88 &QWasmMediaPlayer::onMediaStatusChanged);
89 connect(m_audioOutput, &QWasmAudioOutput::stateChanged,
this,
90 &QWasmMediaPlayer::mediaStateChanged);
91 setAudioAvailable(
true);
96 return m_videoOutput->getDuration();
101 if (mediaStatus() == QMediaPlayer::EndOfMedia)
104 if (m_videoAvailable)
105 return m_videoOutput->getCurrentPosition();
115 const int seekPosition = (position > INT_MAX) ? INT_MAX : position;
117 if (seekPosition ==
this->position())
120 if (mediaStatus() == QMediaPlayer::EndOfMedia)
121 setMediaStatus(QMediaPlayer::LoadedMedia);
123 if (m_videoAvailable)
124 return m_videoOutput->seekTo(position);
126 emit positionChanged(seekPosition);
134 if (m_videoAvailable)
135 m_videoOutput->setVolume(gain);
143 if (m_videoAvailable)
144 m_videoOutput->setMuted(muted);
149 return qBound(0.0, (m_bufferPercent * .01), 1.0);
154 return m_audioAvailable;
159 return m_videoAvailable;
164 return m_availablePlaybackRange;
170 const qint64 pos = position();
171 const qint64 end = (duration() / 100) * m_bufferPercent;
172 m_availablePlaybackRange.addInterval(pos, end);
174 m_availablePlaybackRange = QMediaTimeRange(0, duration());
176 m_availablePlaybackRange = QMediaTimeRange();
185 if (isVideoAvailable())
186 return m_videoOutput->playbackRate();
195 m_videoOutput->setPlaybackRate(rate);
196 emit playbackRateChanged(rate);
201 return m_mediaContent;
206 return m_mediaStream;
211 qCDebug(lcMediaPlayer) << Q_FUNC_INFO << mediaContent << stream;
214 if (mediaContent.isEmpty()) {
216 m_mediaStream = stream;
217 qCDebug(lcMediaPlayer) << db.mimeTypeForData(stream).name();
218 if (db.mimeTypeForData(stream).name().contains(u"audio"_s)) {
219 setAudioAvailable(
true);
220 m_audioOutput->setSource(m_mediaStream);
222 setVideoAvailable(
true);
223 m_videoOutput->setSource(m_mediaStream);
227 setMediaStatus(QMediaPlayer::NoMedia);
230 if (mediaContent.isLocalFile()) {
231 QString sourceFile = mediaContent.toLocalFile();
232 if (db.mimeTypeForFile(QFileInfo(sourceFile)).name().contains(u"audio"_s)) {
233 setAudioAvailable(
true);
234 m_audioOutput->setSource(mediaContent);
236 setVideoAvailable(
true);
237 m_videoOutput->setSource(mediaContent);
241 if (!m_videoOutput->currentVideoElement().isNull()) {
242 m_videoOutput->setSource(mediaContent);
243 setVideoAvailable(
true);
245 m_audioOutput->setSource(mediaContent);
246 setAudioAvailable(
true);
251 resetBufferingProgress();
256 if (m_videoSink == sink)
265 m_videoOutput->setSurface(sink);
266 setVideoAvailable(
true);
267 if (isAudioAvailable() && m_audioOutput)
268 m_audioOutput->setVideoElement(m_videoOutput->currentVideoElement());
273 if (m_audioOutput == output)
277 m_audioOutput->q->disconnect(
this);
278 m_audioOutput =
static_cast<QWasmAudioOutput *>(output);
279 setAudioAvailable(
true);
285 m_audioOutput->setAudioDevice(m_audioOutput->q->device());
294 m_videoOutput->start();
295 m_playWhenReady =
true;
299 m_audioOutput->start();
303#ifdef DEBUG_AUDIOENGINE
304 QAudioEnginePrivate::checkNoError(
"play");
316 m_videoOutput->pause();
318 m_audioOutput->pause();
319 stateChanged(QMediaPlayer::PausedState);
325 m_playWhenReady =
false;
329 qWarning() << Q_FUNC_INFO << __LINE__;
334 m_videoOutput->stop();
336 m_audioOutput->stop();
343 return isVideoAvailable() && m_videoOutput->isVideoSeekable();
349 QMediaPlayer::Error error = QMediaPlayer::ResourceError;
352 case QWasmMediaNetworkState::NetworkEmpty:
354 case QWasmMediaNetworkState::NetworkIdle:
356 case QWasmMediaNetworkState::NetworkLoading:
358 case QWasmMediaNetworkState::NetworkNoSource:
359 error = QMediaPlayer::ResourceError;
360 errorString = message;
364 emit QPlatformMediaPlayer::error(error, errorString);
369 m_buffering = percent != 100;
370 m_bufferPercent = percent;
372 updateAvailablePlaybackRanges();
378 QSize newSize(width, height);
380 if (width == 0 || height == 0 || newSize == m_videoSize)
383 m_videoSize = newSize;
389 QMediaPlayer::PlaybackState m_mediaPlayerState;
391 case QWasmMediaPlayer::Started:
392 m_mediaPlayerState = QMediaPlayer::PlayingState;
394 case QWasmMediaPlayer::Paused:
395 m_mediaPlayerState = QMediaPlayer::PausedState;
397 case QWasmMediaPlayer::Stopped:
398 m_mediaPlayerState = QMediaPlayer::StoppedState;
401 m_mediaPlayerState = QMediaPlayer::StoppedState;
405 QPlatformMediaPlayer::stateChanged(m_mediaPlayerState);
417 QPlatformMediaPlayer::positionChanged(position);
422 QPlatformMediaPlayer::durationChanged(duration);
427 setVideoAvailable(ready);
429 if (m_playWhenReady && m_videoOutput->isReady())
435 mediaStatusChanged(status);
438 case QMediaPlayer::NoMedia:
439 case QMediaPlayer::InvalidMedia:
440 emit durationChanged(0);
442 case QMediaPlayer::EndOfMedia:
443 setPositionChanged(position());
451 if (m_audioAvailable == available)
454 m_audioAvailable = available;
455 emit audioAvailableChanged(m_audioAvailable);
460 if (m_videoAvailable == available)
464 m_videoSize = QSize();
466 m_videoAvailable = available;
467 emit videoAvailableChanged(m_videoAvailable);
474 m_availablePlaybackRange = QMediaTimeRange();
477void QWasmMediaPlayer::onMediaStatusChanged(QMediaPlayer::MediaStatus status)
479 setMediaStatus(status);
489 seekableChanged(seekable);
494#include "moc_qwasmmediaplayer_p.cpp"