4 * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30 #include "autoconf.inc"
35 #include "edlsession.inc"
36 #include "filexml.inc"
37 #include "indexable.h"
38 #include "indexstate.inc"
40 #include "localsession.inc"
41 #include "maxchannels.h"
43 #include "nestededls.inc"
44 #include "playabletracks.inc"
45 #include "playbackconfig.h"
46 #include "pluginserver.h"
47 #include "preferences.inc"
48 #include "recordlabel.inc"
49 #include "sharedlocation.inc"
54 // Loading and saving are built on load and copy except for automation:
57 // Load: load new -> paste into master
58 // Save: copy all of master
59 // Undo: selective load into master
60 // Copy: copy from master
61 // Paste: load new -> paste into master
62 // Copy automation: copy just automation from master
63 // Paste automation: paste functions in automation
66 class EDL : public Indexable
69 EDL(EDL *parent_edl = 0);
72 void create_objects();
73 EDL& operator=(EDL &edl);
75 // Load configuration and track counts
76 int load_defaults(BC_Hash *defaults);
77 int save_defaults(BC_Hash *defaults);
78 // Clip default settings to boundaries.
80 // Create tracks using existing configuration
81 int create_default_tracks();
82 int load_xml(FileXML *file,
84 int save_xml(FileXML *xml,
85 const char *output_path,
88 int load_audio_config(FileXML *file, int append_mode, uint32_t load_flags);
89 int load_video_config(FileXML *file, int append_mode, uint32_t load_flags);
91 // Return 1 if rendering requires a virtual console.
92 int get_use_vconsole(VEdit* *playable_edit,
95 PlayableTracks *playable_tracks);
97 // Convert position to frames if cursor alignment is enabled
98 double align_to_frame(double position, int round);
100 // increase track w/h to at least session w/h
102 // Scale all sample values since everything is locked to audio
104 void resample(double old_rate, double new_rate, int data_type);
105 void copy_tracks(EDL *edl);
106 // Copies project path, folders, EDLSession, and LocalSession from edl argument.
107 // session_only - used by preferences and format specify
108 // whether to only copy EDLSession
109 void copy_session(EDL *edl, int session_only = 0);
110 int copy_all(EDL *edl);
111 void copy_assets(EDL *edl);
112 void copy_clips(EDL *edl);
113 // Copy pan and fade settings from edl
114 void synchronize_params(EDL *edl);
115 // Determine if the positions are equivalent if they're within half a frame
117 int equivalent(double position1, double position2);
118 // Determine if the EDL's produce equivalent video output to the old EDL.
119 // The new EDL is this and the old EDL is the argument.
120 // Return the number of seconds from the beginning of this which are
121 // equivalent to the argument.
122 // If they're completely equivalent, -1 is returned;
123 // This is used by BRender + BatchRender.
124 double equivalent_output(EDL *edl);
125 // Set project path for filename prefixes in the assets
126 void set_path(const char *path);
127 // Set points and labels
128 void set_inpoint(double position);
129 void set_outpoint(double position);
130 // Redraw resources during index builds
131 void set_index_file(Indexable *indexable);
132 // Add assets from the src to the destination
133 void update_assets(EDL *src);
135 // return next/prev edit starting from position
136 double next_edit(double position);
137 double prev_edit(double position);
139 int dump(FILE *fp=stdout);
140 static int next_id();
141 // Create a new folder if it doesn't exist already
142 void new_folder(const char *folder);
143 void delete_folder(const char *folder);
144 void modify_edithandles(double oldposition,
152 void modify_pluginhandles(double oldposition,
160 int trim_selection(double start,
167 int copy_assets(double start,
171 const char *output_path);
172 int copy(double start,
174 int all, // Ignore recordable status of tracks for saving
178 const char *output_path,
179 int rewind_it); // Rewind EDL for easy pasting
180 void paste_silence(double start,
182 int edit_labels /* = 1 */,
185 void remove_from_project(ArrayList<Indexable*> *assets);
186 void remove_from_project(ArrayList<EDL*> *clips);
187 int clear(double start,
192 void deglitch(double position);
193 // Insert the asset at a point in the EDL
194 void insert_asset(Asset *asset,
197 Track *first_track = 0,
198 RecordLabels *labels = 0);
199 // Insert the clip at a point in the EDL
200 int insert_clips(ArrayList<EDL*> *new_edls, int load_mode, Track *first_track = 0);
201 // Add a copy of EDL* to the clip array. Returns the copy.
202 EDL* add_clip(EDL *edl);
204 void get_shared_plugins(Track *source, ArrayList<SharedLocation*> *plugin_locations,
205 int omit_recordable, int data_type);
206 void get_shared_tracks(Track *track, ArrayList<SharedLocation*> *module_locations,
207 int omit_recordable, int data_type);
209 int get_tracks_height(Theme *theme);
210 int64_t get_tracks_width();
211 // Return dimensions for canvas if smaller dimensions has zoom of 1
212 void calculate_conformed_dimensions(int single_channel, float &w, float &h);
213 // Get the total output size scaled to aspect ratio
214 void output_dimensions_scaled(int &w, int &h);
215 float get_aspect_ratio();
219 int get_audio_channels();
220 int get_sample_rate();
221 int64_t get_audio_samples();
226 double get_frame_rate();
227 int get_video_layers();
228 int64_t get_video_frames();
230 EDL* get_vwindow_edl(int number);
231 int total_vwindow_edls();
232 void remove_vwindow_edls();
233 void remove_vwindow_edl(EDL *edl);
234 // Adds to list of EDLs & increase garbage collection counter
235 // Does nothing if EDL already exists
236 void append_vwindow_edl(EDL *edl, int increase_counter);
238 // Titles of all subfolders
239 ArrayList<char*> folders;
241 ArrayList<EDL*> clips;
243 NestedEDLs *nested_edls;
244 // EDLs being shown in VWindows
245 ArrayList<EDL*> vwindow_edls;
246 // is the vwindow_edl shared and therefore should not be deleted in destructor
247 // int vwindow_edl_shared;
250 // Shared between all EDLs
257 // Shared between all EDLs in a tree, for projects.
259 // Specific to this EDL, for clips.
260 LocalSession *local_session;
267 // Use parent Assets if nonzero
271 static Mutex *id_lock;