diff options
| author | Carl Hetherington <cth@carlh.net> | 2012-09-28 23:09:15 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2012-09-28 23:09:15 +0100 |
| commit | c0ed407fb02891f0dd364e78b6192f0e6dbe1d8d (patch) | |
| tree | cfa1abb09f891f220f15886b4cad2d1562f4a79c /src/tools | |
| parent | d50fe6707c973d4a1397aa40b67ae753744ce748 (diff) | |
| parent | c252cb33a3ca8088fbe091af903a77ad8a098969 (diff) | |
Merge branch 'master' of /home/carl/git/dvdomatic
Diffstat (limited to 'src/tools')
| -rw-r--r-- | src/tools/dvdomatic.cc | 12 | ||||
| -rw-r--r-- | src/tools/servomatic.cc | 194 | ||||
| -rw-r--r-- | src/tools/servomatic_cli.cc | 94 | ||||
| -rw-r--r-- | src/tools/servomatic_gui.cc | 151 | ||||
| -rw-r--r-- | src/tools/servomatictest.cc | 9 | ||||
| -rw-r--r-- | src/tools/wscript | 4 |
6 files changed, 259 insertions, 205 deletions
diff --git a/src/tools/dvdomatic.cc b/src/tools/dvdomatic.cc index df38e9d69..c42321300 100644 --- a/src/tools/dvdomatic.cc +++ b/src/tools/dvdomatic.cc @@ -30,6 +30,7 @@ //#include "gtk/dvd_title_dialog.h" #include "wx/wx_util.h" #include "wx/new_film_dialog.h" +#include "wx/properties_dialog.h" #include "lib/film.h" #include "lib/format.h" #include "lib/config.h" @@ -125,6 +126,7 @@ enum { ID_file_new = 1, ID_file_open, ID_file_save, + ID_file_properties, ID_file_quit, ID_edit_preferences, ID_jobs_make_dcp, @@ -144,6 +146,8 @@ setup_menu (wxMenuBar* m) file->AppendSeparator (); add_item (file, "&Save", ID_file_save, NEEDS_FILM); file->AppendSeparator (); + add_item (file, "&Properties...", ID_file_properties, NEEDS_FILM); + file->AppendSeparator (); add_item (file, "&Quit", ID_file_quit, ALWAYS); wxMenu* edit = new wxMenu; @@ -188,6 +192,7 @@ public: Connect (ID_file_new, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::file_new)); Connect (ID_file_open, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::file_open)); Connect (ID_file_save, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::file_save)); + Connect (ID_file_properties, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::file_properties)); Connect (ID_file_quit, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::file_quit)); Connect (ID_edit_preferences, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::edit_preferences)); Connect (ID_jobs_make_dcp, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::jobs_make_dcp)); @@ -285,6 +290,13 @@ public: { film->write_metadata (); } + + void file_properties (wxCommandEvent &) + { + PropertiesDialog* d = new PropertiesDialog (this, film); + d->ShowModal (); + d->Destroy (); + } void file_quit (wxCommandEvent &) { diff --git a/src/tools/servomatic.cc b/src/tools/servomatic.cc deleted file mode 100644 index a9c45b3df..000000000 --- a/src/tools/servomatic.cc +++ /dev/null @@ -1,194 +0,0 @@ -/* - Copyright (C) 2012 Carl Hetherington <cth@carlh.net> - - 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. - -*/ - -#include <iostream> -#include <stdexcept> -#include <sstream> -#include <cstring> -#include <vector> -#include <unistd.h> -#include <errno.h> -#include <boost/array.hpp> -#include <boost/asio.hpp> -#include <boost/algorithm/string.hpp> -#include <boost/thread.hpp> -#include <boost/thread/mutex.hpp> -#include <boost/thread/condition.hpp> -#include "config.h" -#include "dcp_video_frame.h" -#include "exceptions.h" -#include "util.h" -#include "config.h" -#include "scaler.h" -#include "image.h" -#include "log.h" - -#define BACKLOG 8 - -using namespace std; -using namespace boost; - -static vector<thread *> worker_threads; - -static std::list<shared_ptr<asio::ip::tcp::socket> > queue; -static mutex worker_mutex; -static condition worker_condition; -static Log log_ ("servomatic.log"); - -int -process (shared_ptr<asio::ip::tcp::socket> socket) -{ - SocketReader reader (socket); - - char buffer[128]; - reader.read_indefinite ((uint8_t *) buffer, sizeof (buffer)); - reader.consume (strlen (buffer) + 1); - - stringstream s (buffer); - - string command; - s >> command; - if (command != "encode") { - return -1; - } - - Size in_size; - int pixel_format_int; - Size out_size; - int padding; - string scaler_id; - int frame; - float frames_per_second; - string post_process; - int colour_lut_index; - int j2k_bandwidth; - - s >> in_size.width >> in_size.height - >> pixel_format_int - >> out_size.width >> out_size.height - >> padding - >> scaler_id - >> frame - >> frames_per_second - >> post_process - >> colour_lut_index - >> j2k_bandwidth; - - PixelFormat pixel_format = (PixelFormat) pixel_format_int; - Scaler const * scaler = Scaler::from_id (scaler_id); - if (post_process == "none") { - post_process = ""; - } - - shared_ptr<SimpleImage> image (new SimpleImage (pixel_format, in_size)); - - for (int i = 0; i < image->components(); ++i) { - int line_size; - s >> line_size; - image->set_line_size (i, line_size); - } - - for (int i = 0; i < image->components(); ++i) { - reader.read_definite_and_consume (image->data()[i], image->line_size()[i] * image->lines(i)); - } - -#ifdef DEBUG_HASH - image->hash ("Image for encoding (as received by server)"); -#endif - - DCPVideoFrame dcp_video_frame (image, out_size, padding, scaler, frame, frames_per_second, post_process, colour_lut_index, j2k_bandwidth, &log_); - shared_ptr<EncodedData> encoded = dcp_video_frame.encode_locally (); - encoded->send (socket); - -#ifdef DEBUG_HASH - encoded->hash ("Encoded image (as made by server and as sent back)"); -#endif - - return frame; -} - -void -worker_thread () -{ - while (1) { - mutex::scoped_lock lock (worker_mutex); - while (queue.empty ()) { - worker_condition.wait (lock); - } - - shared_ptr<asio::ip::tcp::socket> socket = queue.front (); - queue.pop_front (); - - lock.unlock (); - - int frame = -1; - - struct timeval start; - gettimeofday (&start, 0); - - try { - frame = process (socket); - } catch (std::exception& e) { - cerr << "Error: " << e.what() << "\n"; - } - - socket.reset (); - - lock.lock (); - - if (frame >= 0) { - struct timeval end; - gettimeofday (&end, 0); - cout << "Encoded frame " << frame << " in " << (seconds (end) - seconds (start)) << "\n"; - } - - worker_condition.notify_all (); - } -} - -int -main () -{ - Scaler::setup_scalers (); - - int const num_threads = Config::instance()->num_local_encoding_threads (); - - for (int i = 0; i < num_threads; ++i) { - worker_threads.push_back (new thread (worker_thread)); - } - - asio::io_service io_service; - asio::ip::tcp::acceptor acceptor (io_service, asio::ip::tcp::endpoint (asio::ip::tcp::v4(), Config::instance()->server_port ())); - while (1) { - shared_ptr<asio::ip::tcp::socket> socket (new asio::ip::tcp::socket (io_service)); - acceptor.accept (*socket); - - mutex::scoped_lock lock (worker_mutex); - - /* Wait until the queue has gone down a bit */ - while (int (queue.size()) >= num_threads * 2) { - worker_condition.wait (lock); - } - - queue.push_back (socket); - worker_condition.notify_all (); - } - - return 0; -} diff --git a/src/tools/servomatic_cli.cc b/src/tools/servomatic_cli.cc new file mode 100644 index 000000000..f8e713193 --- /dev/null +++ b/src/tools/servomatic_cli.cc @@ -0,0 +1,94 @@ +/* + Copyright (C) 2012 Carl Hetherington <cth@carlh.net> + + 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. + +*/ + +#include "lib/server.h" +#include <iostream> +#include <stdexcept> +#include <sstream> +#include <cstring> +#include <vector> +#include <unistd.h> +#include <errno.h> +#include <getopt.h> +#include <boost/array.hpp> +#include <boost/asio.hpp> +#include <boost/algorithm/string.hpp> +#include <boost/thread.hpp> +#include <boost/thread/mutex.hpp> +#include <boost/thread/condition.hpp> +#include "config.h" +#include "dcp_video_frame.h" +#include "exceptions.h" +#include "util.h" +#include "config.h" +#include "scaler.h" +#include "image.h" +#include "log.h" +#include "version.h" + +using namespace std; + +static void +help (string n) +{ + cerr << "Syntax: " << n << " [OPTION]\n" + << " -v, --version show DVD-o-matic version\n" + << " -h, --help show this help\n" + << " -t, --threads number of parallel encoding threads to use\n"; +} + +int +main (int argc, char* argv[]) +{ + int num_threads = Config::instance()->num_local_encoding_threads (); + + int option_index = 0; + while (1) { + static struct option long_options[] = { + { "version", no_argument, 0, 'v'}, + { "help", no_argument, 0, 'h'}, + { "threads", required_argument, 0, 't'}, + { 0, 0, 0, 0 } + }; + + int c = getopt_long (argc, argv, "vht:", long_options, &option_index); + + if (c == -1) { + break; + } + + switch (c) { + case 'v': + cout << "dvdomatic version " << dvdomatic_version << " " << dvdomatic_git_commit << "\n"; + exit (EXIT_SUCCESS); + case 'h': + help (argv[0]); + exit (EXIT_SUCCESS); + case 't': + num_threads = atoi (optarg); + break; + } + } + + Scaler::setup_scalers (); + FileLog log ("servomatic.log"); + Server server (&log); + server.run (num_threads); + return 0; +} diff --git a/src/tools/servomatic_gui.cc b/src/tools/servomatic_gui.cc new file mode 100644 index 000000000..610ba8005 --- /dev/null +++ b/src/tools/servomatic_gui.cc @@ -0,0 +1,151 @@ +/* + Copyright (C) 2012 Carl Hetherington <cth@carlh.net> + + 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. + +*/ + +#include <boost/thread.hpp> +#include <wx/taskbar.h> +#include <wx/icon.h> +#include "wx_util.h" +#include "lib/util.h" +#include "lib/server.h" +#include "lib/config.h" + +using namespace std; +using namespace boost; + +enum { + ID_status = 1, + ID_quit, + ID_timer +}; + +class MemoryLog : public Log +{ +public: + + string get () const { + boost::mutex::scoped_lock (_mutex); + return _log; + } + +private: + void do_log (string m) + { + _log = m; + } + + string _log; +}; + +static MemoryLog memory_log; + +class StatusDialog : public wxDialog +{ +public: + StatusDialog () + : wxDialog (0, wxID_ANY, _("DVD-o-matic encode server"), wxDefaultPosition, wxSize (600, 80), wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) + , _timer (this, ID_timer) + { + _sizer = new wxFlexGridSizer (1, 6, 6); + _sizer->AddGrowableCol (0, 1); + + _text = new wxTextCtrl (this, wxID_ANY, _(""), wxDefaultPosition, wxDefaultSize, wxTE_READONLY); + _sizer->Add (_text, 1, wxEXPAND); + + SetSizer (_sizer); + _sizer->Layout (); + + Connect (ID_timer, wxEVT_TIMER, wxTimerEventHandler (StatusDialog::update)); + _timer.Start (1000); + } + +private: + void update (wxTimerEvent &) + { + _text->ChangeValue (std_to_wx (memory_log.get ())); + _sizer->Layout (); + } + + wxFlexGridSizer* _sizer; + wxTextCtrl* _text; + wxTimer _timer; +}; + +class TaskBarIcon : public wxTaskBarIcon +{ +public: + TaskBarIcon () + { + wxIcon icon (std_to_wx ("taskbar_icon")); + SetIcon (icon, std_to_wx ("DVD-o-matic encode server")); + + Connect (ID_status, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (TaskBarIcon::status)); + Connect (ID_quit, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (TaskBarIcon::quit)); + } + + wxMenu* CreatePopupMenu () + { + wxMenu* menu = new wxMenu; + menu->Append (ID_status, std_to_wx ("Status...")); + menu->Append (ID_quit, std_to_wx ("Quit")); + return menu; + } + +private: + void status (wxCommandEvent &) + { + StatusDialog* d = new StatusDialog; + d->Show (); + } + + void quit (wxCommandEvent &) + { + wxTheApp->ExitMainLoop (); + } +}; + +class App : public wxApp +{ +public: + App () + : wxApp () + , _thread (0) + {} + +private: + + bool OnInit () + { + dvdomatic_setup (); + + new TaskBarIcon; + + _thread = new thread (bind (&App::main_thread, this)); + return true; + } + + void main_thread () + { + Server server (&memory_log); + server.run (Config::instance()->num_local_encoding_threads ()); + } + + boost::thread* _thread; +}; + +IMPLEMENT_APP (App) diff --git a/src/tools/servomatictest.cc b/src/tools/servomatictest.cc index 0f37e73a5..d6804c981 100644 --- a/src/tools/servomatictest.cc +++ b/src/tools/servomatictest.cc @@ -47,12 +47,8 @@ process_video (shared_ptr<Image> image, int frame) shared_ptr<DCPVideoFrame> local (new DCPVideoFrame (image, Size (1024, 1024), 0, Scaler::from_id ("bicubic"), frame, 24, "", 0, 250000000, &log_)); shared_ptr<DCPVideoFrame> remote (new DCPVideoFrame (image, Size (1024, 1024), 0, Scaler::from_id ("bicubic"), frame, 24, "", 0, 250000000, &log_)); -#if defined(DEBUG_HASH) - cout << "Frame " << frame << ":\n"; -#else cout << "Frame " << frame << ": "; cout.flush (); -#endif shared_ptr<EncodedData> local_encoded = local->encode_locally (); shared_ptr<EncodedData> remote_encoded; @@ -64,11 +60,6 @@ process_video (shared_ptr<Image> image, int frame) remote_error = e.what (); } -#if defined(DEBUG_HASH) - cout << "Frame " << frame << ": "; - cout.flush (); -#endif - if (!remote_error.empty ()) { cout << "\033[0;31mnetwork problem: " << remote_error << "\033[0m\n"; return; diff --git a/src/tools/wscript b/src/tools/wscript index be3d44e6d..048bdff07 100644 --- a/src/tools/wscript +++ b/src/tools/wscript @@ -1,5 +1,5 @@ def build(bld): - for t in ['makedcp', 'fixlengths', 'servomatic']: + for t in ['makedcp', 'fixlengths', 'servomatic_cli']: obj = bld(features = 'cxx cxxprogram') obj.uselib = 'BOOST_THREAD' obj.includes = ['..'] @@ -9,7 +9,7 @@ def build(bld): if not bld.env.DISABLE_GUI: # p = ['dvdomatic', 'alignomatic'] - p = ['dvdomatic'] + p = ['dvdomatic', 'servomatic_gui'] if not bld.env.DISABLE_PLAYER: p.append('playomatic') for t in p: |
