578 lines
18 KiB
C++
578 lines
18 KiB
C++
/***
|
|
|
|
Olive - Non-Linear Video Editor
|
|
Copyright (C) 2019 Olive Team
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
***/
|
|
|
|
#ifndef CONFIG_H
|
|
#define CONFIG_H
|
|
|
|
#include <QString>
|
|
|
|
namespace olive {
|
|
/**
|
|
* @brief Version identifier for saved projects
|
|
*
|
|
* This constant is used to identify what version of Olive a project file was saved with. Every project file
|
|
* is saved with the current version number and the version is checked whenever an Olive project is loaded to
|
|
* determine how compatible it'll be with the current version.
|
|
*
|
|
* Sometimes this version identifier is used to invoke backwards compatibility in order to keep older project files
|
|
* able to load, but in this early rapidly developing stage, often backwards compatibility is abandoned. Ideally
|
|
* in the future, a class should be made that's able to "convert" an older project into one that the current
|
|
* loading system understands (so that the loading system doesn't get too bloated with backwards compatibility
|
|
* functions).
|
|
*/
|
|
const int kSaveVersion = 190219; // YYMMDD
|
|
|
|
/**
|
|
* @brief Minimum project version that this version of Olive can open
|
|
*
|
|
* When loading a project, the project's version number is actually checked whether it is somewhere between
|
|
* kSaveVersion and this value (inclusive). This is used if the current version of Olive contains backwards
|
|
* compatibility functionality for older project versions, and is bumped up if such backwards compatibility is
|
|
* ever removed.
|
|
*
|
|
* As stated in kSaveVersion documentation, ideally in the future, a system would be in place to account for all
|
|
* project version differences and bring them up to date for the current loading algorithm. This means ideally, this
|
|
* constant stays the same forever, but in this early stage it's not strictly necessary.
|
|
*/
|
|
const int kMinimumSaveVersion = 190219; // lowest compatible project version
|
|
|
|
/**
|
|
* @brief The TimecodeType enum
|
|
*
|
|
* Frame numbers can be displayed in various different ways. The timecode_to_frame() and frame_to_timecode()
|
|
* functions (which should be used for all frame <-> timecode conversions) respond to the timecode display type
|
|
* set in Config::timecode_view corresponding to a value from this enum.
|
|
*/
|
|
enum TimecodeType {
|
|
/** Show frame number as a drop-frame timecode */
|
|
kTimecodeDrop,
|
|
|
|
/** Show frame number as a non-drop-frame timecode */
|
|
kTimecodeNonDrop,
|
|
|
|
/** Show frame number as-is with no modifications */
|
|
kTimecodeFrames,
|
|
|
|
/** Show frame number as milliseconds */
|
|
kTimecodeMilliseconds
|
|
};
|
|
|
|
/**
|
|
* @brief The RecordingMode enum
|
|
*
|
|
* Olive currently supports recording mono or stereo and gives users the option of which mode to use when
|
|
* recording audio in-app. Audio recording responds to Config::recording_mode to a value from this enum.
|
|
*/
|
|
enum RecordingMode {
|
|
/** Record all audio in mono */
|
|
RECORD_MODE_MONO,
|
|
|
|
/** Record all audio in stereo */
|
|
RECORD_MODE_STEREO
|
|
};
|
|
|
|
/**
|
|
* @brief The AutoScrollMode enum
|
|
*
|
|
* The Timeline in Olive can automatically scroll to follow the playhead when the sequence is playing.
|
|
* The Timeline will respond to Config::autoscroll set to a value from this enum.
|
|
*/
|
|
enum AutoScrollMode {
|
|
/** Don't auto-scroll, scrolling will not follow the playhead */
|
|
AUTOSCROLL_NO_SCROLL,
|
|
|
|
/** Page auto-scroll (default), if the playhead goes off-screen while playing, the scroll will jump ahead
|
|
* one "page" to follow it */
|
|
AUTOSCROLL_PAGE_SCROLL,
|
|
|
|
/** Smooth auto-scroll, Olive will scroll to keep the playhead in the center of the screen at all times while
|
|
* playing */
|
|
AUTOSCROLL_SMOOTH_SCROLL
|
|
};
|
|
|
|
/**
|
|
* @brief The ProjectView enum
|
|
*
|
|
* The media in the Project panel can be displayed as a tree hierarchy or as an icon view. The Project panel
|
|
* responds to Config::project_view_type set to a value from this enum.
|
|
*/
|
|
enum ProjectView {
|
|
/** Display project media in tree hierarchy */
|
|
PROJECT_VIEW_TREE,
|
|
|
|
/** Display project media in icon browser */
|
|
PROJECT_VIEW_ICON
|
|
};
|
|
|
|
/**
|
|
* @brief The FrameQueueType enum
|
|
*
|
|
* Olive keeps a "frame queue" in memory to allow smoother playback/seeking. In order to give users control over
|
|
* the amount of memory consumption vs. playback performance, they can control how many frames are cached into
|
|
* memory. For extra fidelity, they can choose this value as a metric of either frames or seconds.
|
|
*
|
|
* The playback engine (playback/playback.h) responds to both Config::previous_queue_type and
|
|
* Config::upcoming_queue_type set to a value from this enum.
|
|
*/
|
|
enum FrameQueueType {
|
|
/** Queue size value is in frames */
|
|
FRAME_QUEUE_TYPE_FRAMES,
|
|
|
|
/** Queue size value is in seconds */
|
|
FRAME_QUEUE_TYPE_SECONDS
|
|
};
|
|
}
|
|
|
|
/**
|
|
* @brief The Config struct
|
|
*
|
|
* This struct handles any configuration that should persist between restarting Olive. It contains several variables
|
|
* as well as functions that load and save all the variables to file.
|
|
*/
|
|
struct Config {
|
|
/**
|
|
* @brief Config Constructor
|
|
*
|
|
* Sets all configuration variables to their defaults.
|
|
*/
|
|
Config();
|
|
|
|
/**
|
|
* @brief Show track lines
|
|
*
|
|
* **TRUE** if the Timeline should show lines between tracks.
|
|
*/
|
|
bool show_track_lines;
|
|
|
|
/**
|
|
* @brief The scroll wheel zooms rather than scrolls
|
|
*
|
|
* **TRUE** if the scroll wheel should zoom in and out rather than scroll up and down.
|
|
*/
|
|
bool scroll_zooms;
|
|
|
|
/**
|
|
* @brief Edit tool selects links
|
|
*
|
|
* **TRUE** if the edit tool should also select links when the user selects a clip.
|
|
*/
|
|
bool edit_tool_selects_links;
|
|
|
|
/**
|
|
* @brief Edit tool also seeks
|
|
*
|
|
* **TRUE** if using the edit tool should also seek the sequence's playhead
|
|
*/
|
|
bool edit_tool_also_seeks;
|
|
|
|
/**
|
|
* @brief Selecting also seeks
|
|
*
|
|
* **TRUE** if the playhead should automatically seek to the start of any clip that gets selected
|
|
*/
|
|
bool select_also_seeks;
|
|
|
|
/**
|
|
* @brief Paste also seeks
|
|
*
|
|
* **TRUE** if the playhead should seek to the end of clips that are pasted
|
|
*/
|
|
bool paste_seeks;
|
|
|
|
/**
|
|
* @brief Image sequence formats
|
|
*
|
|
* A '|' separated list of file extensions that Olive will perform an image sequence test heuristic on when importing
|
|
*/
|
|
QString img_seq_formats;
|
|
|
|
/**
|
|
* @brief Use rectified waveforms
|
|
*
|
|
* **TRUE** if Olive should display waveforms as "rectified". Rectified waveforms start at the bottom rather than
|
|
* from the middle.
|
|
*/
|
|
bool rectified_waveforms;
|
|
|
|
/**
|
|
* @brief Default transition length
|
|
*
|
|
* The default transition length used when making a transition without the transition tool
|
|
*/
|
|
int default_transition_length;
|
|
|
|
/**
|
|
* @brief Timecode display mode
|
|
*
|
|
* The display mode with which timecode_to_frame() and frame_to_timecode() will use to convert frame numbers to
|
|
* more human-readable values.
|
|
*
|
|
* Set to a member of enum TimecodeType.
|
|
*/
|
|
int timecode_view;
|
|
|
|
/**
|
|
* @brief Show title/action safe area
|
|
*
|
|
* **TRUE** if the title/action safe area should be shown on the Viewer.
|
|
*/
|
|
bool show_title_safe_area;
|
|
|
|
/**
|
|
* @brief Use custom title/action safe area aspect ratio
|
|
*
|
|
* **TRUE** if the title/action save area should use a custom aspect ratio
|
|
*/
|
|
bool use_custom_title_safe_ratio;
|
|
|
|
/**
|
|
* @brief Custom title/action safe area aspect ratio
|
|
*
|
|
* If Config::use_custom_title_safe_ratio is true, this is the aspect ratio to use.
|
|
*
|
|
* Set to the result of an aspect ratio division (i.e. for 4:3 set to 1.333333 (4.0 / 3.0)
|
|
*/
|
|
double custom_title_safe_ratio;
|
|
|
|
/**
|
|
* @brief Enable dragging files outside Olive directly into the Timeline
|
|
*
|
|
* **TRUE** if the Timeline should respond to files dropped from outside Olive.
|
|
*/
|
|
bool enable_drag_files_to_timeline;
|
|
|
|
/**
|
|
* @brief Auto-scale by default
|
|
*
|
|
* **TRUE** if clips imported into the timeline should have Clip::autoscale **TRUE** by default. If a Clip is
|
|
* smaller or larger than the Sequence, auto-scale will automatically resize it to fit to the Sequence boundaries.
|
|
*/
|
|
bool autoscale_by_default;
|
|
|
|
/**
|
|
* @brief Recording mode/channel layout
|
|
*
|
|
* When recording audio within Olive, use this mode/channel layout (e.g. mono or stereo).
|
|
*
|
|
* Set to a member of enum RecordingMode.
|
|
*/
|
|
int recording_mode;
|
|
|
|
/**
|
|
* @brief Enable seek to import
|
|
*
|
|
* **TRUE** if the playhead should automatically seek to any newly imported clips
|
|
*/
|
|
bool enable_seek_to_import;
|
|
|
|
/**
|
|
* @brief Enable audio scrubbing
|
|
*
|
|
* **TRUE** if audio should "scrub" as the user drags the playhead around
|
|
*/
|
|
bool enable_audio_scrubbing;
|
|
|
|
/**
|
|
* @brief Enable drop on media to replace
|
|
*
|
|
* **TRUE** if dropping a file from outside Olive onto a media item in the Project panel should prompt the user
|
|
* whether the dropped file should replace the media item that the file was dropped on.
|
|
*/
|
|
bool drop_on_media_to_replace;
|
|
|
|
/**
|
|
* @brief Auto-scroll mode
|
|
*
|
|
* The Timeline behavior regarding scrolling to keep the playhead within view while a Sequence is playing.
|
|
*
|
|
* Set to a member of enum AutoScrollMode.
|
|
*/
|
|
int autoscroll;
|
|
|
|
/**
|
|
* @brief Current audio sample rate
|
|
*
|
|
* The sample rate to set the audio output device to. Also used as the value to resample audio to during playback
|
|
* (but not during rendering).
|
|
*/
|
|
int audio_rate;
|
|
|
|
/**
|
|
* @brief Enable fast seeking
|
|
*
|
|
* Olive supports a seek mode that shows frames faster with the risk of briefly showing a "best-effort" frame that
|
|
* may not be the accurate frame at that point of the Timeline. This does not affect exporting.
|
|
*
|
|
* Set to **TRUE** if this mode should be enabled.
|
|
*/
|
|
bool fast_seeking;
|
|
|
|
/**
|
|
* @brief Enable hover focus
|
|
*
|
|
* Default behavior is panels are focused (and therefore respond to certain keyboard shortcuts)when they are clicked
|
|
* on, but Olive also supports panels being considered "focused" if the mouse is hovered over them.
|
|
*
|
|
* **TRUE** to enable hover focus mode.
|
|
*/
|
|
bool hover_focus;
|
|
|
|
/**
|
|
* @brief Project view type
|
|
*
|
|
* Whether to show media in the Project panel as a tree hierarchy or as a browser of icons.
|
|
*
|
|
* Set to a member of enum ProjectView.
|
|
*/
|
|
int project_view_type;
|
|
|
|
/**
|
|
* @brief Ask for a marker name when setting a marker
|
|
*
|
|
* **TRUE** if Olive should ask the user to name a marker when setting one. **FALSE** if markers should just be
|
|
* created without asking.
|
|
*/
|
|
bool set_name_with_marker;
|
|
|
|
/**
|
|
* @brief Show the project toolbar
|
|
*
|
|
* Olive has an optional toolbar for the Project panel.
|
|
*
|
|
* Set to **TRUE** to show it.
|
|
*/
|
|
bool show_project_toolbar;
|
|
|
|
/**
|
|
* @brief Previous frame queue size
|
|
*
|
|
* Olive caches frames in memory to improve playback performance (see enum FrameQueueType documentation for more
|
|
* details). This variable states how many frames to keep in memory prior to the playhead (in most cases, frames that
|
|
* have already been played, but are kept in memory in case the user wants to backtrack at any time).
|
|
*
|
|
* This value corresponds to Config::previous_queue_type.
|
|
*/
|
|
double previous_queue_size;
|
|
|
|
/**
|
|
* @brief Previous frame queue type
|
|
*
|
|
* The metric of which Config::previous_queue_size is using. For example, if Config::previous_queue_size is
|
|
* 3, this variable states whether that is 3 frames or 3 seconds.
|
|
*
|
|
* Set to a member of enum FrameQueueType.
|
|
*/
|
|
int previous_queue_type;
|
|
|
|
/**
|
|
* @brief Upcoming frame queue size
|
|
*
|
|
* Olive caches frames in memory to improve playback performance (see enum FrameQueueType documentation for more
|
|
* details). This variable states how many upcoming frames are stored in memory. Generally this value will be higher
|
|
* than Config::previous_queue_size since the user will be playing forwards most of the time.
|
|
*
|
|
* This value corresponds to Config::upcoming_queue_type.
|
|
*/
|
|
double upcoming_queue_size;
|
|
|
|
/**
|
|
* @brief Upcoming frame queue type
|
|
*
|
|
* The metric of which Config::upcoming_queue_size is using. For example, if Config::upcoming_queue_size is
|
|
* 3, this variable states whether that is 3 frames or 3 seconds.
|
|
*
|
|
* Set to a member of enum FrameQueueType.
|
|
*/
|
|
int upcoming_queue_type;
|
|
|
|
/**
|
|
* @brief Loop
|
|
*
|
|
* If an in/out point are set on the Sequence (Sequence::using_workarea is **TRUE**), set this to **TRUE** if Olive
|
|
* should rewind to the in point and start playing again after it reaches the out point repeatedly until the user
|
|
* pauses.
|
|
*/
|
|
bool loop;
|
|
|
|
/**
|
|
* @brief Seeking also selects
|
|
*
|
|
* Olive supports automatically selecting clips that the playhead is currently touching for a more efficient workflow.
|
|
*
|
|
* **TRUE** if this mode should be enabled.
|
|
*/
|
|
bool seek_also_selects;
|
|
|
|
/**
|
|
* @brief CSS Path
|
|
*
|
|
* The URL to a CSS file if the user has loaded a custom stylesheet in. **EMPTY** if the user has not set a
|
|
* stylesheet.
|
|
*/
|
|
QString css_path;
|
|
|
|
/**
|
|
* @brief Number of lines that an Effect's textbox has
|
|
*
|
|
* The height of a Effect's textbox field in terms of lines.
|
|
*
|
|
* Set to a value >= 1
|
|
*/
|
|
int effect_textbox_lines;
|
|
|
|
/**
|
|
* @brief Use software fallbacks when possible
|
|
*
|
|
* Olive uses a lot of OpenGL-based hardware acceleration for performance. Some older hardware has difficulty
|
|
* supporting this functionality, so some of it has software-based (not hardware accelerated) fallbacks for these
|
|
* users.
|
|
*
|
|
* **TRUE** if Olive should prefer software fallbacks to hardware acceleration when they're available.
|
|
*/
|
|
bool use_software_fallback;
|
|
|
|
/**
|
|
* @brief Center Timeline timecodes
|
|
*
|
|
* By default, Olive shows timecodes in the TimelineHeader centered to the corresponding frame point. This may not
|
|
* always be desirable as, for example, this forces the initial 00:00:00;00 timecode's left half to be cut off.
|
|
* Olive supports aligning the timecode to the right of the frame rather than the center to address this.
|
|
*/
|
|
bool center_timeline_timecodes;
|
|
|
|
/**
|
|
* @brief Preferred audio output device
|
|
*
|
|
* Sets the audio device Olive should use to output audio to.
|
|
*
|
|
* Set to the name of the audio device or **EMPTY** to try using the default.
|
|
*/
|
|
QString preferred_audio_output;
|
|
|
|
/**
|
|
* @brief Preferred audio input device
|
|
*
|
|
* Sets the audio device Olive should use to input audio from.
|
|
*
|
|
* Set to the name of the audio device or **EMPTY** to try using the default.
|
|
*/
|
|
QString preferred_audio_input;
|
|
|
|
/**
|
|
* @brief Language/translation file
|
|
*
|
|
* Sets the translation file to load to display Olive in a different language.
|
|
*
|
|
* Set to the URL of the language file to load, or **EMPTY** to use default en-US language.
|
|
*/
|
|
QString language_file;
|
|
|
|
/**
|
|
* @brief Waveform resolution
|
|
*
|
|
* Sets how detailed the waveforms should be in the Timeline. Higher value = more detail.
|
|
*
|
|
* Specifically sets how many samples per second should be "cached" for preview. If the waveforms are too blocky,
|
|
* set this higher. If Timeline performance is slow, set this lower.
|
|
*/
|
|
int waveform_resolution;
|
|
|
|
/**
|
|
* @brief Thumbnail resolution
|
|
*
|
|
* The vertical pixel height to use for generating thumbnails.
|
|
*/
|
|
int thumbnail_resolution;
|
|
|
|
/**
|
|
* @brief Add default effects to clips
|
|
*
|
|
* **TRUE** if new clips imported into the Timeline should have a set of default effects (TransformEffect,
|
|
* VolumeEffect, and PanEffect) added to them by default.
|
|
*/
|
|
bool add_default_effects_to_clips;
|
|
|
|
/**
|
|
* @brief Load config from file
|
|
*
|
|
* Load configuration parameters from file
|
|
*
|
|
* @param path
|
|
*
|
|
* URL to the configuration file to load
|
|
*/
|
|
void load(QString path);
|
|
|
|
/**
|
|
* @brief Save config to file
|
|
*
|
|
* Save current configuration parameters to file
|
|
*
|
|
* @param path
|
|
*
|
|
* URL to save the configuration file to.
|
|
*/
|
|
void save(QString path);
|
|
};
|
|
|
|
/**
|
|
* @brief The RuntimeConfig struct
|
|
*
|
|
* This struct handles any configuration that's set as a command-line argument to Olive, and shouldn't be persistent
|
|
* between restarts of Olive.
|
|
*/
|
|
struct RuntimeConfig {
|
|
/**
|
|
* @brief RuntimeConfig Constructor
|
|
*
|
|
* Sets default runtime configuration
|
|
*/
|
|
RuntimeConfig();
|
|
|
|
/**
|
|
* @brief Enable shaders
|
|
*
|
|
* Debugging tool. Set to **FALSE** to bypass OpenGL shaders.
|
|
*/
|
|
bool shaders_are_enabled;
|
|
|
|
/**
|
|
* @brief Disable blending modes
|
|
*
|
|
* Some users had difficulty utilizing blending modes (provided by shaders). Set this to **TRUE** to bypass
|
|
* shader-based blending modes and utilize standard (less versatile) OpenGL blending instead.
|
|
*/
|
|
bool disable_blending;
|
|
|
|
/**
|
|
* @brief Load an external translation file
|
|
*
|
|
* Overrides Config::language_file and sets the path to a language file to use.
|
|
*/
|
|
QString external_translation_file;
|
|
};
|
|
|
|
namespace olive {
|
|
extern Config CurrentConfig;
|
|
extern RuntimeConfig CurrentRuntimeConfig;
|
|
}
|
|
|
|
#endif // CONFIG_H
|