framework2
539 строк · 14.1 Кб
1#include "ofVideoPlayer.h"
2#include "ofAppRunner.h"
3#include "ofGLUtils.h"
4#include "ofPixels.h"
5#include <algorithm>
6
7using std::shared_ptr;
8using std::vector;
9using std::string;
10
11
12#ifdef OF_VIDEO_PLAYER_GSTREAMER
13#include "ofGstVideoPlayer.h"
14#define OF_VID_PLAYER_TYPE ofGstVideoPlayer
15#endif
16
17#ifdef OF_VIDEO_PLAYER_QUICKTIME
18#include "ofQuickTimePlayer.h"
19#define OF_VID_PLAYER_TYPE ofQuickTimePlayer
20#endif
21
22#ifdef OF_VIDEO_PLAYER_QTKIT
23#include "ofQTKitPlayer.h"
24#define OF_VID_PLAYER_TYPE ofQTKitPlayer
25#endif
26
27#ifdef OF_VIDEO_PLAYER_AVFOUNDATION
28#include "ofAVFoundationPlayer.h"
29#define OF_VID_PLAYER_TYPE ofAVFoundationPlayer
30#endif
31
32#ifdef OF_VIDEO_PLAYER_DIRECTSHOW
33#include "ofDirectShowPlayer.h"
34#define OF_VID_PLAYER_TYPE ofDirectShowPlayer
35#endif
36
37#if defined(OF_VIDEO_PLAYER_MEDIA_FOUNDATION)
38#include "ofMediaFoundationPlayer.h"
39#define OF_VID_PLAYER_TYPE ofMediaFoundationPlayer
40#endif
41
42#ifdef OF_VIDEO_PLAYER_IOS
43#include "ofxiOSVideoPlayer.h"
44#define OF_VID_PLAYER_TYPE ofxiOSVideoPlayer
45#endif
46
47#ifdef OF_VIDEO_PLAYER_ANDROID
48#include "ofxAndroidVideoPlayer.h"
49#define OF_VID_PLAYER_TYPE ofxAndroidVideoPlayer
50#endif
51
52#ifdef OF_VIDEO_PLAYER_EMSCRIPTEN
53#include "ofxEmscriptenVideoPlayer.h"
54#define OF_VID_PLAYER_TYPE ofxEmscriptenVideoPlayer
55#endif
56
57
58//---------------------------------------------------------------------------
59ofVideoPlayer::ofVideoPlayer (){
60bUseTexture = true;
61playerTex = nullptr;
62internalPixelFormat = OF_PIXELS_RGB;
63tex.resize(1);
64}
65
66//---------------------------------------------------------------------------
67void ofVideoPlayer::setPlayer(shared_ptr<ofBaseVideoPlayer> newPlayer){
68player = std::move(newPlayer);
69setPixelFormat(internalPixelFormat); //this means that it will try to set the pixel format you have been using before.
70//if the format is not supported ofVideoPlayer's internalPixelFormat will be updated to that of the player's
71}
72
73//---------------------------------------------------------------------------
74shared_ptr<ofBaseVideoPlayer> ofVideoPlayer::getPlayer(){
75if( !player ){
76setPlayer(std::make_shared<OF_VID_PLAYER_TYPE>());
77}
78return player;
79}
80
81const shared_ptr<ofBaseVideoPlayer> ofVideoPlayer::getPlayer() const{
82return player;
83}
84
85//we only set pixel format on the player if it exists.
86//if the movie is already loaded then we can't update the format.
87//also if the format is not supported we get the format from the player instead.
88//--------------------------------------------------------------------
89bool ofVideoPlayer::setPixelFormat(ofPixelFormat pixelFormat) {
90if( player ){
91if( player->isLoaded() ){
92ofLogWarning("ofVideoPlayer") << "setPixelFormat(): can't set pixel format of a loaded movie";
93internalPixelFormat = player->getPixelFormat();
94return false;
95}else{
96if( player->setPixelFormat(pixelFormat) ){
97internalPixelFormat = player->getPixelFormat(); //we do this as either way we want the players format
98}else{
99internalPixelFormat = player->getPixelFormat(); //we do this as either way we want the players format
100return false;
101}
102}
103}else{
104internalPixelFormat = pixelFormat;
105}
106return true;
107}
108
109//---------------------------------------------------------------------------
110ofPixelFormat ofVideoPlayer::getPixelFormat() const{
111if( player ){
112internalPixelFormat = player->getPixelFormat();
113}
114return internalPixelFormat;
115}
116
117//---------------------------------------------------------------------------
118bool ofVideoPlayer::load(string name){
119if( !player ){
120setPlayer(std::make_shared<OF_VID_PLAYER_TYPE>());
121player->setPixelFormat(internalPixelFormat);
122}
123
124bool bOk = player->load(name);
125
126if( bOk){
127moviePath = name;
128if(bUseTexture){
129if(player->getTexturePtr()==nullptr){
130if(tex.empty()) {
131tex.resize(std::max(player->getPixels().getNumPlanes(),static_cast<size_t>(1)));
132for(std::size_t i=0;i<player->getPixels().getNumPlanes();i++){
133ofPixels plane = player->getPixels().getPlane(i);
134tex[i].allocate(plane);
135if(ofIsGLProgrammableRenderer() && plane.getPixelFormat() == OF_PIXELS_GRAY){
136tex[i].setRGToRGBASwizzles(true);
137}
138}
139}
140}else{
141playerTex = player->getTexturePtr();
142}
143}
144setLoopState(OF_LOOP_NORMAL);
145}
146
147return bOk;
148}
149
150//---------------------------------------------------------------------------
151void ofVideoPlayer::loadAsync(string name){
152if( !player ){
153setPlayer(std::make_shared<OF_VID_PLAYER_TYPE>());
154player->setPixelFormat(internalPixelFormat);
155}
156
157player->loadAsync(name);
158moviePath = name;
159}
160
161//---------------------------------------------------------------------------
162bool ofVideoPlayer::loadMovie(string name){
163return load(name);
164}
165
166//---------------------------------------------------------------------------
167string ofVideoPlayer::getMoviePath() const{
168return moviePath;
169}
170
171//---------------------------------------------------------------------------
172ofPixels & ofVideoPlayer::getPixels(){
173return getPlayer()->getPixels();
174}
175
176//---------------------------------------------------------------------------
177const ofPixels& ofVideoPlayer::getPixels() const{
178return getPlayer()->getPixels();
179}
180
181//---------------------------------------------------------------------------
182ofPixels& ofVideoPlayer::getPixelsRef(){
183return getPlayer()->getPixels();
184}
185
186//---------------------------------------------------------------------------
187const ofPixels& ofVideoPlayer::getPixelsRef() const{
188return getPlayer()->getPixels();
189}
190
191//---------------------------------------------------------------------------
192ofTexture & ofVideoPlayer::getTexture(){
193if(playerTex == nullptr){
194return tex[0];
195}else{
196return *playerTex;
197}
198}
199
200//---------------------------------------------------------------------------
201const ofTexture & ofVideoPlayer::getTexture() const{
202if(playerTex == nullptr){
203return tex[0];
204}else{
205return *playerTex;
206}
207}
208
209//---------------------------------------------------------------------------
210ofTexture & ofVideoPlayer::getTextureReference(){
211return getTexture();
212}
213
214//---------------------------------------------------------------------------
215const ofTexture & ofVideoPlayer::getTextureReference() const{
216return getTexture();
217}
218
219//---------------------------------------------------------------------------
220vector<ofTexture> & ofVideoPlayer::getTexturePlanes(){
221if(playerTex != nullptr){
222tex.clear();
223tex.push_back(*playerTex);
224}
225return tex;
226}
227
228//---------------------------------------------------------------------------
229const vector<ofTexture> & ofVideoPlayer::getTexturePlanes() const{
230if(playerTex != nullptr){
231ofVideoPlayer * mutThis = const_cast<ofVideoPlayer*>(this);
232mutThis->tex.clear();
233mutThis->tex.push_back(*playerTex);
234}
235return tex;
236}
237
238//---------------------------------------------------------------------------
239bool ofVideoPlayer::isFrameNew() const{
240if( player ){
241return player->isFrameNew();
242}
243return false;
244}
245
246//--------------------------------------------------------------------
247void ofVideoPlayer::update(){
248if( player ){
249
250player->update();
251
252if( bUseTexture && player->isFrameNew() ) {
253
254playerTex = player->getTexturePtr();
255
256if(playerTex == nullptr){
257if(tex.size()!=player->getPixels().getNumPlanes()){
258tex.resize(std::max(player->getPixels().getNumPlanes(),static_cast<std::size_t>(1)));
259}
260if(std::size_t(player->getWidth()) != 0 && std::size_t(player->getHeight()) != 0) {
261for(std::size_t i=0;i<player->getPixels().getNumPlanes();i++){
262ofPixels plane = player->getPixels().getPlane(i);
263bool bDiffPixFormat = ( tex[i].isAllocated() && tex[i].texData.glInternalFormat != ofGetGLInternalFormatFromPixelFormat(plane.getPixelFormat()) );
264if(bDiffPixFormat || !tex[i].isAllocated() || std::size_t(tex[i].getWidth()) != plane.getWidth() || std::size_t(tex[i].getHeight()) != plane.getHeight())
265{
266tex[i].allocate(plane);
267}
268tex[i].loadData(plane);
269}
270}
271}
272}
273}
274}
275
276//---------------------------------------------------------------------------
277void ofVideoPlayer::closeMovie(){
278close();
279}
280
281//---------------------------------------------------------------------------
282void ofVideoPlayer::close(){
283if( player ){
284player->close();
285}
286tex.clear();
287}
288
289//--------------------------------------------------------
290void ofVideoPlayer::play(){
291if( player ){
292player->play();
293}
294}
295
296//--------------------------------------------------------
297void ofVideoPlayer::stop(){
298if( player ){
299player->stop();
300}
301}
302
303//--------------------------------------------------------
304void ofVideoPlayer::setVolume(float volume){
305if( player ){
306if ( volume > 1.0f ){
307ofLogWarning("ofVideoPlayer") << "setVolume(): expected range is 0-1, limiting requested volume " << volume << " to 1.0";
308volume = 1.0f;
309}
310player->setVolume(volume);
311}
312}
313
314
315//--------------------------------------------------------
316void ofVideoPlayer::setLoopState(ofLoopType state){
317if( player ){
318player->setLoopState(state);
319}
320}
321
322ofLoopType ofVideoPlayer::getLoopState() const{
323if( player ){
324return player->getLoopState();
325}else{
326return OF_LOOP_NONE;
327}
328}
329
330//---------------------------------------------------------------------------
331void ofVideoPlayer::setPosition(float pct){
332if( player ){
333player->setPosition(pct);
334}
335}
336
337//---------------------------------------------------------------------------
338void ofVideoPlayer::setFrame(int frame){
339if( player ){
340player->setFrame(frame);
341}
342}
343
344
345//---------------------------------------------------------------------------
346float ofVideoPlayer::getDuration() const{
347if( player ){
348return player->getDuration();
349}
350
351return 0.0;
352}
353
354//---------------------------------------------------------------------------
355float ofVideoPlayer::getPosition() const{
356if( player ){
357return player->getPosition();
358}
359return 0.0;
360}
361
362//---------------------------------------------------------------------------
363int ofVideoPlayer::getCurrentFrame() const{
364if( player ){
365return player->getCurrentFrame();
366}
367return 0;
368}
369
370
371//---------------------------------------------------------------------------
372bool ofVideoPlayer::getIsMovieDone() const{
373if( player ){
374return player->getIsMovieDone();
375}
376return false;
377}
378
379//---------------------------------------------------------------------------
380void ofVideoPlayer::firstFrame(){
381if( player ){
382player->firstFrame();
383}
384}
385
386//---------------------------------------------------------------------------
387void ofVideoPlayer::nextFrame(){
388if( player ){
389player->nextFrame();
390}
391}
392
393//---------------------------------------------------------------------------
394void ofVideoPlayer::previousFrame(){
395if( player ){
396player->previousFrame();
397}
398}
399
400//---------------------------------------------------------------------------
401void ofVideoPlayer::setSpeed(float _speed){
402if( player ){
403player->setSpeed(_speed);
404}
405}
406
407//---------------------------------------------------------------------------
408float ofVideoPlayer::getSpeed() const{
409if( player ){
410return player->getSpeed();
411}
412return 0.0;
413}
414
415//---------------------------------------------------------------------------
416void ofVideoPlayer::setPaused(bool _bPause){
417if( player ){
418player->setPaused(_bPause);
419}
420}
421
422//------------------------------------
423void ofVideoPlayer::setUseTexture(bool bUse){
424bUseTexture = bUse;
425if(bUse && player && !player->getTexturePtr() && std::size_t(getWidth()) != 0 && std::size_t(getHeight()) != 0){
426for(std::size_t i=0;i<player->getPixels().getNumPlanes();i++){
427ofPixels plane = player->getPixels().getPlane(i);
428bool bDiffPixFormat = ( tex[i].isAllocated() && tex[i].texData.glInternalFormat != ofGetGLInternalFormatFromPixelFormat(plane.getPixelFormat()) );
429if(!tex[i].isAllocated() || bDiffPixFormat){
430tex[i].allocate(plane);
431}
432}
433}
434}
435
436//------------------------------------
437bool ofVideoPlayer::isUsingTexture() const{
438return bUseTexture;
439}
440
441//----------------------------------------------------------
442void ofVideoPlayer::setAnchorPercent(float xPct, float yPct){
443getTexture().setAnchorPercent(xPct, yPct);
444}
445
446//----------------------------------------------------------
447void ofVideoPlayer::setAnchorPoint(float x, float y){
448getTexture().setAnchorPoint(x, y);
449}
450
451//----------------------------------------------------------
452void ofVideoPlayer::resetAnchor(){
453getTexture().resetAnchor();
454}
455
456//------------------------------------
457void ofVideoPlayer::draw(float _x, float _y, float _w, float _h) const{
458ofGetCurrentRenderer()->draw(*this,_x,_y,_w,_h);
459}
460
461//------------------------------------
462void ofVideoPlayer::draw(float _x, float _y) const{
463draw(_x, _y, getWidth(), getHeight());
464}
465
466
467//------------------------------------
468void ofVideoPlayer::bind() const{
469shared_ptr<ofBaseGLRenderer> renderer = ofGetGLRenderer();
470if(renderer){
471renderer->bind(*this);
472}
473}
474
475//------------------------------------
476void ofVideoPlayer::unbind() const{
477shared_ptr<ofBaseGLRenderer> renderer = ofGetGLRenderer();
478if(renderer){
479renderer->unbind(*this);
480}
481}
482
483//------------------------------------
484int ofVideoPlayer::getTotalNumFrames() const{
485if( player ){
486return player->getTotalNumFrames();
487}
488return 0;
489}
490
491//----------------------------------------------------------
492float ofVideoPlayer::getWidth() const{
493if( player ){
494return player->getWidth();
495}else{
496return 0;
497}
498}
499
500//----------------------------------------------------------
501float ofVideoPlayer::getHeight() const{
502if( player ){
503return player->getHeight();
504}else{
505return 0;
506}
507}
508
509//----------------------------------------------------------
510bool ofVideoPlayer::isPaused() const{
511if( player ){
512return player->isPaused();
513}
514return false;
515}
516
517//----------------------------------------------------------
518bool ofVideoPlayer::isLoaded() const{
519if( player ){
520return player->isLoaded();
521}
522return false;
523}
524
525//----------------------------------------------------------
526bool ofVideoPlayer::isPlaying() const{
527if( player ){
528return player->isPlaying();
529}
530return false;
531}
532
533//----------------------------------------------------------
534bool ofVideoPlayer::isInitialized() const{
535if( player ){
536return player->isInitialized() && (!bUseTexture || tex[0].isAllocated() || (player->getTexturePtr() && player->getTexturePtr()->isAllocated()) );
537}
538return false;
539}
540
541
542