Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
mfplayercontrol.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "mfplayercontrol_p.h"
5#include "mfplayersession_p.h"
7#include <qdebug.h>
8
9//#define DEBUG_MEDIAFOUNDATION
10
13 , m_state(QMediaPlayer::StoppedState)
14 , m_stateDirty(false)
15 , m_videoAvailable(false)
16 , m_audioAvailable(false)
17 , m_duration(0)
18 , m_seekable(false)
19{
20 m_session = new MFPlayerSession(this);
21}
22
24{
25 m_session->close();
26 m_session->setPlayerControl(nullptr);
27 m_session->Release();
28}
29
31{
32 if (m_state != QMediaPlayer::StoppedState) {
33 changeState(QMediaPlayer::StoppedState);
34 m_session->stop(true);
35 refreshState();
36 }
37
38 m_media = media;
39 m_stream = stream;
40 resetAudioVideoAvailable();
43 m_session->load(media, stream);
44}
45
47{
48 if (m_state == QMediaPlayer::PlayingState)
49 return;
51 if (QMediaPlayer::InvalidMedia == m_session->status())
52 m_session->load(m_media, m_stream);
53
54 switch (m_session->status()) {
57 return;
62 changeState(QMediaPlayer::PlayingState);
63 m_session->start();
64 break;
65 default: //Loading/Stalled
66 changeState(QMediaPlayer::PlayingState);
67 break;
68 }
69 refreshState();
70}
71
73{
74 if (m_state == QMediaPlayer::PausedState)
75 return;
76
77 if (m_session->status() == QMediaPlayer::NoMedia ||
78 m_session->status() == QMediaPlayer::InvalidMedia)
79 return;
80
81 changeState(QMediaPlayer::PausedState);
82 m_session->pause();
83 refreshState();
84}
85
87{
88 if (m_state == QMediaPlayer::StoppedState)
89 return;
90 changeState(QMediaPlayer::StoppedState);
91 m_session->stop();
92 refreshState();
93}
94
96{
97 return m_session->metaData();
98}
99
104
109
110void MFPlayerControl::changeState(QMediaPlayer::PlaybackState state)
111{
112 if (m_state == state)
113 return;
114 m_state = state;
115 m_stateDirty = true;
116}
117
118void MFPlayerControl::refreshState()
119{
120 if (!m_stateDirty)
121 return;
122 m_stateDirty = false;
123#ifdef DEBUG_MEDIAFOUNDATION
124 qDebug() << "MFPlayerControl::emit stateChanged" << m_state;
125#endif
126 stateChanged(m_state);
127}
128
130{
131 QMediaPlayer::MediaStatus status = m_session->status();
132 switch (status) {
134 if (doLoop()) {
135 setPosition(0);
136 m_session->start();
137 } else {
138 changeState(QMediaPlayer::StoppedState);
139 }
140 break;
142 break;
146 if (m_state == QMediaPlayer::PlayingState)
147 m_session->start();
148 break;
149 default:
150 break;
151 }
152 mediaStatusChanged(m_session->status());
153 refreshState();
154}
155
160
162{
163 if (m_videoAvailable)
164 return;
165 m_videoAvailable = true;
166 videoAvailableChanged(m_videoAvailable);
167}
168
170{
171 if (m_audioAvailable)
172 return;
173 m_audioAvailable = true;
174 audioAvailableChanged(m_audioAvailable);
175}
176
177void MFPlayerControl::resetAudioVideoAvailable()
178{
179 bool videoDirty = false;
180 if (m_videoAvailable) {
181 m_videoAvailable = false;
182 videoDirty = true;
183 }
184 if (m_audioAvailable) {
185 m_audioAvailable = false;
186 audioAvailableChanged(m_audioAvailable);
187 }
188 if (videoDirty)
189 videoAvailableChanged(m_videoAvailable);
190}
191
193{
194 if (m_duration == duration)
195 return;
196 m_duration = duration;
197 durationChanged(m_duration);
198}
199
201{
202 if (m_seekable == seekable)
203 return;
204 m_seekable = seekable;
205 seekableChanged(m_seekable);
206}
207
209{
210 return m_state;
211}
212
214{
215 return m_session->status();
216}
217
219{
220 return m_duration;
221}
222
224{
225 return m_session->position();
226}
227
229{
230 if (!m_seekable || position == m_session->position())
231 return;
232 m_session->setPosition(position);
233}
234
236{
237 return m_session->bufferProgress() / 100.;
238}
239
241{
242 return m_audioAvailable;
243}
244
246{
247 return m_videoAvailable;
248}
249
251{
252 return m_seekable;
253}
254
259
261{
262 return m_session->playbackRate();
263}
264
269
271{
272 return m_media;
273}
274
276{
277 return m_stream;
278}
279
280void MFPlayerControl::handleError(QMediaPlayer::Error errorCode, const QString& errorString, bool isFatal)
281{
282 if (isFatal)
283 stop();
284 error(int(errorCode), errorString);
285}
286
291
293{
294 return m_session->activeTrack(type);
295}
296
298{
299 return m_session->trackCount(type);
300}
301
303{
304 return m_session->trackMetaData(type, trackNumber);
305}
306
QMediaPlayer player
Definition audio.cpp:213
bool isAudioAvailable() const override
void handleError(QMediaPlayer::Error errorCode, const QString &errorString, bool isFatal)
qreal playbackRate() const override
QMediaPlayer::PlaybackState state() const override
QMediaMetaData metaData() const override
const QIODevice * mediaStream() const override
void pause() override
void setActiveTrack(TrackType type, int index) override
void setAudioOutput(QPlatformAudioOutput *output) override
QMediaMetaData trackMetaData(TrackType type, int trackNumber) override
void setPlaybackRate(qreal rate) override
void setMedia(const QUrl &media, QIODevice *stream) override
void play() override
QMediaPlayer::MediaStatus mediaStatus() const override
int activeTrack(TrackType type) override
QUrl media() const override
QMediaTimeRange availablePlaybackRanges() const override
MFPlayerControl(QMediaPlayer *player)
float bufferProgress() const override
void setVideoSink(QVideoSink *sink) override
bool isVideoAvailable() const override
void handleSeekableUpdate(bool seekable)
qint64 duration() const override
qint64 position() const override
void handleDurationUpdate(qint64 duration)
int trackCount(TrackType type) override
void setPosition(qint64 position) override
bool isSeekable() const override
void stop() override
void setPlaybackRate(qreal rate)
void setPosition(qint64 position)
QMediaMetaData metaData() const
void setAudioOutput(QPlatformAudioOutput *device)
void setVideoSink(QVideoSink *sink)
void setActiveTrack(QPlatformMediaPlayer::TrackType type, int index)
void setPlayerControl(MFPlayerControl *playerControl)
qreal playbackRate() const
void stop(bool immediate=false)
QMediaMetaData trackMetaData(QPlatformMediaPlayer::TrackType type, int trackNumber)
void load(const QUrl &media, QIODevice *stream)
int activeTrack(QPlatformMediaPlayer::TrackType type)
QMediaPlayer::MediaStatus status() const
QMediaTimeRange availablePlaybackRanges()
int trackCount(QPlatformMediaPlayer::TrackType)
\inmodule QtCore \reentrant
Definition qiodevice.h:34
\inmodule QtMultimedia
The QMediaPlayer class allows the playing of a media files.
MediaStatus
\qmlproperty enumeration QtMultimedia::MediaPlayer::playbackState
PlaybackState
Defines the current state of a media player.
Error
\qmlproperty enumeration QtMultimedia::MediaPlayer::mediaStatus
The QMediaTimeRange class represents a set of zero or more disjoint time intervals.
void seekableChanged(bool seekable)
void durationChanged(qint64 duration)
void audioAvailableChanged(bool audioAvailable)
void stateChanged(QMediaPlayer::PlaybackState newState)
void videoAvailableChanged(bool videoAvailable)
void mediaStatusChanged(QMediaPlayer::MediaStatus status)
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
\inmodule QtCore
Definition qurl.h:94
The QVideoSink class represents a generic sink for video data.
Definition qvideosink.h:22
else opt state
[0]
static bool isFatal(QtMsgType msgType)
Definition qlogging.cpp:202
DBusConnection const char DBusError * error
EGLStreamKHR stream
#define qDebug
[1]
Definition qlogging.h:164
n void setPosition(void) \n\
GLuint index
[2]
GLenum type
GLuint GLenum * rate
GLsizei GLenum GLboolean sink
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
long long qint64
Definition qtypes.h:60
double qreal
Definition qtypes.h:187
QT_BEGIN_NAMESPACE typedef uchar * output