4#ifndef EVRCUSTOMPRESENTER_H
5#define EVRCUSTOMPRESENTER_H
26#include <private/qcomptr_p.h>
59 if (iid == __uuidof(IUnknown)) {
60 *
ppv =
static_cast<IUnknown*
>(
static_cast<IMFAsyncCallback*
>(
this));
61 }
else if (iid == __uuidof(IMFAsyncCallback)) {
62 *
ppv =
static_cast<IMFAsyncCallback*
>(
this);
87 STDMETHODIMP
Invoke(IMFAsyncResult* asyncResult)
override
126 DWORD schedulerThreadProcPrivate();
127 bool isSampleReadyToPresent(IMFSample *sample, LONG *pNextSleep)
const;
131 QQueue<ComPtr<IMFSample>> m_scheduledSamples;
133 ComPtr<IMFClock> m_clock;
140 float m_playbackRate;
141 MFTIME m_perFrame_1_4th;
161 QList<ComPtr<IMFSample>> m_videoSampleQueue;
167 ,
public IMFVideoDeviceID
168 ,
public IMFVideoPresenter
169 ,
public IMFRateSupport
170 ,
public IMFGetService
171 ,
public IMFTopologyServiceLookupClient
212 STDMETHODIMP
GetService(REFGUID guidService, REFIID
riid, LPVOID *ppvObject)
override;
219 STDMETHODIMP
OnClockStart(MFTIME systemTime, LONGLONG clockStartOffset)
override;
220 STDMETHODIMP
OnClockStop(MFTIME systemTime)
override;
254 return MF_E_SHUTDOWN;
260 inline bool isActive()
const
266 inline bool isScrubbing()
const {
return m_playbackRate == 0.0f; }
269 void notifyEvent(
long eventCode, LONG_PTR param1, LONG_PTR param2)
271 if (m_mediaEventSink)
272 m_mediaEventSink->Notify(eventCode, param1, param2);
275 float getMaxRate(
bool thin);
278 HRESULT configureMixer(IMFTransform *mixer);
281 HRESULT createOptimalVideoType(IMFMediaType* proposed, IMFMediaType **optimal);
282 HRESULT setMediaType(IMFMediaType *mediaType);
283 HRESULT isMediaTypeSupported(IMFMediaType *mediaType);
287 HRESULT renegotiateMediaType();
294 void processOutputLoop();
296 HRESULT deliverSample(
const ComPtr<IMFSample> &sample);
297 HRESULT trackSample(
const ComPtr<IMFSample> &sample);
298 void releaseResources();
301 HRESULT prepareFrameStep(DWORD steps);
303 HRESULT deliverFrameStepSample(
const ComPtr<IMFSample> &sample);
304 HRESULT completeFrameStep(
const ComPtr<IMFSample> &sample);
309 AsyncCallback<EVRCustomPresenter> m_sampleFreeCB;
315 QList<ComPtr<IMFSample>>
samples;
323 FrameStep m_frameStep;
330 DWORD m_tokenCounter;
337 MFVideoNormalizedRect m_sourceRect;
338 float m_playbackRate;
342 ComPtr<IMFClock> m_clock;
343 ComPtr<IMFTransform> m_mixer;
344 ComPtr<IMediaEventSink> m_mediaEventSink;
345 ComPtr<IMFMediaType> m_mediaType;
347 QPointer<QVideoSink> m_videoSink;
348 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
void presentSample(const ComPtr< IMFSample > &sample)
STDMETHODIMP OnClockStart(MFTIME systemTime, LONGLONG clockStartOffset) override
STDMETHODIMP OnClockPause(MFTIME systemTime) override
STDMETHODIMP ProcessMessage(MFVP_MESSAGE_TYPE message, ULONG_PTR param) override
~EVRCustomPresenter() override
EVRCustomPresenter(QVideoSink *sink=0)
\inmodule QtCore\reentrant
The QVideoSink class represents a generic sink for video data.
ComPtr< IMFSample > takeSample()
void returnSample(const ComPtr< IMFSample > &sample)
Scheduler(EVRCustomPresenter *presenter)
HRESULT startScheduler(ComPtr< IMFClock > clock)
void setFrameRate(const MFRatio &fps)
void setClockRate(float rate)
HRESULT processSamplesInQueue(LONG *nextSleep)
bool areSamplesScheduled()
HRESULT scheduleSample(const ComPtr< IMFSample > &sample, bool presentNow)
static DWORD WINAPI schedulerThreadProc(LPVOID parameter)
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