5#include "private/qplatformaudiooutput_p.h"
14#include <QtConcurrent/QtConcurrent>
26 bool isCancelled()
const override {
return m_cancelled.load(std::memory_order_acquire); }
28 void cancel() { m_cancelled.store(
true, std::memory_order_release); }
31 std::atomic_bool m_cancelled =
false;
49 m_cancelToken->cancel();
56 return m_playbackEngine ? m_playbackEngine->duration() / 1000 : 0;
64 if (m_playbackEngine) {
65 m_playbackEngine->seek(
position * 1000);
72void QFFmpegMediaPlayer::updatePosition()
74 positionChanged(m_playbackEngine ? m_playbackEngine->currentPosition() / 1000 : 0);
77void QFFmpegMediaPlayer::endOfStream()
80 m_positionUpdateTimer.
stop();
81 QPointer currentPlaybackEngine(m_playbackEngine.get());
86 if (currentPlaybackEngine)
88 if (currentPlaybackEngine)
92void QFFmpegMediaPlayer::onLoopChanged()
101 m_positionUpdateTimer.
stop();
102 m_positionUpdateTimer.
start();
105void QFFmpegMediaPlayer::onBuffered()
113 return m_bufferProgress;
126 m_bufferProgress = newBufferProgress;
140 return m_playbackRate;
145 const float effectiveRate = std::max(
static_cast<float>(
rate), 0.0f);
150 m_playbackRate = effectiveRate;
152 if (m_playbackEngine)
153 m_playbackEngine->setPlaybackRate(effectiveRate);
174 mediaStatusChanged(status);
175 m_playbackEngine =
nullptr;
182 m_cancelToken->cancel();
188 m_playbackEngine =
nullptr;
199 m_cancelToken = std::make_shared<CancelToken>();
210 setMediaAsync(mediaHolder, cancelToken);
216 const std::shared_ptr<QFFmpeg::CancelToken> &cancelToken)
226 if (cancelToken->isCancelled()) {
230 if (!mediaDataHolder) {
231 const auto [
code, description] = mediaDataHolder.error();
232 error(code, description);
237 m_playbackEngine = std::make_unique<PlaybackEngine>();
240 &QFFmpegMediaPlayer::endOfStream);
242 &QFFmpegMediaPlayer::error);
244 &QFFmpegMediaPlayer::onLoopChanged);
246 &QFFmpegMediaPlayer::onBuffered);
248 m_playbackEngine->setMedia(std::move(*mediaDataHolder.value()));
250 m_playbackEngine->setAudioBufferOutput(m_audioBufferOutput);
251 m_playbackEngine->setAudioSink(m_audioOutput);
252 m_playbackEngine->setVideoSink(m_videoSink);
254 m_playbackEngine->setLoops(
loops());
255 m_playbackEngine->setPlaybackRate(m_playbackRate);
284 if (!m_playbackEngine)
288 m_playbackEngine->seek(0);
295void QFFmpegMediaPlayer::runPlayback()
297 m_playbackEngine->play();
298 m_positionUpdateTimer.
start();
312 if (!m_playbackEngine)
316 m_playbackEngine->seek(0);
319 m_playbackEngine->pause();
320 m_positionUpdateTimer.
stop();
334 if (!m_playbackEngine)
337 m_playbackEngine->stop();
338 m_positionUpdateTimer.
stop();
339 m_playbackEngine->seek(0);
348 if (m_playbackEngine)
349 m_playbackEngine->setAudioSink(
output);
353 m_audioBufferOutput =
output;
354 if (m_playbackEngine)
355 m_playbackEngine->setAudioBufferOutput(
output);
360 return m_playbackEngine ? m_playbackEngine->metaData() :
QMediaMetaData{};
366 if (m_playbackEngine)
367 m_playbackEngine->setVideoSink(
sink);
377 return m_playbackEngine ? m_playbackEngine->streamInfo(
type).count() : 0;
382 if (!m_playbackEngine || streamNumber < 0
383 || streamNumber >= m_playbackEngine->streamInfo(
type).count())
385 return m_playbackEngine->streamInfo(
type).at(streamNumber).metaData;
390 return m_playbackEngine ? m_playbackEngine->activeTrack(
type) : -1;
395 if (m_playbackEngine)
396 m_playbackEngine->setActiveTrack(
type, streamNumber);
398 qWarning() <<
"Cannot set active track without open source";
403 if (m_playbackEngine)
404 m_playbackEngine->setLoops(
loops);
411#include "moc_qffmpegmediaplayer_p.cpp"
bool isCancelled() const override
void errorOccured(int, const QString &)
\inmodule QtCore \reentrant
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
void start(int msec)
Starts or restarts the timer with a timeout interval of msec milliseconds.
void setInterval(int msec)
void stop()
Stops the timer.
void timeout(QPrivateSignal)
This signal is emitted when the timer times out.
void setTimerType(Qt::TimerType atype)
bool isEmpty() const
Returns true if the URL has no data; otherwise returns false.
The QVideoSink class represents a generic sink for video data.
Combined button and popup list for selecting options.
QTCONCURRENT_RUN_NODISCARD auto run(QThreadPool *pool, Function &&f, Args &&...args)
DBusConnection const char DBusError * error
bool qFuzzyCompare(qfloat16 p1, qfloat16 p2) noexcept
GLsizei GLenum GLboolean sink
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
QT_BEGIN_NAMESPACE typedef uchar * output