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 mediaStatusChanged(status);
98
99 switch (status) {
100 case QMediaPlayer::EndOfMedia:
101 if (doLoop()) {
102 setPosition(0);
103 m_session->start();
104 } else {
105 stateChanged(QMediaPlayer::StoppedState);
106 }
107 break;
108 case QMediaPlayer::InvalidMedia:
109 break;
110 case QMediaPlayer::LoadedMedia:
111 case QMediaPlayer::BufferingMedia:
112 case QMediaPlayer::BufferedMedia:
113 if (state() == QMediaPlayer::PlayingState)
114 m_session->start();
115 break;
116 default:
117 break;
118 }
119}
120
122{
123 tracksChanged();
124}
125
127{
128 if (m_videoAvailable)
129 return;
130 m_videoAvailable = true;
131 videoAvailableChanged(m_videoAvailable);
132}
133
135{
136 if (m_audioAvailable)
137 return;
138 m_audioAvailable = true;
139 audioAvailableChanged(m_audioAvailable);
140}
141
142void MFPlayerControl::resetAudioVideoAvailable()
143{
144 bool videoDirty = false;
145 if (m_videoAvailable) {
146 m_videoAvailable = false;
147 videoDirty = true;
148 }
149 if (m_audioAvailable) {
150 m_audioAvailable = false;
151 audioAvailableChanged(m_audioAvailable);
152 }
153 if (videoDirty)
154 videoAvailableChanged(m_videoAvailable);
155}
156
158{
159 if (m_duration == duration)
160 return;
161 m_duration = duration;
162 durationChanged(m_duration);
163}
164
166{
167 if (m_seekable == seekable)
168 return;
169 m_seekable = seekable;
170 seekableChanged(m_seekable);
171}
172
173
174
176{
177 return m_duration;
178}
179
181{
182 return m_session->position();
183}
184
185void MFPlayerControl::setPosition(qint64 position)
186{
187 if (!m_seekable || position == m_session->position())
188 return;
189 m_session->setPosition(position);
190}
191
193{
194 return m_session->bufferProgress();
195}
196
198{
199 return m_audioAvailable;
200}
201
203{
204 return m_videoAvailable;
205}
206
208{
209 return m_seekable;
210}
211
213{
214 return m_session->availablePlaybackRanges();
215}
216
218{
219 return m_session->playbackRate();
220}
221
223{
224 m_session->setPlaybackRate(rate);
225}
226
228{
229 return m_media;
230}
231
233{
234 return m_stream;
235}
236
237void MFPlayerControl::handleError(QMediaPlayer::Error errorCode, const QString& errorString, bool isFatal)
238{
239 if (isFatal)
240 stop();
241 error(errorCode, errorString);
242}
243
244void MFPlayerControl::setActiveTrack(TrackType type, int index)
245{
246 m_session->setActiveTrack(type, index);
247}
248
249int MFPlayerControl::activeTrack(TrackType type)
250{
251 return m_session->activeTrack(type);
252}
253
254int MFPlayerControl::trackCount(TrackType type)
255{
256 return m_session->trackCount(type);
257}
258
259QMediaMetaData MFPlayerControl::trackMetaData(TrackType type, int trackNumber)
260{
261 return m_session->trackMetaData(type, trackNumber);
262}
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()