Here's a reproducable crush:
1. Load a media file
2. Create arbitrary clip from the file
3. Load a clip into the viewer window.
4. Load any XML project with "Replace project" insertion strategy
5. Crush
The problem is that the vwindow_edl is deleted in EDL.C destructor, even when
it is shared, and then deleted again as a clip. The fix is to move the info
about sharing of vwindow_edl from vwindow.h to edl.h ...
A bit long, but trivial fix is attached..
diff -ru --exclude-from exclude hvirtual-cvs/cinelerra/edl.C hvirtual-2/cinelerra/edl.C
--- hvirtual-cvs/cinelerra/edl.C 2005-11-12 12:12:48.000000000 +0100
+++ hvirtual-2/cinelerra/edl.C 2006-04-06 14:36:28.000000000 +0200
@@ -34,6 +34,7 @@
labels = 0;
local_session = 0;
vwindow_edl = 0;
+ vwindow_edl_shared = 0;
folders.set_array_delete();
new_folder(CLIP_FOLDER);
@@ -60,7 +61,7 @@
delete local_session;
}
- if(vwindow_edl)
+ if(vwindow_edl && !vwindow_edl_shared)
delete vwindow_edl;
if(!parent_edl)
@@ -286,8 +287,9 @@
if((load_flags & LOAD_ALL) == LOAD_ALL)
{
- if(vwindow_edl) delete vwindow_edl;
+ if(vwindow_edl && !vwindow_edl_shared) delete vwindow_edl;
vwindow_edl = new_edl;
+ vwindow_edl_shared = 0;
}
else
{
@@ -340,8 +342,9 @@
void EDL::copy_clips(EDL *edl)
{
- if(vwindow_edl) delete vwindow_edl;
+ if(vwindow_edl && !vwindow_edl_shared) delete vwindow_edl;
vwindow_edl = 0;
+ vwindow_edl_shared = 0;
if(edl->vwindow_edl)
{
vwindow_edl = new EDL(this);
diff -ru --exclude-from exclude hvirtual-cvs/cinelerra/edl.h hvirtual-2/cinelerra/edl.h
--- hvirtual-cvs/cinelerra/edl.h 2005-11-12 12:12:48.000000000 +0100
+++ hvirtual-2/cinelerra/edl.h 2006-04-06 14:33:08.000000000 +0200
@@ -191,6 +191,8 @@
ArrayList<EDL*> clips;
// VWindow
EDL *vwindow_edl;
+// is the vwindow_edl shared and therefore should not be deleted in destructor
+ int vwindow_edl_shared;
// Media files
// Shared between all EDLs
diff -ru --exclude-from exclude hvirtual-cvs/cinelerra/vwindow.C hvirtual-2/cinelerra/vwindow.C
--- hvirtual-cvs/cinelerra/vwindow.C 2005-11-12 12:12:47.000000000 +0100
+++ hvirtual-2/cinelerra/vwindow.C 2006-04-06 14:38:10.000000000 +0200
@@ -42,16 +42,15 @@
void VWindow::delete_edl()
{
//printf("VWindow::delete_edl 1\n");
- if(mwindow->edl->vwindow_edl)
+ if(mwindow->edl->vwindow_edl && !mwindow->edl->vwindow_edl_shared)
{
- if (!edl_shared)
- delete mwindow->edl->vwindow_edl;
+ delete mwindow->edl->vwindow_edl;
mwindow->edl->vwindow_edl = 0;
+ mwindow->edl->vwindow_edl_shared = 0;
}
if(asset) delete asset;
asset = 0;
- edl_shared = 0;
}
@@ -112,7 +111,7 @@
{
if(asset) delete asset;
asset = 0;
- edl_shared = 0;
+ mwindow->edl->vwindow_edl_shared = 0;
}
}
@@ -137,7 +136,7 @@
this->asset = new Asset;
*this->asset = *asset;
mwindow->edl->vwindow_edl = new EDL(mwindow->edl);
- edl_shared = 0;
+ mwindow->edl->vwindow_edl_shared = 0;
mwindow->edl->vwindow_edl->create_objects();
mwindow->asset_to_edl(mwindow->edl->vwindow_edl, asset);
//printf("VWindow::change_source 1 %d %d\n", edl->local_session->loop_playback, mwindow->edl->local_session->loop_playback);
@@ -182,7 +181,7 @@
this->asset = 0;
mwindow->edl->vwindow_edl = edl;
// in order not to later delete edl if it is shared
- edl_shared = 1;
+ mwindow->edl->vwindow_edl_shared = 1;
// Update GUI
gui->change_source(edl, edl->local_session->clip_title);
diff -ru --exclude-from exclude hvirtual-cvs/cinelerra/vwindow.h hvirtual-2/cinelerra/vwindow.h
--- hvirtual-cvs/cinelerra/vwindow.h 2005-11-12 12:12:47.000000000 +0100
+++ hvirtual-2/cinelerra/vwindow.h 2006-04-06 14:33:17.000000000 +0200
@@ -66,10 +66,6 @@
// Pointer to asset for accounting
Asset *asset;
-// When not using the VWindow EDL of the master EDL.
- int edl_shared;
-// Pointer to clip in master EDL.
-// EDL *edl;
};