: Mlt::Filter( mlt_filter_new() )
, pbo(0)
, initEvent(0)
+ , closeEvent(0)
{
mlt_filter filter = get_filter();
if ( filter ) {
(mlt_destructor) deleteManager, NULL);
mlt_events_register( get_properties(), "init glsl", NULL );
+ mlt_events_register( get_properties(), "close glsl", NULL );
initEvent = listen("init glsl", this, (mlt_listener) GlslManager::onInit);
+ closeEvent = listen("close glsl", this, (mlt_listener) GlslManager::onClose);
}
}
GlslManager::~GlslManager()
{
mlt_log_debug(get_service(), "%s\n", __FUNCTION__);
- while (fbo_list.peek_back())
- delete (glsl_fbo) fbo_list.pop_back();
- while (texture_list.peek_back())
- delete (glsl_texture) texture_list.pop_back();
- delete pbo;
+ cleanupContext();
delete initEvent;
+ delete closeEvent;
}
GlslManager* GlslManager::get_instance()
return pbo;
}
+void GlslManager::cleanupContext()
+{
+ while (fbo_list.peek_back()) {
+ glsl_fbo fbo = (glsl_fbo) fbo_list.pop_back();
+ glDeleteFramebuffers(1, &fbo->fbo);
+ delete fbo;
+ }
+ while (texture_list.peek_back()) {
+ glsl_texture texture = (glsl_texture) texture_list.pop_back();
+ glDeleteTextures(1, &texture->texture);
+ delete texture;
+ }
+ if (pbo) {
+ glDeleteBuffers(1, &pbo->pbo);
+ delete pbo;
+ pbo = 0;
+ }
+}
+
void GlslManager::onInit( mlt_properties owner, GlslManager* filter )
{
mlt_log_debug( filter->get_service(), "%s\n", __FUNCTION__ );
filter->set( "glsl_supported", movit_initialized );
}
+void GlslManager::onClose( mlt_properties owner, GlslManager *filter )
+{
+ filter->cleanupContext();
+}
+
void GlslManager::onServiceChanged( mlt_properties owner, mlt_service aservice )
{
Mlt::Service service( aservice );
glsl_texture get_texture(int width, int height, GLint internal_format);
static void release_texture(glsl_texture);
glsl_pbo get_pbo(int size);
+ void cleanupContext();
Properties effect_list( Mlt::Service &service );
static bool init_chain(mlt_service);
private:
static void onInit( mlt_properties owner, GlslManager* filter );
+ static void onClose( mlt_properties owner, GlslManager* filter );
static void onServiceChanged( mlt_properties owner, mlt_service service );
static void onPropertyChanged( mlt_properties owner, mlt_service service, const char* property );
Mlt::Deque fbo_list;
Mlt::Deque texture_list;
glsl_pbo pbo;
Mlt::Event* initEvent;
+ Mlt::Event* closeEvent;
};
#endif // GLSL_MANAGER_H