Qt 6.x
The Qt SDK
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"
22#include "qmediatimerange.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>
32#include "mfplayercontrol_p.h"
33
35
36class QUrl;
37
38class SourceResolver;
40class MFPlayerControl;
41class MFPlayerService;
43class MFTransform;
44
45class MFPlayerSession : public QObject, public IMFAsyncCallback
46{
48 friend class SourceResolver;
49public:
50 MFPlayerSession(MFPlayerControl *playerControl = 0);
52
53 STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppvObject) override;
54
55 STDMETHODIMP_(ULONG) AddRef(void) override;
56
57 STDMETHODIMP_(ULONG) Release(void) override;
58
59 STDMETHODIMP Invoke(IMFAsyncResult *pResult) override;
60
61 STDMETHODIMP GetParameters(DWORD *pdwFlags, DWORD *pdwQueue) override
62 {
63 Q_UNUSED(pdwFlags);
64 Q_UNUSED(pdwQueue);
65 return E_NOTIMPL;
66 }
67
68 void load(const QUrl &media, QIODevice *stream);
69 void stop(bool immediate = false);
70 void start();
71 void pause();
72
76 qreal playbackRate() const;
78 float bufferProgress();
80
82
83 void close();
84
86
87 QMediaMetaData metaData() const { return m_metaData; }
88
90
95
96 void setPlayerControl(MFPlayerControl *playerControl) { m_playerControl = playerControl; }
97
98 void statusChanged() { if (m_playerControl) m_playerControl->handleStatusChanged(); }
99 void tracksChanged() { if (m_playerControl) m_playerControl->handleTracksChanged(); }
100 void audioAvailable() { if (m_playerControl) m_playerControl->handleAudioAvailable(); }
101 void videoAvailable() { if (m_playerControl) m_playerControl->handleVideoAvailable(); }
102 void durationUpdate(qint64 duration) { if (m_playerControl) m_playerControl->handleDurationUpdate(duration); }
103 void seekableUpdate(bool seekable) { if (m_playerControl) m_playerControl->handleSeekableUpdate(seekable); }
104 void error(QMediaPlayer::Error error, QString errorString, bool isFatal) { if (m_playerControl) m_playerControl->handleError(error, errorString, isFatal); }
105 void playbackRateChanged(qreal rate) { if (m_playerControl) m_playerControl->playbackRateChanged(rate); }
106 void bufferProgressChanged(float percentFilled) { if (m_playerControl) m_playerControl->bufferProgressChanged(percentFilled); }
107 void metaDataChanged() { if (m_playerControl) m_playerControl->metaDataChanged(); }
108 void positionChanged(qint64 position) { if (m_playerControl) m_playerControl->positionChanged(position); }
109
110public Q_SLOTS:
111 void setVolume(float volume);
112 void setMuted(bool muted);
113 void updateOutputRouting();
114
116 void sessionEvent(IMFMediaEvent *sessionEvent);
117
118private Q_SLOTS:
119 void handleMediaSourceReady();
120 void handleSessionEvent(IMFMediaEvent *sessionEvent);
121 void handleSourceError(long hr);
122 void timeout();
123
124private:
125 long m_cRef;
126 MFPlayerControl *m_playerControl = nullptr;
127 MFVideoRendererControl *m_videoRendererControl = nullptr;
128 IMFMediaSession *m_session;
129 IMFPresentationClock *m_presentationClock;
130 IMFRateControl *m_rateControl;
131 IMFRateSupport *m_rateSupport;
132 IMFAudioStreamVolume *m_volumeControl;
133 IPropertyStore *m_netsourceStatistics;
134 qint64 m_position = 0;
135 qint64 m_restorePosition = -1;
136 qint64 m_timeCounter = 0;
137 UINT64 m_duration = 0;
138 bool m_updatingTopology = false;
139 bool m_updateRoutingOnStart = false;
140
141 enum Command
142 {
143 CmdNone = 0,
144 CmdStop,
145 CmdStart,
146 CmdPause,
147 CmdSeek,
148 CmdSeekResume,
149 CmdStartAndSeek
150 };
151
152 void clear();
153 void setPositionInternal(qint64 position, Command requestCmd);
154 void setPlaybackRateInternal(qreal rate);
155 void commitRateChange(qreal rate, BOOL isThin);
156 bool canScrub() const;
157 void scrub(bool enableScrub);
158 bool m_scrubbing;
159 float m_restoreRate;
160
161 SourceResolver *m_sourceResolver;
162 HANDLE m_hCloseEvent;
163 bool m_closing;
164
165 enum MediaType
166 {
167 Unknown = 0,
168 Audio = 1,
169 Video = 2,
170 };
171 DWORD m_mediaTypes;
172
173 enum PendingState
174 {
175 NoPending = 0,
176 CmdPending,
177 SeekPending,
178 };
179
180 struct SeekState
181 {
182 void setCommand(Command cmd) {
183 prevCmd = command;
184 command = cmd;
185 }
186 Command command;
187 Command prevCmd;
188 float rate; // Playback rate
189 BOOL isThin; // Thinned playback?
190 qint64 start; // Start position
191 };
192 SeekState m_state; // Current nominal state.
193 SeekState m_request; // Pending request.
194 PendingState m_pendingState;
195 float m_pendingRate;
196 void updatePendingCommands(Command command);
197
198 struct TrackInfo
199 {
200 QList<QMediaMetaData> metaData;
201 QList<int> nativeIndexes;
202 int currentIndex = -1;
203 TOPOID sourceNodeId = -1;
204 TOPOID outputNodeId = -1;
205 GUID format = GUID_NULL;
206 };
207 TrackInfo m_trackInfo[QPlatformMediaPlayer::NTrackTypes];
208
210 bool m_canScrub;
211 float m_volume = 1.;
212 bool m_muted = false;
213
214 QPlatformAudioOutput *m_audioOutput = nullptr;
215 QMediaMetaData m_metaData;
216
217 void setVolumeInternal(float volume);
218
219 bool createSession();
220 void setupPlaybackTopology(IMFMediaSource *source, IMFPresentationDescriptor *sourcePD);
221 bool getStreamInfo(IMFStreamDescriptor *stream, MFPlayerSession::MediaType *type, QString *name, QString *language, GUID *format) const;
222 IMFTopologyNode* addSourceNode(IMFTopology* topology, IMFMediaSource* source,
223 IMFPresentationDescriptor* presentationDesc, IMFStreamDescriptor *streamDesc);
224 IMFTopologyNode* addOutputNode(MediaType mediaType, IMFTopology* topology, DWORD sinkID);
225
226 bool addAudioSampleGrabberNode(IMFTopology* topology);
227 bool setupAudioSampleGrabber(IMFTopology *topology, IMFTopologyNode *sourceNode, IMFTopologyNode *outputNode);
228 QAudioFormat audioFormatForMFMediaType(IMFMediaType *mediaType) const;
229 // ### Below can be used to monitor the audio channel. Currently unused.
230 AudioSampleGrabberCallback *m_audioSampleGrabber;
231 IMFTopologyNode *m_audioSampleGrabberNode;
232
233 IMFTopology *insertMFT(IMFTopology *topology, TOPOID outputNodeId);
234 bool insertResizer(IMFTopology *topology);
235 void insertColorConverter(IMFTopology *topology, TOPOID outputNodeId);
236 // ### Below can be used to monitor the video channel. Functionality currently unused.
237 MFTransform *m_videoProbeMFT;
238
239 QTimer m_signalPositionChangeTimer;
240 qint64 m_lastPosition = -1;
241};
242
244
245#endif
AVFCameraSession * m_session
IOBluetoothDevice * device
void handleError(QMediaPlayer::Error errorCode, const QString &errorString, bool isFatal)
void handleSeekableUpdate(bool seekable)
void handleDurationUpdate(qint64 duration)
void seekableUpdate(bool seekable)
void setPlaybackRate(qreal rate)
QMediaMetaData metaData() const
void setAudioOutput(QPlatformAudioOutput *device)
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)
void setPlayerControl(MFPlayerControl *playerControl)
void durationUpdate(qint64 duration)
qreal playbackRate() const
void stop(bool immediate=false)
void setVolume(float volume)
QMediaMetaData trackMetaData(QPlatformMediaPlayer::TrackType type, int trackNumber)
STDMETHODIMP Invoke(IMFAsyncResult *pResult) override
void load(const QUrl &media, QIODevice *stream)
int activeTrack(QPlatformMediaPlayer::TrackType type)
QMediaPlayer::MediaStatus status() const
void changeStatus(QMediaPlayer::MediaStatus newStatus)
QMediaTimeRange availablePlaybackRanges()
STDMETHODIMP_(ULONG) Release(void) override
void setMuted(bool muted)
STDMETHODIMP_(ULONG) AddRef(void) override
void sessionEvent(IMFMediaEvent *sessionEvent)
void error(QMediaPlayer::Error error, QString errorString, bool isFatal)
STDMETHODIMP GetParameters(DWORD *pdwFlags, DWORD *pdwQueue) override
int trackCount(QPlatformMediaPlayer::TrackType)
The QAudioFormat class stores audio stream parameter information.
\inmodule QtCore \reentrant
Definition qiodevice.h:34
Definition qlist.h:74
\inmodule QtMultimedia
MediaStatus
\qmlproperty enumeration QtMultimedia::MediaPlayer::playbackState
Error
\qmlproperty enumeration QtMultimedia::MediaPlayer::mediaStatus
The QMediaTimeRange class represents a set of zero or more disjoint time intervals.
\inmodule QtCore
Definition qobject.h:90
void positionChanged(qint64 position)
void playbackRateChanged(qreal rate)
void bufferProgressChanged(float progress)
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
\inmodule QtCore
Definition qtimer.h:20
\inmodule QtCore
Definition qurl.h:94
The QVideoSink class represents a generic sink for video data.
Definition qvideosink.h:22
b clear()
static bool isFatal(QtMsgType msgType)
Definition qlogging.cpp:198
Combined button and popup list for selecting options.
DBusConnection const char DBusError * error
EGLStreamKHR stream
n void setPosition(void) \n\
GLuint index
[2]
GLbitfield GLuint64 timeout
[4]
GLenum type
GLuint start
GLuint name
GLint GLsizei GLsizei GLenum format
GLsizei GLsizei GLchar * source
GLuint GLenum * rate
GLsizei GLenum GLboolean sink
#define Q_OBJECT
#define Q_SLOTS
#define Q_SIGNALS
#define Q_UNUSED(x)
long long qint64
Definition qtypes.h:55
double qreal
Definition qtypes.h:92
IUIViewSettingsInterop __RPC__in REFIID riid