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
mfplayersession_p.h
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#ifndef MFPLAYERSESSION_H
5#define MFPLAYERSESSION_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <mfapi.h>
19#include <mfidl.h>
20
21#include "qmediaplayer.h"
23
24#include <QtCore/qcoreevent.h>
25#include <QtCore/qmutex.h>
26#include <QtCore/qurl.h>
27#include <QtCore/qwaitcondition.h>
28#include <QtMultimedia/qaudioformat.h>
29#include <QtMultimedia/qvideoframeformat.h>
30#include <qaudiodevice.h>
31#include <qtimer.h>
33#include <QtCore/private/qcomptr_p.h>
34#include <evrhelpers_p.h>
35#include <cguid.h>
36
38
39class QUrl;
40
41class SourceResolver;
43class MFPlayerControl;
44class MFPlayerService;
45class AudioSampleGrabberCallback;
46class MFTransform;
47
49{
51 friend class SourceResolver;
52public:
53 MFPlayerSession(MFPlayerControl *playerControl = 0);
54
55 STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppvObject) override;
56
58
60
61 STDMETHODIMP Invoke(IMFAsyncResult *pResult) override;
62
63 STDMETHODIMP GetParameters(DWORD *pdwFlags, DWORD *pdwQueue) override
64 {
65 Q_UNUSED(pdwFlags);
66 Q_UNUSED(pdwQueue);
67 return E_NOTIMPL;
68 }
69
70 void load(const QUrl &media, QIODevice *stream);
71 void stop(bool immediate = false);
72 void start();
73 void pause();
74
77 void setPosition(qint64 position);
78 qreal playbackRate() const;
79 void setPlaybackRate(qreal rate);
80 float bufferProgress();
81 QMediaTimeRange availablePlaybackRanges();
82
83 void changeStatus(QMediaPlayer::MediaStatus newStatus);
84
85 void close();
86
87 void setAudioOutput(QPlatformAudioOutput *device);
88
89 QMediaMetaData metaData() const { return m_metaData; }
90
91 void setVideoSink(QVideoSink *sink);
92
93 void setActiveTrack(QPlatformMediaPlayer::TrackType type, int index);
94 int activeTrack(QPlatformMediaPlayer::TrackType type);
96 QMediaMetaData trackMetaData(QPlatformMediaPlayer::TrackType type, int trackNumber);
97
98 void setPlayerControl(MFPlayerControl *playerControl) { m_playerControl = playerControl; }
99
100 void statusChanged() { if (m_playerControl) m_playerControl->handleStatusChanged(); }
101 void tracksChanged() { if (m_playerControl) m_playerControl->handleTracksChanged(); }
102 void audioAvailable() { if (m_playerControl) m_playerControl->handleAudioAvailable(); }
103 void videoAvailable() { if (m_playerControl) m_playerControl->handleVideoAvailable(); }
104 void durationUpdate(qint64 duration) { if (m_playerControl) m_playerControl->handleDurationUpdate(duration); }
105 void seekableUpdate(bool seekable) { if (m_playerControl) m_playerControl->handleSeekableUpdate(seekable); }
106 void error(QMediaPlayer::Error error, QString errorString, bool isFatal) { if (m_playerControl) m_playerControl->handleError(error, errorString, isFatal); }
107 void playbackRateChanged(qreal rate) { if (m_playerControl) m_playerControl->playbackRateChanged(rate); }
108 void bufferProgressChanged(float percentFilled) { if (m_playerControl) m_playerControl->bufferProgressChanged(percentFilled); }
109 void metaDataChanged() { if (m_playerControl) m_playerControl->metaDataChanged(); }
110 void positionChanged(qint64 position) { if (m_playerControl) m_playerControl->positionChanged(position); }
111
112public Q_SLOTS:
113 void setVolume(float volume);
114 void setMuted(bool muted);
115 void updateOutputRouting();
116
119
120private Q_SLOTS:
122 void handleSessionEvent(const ComPtr<IMFMediaEvent> &sessionEvent);
123 void handleSourceError(long hr);
124 void timeout();
125
126private:
127 long m_cRef;
128 MFPlayerControl *m_playerControl = nullptr;
129 MFVideoRendererControl *m_videoRendererControl = nullptr;
130 ComPtr<IMFMediaSession> m_session;
131 ComPtr<IMFPresentationClock> m_presentationClock;
132 ComPtr<IMFRateControl> m_rateControl;
133 ComPtr<IMFRateSupport> m_rateSupport;
134 ComPtr<IMFAudioStreamVolume> m_volumeControl;
135 ComPtr<IPropertyStore> m_netsourceStatistics;
136 qint64 m_position = 0;
137 qint64 m_restorePosition = -1;
138 qint64 m_timeCounter = 0;
139 UINT64 m_duration = 0;
140 bool m_updatingTopology = false;
141 bool m_updateRoutingOnStart = false;
142
143 enum Command
144 {
145 CmdNone = 0,
146 CmdStop,
147 CmdStart,
148 CmdPause,
149 CmdSeek,
150 CmdSeekResume,
151 CmdStartAndSeek
152 };
153
154 void clear();
155 void setPositionInternal(qint64 position, Command requestCmd);
156 void setPlaybackRateInternal(qreal rate);
157 void commitRateChange(qreal rate, BOOL isThin);
158 bool canScrub() const;
159 void scrub(bool enableScrub);
160 bool m_scrubbing;
161 float m_restoreRate;
162
163 ComPtr<SourceResolver> m_sourceResolver;
164 EventHandle m_hCloseEvent;
165 bool m_closing;
166
167 enum MediaType
168 {
169 Unknown = 0,
170 Audio = 1,
171 Video = 2,
172 };
173 DWORD m_mediaTypes;
174
175 enum PendingState
176 {
177 NoPending = 0,
178 CmdPending,
179 SeekPending,
180 };
181
182 struct SeekState
183 {
184 void setCommand(Command cmd) {
185 prevCmd = command;
186 command = cmd;
187 }
188 Command command;
189 Command prevCmd;
190 float rate; // Playback rate
191 BOOL isThin; // Thinned playback?
192 qint64 start; // Start position
193 };
194 SeekState m_state; // Current nominal state.
195 SeekState m_request; // Pending request.
196 PendingState m_pendingState;
197 float m_pendingRate;
198 void updatePendingCommands(Command command);
199
200 struct TrackInfo
201 {
202 QList<QMediaMetaData> metaData;
203 QList<int> nativeIndexes;
204 int currentIndex = -1;
205 TOPOID sourceNodeId = -1;
206 TOPOID outputNodeId = -1;
207 GUID format = GUID_NULL;
208 };
209 TrackInfo m_trackInfo[QPlatformMediaPlayer::NTrackTypes];
210
212 bool m_canScrub;
213 float m_volume = 1.;
214 bool m_muted = false;
215
216 QPlatformAudioOutput *m_audioOutput = nullptr;
217 QMediaMetaData m_metaData;
218
219 void setVolumeInternal(float volume);
220
221 bool createSession();
222 void setupPlaybackTopology(IMFMediaSource *source, IMFPresentationDescriptor *sourcePD);
223 bool getStreamInfo(IMFStreamDescriptor *stream, MFPlayerSession::MediaType *type, QString *name, QString *language, GUID *format) const;
224 ComPtr<IMFTopologyNode> addSourceNode(IMFTopology *topology, IMFMediaSource *source,
225 IMFPresentationDescriptor *presentationDesc,
226 IMFStreamDescriptor *streamDesc);
227 ComPtr<IMFTopologyNode> addOutputNode(MediaType mediaType, IMFTopology *topology, DWORD sinkID);
228
229 QAudioFormat audioFormatForMFMediaType(IMFMediaType *mediaType) const;
230
231 ComPtr<IMFTopology> insertMFT(const ComPtr<IMFTopology> &topology, TOPOID outputNodeId);
232 bool insertResizer(IMFTopology *topology);
233 void insertColorConverter(IMFTopology *topology, TOPOID outputNodeId);
234
235 QTimer m_signalPositionChangeTimer;
236 qint64 m_lastPosition = -1;
237};
238
239QT_END_NAMESPACE
240
241#endif
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 seekableUpdate(bool seekable)
void setPlaybackRate(qreal rate)
void setPosition(qint64 position)
QMediaMetaData metaData() const
void setVideoSink(QVideoSink *sink)
void bufferProgressChanged(float percentFilled)
void setActiveTrack(QPlatformMediaPlayer::TrackType type, int index)
void playbackRateChanged(qreal rate)
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppvObject) override
void positionChanged(qint64 position)
MFPlayerSession(MFPlayerControl *playerControl=0)
void setPlayerControl(MFPlayerControl *playerControl)
void durationUpdate(qint64 duration)
qreal playbackRate() const
void stop(bool immediate=false)
QMediaMetaData trackMetaData(QPlatformMediaPlayer::TrackType type, int trackNumber)
STDMETHODIMP Invoke(IMFAsyncResult *pResult) override
void load(const QUrl &media, QIODevice *stream)
int activeTrack(QPlatformMediaPlayer::TrackType type)
void changeStatus(QMediaPlayer::MediaStatus newStatus)
QMediaTimeRange availablePlaybackRanges()
void setMuted(bool muted)
STDMETHODIMP_(ULONG) AddRef(void) override
void error(QMediaPlayer::Error error, QString errorString, bool isFatal)
STDMETHODIMP GetParameters(DWORD *pdwFlags, DWORD *pdwQueue) override
int trackCount(QPlatformMediaPlayer::TrackType)