| 39 | | // This class is used as a helper to de-initialize |
| 40 | | // properly quicktime, when the last media loaded |
| 41 | | // with the quicktime plugin is released. |
| 42 | | // All loaded media must be added to the observer |
| 43 | | // (see ReaderWriterQT::readImage() function) |
| 44 | | class QuicktimeExitObserver : public osg::Observer |
| 45 | | { |
| 46 | | public: |
| 47 | | |
| 48 | | QuicktimeExitObserver () : _instanceCount(0) |
| 49 | | { |
| 50 | | } |
| 51 | | virtual ~QuicktimeExitObserver() |
| 52 | | { |
| 53 | | }; |
| 54 | | |
| 55 | | void addMedia(Image* ptr) |
| 56 | | { |
| 57 | | ptr->addObserver(this); |
| 58 | | ++ _instanceCount; |
| 59 | | } |
| 60 | | |
| 61 | | virtual void objectDeleted(void*) |
| 62 | | { |
| 63 | | -- _instanceCount; |
| 64 | | if(_instanceCount== 0) |
| 65 | | exitQuicktime(); |
| 66 | | } |
| 67 | | |
| 68 | | private: |
| 69 | | unsigned int _instanceCount; |
| 70 | | }; |
| 71 | | |
| 72 | | |
| | 43 | |
| | 44 | |
| | 45 | // This class is used as a helper to de-initialize |
| | 46 | // properly quicktime, when the last media loaded |
| | 47 | // with the quicktime plugin is released. |
| | 48 | // All loaded media must be added to the observer |
| | 49 | // (see ReaderWriterQT::readImage() function) |
| | 50 | class QuicktimeInitializer : public osg::Observer |
| | 51 | { |
| | 52 | public: |
| | 53 | |
| | 54 | QuicktimeInitializer (): |
| | 55 | _instanceCount(0), |
| | 56 | _setup(false) |
| | 57 | {} |
| | 58 | |
| | 59 | virtual ~QuicktimeInitializer() |
| | 60 | { |
| | 61 | // When we get here, the exit() function |
| | 62 | // should have been called, when last media was released. |
| | 63 | // In case no media has been added after initialization, |
| | 64 | // let's perform an extra check |
| | 65 | if (_setup && _instanceCount == 0) |
| | 66 | { |
| | 67 | exit(); |
| | 68 | } |
| | 69 | }; |
| | 70 | |
| | 71 | void addMedia(Image* ptr) |
| | 72 | { |
| | 73 | ptr->addObserver(this); |
| | 74 | ++ _instanceCount; |
| | 75 | } |
| | 76 | |
| | 77 | virtual void objectDeleted(void*) |
| | 78 | { |
| | 79 | -- _instanceCount; |
| | 80 | if(_instanceCount== 0) |
| | 81 | exit(); |
| | 82 | } |
| | 83 | |
| | 84 | void init() |
| | 85 | { |
| | 86 | if (!_setup) |
| | 87 | { |
| | 88 | #ifndef __APPLE__ |
| | 89 | InitializeQTML(0); |
| | 90 | #endif |
| | 91 | |
| | 92 | OSErr err = EnterMovies(); |
| | 93 | if (err!=0) |
| | 94 | osg::notify(osg::FATAL) << "Error while initializing quicktime: " << err << std::endl; |
| | 95 | else |
| | 96 | osg::notify(osg::DEBUG_INFO) << "Quicktime initialized successfully" << std::endl; |
| | 97 | |
| | 98 | _setup = true; |
| | 99 | } |
| | 100 | } |
| | 101 | |
| | 102 | void exit() |
| | 103 | { |
| | 104 | #ifndef __APPLE__ |
| | 105 | ExitMovies(); |
| | 106 | #endif |
| | 107 | |
| | 108 | _setup = false; |
| | 109 | } |
| | 110 | |
| | 111 | private: |
| | 112 | unsigned int _instanceCount; |
| | 113 | bool _setup; |
| | 114 | |
| | 115 | }; |
| | 116 | |
| | 117 | |
| | 118 | |
| | 119 | |
| | 120 | |
| 398 | | |
| 399 | | mutable QuicktimeExitObserver _qtExitObserver; |
| | 451 | protected: |
| | 452 | |
| | 453 | //internal utils |
| | 454 | void registerQtReader() const |
| | 455 | { |
| | 456 | osgDB::Registry* r = osgDB::Registry::instance(); |
| | 457 | r->addFileExtensionAlias("mov", "qt"); |
| | 458 | |
| | 459 | #ifdef QT_HANDLE_IMAGES_ALSO |
| | 460 | r->addFileExtensionAlias("jpg", "qt"); |
| | 461 | r->addFileExtensionAlias("jpe", "qt"); |
| | 462 | r->addFileExtensionAlias("jpeg", "qt"); |
| | 463 | r->addFileExtensionAlias("tif", "qt"); |
| | 464 | r->addFileExtensionAlias("tiff", "qt"); |
| | 465 | r->addFileExtensionAlias("gif", "qt"); |
| | 466 | r->addFileExtensionAlias("png", "qt"); |
| | 467 | r->addFileExtensionAlias("psd", "qt"); |
| | 468 | r->addFileExtensionAlias("tga", "qt"); |
| | 469 | r->addFileExtensionAlias("mov", "qt"); |
| | 470 | r->addFileExtensionAlias("avi", "qt"); |
| | 471 | r->addFileExtensionAlias("mpg", "qt"); |
| | 472 | r->addFileExtensionAlias("mpv", "qt"); |
| | 473 | r->addFileExtensionAlias("dv", "qt"); |
| | 474 | r->addFileExtensionAlias("mp4", "qt"); |
| | 475 | r->addFileExtensionAlias("m4v", "qt"); |
| | 476 | #endif |
| | 477 | } |
| | 478 | |
| | 479 | mutable QuicktimeInitializer _qtExitObserver; |