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); } }
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; }
// 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; }
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; }
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; }
PluginSet::PluginSet(EDL *edl, Track *track) : Edits(edl, track, create_edit()) { record = 1; }
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; }