X-Git-Url: https://git.decadent.org.uk/gitweb/?p=videolink.git;a=blobdiff_plain;f=generate_dvd.hpp;h=e1e3e3cf4f7f8bd6d4a3ea95e855239c89e3941b;hp=91e8da8d5e808ec4e52eef5cf234483e1aaf6b36;hb=HEAD;hpb=c5f98ff303d670f72a5d491a5f4e1989d2043219 diff --git a/generate_dvd.hpp b/generate_dvd.hpp index 91e8da8..e1e3e3c 100644 --- a/generate_dvd.hpp +++ b/generate_dvd.hpp @@ -7,15 +7,23 @@ #include #include -#include +#include +#include "geometry.hpp" #include "temp_file.hpp" +#include "video.hpp" #include "vob_list.hpp" +namespace Gdk +{ + class Pixbuf; +} + // Description of menus and titles to go on a DVD. -struct dvd_contents +class dvd_generator { +public: enum pgc_type { unknown_pgc, menu_pgc, title_pgc }; // Reference to some PGC (program chain). @@ -41,26 +49,57 @@ struct dvd_contents // unspecified; not compared!) }; - // Menu definition. - struct menu + // We can try using either of these encoders to convert PNG to MPEG. + enum mpeg_encoder { - menu(); + mpeg_encoder_ffmpeg, // ffmpeg + mpeg_encoder_mjpegtools // mjpegtools from version 1.8 + }; + + dvd_generator(const video::frame_params & frame_params, + mpeg_encoder encoder); + + // Create a new empty menu; return a reference to it. + // The client must call generate_menu_vob() for each menu before + // calling generate(). + pgc_ref add_menu(); + // Add a menu entry (link) to an existing menu. + void add_menu_entry(unsigned index, + const rectangle & area, + const pgc_ref & target); + // Generate the menu VOB from a background image and button + // highlight image. + void generate_menu_vob(unsigned index, + Glib::RefPtr background, + Glib::RefPtr highlights) const; + + // Create a new title using the given vob_list; return a reference + // to it. The argument will be pilfered (i.e. emptied). + pgc_ref add_title(vob_list & list); - // Temporary file in which the menu VOB should be generated. - // This is created as an empty file and then closed. - boost::shared_ptr vob_temp; + // Use dvdauthor to generate a DVD filesystem. + void generate(const std::string & output_dir) const; +private: + struct menu_entry + { + rectangle area; + pgc_ref target; + }; + + // Menu definition. + struct menu + { // References to the menus and titles that the menu buttons // are meant to link to, in the same order as the buttons. - std::vector entries; + std::vector entries; }; - std::vector menus; - std::vector titles; + temp_dir temp_dir_; + video::frame_params frame_params_; + mpeg_encoder encoder_; + std::vector menus_; + std::vector titles_; }; -// Use dvdauthor to generate a DVD filesystem with the given contents. -void generate_dvd(const dvd_contents & contents, - const std::string & output_dir); - #endif // !INC_GENERATE_DVD_HPP