#include <sstream>
#include <iostream>
#include <boost/algorithm/string.hpp>
+#include <boost/lexical_cast.hpp>
#include "server.h"
#include "util.h"
#include "scaler.h"
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");
+ float subtitle_scale = get_required_float (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));