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
9MFPlayerControl::MFPlayerControl(QMediaPlayer *player) : QPlatformMediaPlayer(player)
10{
11 m_session = new MFPlayerSession(this);
12}
13
14MFPlayerControl::~MFPlayerControl()
15{
16 m_session->close();
17 m_session->setPlayerControl(nullptr);
18 m_session->Release();
19}
20
21void MFPlayerControl::setMedia(const QUrl &media, QIODevice *stream)
22{
23 m_media = media;
24 m_stream = stream;
25 resetAudioVideoAvailable();
26 handleDurationUpdate(0);
28 m_session->load(media, stream);
29}
30
32{
33 if (state() == QMediaPlayer::PlayingState)
34 return;
35 resetCurrentLoop();
36 if (QMediaPlayer::InvalidMedia == m_session->status())
37 m_session->load(m_media, m_stream);
38
39 switch (m_session->status()) {
40 case QMediaPlayer::NoMedia:
41 case QMediaPlayer::InvalidMedia:
42 return;
43 case QMediaPlayer::LoadedMedia:
44 case QMediaPlayer::BufferingMedia:
45 case QMediaPlayer::BufferedMedia:
46 case QMediaPlayer::EndOfMedia:
47 stateChanged(QMediaPlayer::PlayingState);
48 m_session->start();
49 break;
50 default: //Loading/Stalled
51 stateChanged(QMediaPlayer::PlayingState);
52 break;
53 }
54}
55
57{
58 if (state() == QMediaPlayer::PausedState)
59 return;
60
61 if (m_session->status() == QMediaPlayer::NoMedia ||
62 m_session->status() == QMediaPlayer::InvalidMedia)
63 return;
64
65 stateChanged(QMediaPlayer::PausedState);
66 m_session->pause();
67}
68
70{
71 if (state() == QMediaPlayer::StoppedState)
72 return;
73 stateChanged(QMediaPlayer::StoppedState);
74 m_session->stop();
75}
76
77QMediaMetaData MFPlayerControl::metaData() const
78{
79 return m_session->metaData();
80}
81
82void MFPlayerControl::setAudioOutput(QPlatformAudioOutput *output)
83{
84 m_session->setAudioOutput(output);
85}
86
87void MFPlayerControl::setVideoSink(QVideoSink *sink)
88{
89 m_session->setVideoSink(sink);
90}
91
92void MFPlayerControl::handleStatusChanged(QMediaPlayer::MediaStatus status)
93{
94 if (status == mediaStatus())
95 return;
96
97 switch (status) {
98 case QMediaPlayer::EndOfMedia:
99 if (doLoop()) {
100 setPosition(0);
101 m_session->start();
102 } else {
103 stateChanged(QMediaPlayer::StoppedState);
104 }
105 break;
106 case QMediaPlayer::InvalidMedia:
107 break;
108 case QMediaPlayer::LoadedMedia:
109 case QMediaPlayer::BufferingMedia:
110 case QMediaPlayer::BufferedMedia:
111 if (state() == QMediaPlayer::PlayingState)
112 m_session->start();
113 break;
114 default:
115 break;
116 }
117 mediaStatusChanged(status);
118}
119
121{
122 tracksChanged();
123}
124
126{
127 if (m_videoAvailable)
128 return;
129 m_videoAvailable = true;
130 videoAvailableChanged(m_videoAvailable);
131}
132
134{
135 if (m_audioAvailable)
136 return;
137 m_audioAvailable = true;
138 audioAvailableChanged(m_audioAvailable);
139}
140
141void MFPlayerControl::resetAudioVideoAvailable()
142{
143 bool videoDirty = false;
144 if (m_videoAvailable) {
145 m_videoAvailable = false;
146 videoDirty = true;
147 }
148 if (m_audioAvailable) {
149 m_audioAvailable = false;
150 audioAvailableChanged(m_audioAvailable);
151 }
152 if (videoDirty)
153 videoAvailableChanged(m_videoAvailable);
154}
155
157{
158 if (m_duration == duration)
159 return;
160 m_duration = duration;
161 durationChanged(m_duration);
162}
163
165{
166 if (m_seekable == seekable)
167 return;
168 m_seekable = seekable;
169 seekableChanged(m_seekable);
170}
171
172
173
175{
176 return m_duration;
177}
178
180{
181 return m_session->position();
182}
183
184void MFPlayerControl::setPosition(qint64 position)
185{
186 if (!m_seekable || position == m_session->position())
187 return;
188 m_session->setPosition(position);
189}
190
192{
193 return m_session->bufferProgress();
194}
195
197{
198 return m_audioAvailable;
199}
200
202{
203 return m_videoAvailable;
204}
205
207{
208 return m_seekable;
209}
210
212{
213 return m_session->availablePlaybackRanges();
214}
215
217{
218 return m_session->playbackRate();
219}
220
222{
223 m_session->setPlaybackRate(rate);
224}
225
227{
228 return m_media;
229}
230
232{
233 return m_stream;
234}
235
236void MFPlayerControl::handleError(QMediaPlayer::Error errorCode, const QString& errorString, bool isFatal)
237{
238 if (isFatal)
239 stop();
240 error(errorCode, errorString);
241}
242
243void MFPlayerControl::setActiveTrack(TrackType type, int index)
244{
245 m_session->setActiveTrack(type, index);
246}
247
248int MFPlayerControl::activeTrack(TrackType type)
249{
250 return m_session->activeTrack(type);
251}
252
253int MFPlayerControl::trackCount(TrackType type)
254{
255 return m_session->trackCount(type);
256}
257
258QMediaMetaData MFPlayerControl::trackMetaData(TrackType type, int trackNumber)
259{
260 return m_session->trackMetaData(type, trackNumber);
261}
QMediaPlayer player
Definition audio.cpp:323
bool isAudioAvailable() const override
void handleError(QMediaPlayer::Error errorCode, const QString &errorString, bool isFatal)
qreal playbackRate() 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 handleStatusChanged(QMediaPlayer::MediaStatus)
void setPlaybackRate(qreal rate) override
void setMedia(const QUrl &media, QIODevice *stream) override
void play() 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 stop(bool immediate=false)
QMediaTimeRange availablePlaybackRanges()