4#ifndef EVRCUSTOMPRESENTER_H
5#define EVRCUSTOMPRESENTER_H
57 if (iid == __uuidof(IUnknown)) {
58 *
ppv =
static_cast<IUnknown*
>(
static_cast<IMFAsyncCallback*
>(
this));
59 }
else if (iid == __uuidof(IMFAsyncCallback)) {
60 *
ppv =
static_cast<IMFAsyncCallback*
>(
this);
85 STDMETHODIMP
Invoke(IMFAsyncResult* asyncResult)
override
128 DWORD schedulerThreadProcPrivate();
137 HANDLE m_schedulerThread;
138 HANDLE m_threadReadyEvent;
141 float m_playbackRate;
142 MFTIME m_perFrameInterval;
143 LONGLONG m_perFrame_1_4th;
144 MFTIME m_lastSampleTime;
170 ,
public IMFVideoDeviceID
171 ,
public IMFVideoPresenter
172 ,
public IMFRateSupport
173 ,
public IMFGetService
174 ,
public IMFTopologyServiceLookupClient
215 STDMETHODIMP
GetService(REFGUID guidService, REFIID
riid, LPVOID *ppvObject)
override;
222 STDMETHODIMP
OnClockStart(MFTIME systemTime, LONGLONG clockStartOffset)
override;
223 STDMETHODIMP
OnClockStop(MFTIME systemTime)
override;
257 return MF_E_SHUTDOWN;
263 inline bool isActive()
const
269 inline bool isScrubbing()
const {
return m_playbackRate == 0.0f; }
272 void notifyEvent(
long eventCode, LONG_PTR param1, LONG_PTR param2)
274 if (m_mediaEventSink)
275 m_mediaEventSink->Notify(eventCode, param1, param2);
278 float getMaxRate(
bool thin);
281 HRESULT configureMixer(IMFTransform *mixer);
284 HRESULT createOptimalVideoType(IMFMediaType* proposed, IMFMediaType **optimal);
285 HRESULT setMediaType(IMFMediaType *mediaType);
286 HRESULT isMediaTypeSupported(IMFMediaType *mediaType);
290 HRESULT renegotiateMediaType();
297 void processOutputLoop();
299 HRESULT deliverSample(IMFSample *sample,
bool repaint);
300 HRESULT trackSample(IMFSample *sample);
301 void releaseResources();
304 HRESULT prepareFrameStep(DWORD steps);
306 HRESULT deliverFrameStepSample(IMFSample *sample);
307 HRESULT completeFrameStep(IMFSample *sample);
326 FrameStep m_frameStep;
333 DWORD m_tokenCounter;
341 MFVideoNormalizedRect m_sourceRect;
342 float m_playbackRate;
347 IMFTransform *m_mixer;
348 IMediaEventSink *m_mediaEventSink;
349 IMFMediaType *m_mediaType;
352 bool m_canRenderToSurface;
STDMETHODIMP_(ULONG) AddRef() override
HRESULT(T::* InvokeFn)(IMFAsyncResult *asyncResult)
AsyncCallback(T *parent, InvokeFn fn)
STDMETHODIMP QueryInterface(REFIID iid, void **ppv) override
STDMETHODIMP Invoke(IMFAsyncResult *asyncResult) override
STDMETHODIMP_(ULONG) Release() override
STDMETHODIMP GetParameters(DWORD *, DWORD *) override
void positionChanged(qint64 position)
STDMETHODIMP GetDeviceID(IID *deviceID) override
STDMETHODIMP GetSlowestRate(MFRATE_DIRECTION direction, BOOL thin, float *rate) override
STDMETHODIMP_(ULONG) Release() override
STDMETHODIMP OnClockStop(MFTIME systemTime) override
STDMETHODIMP ReleaseServicePointers() override
STDMETHODIMP QueryInterface(REFIID riid, void **ppv) override
STDMETHODIMP OnClockRestart(MFTIME systemTime) override
STDMETHODIMP InitServicePointers(IMFTopologyServiceLookup *lookup) override
STDMETHODIMP GetService(REFGUID guidService, REFIID riid, LPVOID *ppvObject) override
void supportedFormatsChanged()
void setCropRect(QRect cropRect)
STDMETHODIMP_(ULONG) AddRef() override
STDMETHODIMP IsRateSupported(BOOL thin, float rate, float *nearestSupportedRate) override
STDMETHODIMP OnClockSetRate(MFTIME systemTime, float rate) override
STDMETHODIMP GetCurrentMediaType(IMFVideoMediaType **mediaType) override
void setSink(QVideoSink *sink)
STDMETHODIMP GetFastestRate(MFRATE_DIRECTION direction, BOOL thin, float *rate) override
STDMETHODIMP OnClockStart(MFTIME systemTime, LONGLONG clockStartOffset) override
STDMETHODIMP OnClockPause(MFTIME systemTime) override
STDMETHODIMP ProcessMessage(MFVP_MESSAGE_TYPE message, ULONG_PTR param) override
void presentSample(IMFSample *sample)
~EVRCustomPresenter() override
\inmodule QtCore\reentrant
The QVideoSink class represents a generic sink for video data.
HRESULT getSample(IMFSample **sample)
HRESULT returnSample(IMFSample *sample)
HRESULT scheduleSample(IMFSample *sample, bool presentNow)
const LONGLONG & frameDuration() const
void setFrameRate(const MFRatio &fps)
const LONGLONG & lastSampleTime() const
void setClockRate(float rate)
HRESULT processSamplesInQueue(LONG *nextSleep)
bool areSamplesScheduled()
static DWORD WINAPI schedulerThreadProc(LPVOID parameter)
HRESULT processSample(IMFSample *sample, LONG *nextSleep)
HRESULT startScheduler(IMFClock *clock)
bool qt_evr_setCustomPresenter(IUnknown *evr, EVRCustomPresenter *presenter)
Combined button and popup list for selecting options.
GLuint GLsizei const GLchar * message
GLenum const GLint * param
GLsizei GLenum GLboolean sink
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
IUIViewSettingsInterop __RPC__in REFIID riid
IUIViewSettingsInterop __RPC__in REFIID __RPC__deref_out_opt void ** ppv
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent