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"
32 #include "binfolder.h"
36 #include "edlsession.inc"
37 #include "filexml.inc"
38 #include "indexable.h"
39 #include "indexstate.inc"
41 #include "localsession.inc"
42 #include "maxchannels.h"
45 #include "playabletracks.inc"
46 #include "playbackconfig.h"
47 #include "pluginserver.h"
48 #include "preferences.inc"
49 #include "recordlabel.inc"
50 #include "sharedlocation.inc"
56 // Loading and saving are built on load and copy except for automation:
59 // Load: load new -> paste into master
60 // Save: copy all of master
61 // Undo: selective load into master
62 // Copy: copy from master
63 // Paste: load new -> paste into master
64 // Copy automation: copy just automation from master
65 // Paste automation: paste functions in automation
68 class EDL : public Indexable
71 EDL(EDL *parent_edl = 0);
74 void create_objects();
75 EDL& operator=(EDL &edl);
77 // Load configuration and track counts
78 int load_defaults(BC_Hash *defaults);
79 int save_defaults(BC_Hash *defaults);
80 // Clip default settings to boundaries.
82 // Create tracks using existing configuration
83 int create_default_tracks();
84 int load_xml(FileXML *file, uint32_t load_flags);
85 int read_xml(FileXML *file, uint32_t load_flags);
86 int save_xml(FileXML *xml, const char *output_path);
87 int load_audio_config(FileXML *file, int append_mode, uint32_t load_flags);
88 int load_video_config(FileXML *file, int append_mode, uint32_t load_flags);
90 // Return 1 if rendering requires a virtual console.
91 int get_use_vconsole(VEdit* *playable_edit,
94 PlayableTracks *playable_tracks);
96 // Convert position to frame boundry times
97 double frame_align(double position, int round);
98 // frame align if cursor alignment is enabled
99 double align_to_frame(double position, int round);
100 // get position under cursor in pane
101 double get_cursor_position(int cursor_x, int pane_no);
103 // increase track w/h to at least session w/h
105 // Scale all sample values since everything is locked to audio
107 void resample(double old_rate, double new_rate, int data_type);
109 int copy(double start, double end, int all,
110 FileXML *file, const char *output_path, int rewind_it);
111 int copy(int all, FileXML *file, const char *output_path, int rewind_it);
113 int copy_clip(double start, double end, int all,
114 FileXML *file, const char *output_path, int rewind_it);
115 int copy_clip(int all, FileXML *file, const char *output_path, int rewind_it);
117 int copy_nested_edl(double start, double end, int all,
118 FileXML *file, const char *output_path, int rewind_it);
119 int copy_nested_edl(int all, FileXML *file, const char *output_path, int rewind_it);
121 int copy_vwindow_edl(double start, double end, int all,
122 FileXML *file, const char *output_path, int rewind_it);
123 int copy_vwindow_edl(int all, FileXML *file, const char *output_path, int rewind_it);
125 void copy_tracks(EDL *edl);
126 // Copies project path, folders, EDLSession, and LocalSession from edl argument.
127 // session_only - used by preferences and format specify
128 // whether to only copy EDLSession
129 void copy_session(EDL *edl, int session_only = 0);
130 int copy_all(EDL *edl);
131 void copy_assets(EDL *edl);
132 void copy_clips(EDL *edl);
133 void copy_nested(EDL *edl);
134 void copy_mixers(EDL *edl);
135 // Copy pan and fade settings from edl
136 void synchronize_params(EDL *edl);
137 // Determine if the positions are equivalent if they're within half a frame
139 int equivalent(double position1, double position2);
140 // Determine if the EDL's produce equivalent video output to the old EDL.
141 // The new EDL is this and the old EDL is the argument.
142 // Return the number of seconds from the beginning of this which are
143 // equivalent to the argument.
144 // If they're completely equivalent, -1 is returned;
145 // This is used by BRender + BatchRender.
146 double equivalent_output(EDL *edl);
147 // Set project path for filename prefixes in the assets
148 void set_path(const char *path);
149 // Set points and labels
150 void set_inpoint(double position);
151 void set_outpoint(double position);
152 void unset_inoutpoint();
153 // Redraw resources during index builds
154 void set_index_file(Indexable *indexable);
155 // Add assets from the src to the destination
156 void update_assets(EDL *src);
158 // return next/prev edit starting from position
159 double next_edit(double position);
160 double prev_edit(double position);
162 int dump(FILE *fp=stdout);
163 static int next_id();
165 BinFolder *get_folder(int no);
166 int get_folder_number(const char *title);
167 const char *get_folder_name(int no);
168 int new_folder(const char *title, int is_clips);
169 int delete_folder(const char *title);
171 void modify_edithandles(double oldposition,
179 void modify_pluginhandles(double oldposition,
187 int trim_selection(double start,
194 int copy_assets(double start, double end,
195 FileXML *file, int all, const char *output_path);
196 int copy(double start, double end, int all,
197 const char *closer, FileXML *file,
198 const char *output_path, int rewind_it);
199 void copy_indexables(EDL *edl);
200 EDL *new_nested(EDL *edl, const char *path);
201 EDL *create_nested_clip(EDL *nested);
202 void create_nested(EDL *nested);
203 void paste_silence(double start, double end,
204 int edit_labels /* = 1 */,
207 int in_use(Indexable *indexable);
208 void remove_from_project(ArrayList<Indexable*> *assets);
209 void remove_from_project(ArrayList<EDL*> *clips);
210 int blade(double position);
211 int clear(double start, double end,
215 void deglitch(double position);
216 // Insert the asset at a point in the EDL
217 void insert_asset(Asset *asset,
220 Track *first_track = 0,
221 RecordLabels *labels = 0);
222 // Insert the clip at a point in the EDL
223 int insert_clips(ArrayList<EDL*> *new_edls, int load_mode, Track *first_track = 0);
224 // Add a copy of EDL* to the clip array. Returns the copy.
225 EDL* add_clip(EDL *edl);
227 void get_shared_plugins(Track *source, ArrayList<SharedLocation*> *plugin_locations,
228 int omit_recordable, int data_type);
229 void get_shared_tracks(Track *track, ArrayList<SharedLocation*> *module_locations,
230 int omit_recordable, int data_type);
232 int get_tracks_height(Theme *theme);
233 int64_t get_tracks_width();
234 // Return dimensions for canvas if smaller dimensions has zoom of 1
235 void calculate_conformed_dimensions(int single_channel, float &w, float &h);
236 // Get the total output size scaled to aspect ratio
237 void output_dimensions_scaled(int &w, int &h);
238 float get_aspect_ratio();
242 int get_audio_channels();
243 int get_sample_rate();
244 int64_t get_audio_samples();
249 double get_frame_rate();
250 int get_video_layers();
251 int64_t get_video_frames();
253 EDL* get_vwindow_edl(int number);
254 int total_vwindow_edls();
255 void remove_vwindow_edls();
256 void remove_vwindow_edl(EDL *edl);
257 // Adds to list of EDLs & increase garbage collection counter
258 // Does nothing if EDL already exists
259 void append_vwindow_edl(EDL *edl, int increase_counter);
260 void rescale_proxy(int orig_scale, int new_scale);
261 void set_proxy(int new_scale, int use_scaler,
262 ArrayList<Indexable*> *orig_assets, ArrayList<Indexable*> *proxy_assets);
263 void add_proxy(int use_scaler,
264 ArrayList<Indexable*> *orig_assets, ArrayList<Indexable*> *proxy_assets);
265 Asset *get_proxy_asset();
267 // Titles of all subfolders
269 // Clips, Nested EDLs
270 ClipEDLs clips, nested_edls;
271 // EDLs being shown in VWindows
272 ArrayList<EDL*> vwindow_edls;
273 // is the vwindow_edl shared and therefore should not be deleted in destructor
274 // int vwindow_edl_shared;
278 // Shared between all EDLs
283 // Shared between all EDLs in a tree, for projects.
285 // Specific to this EDL, for clips.
286 LocalSession *local_session;
288 // Use parent Assets if nonzero