summaryrefslogtreecommitdiff
path: root/src/lib/server.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2012-10-16 01:46:18 +0100
committerCarl Hetherington <cth@carlh.net>2012-10-16 01:46:18 +0100
commit763acf87c7c80d508f6c10af0f3f46045d5c23df (patch)
tree72cf7b3da0f300bbf2f6dfb45e5b53ce3803d368 /src/lib/server.cc
parent5428006e97b37d757a03c14024d7a0fb363bdcc6 (diff)
Try to make client/server communications a little more robust.
Diffstat (limited to 'src/lib/server.cc')
-rw-r--r--src/lib/server.cc59
1 files changed, 22 insertions, 37 deletions
diff --git a/src/lib/server.cc b/src/lib/server.cc
index d40325db0..e8a9804ed 100644
--- a/src/lib/server.cc
+++ b/src/lib/server.cc
@@ -27,6 +27,7 @@
#include <sstream>
#include <iostream>
#include <boost/algorithm/string.hpp>
+#include <boost/lexical_cast.hpp>
#include "server.h"
#include "util.h"
#include "scaler.h"
@@ -73,60 +74,44 @@ Server::Server (Log* log)
int
Server::process (shared_ptr<Socket> socket)
{
- char buffer[256];
+ char buffer[512];
socket->read_indefinite ((uint8_t *) buffer, sizeof (buffer), 30);
socket->consume (strlen (buffer) + 1);
stringstream s (buffer);
+ multimap<string, string> kv = read_key_value (s);
- string command;
- s >> command;
- if (command != "encode") {
+ if (get_required_string (kv, "encode") != "please") {
return -1;
}
- Size in_size;
- int pixel_format_int;
- Size out_size;
- int padding;
- int subtitle_offset;
- int subtitle_scale;
- string scaler_id;
- int frame;
- float frames_per_second;
- string post_process;
- int colour_lut_index;
- int j2k_bandwidth;
- Position subtitle_position;
- Size subtitle_size;
-
- s >> in_size.width >> in_size.height
- >> pixel_format_int
- >> out_size.width >> out_size.height
- >> padding
- >> subtitle_offset
- >> subtitle_scale
- >> scaler_id
- >> frame
- >> frames_per_second
- >> post_process
- >> colour_lut_index
- >> j2k_bandwidth
- >> subtitle_position.x >> subtitle_position.y
- >> subtitle_size.width >> subtitle_size.height;
+ Size in_size (get_required_int (kv, "input_width"), get_required_int (kv, "input_height"));
+ int pixel_format_int = get_required_int (kv, "input_pixel_format");
+ Size out_size (get_required_int (kv, "output_width"), get_required_int (kv, "output_height"));
+ int padding = get_required_int (kv, "padding");
+ int subtitle_offset = get_required_int (kv, "subtitle_offset");
+ int subtitle_scale = get_required_int (kv, "subtitle_scale");
+ string scaler_id = get_required_string (kv, "scaler");
+ int frame = get_required_int (kv, "frame");
+ int frames_per_second = get_required_int (kv, "frames_per_second");
+ string post_process = get_optional_string (kv, "post_process");
+ int colour_lut_index = get_required_int (kv, "colour_lut");
+ int j2k_bandwidth = get_required_int (kv, "j2k_bandwidth");
+ Position subtitle_position (get_optional_int (kv, "subtitle_x"), get_optional_int (kv, "subtitle_y"));
+ Size subtitle_size (get_optional_int (kv, "subtitle_width"), get_optional_int (kv, "subtitle_height"));
+
+ /* This checks that colour_lut_index is within range */
+ colour_lut_index_to_name (colour_lut_index);
PixelFormat pixel_format = (PixelFormat) pixel_format_int;
Scaler const * scaler = Scaler::from_id (scaler_id);
- if (post_process == "none") {
- post_process = "";
- }
shared_ptr<Image> image (new AlignedImage (pixel_format, in_size));
image->read_from_socket (socket);
shared_ptr<Subtitle> sub;
- if (subtitle_position.x != -1) {
+ if (subtitle_size.width && subtitle_size.height) {
shared_ptr<Image> subtitle_image (new AlignedImage (PIX_FMT_RGBA, subtitle_size));
subtitle_image->read_from_socket (socket);
sub.reset (new Subtitle (subtitle_position, subtitle_image));