From ce9d2233f4653ae54ee7bdfa4a7313326a9d8240 Mon Sep 17 00:00:00 2001 From: Good Guy Date: Sun, 17 Dec 2017 14:38:03 -0700 Subject: [PATCH] memory leaks and tweaks, sams histeq icon --- cinelerra-5.1/cinelerra/assetremove.C | 5 +- cinelerra-5.1/cinelerra/mainerror.C | 1 + cinelerra-5.1/cinelerra/mainindexes.C | 20 +- cinelerra-5.1/cinelerra/mainindexes.h | 1 - cinelerra-5.1/cinelerra/mwindow.C | 354 ++++++++++------------ cinelerra-5.1/cinelerra/packagerenderer.C | 1 + cinelerra-5.1/cinelerra/removefile.h | 5 +- cinelerra-5.1/cinelerra/render.C | 26 +- cinelerra-5.1/guicast/thread.C | 8 +- cinelerra-5.1/picon/cinfinity/histeq.png | Bin 2873 -> 16766 bytes 10 files changed, 198 insertions(+), 223 deletions(-) diff --git a/cinelerra-5.1/cinelerra/assetremove.C b/cinelerra-5.1/cinelerra/assetremove.C index ec2c0f8c..49e82414 100644 --- a/cinelerra-5.1/cinelerra/assetremove.C +++ b/cinelerra-5.1/cinelerra/assetremove.C @@ -46,7 +46,10 @@ AssetRemoveWindow::AssetRemoveWindow(MWindow *mwindow) AssetRemoveWindow::~AssetRemoveWindow() { - delete data; + if( data ) { + data->remove_all_objects(); + delete data; + } } void AssetRemoveWindow::create_objects() diff --git a/cinelerra-5.1/cinelerra/mainerror.C b/cinelerra-5.1/cinelerra/mainerror.C index ceeffc4a..4dc01aec 100644 --- a/cinelerra-5.1/cinelerra/mainerror.C +++ b/cinelerra-5.1/cinelerra/mainerror.C @@ -121,6 +121,7 @@ MainError::MainError(MWindow *mwindow) MainError::~MainError() { close_window(); + errors.remove_all_objects(); delete errors_lock; } diff --git a/cinelerra-5.1/cinelerra/mainindexes.C b/cinelerra-5.1/cinelerra/mainindexes.C index d871a50b..05812bb7 100644 --- a/cinelerra-5.1/cinelerra/mainindexes.C +++ b/cinelerra-5.1/cinelerra/mainindexes.C @@ -91,13 +91,6 @@ SET_TRACE next_lock->unlock(); } -void MainIndexes::delete_current_sources() -{ - for(int i = 0; i < current_indexables.size(); i++) - current_indexables.get(i)->Garbage::remove_user(); - current_indexables.remove_all(); -} - void MainIndexes::start_loop() { interrupt_flag = 0; @@ -140,8 +133,6 @@ void MainIndexes::interrupt_build() void MainIndexes::load_next_sources() { - delete_current_sources(); - // Transfer from new list next_lock->lock("MainIndexes::load_next_sources"); for(int i = 0; i < next_indexables.size(); i++) @@ -166,13 +157,14 @@ void MainIndexes::run() // test index of each indexable MainProgressBar *progress = 0; - int total_sources = current_indexables.size(); - for( int i = 0; i < total_sources && !interrupt_flag; ++i ) { + next_lock->lock("MainIndexes::run"); + for( int i=0; iindex_state; // if status is known, no probe if( index_state->index_status != INDEX_NOTTESTED ) continue; + next_lock->unlock(); IndexFile indexfile(mwindow, indexable); int ret = indexfile.open_index(); @@ -195,8 +187,14 @@ void MainIndexes::run() indexfile.create_index(progress); if( progress->is_cancelled() ) interrupt_flag = 1; + next_lock->lock("MainIndexes::run"); } + for( int i=0; iremove_user(); + current_indexables.remove_all(); + next_lock->unlock(); + if(progress) { // progress box is only created when an index is built if(mwindow->gui) mwindow->gui->lock_window("MainIndexes::run 3"); progress->stop_progress(); diff --git a/cinelerra-5.1/cinelerra/mainindexes.h b/cinelerra-5.1/cinelerra/mainindexes.h index c769d7e0..810dcd87 100644 --- a/cinelerra-5.1/cinelerra/mainindexes.h +++ b/cinelerra-5.1/cinelerra/mainindexes.h @@ -47,7 +47,6 @@ public: void run(); void interrupt_build(); void load_next_sources(); - void delete_current_sources(); ArrayList current_indexables; ArrayList next_indexables; diff --git a/cinelerra-5.1/cinelerra/mwindow.C b/cinelerra-5.1/cinelerra/mwindow.C index 31790067..9bab2c61 100644 --- a/cinelerra-5.1/cinelerra/mwindow.C +++ b/cinelerra-5.1/cinelerra/mwindow.C @@ -1695,8 +1695,8 @@ if(debug) printf("MWindow::load_filenames %d\n", __LINE__); // Define new_edls and new_assets to load int result = 0, ftype = -1; - for(int i = 0; i < filenames->size(); i++) - { + + for( int i=0; isize(); ++i ) { // Get type of file File *new_file = new File; Asset *new_asset = new Asset(filenames->get(i)); @@ -1715,234 +1715,210 @@ if(debug) printf("MWindow::load_filenames %d\n", __LINE__); if(debug) printf("MWindow::load_filenames %d\n", __LINE__); result = 1; - switch(ftype) - { + switch( ftype ) { // Convert media file to EDL - case FILE_OK: + case FILE_OK: // Warn about odd image dimensions - if(new_asset->video_data && - ((new_asset->width % 2) || - (new_asset->height % 2))) - { - char string[BCTEXTLEN]; - sprintf(string, _("%s's resolution is %dx%d.\nImages with odd dimensions may not decode properly."), - new_asset->path, - new_asset->width, - new_asset->height); - MainError::show_error(string); - } - - if(new_asset->program >= 0 && - edl->session->program_no != new_asset->program) - { - char string[BCTEXTLEN]; - sprintf(string, _("%s's index was built for program number %d\n" - "Playback preference is %d.\n Using program %d."), - new_asset->path, new_asset->program, - edl->session->program_no, new_asset->program); - MainError::show_error(string); - } + if( new_asset->video_data && + ((new_asset->width % 2) || (new_asset->height % 2)) ) { + char string[BCTEXTLEN]; + sprintf(string, _("%s's resolution is %dx%d.\nImages with odd dimensions may not decode properly."), + new_asset->path, new_asset->width, new_asset->height); + MainError::show_error(string); + } + if( new_asset->program >= 0 && + edl->session->program_no != new_asset->program ) { + char string[BCTEXTLEN]; + sprintf(string, _("%s's index was built for program number %d\n" + "Playback preference is %d.\n Using program %d."), + new_asset->path, new_asset->program, + edl->session->program_no, new_asset->program); + MainError::show_error(string); + } - if(load_mode != LOADMODE_RESOURCESONLY) - { - RecordLabels *labels = edl->session->label_cells ? - new RecordLabels(new_file) : 0; - asset_to_edl(new_edl, new_asset, labels); - new_edls.append(new_edl); - new_asset->Garbage::remove_user(); - delete labels; - new_asset = 0; - } - else - { - new_assets.append(new_asset); - new_asset = 0; - } + if( load_mode != LOADMODE_RESOURCESONLY ) { + RecordLabels *labels = edl->session->label_cells ? + new RecordLabels(new_file) : 0; + asset_to_edl(new_edl, new_asset, labels); + new_edls.append(new_edl); + new_edl->add_user(); + delete labels; + } + else { + new_assets.append(new_asset); + new_asset->add_user(); + } // Set filename to nothing for assets since save EDL would overwrite them. - if(load_mode == LOADMODE_REPLACE || - load_mode == LOADMODE_REPLACE_CONCATENATE) - { - set_filename(""); + if( load_mode == LOADMODE_REPLACE || + load_mode == LOADMODE_REPLACE_CONCATENATE ) { + set_filename(""); // Reset timeline position - for(int i = 0; i < TOTAL_PANES; i++) - { - new_edl->local_session->view_start[i] = 0; - new_edl->local_session->track_start[i] = 0; - } + for( int i=0; ilocal_session->view_start[i] = 0; + new_edl->local_session->track_start[i] = 0; } + } - result = 0; - break; + result = 0; + break; // File not found - case FILE_NOT_FOUND: - sprintf(string, _("Failed to open %s"), new_asset->path); - gui->show_message(string, theme->message_error); - gui->update_default_message(); - break; + case FILE_NOT_FOUND: + sprintf(string, _("Failed to open %s"), new_asset->path); + gui->show_message(string, theme->message_error); + gui->update_default_message(); + break; // Unknown format - case FILE_UNRECOGNIZED_CODEC: - { + case FILE_UNRECOGNIZED_CODEC: { // Test index file - { IndexFile indexfile(this, new_asset); - if( !(result = indexfile.open_index()) ) - indexfile.close_index(); - } + { IndexFile indexfile(this, new_asset); + if( !(result = indexfile.open_index()) ) + indexfile.close_index(); } // Test existing EDLs - for(int j = 0; result && j <= new_edls.total; j++) { - Asset *old_asset = j < new_edls.total ? - new_edls[j]->assets->get_asset(new_asset->path) : - edl->assets->get_asset(new_asset->path); - if( old_asset ) { - new_asset->copy_from(old_asset,1); - result = 0; - } + for( int j=0; result && jassets->get_asset(new_asset->path); + if( old_asset ) { + new_asset->copy_from(old_asset,1); + result = 0; } + } + if( result ) { + Asset *old_asset = edl->assets->get_asset(new_asset->path); + if( old_asset ) { + new_asset->copy_from(old_asset,1); + result = 0; + } + } // Prompt user - if(result) - { - char string[BCTEXTLEN]; - FileSystem fs; - fs.extract_name(string, new_asset->path); - - strcat(string, _("'s format couldn't be determined.")); - new_asset->audio_data = 1; - new_asset->format = FILE_PCM; - new_asset->channels = defaults->get("AUDIO_CHANNELS", 2); - new_asset->sample_rate = defaults->get("SAMPLE_RATE", 44100); - new_asset->bits = defaults->get("AUDIO_BITS", 16); - new_asset->byte_order = defaults->get("BYTE_ORDER", 1); - new_asset->signed_ = defaults->get("SIGNED_", 1); - new_asset->header = defaults->get("HEADER", 0); - - FileFormat fwindow(this); - fwindow.create_objects(new_asset, string); - result = fwindow.run_window(); - - - defaults->update("AUDIO_CHANNELS", new_asset->channels); - defaults->update("SAMPLE_RATE", new_asset->sample_rate); - defaults->update("AUDIO_BITS", new_asset->bits); - defaults->update("BYTE_ORDER", new_asset->byte_order); - defaults->update("SIGNED_", new_asset->signed_); - defaults->update("HEADER", new_asset->header); - save_defaults(); - } + if( result ) { + char string[BCTEXTLEN]; + FileSystem fs; + fs.extract_name(string, new_asset->path); + + strcat(string, _("'s format couldn't be determined.")); + new_asset->audio_data = 1; + new_asset->format = FILE_PCM; + new_asset->channels = defaults->get("AUDIO_CHANNELS", 2); + new_asset->sample_rate = defaults->get("SAMPLE_RATE", 44100); + new_asset->bits = defaults->get("AUDIO_BITS", 16); + new_asset->byte_order = defaults->get("BYTE_ORDER", 1); + new_asset->signed_ = defaults->get("SIGNED_", 1); + new_asset->header = defaults->get("HEADER", 0); + + FileFormat fwindow(this); + fwindow.create_objects(new_asset, string); + result = fwindow.run_window(); + + defaults->update("AUDIO_CHANNELS", new_asset->channels); + defaults->update("SAMPLE_RATE", new_asset->sample_rate); + defaults->update("AUDIO_BITS", new_asset->bits); + defaults->update("BYTE_ORDER", new_asset->byte_order); + defaults->update("SIGNED_", new_asset->signed_); + defaults->update("HEADER", new_asset->header); + save_defaults(); + } // Append to list - if(!result) - { + if( !result ) { // Recalculate length - delete new_file; - new_file = new File; - result = new_file->open_file(preferences, new_asset, 1, 0); + delete new_file; + new_file = new File; + result = new_file->open_file(preferences, new_asset, 1, 0); - if(load_mode != LOADMODE_RESOURCESONLY) - { - RecordLabels *labels = edl->session->label_cells ? - new RecordLabels(new_file) : 0; - asset_to_edl(new_edl, new_asset, labels); - new_edls.append(new_edl); - new_asset->Garbage::remove_user(); - delete labels; - new_asset = 0; - } - else - { - new_assets.append(new_asset); - new_asset = 0; - } + if( load_mode != LOADMODE_RESOURCESONLY ) { + RecordLabels *labels = edl->session->label_cells ? + new RecordLabels(new_file) : 0; + asset_to_edl(new_edl, new_asset, labels); + new_edls.append(new_edl); + new_edl->add_user(); + delete labels; } - else - { - result = 1; + else { + new_assets.append(new_asset); + new_asset->add_user(); } - break; } + else { + result = 1; + } + break; } - case FILE_IS_XML: - { - FileXML xml_file; + case FILE_IS_XML: { + FileXML xml_file; if(debug) printf("MWindow::load_filenames %d\n", __LINE__); - xml_file.read_from_file(filenames->get(i)); + xml_file.read_from_file(filenames->get(i)); if(debug) printf("MWindow::load_filenames %d\n", __LINE__); - const char *cin_version = 0; - while( !xml_file.read_tag() ) { - if( xml_file.tag.title_is("EDL") ) { - cin_version = xml_file.tag.get_property("VERSION"); - break; - } - } - xml_file.rewind(); - if( !cin_version ) { - eprintf(_("XML file %s\n not from cinelerra."),filenames->get(i)); - char string[BCTEXTLEN]; - sprintf(string,_("Unknown %s"), filenames->get(i)); - gui->show_message(string); - result = 1; + const char *cin_version = 0; + while( !xml_file.read_tag() ) { + if( xml_file.tag.title_is("EDL") ) { + cin_version = xml_file.tag.get_property("VERSION"); break; } - if( strcmp(cin_version, CINELERRA_VERSION) ) { - char string[BCTEXTLEN]; - snprintf(string, sizeof(string), - _("Warning: XML from cinelerra version %s\n" - "Session data may be incompatible."), cin_version); - show_warning(&preferences->warn_version, string); - } - if(load_mode == LOADMODE_NESTED) - { + } + xml_file.rewind(); + if( !cin_version ) { + eprintf(_("XML file %s\n not from cinelerra."),filenames->get(i)); + char string[BCTEXTLEN]; + sprintf(string,_("Unknown %s"), filenames->get(i)); + gui->show_message(string); + result = 1; + break; + } + if( strcmp(cin_version, CINELERRA_VERSION) ) { + char string[BCTEXTLEN]; + snprintf(string, sizeof(string), + _("Warning: XML from cinelerra version %s\n" + "Session data may be incompatible."), cin_version); + show_warning(&preferences->warn_version, string); + } + if( load_mode == LOADMODE_NESTED ) { // Load temporary EDL for nesting. - EDL *nested_edl = new EDL; - nested_edl->create_objects(); - nested_edl->set_path(filenames->get(i)); - nested_edl->load_xml(&xml_file, LOAD_ALL); + EDL *nested_edl = new EDL; + nested_edl->create_objects(); + nested_edl->set_path(filenames->get(i)); + nested_edl->load_xml(&xml_file, LOAD_ALL); //printf("MWindow::load_filenames %p %s\n", nested_edl, nested_edl->project_path); - edl_to_nested(new_edl, nested_edl); - nested_edl->Garbage::remove_user(); - } - else - { + edl_to_nested(new_edl, nested_edl); + nested_edl->Garbage::remove_user(); + } + else { // Load EDL for pasting - new_edl->load_xml(&xml_file, LOAD_ALL); + new_edl->load_xml(&xml_file, LOAD_ALL); if(debug) printf("MWindow::load_filenames %d\n", __LINE__); - test_plugins(new_edl, filenames->get(i)); + test_plugins(new_edl, filenames->get(i)); if(debug) printf("MWindow::load_filenames %d\n", __LINE__); - if(load_mode == LOADMODE_REPLACE || - load_mode == LOADMODE_REPLACE_CONCATENATE) - { - strcpy(session->filename, filenames->get(i)); - strcpy(new_edl->local_session->clip_title, - filenames->get(i)); - if(update_filename) - set_filename(new_edl->local_session->clip_title); - } - else - if( load_mode == LOADMODE_RESOURCESONLY ) { - strcpy(new_edl->local_session->clip_title, - filenames->get(i)); - struct stat st; - time_t t = !stat(filenames->get(i),&st) ? - st.st_mtime : time(&t); - ctime_r(&t, new_edl->local_session->clip_notes); - } + if( load_mode == LOADMODE_REPLACE || + load_mode == LOADMODE_REPLACE_CONCATENATE ) { + strcpy(session->filename, filenames->get(i)); + strcpy(new_edl->local_session->clip_title, + filenames->get(i)); + if(update_filename) + set_filename(new_edl->local_session->clip_title); + } + else if( load_mode == LOADMODE_RESOURCESONLY ) { + strcpy(new_edl->local_session->clip_title, + filenames->get(i)); + struct stat st; + time_t t = !stat(filenames->get(i),&st) ? + st.st_mtime : time(&t); + ctime_r(&t, new_edl->local_session->clip_notes); } - - new_edls.append(new_edl); - result = 0; - break; } + + new_edls.append(new_edl); + new_edl->add_user(); + result = 0; + break; } } -// edls are in new_edls - if( result && new_edl ) new_edl->Garbage::remove_user(); -// assets are copied - if( new_asset ) new_asset->Garbage::remove_user(); + new_edl->Garbage::remove_user(); + new_asset->Garbage::remove_user(); // Store for testing index new_files.append(new_file); diff --git a/cinelerra-5.1/cinelerra/packagerenderer.C b/cinelerra-5.1/cinelerra/packagerenderer.C index e0508099..4318bec7 100644 --- a/cinelerra-5.1/cinelerra/packagerenderer.C +++ b/cinelerra-5.1/cinelerra/packagerenderer.C @@ -105,6 +105,7 @@ PackageRenderer::~PackageRenderer() delete video_cache; delete vconfig; delete aconfig; + delete timer; } // PackageRenderer::initialize happens only once for every node when doing rendering session diff --git a/cinelerra-5.1/cinelerra/removefile.h b/cinelerra-5.1/cinelerra/removefile.h index b2f35fa5..371c0710 100644 --- a/cinelerra-5.1/cinelerra/removefile.h +++ b/cinelerra-5.1/cinelerra/removefile.h @@ -40,12 +40,13 @@ public: void wait() { Thread::join(); delete this; } static void removeFile(const char *path) { RemoveFile *rf = new RemoveFile(path,1); - rf->run(); + rf->start(); } static void removeFileWait(const char *path) { if( ::access(path, F_OK) ) return; RemoveFile *rf = new RemoveFile(path,0); - rf->run(); rf->wait(); + rf->start(); rf->wait(); + delete rf; } }; diff --git a/cinelerra-5.1/cinelerra/render.C b/cinelerra-5.1/cinelerra/render.C index 5ce03541..f50ae895 100644 --- a/cinelerra-5.1/cinelerra/render.C +++ b/cinelerra-5.1/cinelerra/render.C @@ -255,9 +255,7 @@ Render::~Render() delete package_lock; delete counter_lock; delete completion; -// May be owned by someone else. This is owned by mwindow, so we don't care -// about deletion. -// delete preferences; + delete preferences; delete progress_timer; if( asset ) asset->Garbage::remove_user(); delete thread; @@ -314,13 +312,11 @@ void Render::start_batches(ArrayList *jobs, mode = Render::BATCH; batch_cancelled = 0; this->jobs = jobs; - this->preferences = preferences; + this->preferences = new Preferences; + this->preferences->copy_from(preferences); completion->reset(); -PRINT_TRACE thread->run(); -PRINT_TRACE - this->preferences = 0; } @@ -715,15 +711,12 @@ void RenderThread::render_single(int test_overwrite, Asset *asset, EDL *edl, render->progress = 0; render->result = 0; - if(mwindow) - { - if(!render->preferences) + if( mwindow ) { + if( !render->preferences ) render->preferences = new Preferences; - render->preferences->copy_from(mwindow->preferences); } - // Create rendering command TransportCommand *command = new TransportCommand; command->command = NORMAL_FWD; @@ -1135,6 +1128,9 @@ RenderWindow::RenderWindow(MWindow *mwindow, this->mwindow = mwindow; this->render = render; this->asset = asset; + render_format = 0; + loadmode = 0; + renderprofile = 0; rangeproject = 0; rangeselection = 0; rangeinout = 0; @@ -1143,15 +1139,11 @@ RenderWindow::RenderWindow(MWindow *mwindow, RenderWindow::~RenderWindow() { -SET_TRACE lock_window("RenderWindow::~RenderWindow"); -SET_TRACE delete render_format; -SET_TRACE delete loadmode; -SET_TRACE + delete renderprofile; unlock_window(); -SET_TRACE } diff --git a/cinelerra-5.1/guicast/thread.C b/cinelerra-5.1/guicast/thread.C index 26ccf9a4..b27f43a2 100644 --- a/cinelerra-5.1/guicast/thread.C +++ b/cinelerra-5.1/guicast/thread.C @@ -65,8 +65,8 @@ void* Thread::entrypoint(void *parameters) thread->run(); thread->finished = true; if( !thread->synchronous ) { - if( !thread->cancelled ) TheList::dbg_del(thread->tid); if( thread->autodelete ) delete thread; + else if( !thread->cancelled ) TheList::dbg_del(thread->tid); else thread->tid = ((pthread_t)-1); } return NULL; @@ -106,9 +106,13 @@ void Thread::start() perror("Thread::start pthread_attr_setinheritsched"); } +// autodelete may delete this immediately after create + int autodelete = this->autodelete; + pthread_create(&tid, &attr, Thread::entrypoint, this); - TheList::dbg_add(tid, owner, typeid(*this).name()); + if( !autodelete ) + TheList::dbg_add(tid, owner, typeid(*this).name()); } int Thread::cancel() diff --git a/cinelerra-5.1/picon/cinfinity/histeq.png b/cinelerra-5.1/picon/cinfinity/histeq.png index 658d2f3820183356b15e156b946c4a6dba104195..a2a4bbee0ba6063935c07b7918f828ffc68e70b8 100644 GIT binary patch literal 16766 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

h$WxongUw*pb6($00CzN=`!yITk9F7}Hdo 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 -- 2.26.2