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;
 };
 
 

Reply via email to