diff options
author | Robin Gareus <robin@gareus.org> | 2013-03-12 22:00:09 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2013-03-13 20:28:15 +0100 |
commit | 0c3e840700a915fc1476cef73c591048f688f81e (patch) | |
tree | 3241845f899cfed86217db2f6f589740b2b9c04a /gtk2_ardour/video_timeline.h | |
parent | d91565093965b3405774acd878b3baf38839f4e4 (diff) |
videotimline
squashed 694 commits from http://gareus.org/gitweb/?p=ardour3.git
Diffstat (limited to 'gtk2_ardour/video_timeline.h')
-rw-r--r-- | gtk2_ardour/video_timeline.h | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/gtk2_ardour/video_timeline.h b/gtk2_ardour/video_timeline.h new file mode 100644 index 0000000000..d352af9faf --- /dev/null +++ b/gtk2_ardour/video_timeline.h @@ -0,0 +1,145 @@ +/* + Copyright (C) 2010 Paul Davis + Author: Robin Gareus <robin@gareus.org> + + 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 2 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, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ +#ifdef WITH_VIDEOTIMELINE + +#ifndef __ardour_video_timeline_h__ +#define __ardour_video_timeline_h__ + +#include <string> + +#include <sigc++/signal.h> +#include "ardour/ardour.h" +#include "ardour/session.h" +#include "ardour/session_handle.h" +#include "video_image_frame.h" +#include "open_video_monitor_dialog.h" +#include "video_monitor.h" +#include "pbd/signals.h" +#include "canvas.h" + +namespace ARDOUR { + class Session; +} + +class PublicEditor; + +/** @class VideoTimeLine + * @brief video-timline controller and display + * + * The video-timeline can be displayed in a canvas-group. Given a filename + * it queries the video-server about file-information and + * creates \ref VideoImageFrame as neccesary (which + * query the server for image-data). + * + * This class contains the algorithm to position the single frames + * on the timeline according to current-zoom level and video-file + * attributes. see \ref update_video_timeline() + * + * The VideoTimeLine class includes functionality to launch a video-monitor + * corresponding to its currently diplayed file. + */ +class VideoTimeLine : public sigc::trackable, public ARDOUR::SessionHandlePtr, public PBD::ScopedConnectionList, public PBD::StatefulDestructible +{ + public: + VideoTimeLine (PublicEditor*, ArdourCanvas::Group*, int); + virtual ~VideoTimeLine (); + + void set_session (ARDOUR::Session *s); + void update_video_timeline (); + void set_height (int); + + void save_undo (void); + XMLNode& get_state (); + int set_state (const XMLNode&, int version); + + bool video_file_info (std::string, bool); + double get_video_file_fps () { return video_file_fps; } + void set_update_session_fps (bool v=true) { auto_set_session_fps = v; } + + void set_offset_locked (bool v) { video_offset_lock = v; } + void toggle_offset_locked () { video_offset_lock = !video_offset_lock; } + bool is_offset_locked () { return video_offset_lock; } + + void open_video_monitor (bool interactive=true); + void close_video_monitor (); + void terminated_video_monitor (); + void manual_seek_video_monitor (framepos_t pos); + + void parameter_changed (std::string const & p); + void set_video_server_url (std::string); + void set_video_server_docroot (std::string); + + bool found_xjadeo () { return ((_xjadeo_bin.empty())?false:true); } + bool check_server (); + void flush_local_cache (); + void vmon_update (); + void flush_cache (); + void save_session (); + void close_session (); + float get_apv(); /* audio frames per video frame; */ + ARDOUR::framecnt_t get_duration () { return video_duration;} + ARDOUR::frameoffset_t get_offset () { return video_offset;} + ARDOUR::frameoffset_t quantify_frames_to_apv (ARDOUR::frameoffset_t offset) { return floor(offset/get_apv())*get_apv(); } + void set_offset (ARDOUR::frameoffset_t offset) { video_offset = quantify_frames_to_apv(offset); } // this function does not update video_offset_p, call save_undo() to finalize changes to this! - this fn is currently only used from editor_drag.cc + + protected: + + PublicEditor *editor; + ArdourCanvas::Group *videotl_bar_group; + int bar_height; + + std::string _xjadeo_bin; + void find_xjadeo (); + + + ARDOUR::frameoffset_t video_start_offset; /**< unit: audio-frames - video-file */ + ARDOUR::frameoffset_t video_offset; /**< unit: audio-frames - session */ + ARDOUR::frameoffset_t video_offset_p; /**< used for undo from editor_drag.cc */ + framepos_t video_duration; /**< unit: audio-frames */ + std::string video_filename; + bool local_file; + double video_aspect_ratio; + double video_file_fps; + bool auto_set_session_fps; + bool video_offset_lock; + + std::string video_server_url; + std::string server_docroot; + + typedef std::list<VideoImageFrame*> VideoFrames; + VideoFrames video_frames; + VideoImageFrame *get_video_frame (framepos_t vfn, int cut=0, int rightend = -1); + bool flush_frames; + void remove_frames (); + + std::string translated_filename (); + + VideoMonitor *vmonitor; + OpenVideoMonitorDialog *open_video_monitor_dialog; + bool reopen_vmonitor; + + PBD::Signal0<void> VtlUpdate; + PBD::Signal1<void,std::string> GuiUpdate; + void gui_update (const std::string &); +}; + +#endif /* __ardour_video_timeline_h__ */ + +#endif /* WITH_VIDEOTIMELINE */ |