int Asset::write(FileXML *file, int include_index, const char *output_path) { char new_path[BCTEXTLEN]; char asset_directory[BCTEXTLEN]; char output_directory[BCTEXTLEN]; FileSystem fs; // Make path relative fs.extract_dir(asset_directory, path); if(output_path && output_path[0]) fs.extract_dir(output_directory, output_path); else output_directory[0] = 0; // Asset and EDL are in same directory. Extract just the name. if(!strcmp(asset_directory, output_directory)) { fs.extract_name(new_path, path); } else { strcpy(new_path, path); } file->tag.set_title("ASSET"); file->tag.set_property("SRC", new_path); file->append_tag(); file->append_newline(); file->tag.set_title("FOLDER"); file->tag.set_property("NUMBER", awindow_folder); file->append_tag(); file->tag.set_title("/FOLDER"); file->append_tag(); file->append_newline(); // Write the format information file->tag.set_title("FORMAT"); file->tag.set_property("TYPE", File::formattostr(format)); file->tag.set_property("USE_HEADER", use_header); file->append_tag(); file->tag.set_title("/FORMAT"); file->append_tag(); file->append_newline(); // Requiring data to exist caused batch render to lose settings. // But the only way to know if an asset doesn't have audio or video data // is to not write the block. // So change the block name if the asset doesn't have the data. /* if(audio_data) */ write_audio(file); /* if(video_data) */ write_video(file); if(index_status == 0 && include_index) write_index(file); // index goes after source file->tag.set_title("/ASSET"); file->append_tag(); file->append_newline(); return 0; }
int Edit::copy(int64_t start, int64_t end, FileXML *file, const char *output_path) { // variables //printf("Edit::copy 1\n"); int64_t endproject = startproject + length; int result; if((startproject >= start && startproject <= end) || // startproject in range (endproject <= end && endproject >= start) || // endproject in range (startproject <= start && endproject >= end)) // range in project { // edit is in range int64_t startproject_in_selection = startproject; // start of edit in selection in project int64_t startsource_in_selection = startsource; // start of source in selection in source int64_t endsource_in_selection = startsource + length; // end of source in selection int64_t length_in_selection = length; // length of edit in selection //printf("Edit::copy 2\n"); if(startproject < start) { // start is after start of edit in project int64_t length_difference = start - startproject; startsource_in_selection += length_difference; startproject_in_selection += length_difference; length_in_selection -= length_difference; } //printf("Edit::copy 3\n"); if(endproject > end) { // end is before end of edit in project length_in_selection = end - startproject_in_selection; } //printf("Edit::copy 4\n"); if(file) // only if not counting { file->tag.set_title("EDIT"); file->tag.set_property("STARTSOURCE", startsource_in_selection); file->tag.set_property("CHANNEL", (int64_t)channel); file->tag.set_property("LENGTH", length_in_selection); if(user_title[0]) file->tag.set_property("USER_TITLE", user_title); //printf("Edit::copy 5\n"); copy_properties_derived(file, length_in_selection); file->append_tag(); // file->append_newline(); //printf("Edit::copy 6\n"); if(nested_edl) { file->tag.set_title("NESTED_EDL"); file->tag.set_property("SRC", nested_edl->path); file->append_tag(); } if(asset) { //printf("Edit::copy 6 %s\n", asset->path); char stored_path[BCTEXTLEN]; char asset_directory[BCTEXTLEN]; char output_directory[BCTEXTLEN]; FileSystem fs; //printf("Edit::copy 6 %s\n", asset->path); fs.extract_dir(asset_directory, asset->path); //printf("Edit::copy 6 %s\n", asset->path); if(output_path) fs.extract_dir(output_directory, output_path); else output_directory[0] = 0; //printf("Edit::copy %s, %s %s, %s\n", asset->path, asset_directory, output_path, output_directory); if(output_path && !strcmp(asset_directory, output_directory)) fs.extract_name(stored_path, asset->path); else strcpy(stored_path, asset->path); file->tag.set_title("FILE"); file->tag.set_property("SRC", stored_path); file->append_tag(); } if(transition) { transition->save_xml(file); } //printf("Edit::copy 7\n"); file->tag.set_title("/EDIT"); file->append_tag(); file->append_newline(); //printf("Edit::copy 8\n"); } //printf("Edit::copy 9\n"); result = 1; } else { result = 0; } //printf("Edit::copy 10\n"); return result; }
int Asset::read(FileXML *file, int expand_relative) { int result = 0; // Check for relative path. if(expand_relative) { char new_path[BCTEXTLEN]; char asset_directory[BCTEXTLEN]; char input_directory[BCTEXTLEN]; FileSystem fs; strcpy(new_path, path); fs.set_current_dir(""); fs.extract_dir(asset_directory, path); // No path in asset. // Take path of XML file. if(!asset_directory[0]) { fs.extract_dir(input_directory, file->filename); // Input file has a path if(input_directory[0]) { fs.join_names(path, input_directory, new_path); } } } while(!result) { result = file->read_tag(); if(!result) { if(file->tag.title_is("/ASSET")) { result = 1; } else if(file->tag.title_is("AUDIO")) { read_audio(file); } else if(file->tag.title_is("AUDIO_OMIT")) { read_audio(file); } else if(file->tag.title_is("FORMAT")) { char *string = file->tag.get_property("TYPE"); format = File::strtoformat(string); use_header = file->tag.get_property("USE_HEADER", use_header); } else if(file->tag.title_is("FOLDER")) { char *string = file->tag.get_property("NUMBER"); if(string) awindow_folder = atoi(string); else awindow_folder = AWindowGUI::folder_number(file->read_text()); } else if(file->tag.title_is("VIDEO")) { read_video(file); } else if(file->tag.title_is("VIDEO_OMIT")) { read_video(file); } else if(file->tag.title_is("INDEX")) { read_index(file); } } } //printf("Asset::read 2\n"); return 0; }
int Edits::load_edit(FileXML *file, int64_t &startproject, int track_offset) { Edit* current; current = append_new_edit(); current->load_properties(file, startproject); startproject += current->length; int result = 0; do{ result = file->read_tag(); if(!result) { if(file->tag.title_is("NESTED_EDL")) { char path[BCTEXTLEN]; path[0] = 0; file->tag.get_property("SRC", path); //printf("Edits::load_edit %d path=%s\n", __LINE__, path); if(path[0] != 0) { current->nested_edl = edl->nested_edls->get(path); } // printf("Edits::load_edit %d nested_edl->path=%s\n", // __LINE__, // current->nested_edl->path); } else if(file->tag.title_is("FILE")) { char filename[BCTEXTLEN]; filename[0] = 0; file->tag.get_property("SRC", filename); // Extend path if(filename[0] != 0) { char directory[BCTEXTLEN], edl_directory[BCTEXTLEN]; FileSystem fs; fs.set_current_dir(""); fs.extract_dir(directory, filename); if(!strlen(directory)) { fs.extract_dir(edl_directory, file->filename); fs.join_names(directory, edl_directory, filename); strcpy(filename, directory); } current->asset = edl->assets->get_asset(filename); } else { current->asset = 0; } //printf("Edits::load_edit 5\n"); } else if(file->tag.title_is("TRANSITION")) { current->transition = new Transition(edl, current, "", track->to_units(edl->session->default_transition_length, 1)); current->transition->load_xml(file); } else if(file->tag.title_is("/EDIT")) { result = 1; } } }while(!result); //printf("Edits::load_edit %d\n", __LINE__); //track->dump(); //printf("Edits::load_edit %d\n", __LINE__); return 0; }