Exemplo n.º 1
0
void Edits::copy_from(Edits *edits)
{
	while(last) delete last;
	for(Edit *current = edits->first; current; current = NEXT)
	{
		Edit *new_edit = append(create_edit());
		new_edit->copy_from(current);
	}
}
Exemplo n.º 2
0
void PluginSet::copy_from(PluginSet *src)
{
	while(last) delete last;
	for(Plugin *current = (Plugin*)src->first; current; current = (Plugin*)NEXT)
	{
		Plugin *new_plugin;
		append(new_plugin = (Plugin*)create_edit());
		new_plugin->copy_from(current);
	}
	this->record = src->record;
}
Exemplo n.º 3
0
// Native units
// Can't paste silence in here because it's used by paste_silence.
Edit* Edits::insert_new_edit(int64_t position)
{
	Edit *current = 0;
//printf("Edits::insert_new_edit 1\n");
	current = split_edit(position);
	if(current) current = PREVIOUS;

//printf("Edits::insert_new_edit 1\n");
	Edit *new_edit = create_edit();
//printf("Edits::insert_new_edit 1\n");
	insert_after(current, new_edit);
	new_edit->startproject = position;
//printf("Edits::insert_new_edit 2\n");
	return new_edit;
}
Exemplo n.º 4
0
Edit* Edits::split_edit(int64_t position)
{
// Get edit containing position
	Edit *edit = editof(position, PLAY_FORWARD, 0);

// No edit found
	if(!edit)
	{
		return 0;
	}
// Split would have created a 0 length
//	if(edit->startproject == position) return edit;
// Create anyway so the return value comes before position

	Edit *new_edit = create_edit();
	insert_after(edit, new_edit);
	new_edit->copy_from(edit);
	new_edit->length = new_edit->startproject + new_edit->length - position;
	edit->length = position - edit->startproject;
	new_edit->startproject = edit->startproject + edit->length;
	new_edit->startsource += edit->length;


// Decide what to do with the transition
	if(edit->length && edit->transition)
	{
		delete new_edit->transition;
		new_edit->transition = 0;
	}

	if(edit->transition && edit->transition->length > edit->length) 
		edit->transition->length = edit->length;
	if(new_edit->transition && new_edit->transition->length > new_edit->length)
		new_edit->transition->length = new_edit->length;
	return new_edit;
}
Exemplo n.º 5
0
int PluginSet::optimize()
{
	int result = 1;
	Plugin *current_edit;


// Delete keyframes out of range
	for(current_edit = (Plugin*)first;
		current_edit; 
		current_edit = (Plugin*)current_edit->next)
	{
		current_edit->keyframes->default_auto->position = 0;
		for(KeyFrame *current_keyframe = (KeyFrame*)current_edit->keyframes->last;
			current_keyframe; )
		{
			KeyFrame *previous_keyframe = (KeyFrame*)current_keyframe->previous;
			if(current_keyframe->position > 
				current_edit->startproject + current_edit->length ||
				current_keyframe->position < current_edit->startproject)
			{
				delete current_keyframe;
			}
			current_keyframe = previous_keyframe;
		}
	}

// Insert silence between plugins
	for(Plugin *current = (Plugin*)last; current; current = (Plugin*)PREVIOUS)
	{
		if(current->previous)
		{
			Plugin *previous = (Plugin*)PREVIOUS;

			if(current->startproject - 
				previous->startproject - 
				previous->length > 0)
			{
				Plugin *new_plugin = (Plugin*)create_edit();
				insert_before(current, new_plugin);
				new_plugin->startproject = previous->startproject + 
					previous->length;
				new_plugin->length = current->startproject - 
					previous->startproject - 
					previous->length;
			}
		}
		else
		if(current->startproject > 0)
		{
			Plugin *new_plugin = (Plugin*)create_edit();
			insert_before(current, new_plugin);
			new_plugin->length = current->startproject;
		}
	}


// delete 0 length plugins
	while(result)
	{
		result = 0;

		for(current_edit = (Plugin*)first; 
			current_edit && !result; )
		{
			if(current_edit->length == 0)
			{
				Plugin* next = (Plugin*)current_edit->next;
				delete current_edit;
				result = 1;
				current_edit = next;
			}
			else
				current_edit = (Plugin*)current_edit->next;
		}


// merge identical plugins with same keyframes
		for(current_edit = (Plugin*)first; 
			current_edit && current_edit->next && !result; )
		{
			Plugin *next_edit = (Plugin*)current_edit->next;


// plugins identical
   			if(next_edit->identical(current_edit))
        	{
        		current_edit->length += next_edit->length;
// Merge keyframes
				for(KeyFrame *source = (KeyFrame*)next_edit->keyframes->first;
					source;
					source = (KeyFrame*)source->next)
				{
					KeyFrame *dest = new KeyFrame(edl, current_edit->keyframes);
					*dest = *source;
					current_edit->keyframes->append(dest);
				}
        		remove(next_edit);
        		result = 1;
        	}

    		current_edit = (Plugin*)current_edit->next;
		}

// delete last edit if 0 length or silence
		if(last)
		{
			if(last->silence() || !last->length)
			{
				delete last;
				result = 1;
			}
		}
	}

	return 0;
}
Exemplo n.º 6
0
PluginSet::PluginSet(EDL *edl, Track *track)
 : Edits(edl, track, create_edit())
{
	record = 1;
}
Exemplo n.º 7
0
int Edits::optimize()
{
	int result = 1;
	Edit *current;


//printf("Edits::optimize %d\n", __LINE__);
// Sort edits by starting point
	while(result)
	{
		result = 0;
		
		for(current = first; current; current = NEXT)
		{
			Edit *next_edit = NEXT;
			
			if(next_edit && next_edit->startproject < current->startproject)
			{
				swap(next_edit, current);
				result = 1;
			}
		}
	}

// Insert silence between edits which aren't consecutive
	for(current = last; current; current = current->previous)
	{
		if(current->previous)
		{
			Edit *previous_edit = current->previous;
			if(current->startproject - 
				previous_edit->startproject -
				previous_edit->length > 0)
			{
				Edit *new_edit = create_edit();
				insert_before(current, new_edit);
				new_edit->startproject = previous_edit->startproject + previous_edit->length;
				new_edit->length = current->startproject - 
					previous_edit->startproject -
					previous_edit->length;
			}
		}
		else
		if(current->startproject > 0)
		{
			Edit *new_edit = create_edit();
			insert_before(current, new_edit);
			new_edit->length = current->startproject;
		}
	}

	result = 1;
	while(result)
	{
		result = 0;


// delete 0 length edits
		for(current = first; 
			current && !result; )
		{
			if(current->length == 0)
			{
				Edit* next = current->next;
				delete current;
				result = 1;
				current = next;
			}
			else
				current = current->next;
		}

//printf("Edits::optimize %d result=%d\n", __LINE__, result);
// merge same files or transitions
		for(current = first; 
			current && current->next && !result; )
		{
			Edit *next_edit = current->next;

// printf("Edits::optimize %d %lld=%lld %d=%d %p=%p %p=%p\n", 
// __LINE__,
// current->startsource + current->length,
// next_edit->startsource,
// current->channel,
// next_edit->channel,
// current->asset,
// next_edit->asset,
// current->nested_edl,
// next_edit->nested_edl);


	   		if(
// both edits are silence & not a plugin
				(current->silence() && next_edit->silence() && !current->is_plugin) ||
				(current->startsource + current->length == next_edit->startsource &&
// source channels are identical
	       		current->channel == next_edit->channel &&
// assets are identical
				current->asset == next_edit->asset && 
    		   	current->nested_edl == next_edit->nested_edl))
			{
//printf("Edits::optimize %d\n", __LINE__);
        		current->length += next_edit->length;
        		remove(next_edit);
        		result = 1;
        	}

    		current = current->next;
		}

// delete last edit of 0 length or silence
		if(last && 
			(last->silence() || 
			!last->length))
		{
			delete last;
			result = 1;
		}
	}

//track->dump();
	return 0;
}