reference

This documentation is automatically generated from the openFrameworks source code using doxygen and refers to the most recent release, version 0.12.0.

ofMediaFoundationPlayer.h
Go to the documentation of this file.
1#pragma once
2
3#include <mfmediaengine.h>
4#include <d3d11_1.h>
5#include <wrl.h>
6#include <wincodec.h>
7#include "ofConstants.h"
8#include "ofVideoBaseTypes.h"
9#include "ofPixels.h"
10#include "ofFbo.h"
11#include "ofEvent.h"
12
13#include <mutex>
14#include <queue>
15
16namespace of {
18 public:
19 virtual void OnMediaEngineEvent(DWORD meEvent, DWORD_PTR param1, DWORD param2) = 0;
20 };
21}
22
24protected:
26
27 // MediaEngineNotify: Implements the callback for Media Engine event notification.
28 class ofMEEventProcessor : public IMFMediaEngineNotify {
29 public:
30
31 STDMETHODIMP QueryInterface(REFIID riid, void** ppv) {
32 if (__uuidof(IMFMediaEngineNotify) == riid) {
33 *ppv = static_cast<IMFMediaEngineNotify*>(this);
34 } else {
35 *ppv = nullptr;
36 return E_NOINTERFACE;
37 }
38 AddRef();
39 return S_OK;
40 }
41
42 // EventNotify is called when the Media Engine sends an event.
43 STDMETHODIMP EventNotify(DWORD meEvent, DWORD_PTR param1, DWORD param2) {
44 if (meEvent == MF_MEDIA_ENGINE_EVENT_NOTIFYSTABLESTATE) {
45 SetEvent(reinterpret_cast<HANDLE>(param1));
46 } else {
47 mCB->OnMediaEngineEvent(meEvent, param1, param2);
48 }
49 return S_OK;
50 }
51
52 // we are going to store and manage this, so don't worry about these functions
53 STDMETHODIMP_(ULONG) AddRef() {return 0;}
54 STDMETHODIMP_(ULONG) Release() {return 0;}
55
56 void setCB(MediaEngineNotifyCallback* acb) {
57 mCB = acb;
58 }
59
60 protected:
61 MediaEngineNotifyCallback* mCB = nullptr;
62 };
63
64public:
65 static std::string MFEventToString(MF_MEDIA_ENGINE_EVENT aevent);
66 static std::string MFErrorToString(MF_MEDIA_ENGINE_ERR aerror);
67
70
71 static void setDurationHackEnabled(bool ab);
72
73 bool load(std::string name) override;
74 void loadAsync(std::string name) override;
75 void close() override;
76
77 bool isInitialized() const override;
78
79 void update() override;
80 bool isFrameNew() const override;
81 void play() override;
82 void stop() override;
83 void setPaused(bool bPause) override;
84
85 bool isLoaded() const override;
86 bool isPlaying() const override;
87
88 float getWidth() const override;
89 float getHeight() const override;
90
92
93 bool isPaused() const override;
94
95 void setPosition(float pct) override;
96 void setSpeed(float speed) override;
97 void setVolume(float volume) override;
98
99 void setFrame(int frame) override;
100 int getCurrentFrame() const override;
101 int getTotalNumFrames() const override;
102
103 void setLoopState(ofLoopType state) override;
104 ofLoopType getLoopState() const override;
105
106 float getPosition() const override;
107 float getSpeed() const override;
108 float getDuration() const override;
109 bool getIsMovieDone() const override;
110
111 bool hasAudio();
112 bool hasVideo();
113
114 void firstFrame() override;
115 void nextFrame() override;
116 void previousFrame() override;
117
118 bool setPixelFormat(ofPixelFormat pixelFormat) override;
119 ofPixelFormat getPixelFormat() const override;
120
121 ofPixels& getPixels() override;
122 const ofPixels& getPixels() const override;
123
124 void setUsingHWAccel(bool ab) { mBUseHWAccel = ab; };
125 bool isUsingHWAccel() { return mBUseHWAccel; }
126
127 float getFrameRate() { return mFramerate; }
128
131
132protected:
133 bool _load(std::string name, bool abAsync);
134 void OnMediaEngineEvent(DWORD aEvent, DWORD_PTR param1, DWORD param2) override;
135
137 public:
140
141 bool createDX11Device();
142 bool isHWSupported() { return mBUseDX; }
143
144 IMFDXGIDeviceManager* getDXGIManagerPtr() { return m_spDXGIManager.Get(); }
145 ID3D11Device* getD11Device() { return m_spDX11Device.Get(); }
146 HANDLE getGLHandleD3D() { return gl_handleD3D; }
147 ID3D11DeviceContext* getContext() {return m_spDX11DeviceContext.Get();}
148
149 protected:
150 bool mBUseDX = true;
151 Microsoft::WRL::ComPtr<IMFDXGIDeviceManager> m_spDXGIManager;
152 Microsoft::WRL::ComPtr<ID3D11Device> m_spDX11Device;
153 Microsoft::WRL::ComPtr<ID3D11DeviceContext> m_spDX11DeviceContext;
154
155 UINT mResetToken = 0;
157 };
158
159
160public:
161 static std::shared_ptr<MEDXDeviceManager> getDxDeviceManager();
162
163 class METexture {
164 public:
165 virtual bool allocate(ofPixelFormat afmt, int aw, int ah);
166 virtual bool transferFrame(IMFMediaEngine* aengine) = 0;
167 virtual bool create(DXGI_FORMAT aDxFormat) = 0;
168 virtual bool isValid() = 0;
169 virtual bool draw(ofPixels& apix) = 0;
170 virtual bool updatePixels(ofTexture& aSrcTex, ofPixels& apix, ofPixelFormat aTargetPixFormat) = 0;
171
172 int getWidth() { return mWidth; }
173 int getHeight() { return mHeight; }
174
175 protected:
177
178 unsigned int mWidth = 0;
179 unsigned int mHeight = 0;
180
181 MFARGB bgColor{ 0, 0, 0, 0 };
182 MFVideoNormalizedRect mNormalizedVidRect{ 0.0f, 0.0f, 1.0f, 1.0f };
184 std::shared_ptr<ofTexture> mOfTex;
186 };
187
188protected:
189
190 void handleMEEvent(DWORD aevent);
191 void updateDuration();
192
193 std::shared_ptr<METexture> mMeTexture;
194
195 bool mBUseHWAccel = true;
196 static bool sBAllowDurationHack;// = true;
197
198 bool mBReady = false;
199 bool mBLoaded = false;
200 bool mBNewFrame = false;
201 mutable double mDuration = 0.0;
202 float mWidth = 0.f;
203 float mHeight = 0.f;
204 bool mBDone = false;
205 bool mBPlaying = false;
206 bool mBCanSeek = false;
207 float mFramerate = 1.f / 30.f;
211 float mTargetSeekPercent = -1.0;
212
213 double mTimeStartedSeek = 0.0;
214 double mTimePlayback = 0.0;
215
216 std::shared_ptr<ofMEEventProcessor> mEventProcessor;
217
218 static std::shared_ptr<MEDXDeviceManager> sDeviceManager;
219
220 DXGI_FORMAT m_d3dFormat = DXGI_FORMAT_B8G8R8A8_UNORM;
221
222 // Media Engine related
223 Microsoft::WRL::ComPtr<IMFMediaEngine> m_spMediaEngine;
224 Microsoft::WRL::ComPtr<IMFMediaEngineEx> m_spEngineEx;
225
226 CRITICAL_SECTION m_critSec;
227
228 //static int sNumInstances;
229
230 //static bool sInitMediaFoundation();
231 //static void sCloseMediaFoundation();
232
233 std::queue<DWORD> mEventsQueue;
234 std::mutex mMutexEvents;
235 // needed to copy the pixels while in lock()
236 // also an easy color conversion
240 mutable bool mBUpdatePixels = false;
241
242 //std::mutex mMutexLoad;
243 bool mBLoadAsync = false;
244 std::atomic_bool mBIsDoneAtomic;
245 std::atomic_bool mBIsClosedAtomic;
246 std::condition_variable mWaitCondition;
247
248};
A base class representing a video player.
Definition ofVideoBaseTypes.h:178
Definition ofEvent.h:444
Definition ofFbo.h:46
Definition ofMediaFoundationPlayer.h:136
Microsoft::WRL::ComPtr< ID3D11DeviceContext > m_spDX11DeviceContext
Definition ofMediaFoundationPlayer.h:153
Microsoft::WRL::ComPtr< ID3D11Device > m_spDX11Device
Definition ofMediaFoundationPlayer.h:152
bool createDX11Device()
Definition ofMediaFoundationPlayer.cpp:44
IMFDXGIDeviceManager * getDXGIManagerPtr()
Definition ofMediaFoundationPlayer.h:144
ID3D11DeviceContext * getContext()
Definition ofMediaFoundationPlayer.h:147
Microsoft::WRL::ComPtr< IMFDXGIDeviceManager > m_spDXGIManager
Definition ofMediaFoundationPlayer.h:151
MEDXDeviceManager()
Definition ofMediaFoundationPlayer.cpp:28
bool isHWSupported()
Definition ofMediaFoundationPlayer.h:142
HANDLE gl_handleD3D
Definition ofMediaFoundationPlayer.h:156
HANDLE getGLHandleD3D()
Definition ofMediaFoundationPlayer.h:146
UINT mResetToken
Definition ofMediaFoundationPlayer.h:155
ID3D11Device * getD11Device()
Definition ofMediaFoundationPlayer.h:145
bool mBUseDX
Definition ofMediaFoundationPlayer.h:150
~MEDXDeviceManager()
Definition ofMediaFoundationPlayer.cpp:33
Definition ofMediaFoundationPlayer.h:163
virtual bool create(DXGI_FORMAT aDxFormat)=0
virtual bool updatePixels(ofTexture &aSrcTex, ofPixels &apix, ofPixelFormat aTargetPixFormat)=0
int getHeight()
Definition ofMediaFoundationPlayer.h:173
int getWidth()
Definition ofMediaFoundationPlayer.h:172
MFVideoNormalizedRect mNormalizedVidRect
Definition ofMediaFoundationPlayer.h:182
std::shared_ptr< ofTexture > mOfTex
Definition ofMediaFoundationPlayer.h:184
unsigned int mWidth
Definition ofMediaFoundationPlayer.h:178
ofPixelFormat mOfPixFmt
Definition ofMediaFoundationPlayer.h:183
virtual bool draw(ofPixels &apix)=0
MFARGB bgColor
Definition ofMediaFoundationPlayer.h:181
virtual bool transferFrame(IMFMediaEngine *aengine)=0
ofPixels mSrcPixels
Definition ofMediaFoundationPlayer.h:185
unsigned int mHeight
Definition ofMediaFoundationPlayer.h:179
virtual bool allocate(ofPixelFormat afmt, int aw, int ah)
Definition ofMediaFoundationPlayer.cpp:137
bool _swapPixelsFromSrc4ChannelTo3(ofPixels &aDstPix)
Definition ofMediaFoundationPlayer.cpp:155
Definition ofMediaFoundationPlayer.h:28
MediaEngineNotifyCallback * mCB
Definition ofMediaFoundationPlayer.h:61
STDMETHODIMP_(ULONG) Release()
Definition ofMediaFoundationPlayer.h:54
STDMETHODIMP_(ULONG) AddRef()
Definition ofMediaFoundationPlayer.h:53
void setCB(MediaEngineNotifyCallback *acb)
Definition ofMediaFoundationPlayer.h:56
STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
Definition ofMediaFoundationPlayer.h:31
STDMETHODIMP EventNotify(DWORD meEvent, DWORD_PTR param1, DWORD param2)
Definition ofMediaFoundationPlayer.h:43
Definition ofMediaFoundationPlayer.h:23
CRITICAL_SECTION m_critSec
Definition ofMediaFoundationPlayer.h:226
bool mBCanSeek
Definition ofMediaFoundationPlayer.h:206
ofEvent< MF_MEDIA_ENGINE_EVENT > MFEngineEvent
Definition ofMediaFoundationPlayer.h:129
float getPosition() const override
Get the current playhead position of the loaded video.
Definition ofMediaFoundationPlayer.cpp:1094
void setFrame(int frame) override
Set the current frame by frame number.
Definition ofMediaFoundationPlayer.cpp:1061
bool hasAudio()
Definition ofMediaFoundationPlayer.cpp:1125
bool mBLoadAsync
Definition ofMediaFoundationPlayer.h:243
int mEstimatedNumFrames
Definition ofMediaFoundationPlayer.h:208
void setLoopState(ofLoopType state) override
Set the video loop state.
Definition ofMediaFoundationPlayer.cpp:1076
static std::shared_ptr< MEDXDeviceManager > getDxDeviceManager()
Definition ofMediaFoundationPlayer.cpp:620
void setPosition(float pct) override
Set the position of the playhead.
Definition ofMediaFoundationPlayer.cpp:1007
bool mBUseHWAccel
Definition ofMediaFoundationPlayer.h:195
bool _load(std::string name, bool abAsync)
Definition ofMediaFoundationPlayer.cpp:639
float getHeight() const override
Get the height in pixels of the loaded video.
Definition ofMediaFoundationPlayer.cpp:989
bool mBReady
Definition ofMediaFoundationPlayer.h:198
ofLoopType mLoopType
Definition ofMediaFoundationPlayer.h:210
void updateDuration()
Definition ofMediaFoundationPlayer.cpp:1372
float getDuration() const override
Get the duration of the loaded video in seconds.
Definition ofMediaFoundationPlayer.cpp:1115
bool hasVideo()
Definition ofMediaFoundationPlayer.cpp:1133
static bool sBAllowDurationHack
Definition ofMediaFoundationPlayer.h:196
ofPixelFormat getPixelFormat() const override
Definition ofMediaFoundationPlayer.cpp:1181
void play() override
Play the video from the current playhead position.
Definition ofMediaFoundationPlayer.cpp:940
void handleMEEvent(DWORD aevent)
Definition ofMediaFoundationPlayer.cpp:1201
void OnMediaEngineEvent(DWORD aEvent, DWORD_PTR param1, DWORD param2) override
Definition ofMediaFoundationPlayer.cpp:827
bool isInitialized() const override
Returns true if a video is loaded.
Definition ofMediaFoundationPlayer.cpp:822
bool mBNewFrame
Definition ofMediaFoundationPlayer.h:200
ofTexture * getTexturePtr()
Get a pointer to the video texture used internally if it exists.
Definition ofMediaFoundationPlayer.cpp:994
bool mBPlaying
Definition ofMediaFoundationPlayer.h:205
double mTimePlayback
Definition ofMediaFoundationPlayer.h:214
void firstFrame() override
Set the playhead position to the first frame.
Definition ofMediaFoundationPlayer.cpp:1141
bool isFrameNew() const override
Definition ofMediaFoundationPlayer.cpp:935
void update() override
Update the object's state.
Definition ofMediaFoundationPlayer.cpp:854
float mHeight
Definition ofMediaFoundationPlayer.h:203
Microsoft::WRL::ComPtr< IMFMediaEngineEx > m_spEngineEx
Definition ofMediaFoundationPlayer.h:224
bool setPixelFormat(ofPixelFormat pixelFormat) override
Set the requested ofPixelFormat.
Definition ofMediaFoundationPlayer.cpp:1160
float mTargetSeekPercent
Definition ofMediaFoundationPlayer.h:211
static std::string MFEventToString(MF_MEDIA_ENGINE_EVENT aevent)
Definition ofMediaFoundationPlayer.cpp:534
std::atomic_bool mBIsDoneAtomic
Definition ofMediaFoundationPlayer.h:244
void setSpeed(float speed) override
Set the video playback speed.
Definition ofMediaFoundationPlayer.cpp:1040
std::shared_ptr< METexture > mMeTexture
Definition ofMediaFoundationPlayer.h:193
bool isPlaying() const override
Returns true if the loaded video is playing.
Definition ofMediaFoundationPlayer.cpp:979
ofPixelFormat mPixFormat
Definition ofMediaFoundationPlayer.h:209
void setVolume(float volume) override
Set the volume of the video player.
Definition ofMediaFoundationPlayer.cpp:1052
void close() override
Close the video source.
Definition ofMediaFoundationPlayer.cpp:768
bool getIsMovieDone() const override
Returns true if the loaded video has finished playing.
Definition ofMediaFoundationPlayer.cpp:1120
std::queue< DWORD > mEventsQueue
Definition ofMediaFoundationPlayer.h:233
bool isLoaded() const override
Returns true if a video is loaded.
Definition ofMediaFoundationPlayer.cpp:974
ofEvent< MF_MEDIA_ENGINE_ERR > MFErrorEvent
Definition ofMediaFoundationPlayer.h:130
ofMediaFoundationPlayer()
Definition ofMediaFoundationPlayer.cpp:604
static std::string MFErrorToString(MF_MEDIA_ENGINE_ERR aerror)
Definition ofMediaFoundationPlayer.cpp:585
DXGI_FORMAT m_d3dFormat
Definition ofMediaFoundationPlayer.h:220
void previousFrame() override
Advance the playhead backward one frame.
Definition ofMediaFoundationPlayer.cpp:1153
ofLoopType getLoopState() const override
Get the current loop state of the video.
Definition ofMediaFoundationPlayer.cpp:1089
Microsoft::WRL::ComPtr< IMFMediaEngine > m_spMediaEngine
Definition ofMediaFoundationPlayer.h:223
std::mutex mMutexEvents
Definition ofMediaFoundationPlayer.h:234
float mWidth
Definition ofMediaFoundationPlayer.h:202
static void setDurationHackEnabled(bool ab)
Definition ofMediaFoundationPlayer.cpp:23
int getTotalNumFrames() const override
Get the total number of frames in the currently loaded video.
Definition ofMediaFoundationPlayer.cpp:1071
int getCurrentFrame() const override
Get the current playhead position as a frame number.
Definition ofMediaFoundationPlayer.cpp:1066
float getFrameRate()
Definition ofMediaFoundationPlayer.h:127
std::shared_ptr< ofMEEventProcessor > mEventProcessor
Definition ofMediaFoundationPlayer.h:216
float getSpeed() const override
Get the playback speed of the video player.
Definition ofMediaFoundationPlayer.cpp:1107
~ofMediaFoundationPlayer()
Definition ofMediaFoundationPlayer.cpp:613
std::atomic_bool mBIsClosedAtomic
Definition ofMediaFoundationPlayer.h:245
double mTimeStartedSeek
Definition ofMediaFoundationPlayer.h:213
bool mBLoaded
Definition ofMediaFoundationPlayer.h:199
bool load(std::string name) override
Load a video resource by name.
Definition ofMediaFoundationPlayer.cpp:629
bool mBDone
Definition ofMediaFoundationPlayer.h:204
ofPixels mPixels
Definition ofMediaFoundationPlayer.h:239
bool isUsingHWAccel()
Definition ofMediaFoundationPlayer.h:125
static std::shared_ptr< MEDXDeviceManager > sDeviceManager
Definition ofMediaFoundationPlayer.h:218
void setUsingHWAccel(bool ab)
Definition ofMediaFoundationPlayer.h:124
ofPixels & getPixels() override
Get a reference to the underlying ofPixels.
Definition ofMediaFoundationPlayer.cpp:1186
float getWidth() const override
Get the width in pixels of the loaded video.
Definition ofMediaFoundationPlayer.cpp:984
void nextFrame() override
Advance the playhead forward one frame.
Definition ofMediaFoundationPlayer.cpp:1146
bool mBUpdatePixels
Definition ofMediaFoundationPlayer.h:240
void setPaused(bool bPause) override
Set the paused state of the video.
Definition ofMediaFoundationPlayer.cpp:962
ofFbo mFbo
Definition ofMediaFoundationPlayer.h:237
bool isPaused() const override
Returns true if the video is paused.
Definition ofMediaFoundationPlayer.cpp:999
double mDuration
Definition ofMediaFoundationPlayer.h:201
ofTexture mCopyTex
Definition ofMediaFoundationPlayer.h:238
std::condition_variable mWaitCondition
Definition ofMediaFoundationPlayer.h:246
void stop() override
Pause and reset the playhead position to the first frame.
Definition ofMediaFoundationPlayer.cpp:951
float mFramerate
Definition ofMediaFoundationPlayer.h:207
void loadAsync(std::string name) override
Asynchronously load a video resource by name.
Definition ofMediaFoundationPlayer.cpp:634
Definition ofMediaFoundationSoundPlayer.h:84
A wrapper class for an OpenGL texture.
Definition ofTexture.h:253
Definition ofEvents.cpp:625
ofPixelFormat
Used to represent the available pixel formats.
Definition ofPixels.h:68
ofLoopType
Used to represent the available video looping modes.
Definition ofVideoBaseTypes.h:11
@ OF_LOOP_NONE
Plays the video once without looping.
Definition ofVideoBaseTypes.h:13
Definition ofMediaFoundationPlayer.h:17
virtual void OnMediaEngineEvent(DWORD meEvent, DWORD_PTR param1, DWORD param2)=0