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:
54
55 MFPlayerSession(MFPlayerControl *playerControl = 0);
56
57 STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppvObject) override;
58
60
62
63 STDMETHODIMP Invoke(IMFAsyncResult *pResult) override;
64
65 STDMETHODIMP GetParameters(DWORD *pdwFlags, DWORD *pdwQueue) override
66 {
67 Q_UNUSED(pdwFlags);
68 Q_UNUSED(pdwQueue);
69 return E_NOTIMPL;
70 }
71
72 void load(const QUrl &media, QIODevice *stream);
73 void stop(bool immediate = false);
74 void start();
75 void pause();
76
79 void setPosition(qint64 position);
80 qreal playbackRate() const;
81 void setPlaybackRate(qreal rate);
82 float bufferProgress();
83 QMediaTimeRange availablePlaybackRanges();
84
85 void changeStatus(QMediaPlayer::MediaStatus newStatus);
86
87 void close();
88
89 void setAudioOutput(QPlatformAudioOutput *device);
90
91 QMediaMetaData metaData() const { return m_metaData; }
92
93 void setVideoSink(QVideoSink *sink);
94
95 void setActiveTrack(TrackType type, int index);
96 int activeTrack(TrackType type);
98 QMediaMetaData trackMetaData(TrackType type, int trackNumber);
99
100 void setPlayerControl(MFPlayerControl *playerControl) { m_playerControl = playerControl; }
101
102 void statusChanged(QMediaPlayer::MediaStatus status) { if (m_playerControl) m_playerControl->handleStatusChanged(status); }
103 void tracksChanged() { if (m_playerControl) m_playerControl->handleTracksChanged(); }
104 void audioAvailable() { if (m_playerControl) m_playerControl->handleAudioAvailable(); }
105 void videoAvailable() { if (m_playerControl) m_playerControl->handleVideoAvailable(); }
106 void durationUpdate(qint64 duration) { if (m_playerControl) m_playerControl->handleDurationUpdate(duration); }
107 void seekableUpdate(bool seekable) { if (m_playerControl) m_playerControl->handleSeekableUpdate(seekable); }
108 void error(QMediaPlayer::Error error, QString errorString, bool isFatal) { if (m_playerControl) m_playerControl->handleError(error, errorString, isFatal); }
109 void playbackRateChanged(qreal rate) { if (m_playerControl) m_playerControl->playbackRateChanged(rate); }
110 void bufferProgressChanged(float percentFilled) { if (m_playerControl) m_playerControl->bufferProgressChanged(percentFilled); }
111 void metaDataChanged() { if (m_playerControl) m_playerControl->metaDataChanged(); }
112 void positionChanged(qint64 position) { if (m_playerControl) m_playerControl->positionChanged(position); }
113
114public Q_SLOTS:
115 void setVolume(float volume);
116 void setMuted(bool muted);
117 void updateOutputRouting();
118
121
122private Q_SLOTS:
124 void handleSessionEvent(const ComPtr<IMFMediaEvent> &sessionEvent);
125 void handleSourceError(long hr);
126 void timeout();
127
128private:
129 long m_cRef;
130 MFPlayerControl *m_playerControl = nullptr;
131 MFVideoRendererControl *m_videoRendererControl = nullptr;
132 ComPtr<IMFMediaSession> m_session;
133 ComPtr<IMFPresentationClock> m_presentationClock;
134 ComPtr<IMFRateControl> m_rateControl;
135 ComPtr<IMFRateSupport> m_rateSupport;
136 ComPtr<IMFAudioStreamVolume> m_volumeControl;
137 ComPtr<IPropertyStore> m_netsourceStatistics;
138 qint64 m_position = 0;
139 qint64 m_restorePosition = -1;
140 qint64 m_timeCounter = 0;
141 UINT64 m_duration = 0;
142 bool m_updatingTopology = false;
143 bool m_updateRoutingOnStart = false;
144
145 enum Command
146 {
147 CmdNone = 0,
148 CmdStop,
149 CmdStart,
150 CmdPause,
151 CmdSeek,
152 CmdSeekResume,
153 CmdStartAndSeek
154 };
155
156 void clear();
157 void setPositionInternal(qint64 position, Command requestCmd);
158 void setPlaybackRateInternal(qreal rate);
159 void commitRateChange(qreal rate, BOOL isThin);
160 bool canScrub() const;
161 void scrub(bool enableScrub);
162 bool m_scrubbing;
163 float m_restoreRate;
164
165 ComPtr<SourceResolver> m_sourceResolver;
166 EventHandle m_hCloseEvent;
167 bool m_closing;
168 bool m_deferredPause = false;
169
170 enum MediaType
171 {
172 Unknown = 0,
173 Audio = 1,
174 Video = 2,
175 };
176 DWORD m_mediaTypes;
177
178 enum PendingState
179 {
180 NoPending = 0,
181 CmdPending,
182 SeekPending,
183 };
184
185 struct SeekState
186 {
187 void setCommand(Command cmd) {
188 prevCmd = command;
189 command = cmd;
190 }
191 Command command;
192 Command prevCmd;
193 float rate; // Playback rate
194 BOOL isThin; // Thinned playback?
195 qint64 start; // Start position
196 };
197 SeekState m_state; // Current nominal state.
198 SeekState m_request; // Pending request.
199 PendingState m_pendingState;
200 float m_pendingRate;
201 void updatePendingCommands(Command command);
202
203 struct TrackInfo
204 {
205 QList<QMediaMetaData> metaData;
206 QList<int> nativeIndexes;
207 int currentIndex = -1;
208 TOPOID sourceNodeId = -1;
209 TOPOID outputNodeId = -1;
210 GUID format = GUID_NULL;
211 };
212 QPlatformMediaPlayer::TrackTypeMap<TrackInfo> m_trackInfo;
213
214 bool m_canScrub;
215 float m_volume = 1.;
216 bool m_muted = false;
217
218 QPlatformAudioOutput *m_audioOutput = nullptr;
219 QMediaMetaData m_metaData;
220
221 void setVolumeInternal(float volume);
222
223 bool createSession();
224 void setupPlaybackTopology(IMFMediaSource *source, IMFPresentationDescriptor *sourcePD);
225 bool getStreamInfo(IMFStreamDescriptor *stream, MFPlayerSession::MediaType *type, QString *name, QString *language, GUID *format) const;
226 ComPtr<IMFTopologyNode> addSourceNode(IMFTopology *topology, IMFMediaSource *source,
227 IMFPresentationDescriptor *presentationDesc,
228 IMFStreamDescriptor *streamDesc);
229 ComPtr<IMFTopologyNode> addOutputNode(MediaType mediaType, IMFTopology *topology, DWORD sinkID);
230
231 QAudioFormat audioFormatForMFMediaType(IMFMediaType *mediaType) const;
232
233 ComPtr<IMFTopology> insertMFT(const ComPtr<IMFTopology> &topology, TOPOID outputNodeId);
234 bool insertResizer(IMFTopology *topology);
235 void insertColorConverter(IMFTopology *topology, TOPOID outputNodeId);
236
237 QTimer m_signalPositionChangeTimer;
238 qint64 m_lastPosition = -1;
239};
240
241QT_END_NAMESPACE
242
243#endif
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 seekableUpdate(bool seekable)
void setPlaybackRate(qreal rate)
void setPosition(qint64 position)
QMediaMetaData metaData() const
void setVideoSink(QVideoSink *sink)
void bufferProgressChanged(float percentFilled)
void setActiveTrack(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)
int trackCount(TrackType)
STDMETHODIMP Invoke(IMFAsyncResult *pResult) override
void load(const QUrl &media, QIODevice *stream)
void statusChanged(QMediaPlayer::MediaStatus status)
void changeStatus(QMediaPlayer::MediaStatus newStatus)
QMediaTimeRange availablePlaybackRanges()
void setMuted(bool muted)
int activeTrack(TrackType type)
STDMETHODIMP_(ULONG) AddRef(void) override
QMediaMetaData trackMetaData(TrackType type, int trackNumber)
void error(QMediaPlayer::Error error, QString errorString, bool isFatal)
STDMETHODIMP GetParameters(DWORD *pdwFlags, DWORD *pdwQueue) override
Combined button and popup list for selecting options.