Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
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
7#include <qdebug.h>
8
9//#define DEBUG_MEDIAFOUNDATION
10
11MFPlayerControl::MFPlayerControl(QMediaPlayer *player)
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
30void MFPlayerControl::setMedia(const QUrl &media, QIODevice *stream)
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();
41 handleDurationUpdate(0);
43 m_session->load(media, stream);
44}
45
47{
48 if (m_state == QMediaPlayer::PlayingState)
49 return;
50 resetCurrentLoop();
51 if (QMediaPlayer::InvalidMedia == m_session->status())
52 m_session->load(m_media, m_stream);
53
54 switch (m_session->status()) {
55 case QMediaPlayer::NoMedia:
56 case QMediaPlayer::InvalidMedia:
57 return;
58 case QMediaPlayer::LoadedMedia:
59 case QMediaPlayer::BufferingMedia:
60 case QMediaPlayer::BufferedMedia:
61 case QMediaPlayer::EndOfMedia:
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
95QMediaMetaData MFPlayerControl::metaData() const
96{
97 return m_session->metaData();
98}
99
100void MFPlayerControl::setAudioOutput(QPlatformAudioOutput *output)
101{
102 m_session->setAudioOutput(output);
103}
104
105void MFPlayerControl::setVideoSink(QVideoSink *sink)
106{
107 m_session->setVideoSink(sink);
108}
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) {
133 case QMediaPlayer::EndOfMedia:
134 if (doLoop()) {
135 setPosition(0);
136 m_session->start();
137 } else {
138 changeState(QMediaPlayer::StoppedState);
139 }
140 break;
141 case QMediaPlayer::InvalidMedia:
142 break;
143 case QMediaPlayer::LoadedMedia:
144 case QMediaPlayer::BufferingMedia:
145 case QMediaPlayer::BufferedMedia:
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
157{
158 tracksChanged();
159}
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
228void MFPlayerControl::setPosition(qint64 position)
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
256{
257 return m_session->availablePlaybackRanges();
258}
259
261{
262 return m_session->playbackRate();
263}
264
266{
267 m_session->setPlaybackRate(rate);
268}
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
287void MFPlayerControl::setActiveTrack(TrackType type, int index)
288{
289 m_session->setActiveTrack(type, index);
290}
291
292int MFPlayerControl::activeTrack(TrackType type)
293{
294 return m_session->activeTrack(type);
295}
296
297int MFPlayerControl::trackCount(TrackType type)
298{
299 return m_session->trackCount(type);
300}
301
302QMediaMetaData MFPlayerControl::trackMetaData(TrackType type, int trackNumber)
303{
304 return m_session->trackMetaData(type, trackNumber);
305}
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
float bufferProgress() const 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 setVideoSink(QVideoSink *sink)
void setPlayerControl(MFPlayerControl *playerControl)
void stop(bool immediate=false)
QMediaTimeRange availablePlaybackRanges()