diff options
Diffstat (limited to 'utils')
| -rw-r--r-- | utils/wbm2m.cpp | 32 | 
1 files changed, 31 insertions, 1 deletions
diff --git a/utils/wbm2m.cpp b/utils/wbm2m.cpp index e08ffb1..b69bb28 100644 --- a/utils/wbm2m.cpp +++ b/utils/wbm2m.cpp @@ -2,6 +2,7 @@  #include <poll.h>  #include <unistd.h>  #include <algorithm> +#include <regex>  #include <fstream>  #include <map>  #include <system_error> @@ -19,7 +20,8 @@ using namespace kms;  static const char* usage_str =  		"Usage: wbm2m [OPTIONS]\n\n"  		"Options:\n" -		"  -f, --format=4CC          Output format" +		"  -f, --format=4CC          Output format\n" +		"  -c, --crop=CROP           CROP is <x>,<y>-<w>x<h>\n"  		"  -h, --help                Print this help\n"  		; @@ -45,6 +47,21 @@ static void read_frame(DumbFramebuffer* fb, unsigned frame_num)  	s_bar_pos_map[fb] = pos;  } +static void parse_crop(const string& crop_str, uint32_t& c_left, uint32_t& c_top, +		       uint32_t& c_width, uint32_t& c_height) +{ +	const regex crop_re("(\\d+),(\\d+)-(\\d+)x(\\d+)");		// 400,400-400x400 + +	smatch sm; +	if (!regex_match(crop_str, sm, crop_re)) +		EXIT("Failed to parse crop option '%s'", crop_str.c_str()); + +	c_left = stoul(sm[1]); +	c_top = stoul(sm[2]); +	c_width = stoul(sm[3]); +	c_height = stoul(sm[4]); +} +  int main(int argc, char** argv)  {  	// XXX get from args @@ -55,13 +72,21 @@ int main(int argc, char** argv)  	const uint32_t dst_width = 800;  	const uint32_t dst_height = 480; +	uint32_t c_top, c_left, c_width, c_height; +  	auto dst_fmt = PixelFormat::XRGB8888; +	bool use_selection = false;  	OptionSet optionset = {  		Option("f|format=", [&](string s)  		{  			dst_fmt = FourCCToPixelFormat(s);  		}), +		Option("c|crop=", [&](string s) +		{ +			parse_crop(s, c_left, c_top, c_width, c_height); +			use_selection = true; +		}),  		Option("h|help", [&]()  		{  			puts(usage_str); @@ -92,6 +117,11 @@ int main(int argc, char** argv)  	out->set_format(src_fmt, src_width, src_height);  	in->set_format(dst_fmt, dst_width, dst_height); +	if (use_selection) { +		out->set_selection(c_left, c_top, c_width, c_height); +		printf("crop -> %u,%u-%ux%u\n", c_left, c_top, c_width, c_height); +	} +  	out->set_queue_size(NUM_SRC_BUFS);  	in->set_queue_size(NUM_DST_BUFS);  | 
