5#include "private/qplatformaudiooutput_p.h"
13#include <QtConcurrent/QtConcurrent>
25 bool isCancelled()
const override {
return m_cancelled.load(std::memory_order_acquire); }
27 void cancel() { m_cancelled.store(
true, std::memory_order_release); }
30 std::atomic_bool m_cancelled =
false;
48 m_cancelToken->cancel();
55 return m_playbackEngine ? m_playbackEngine->duration() / 1000 : 0;
63 if (m_playbackEngine) {
64 m_playbackEngine->seek(
position * 1000);
71void QFFmpegMediaPlayer::updatePosition()
73 positionChanged(m_playbackEngine ? m_playbackEngine->currentPosition() / 1000 : 0);
76void QFFmpegMediaPlayer::endOfStream()
79 m_positionUpdateTimer.
stop();
86void QFFmpegMediaPlayer::onLoopChanged()
95 m_positionUpdateTimer.
stop();
96 m_positionUpdateTimer.
start();
99void QFFmpegMediaPlayer::onBuffered()
107 return m_bufferProgress;
120 m_bufferProgress = newBufferProgress;
134 return m_playbackRate;
139 const float effectiveRate = std::max(
static_cast<float>(
rate), 0.0f);
144 m_playbackRate = effectiveRate;
146 if (m_playbackEngine)
147 m_playbackEngine->setPlaybackRate(effectiveRate);
168 mediaStatusChanged(status);
169 m_playbackEngine =
nullptr;
176 m_cancelToken->cancel();
182 m_playbackEngine =
nullptr;
193 m_cancelToken = std::make_shared<CancelToken>();
204 setMediaAsync(mediaHolder, cancelToken);
210 const std::shared_ptr<QFFmpeg::CancelToken> &cancelToken)
220 if (cancelToken->isCancelled()) {
224 if (!mediaDataHolder) {
225 const auto [
code, description] = mediaDataHolder.error();
226 error(code, description);
231 m_playbackEngine = std::make_unique<PlaybackEngine>();
234 &QFFmpegMediaPlayer::endOfStream);
236 &QFFmpegMediaPlayer::error);
238 &QFFmpegMediaPlayer::onLoopChanged);
240 &QFFmpegMediaPlayer::onBuffered);
242 m_playbackEngine->setMedia(std::move(*mediaDataHolder.value()));
244 m_playbackEngine->setAudioSink(m_audioOutput);
245 m_playbackEngine->setVideoSink(m_videoSink);
246 m_playbackEngine->setLoops(
loops());
247 m_playbackEngine->setPlaybackRate(m_playbackRate);
276 if (!m_playbackEngine)
280 m_playbackEngine->seek(0);
287void QFFmpegMediaPlayer::runPlayback()
289 m_playbackEngine->play();
290 m_positionUpdateTimer.
start();
304 if (!m_playbackEngine)
308 m_playbackEngine->seek(0);
311 m_playbackEngine->pause();
312 m_positionUpdateTimer.
stop();
326 if (!m_playbackEngine)
329 m_playbackEngine->stop();
330 m_positionUpdateTimer.
stop();
331 m_playbackEngine->seek(0);
339 if (m_audioOutput ==
output)
343 if (m_playbackEngine)
344 m_playbackEngine->setAudioSink(
output);
349 return m_playbackEngine ? m_playbackEngine->metaData() :
QMediaMetaData{};
354 if (m_videoSink ==
sink)
358 if (m_playbackEngine)
359 m_playbackEngine->setVideoSink(
sink);
369 return m_playbackEngine ? m_playbackEngine->streamInfo(
type).count() : 0;
374 if (!m_playbackEngine || streamNumber < 0
375 || streamNumber >= m_playbackEngine->streamInfo(
type).count())
377 return m_playbackEngine->streamInfo(
type).at(streamNumber).metaData;
382 return m_playbackEngine ? m_playbackEngine->activeTrack(
type) : -1;
387 if (m_playbackEngine)
388 m_playbackEngine->setActiveTrack(
type, streamNumber);
390 qWarning() <<
"Cannot set active track without open source";
395 if (m_playbackEngine)
396 m_playbackEngine->setLoops(
loops);
403#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