wbcap: support saving to file
diff --git a/utils/wbcap.cpp b/utils/wbcap.cpp
index 38a8cc0..5a94a70 100644
--- a/utils/wbcap.cpp
+++ b/utils/wbcap.cpp
@@ -2,6 +2,7 @@
 #include <poll.h>
 #include <unistd.h>
 #include <algorithm>
+#include <fstream>
 
 #include <kms++/kms++.h>
 #include <kms++util/kms++util.h>
@@ -56,7 +57,7 @@
 		m_capdev.stream_off();
 	}
 
-	void Dequeue()
+	DumbFramebuffer* Dequeue()
 	{
 		auto fb = m_capdev.dequeue();
 
@@ -64,6 +65,8 @@
 		s_wb_fbs.erase(iter);
 
 		s_ready_fbs.insert(s_ready_fbs.begin(), fb);
+
+		return fb;
 	}
 
 	void Queue()
@@ -248,7 +251,10 @@
 		"Options:\n"
 		"  -s, --src=CONN            Source connector\n"
 		"  -d, --dst=CONN            Destination connector\n"
-		"  -f, --format=4CC          Format"
+		"  -m, --smode=MODE          Source connector videomode\n"
+		"  -M, --dmode=MODE          Destination connector videomode\n"
+		"  -f, --format=4CC          Format\n"
+		"  -w, --write               Write captured frames to wbcap.raw file\n"
 		"  -h, --help                Print this help\n"
 		;
 
@@ -259,6 +265,7 @@
 	string dst_conn_name;
 	string dst_mode_name;
 	PixelFormat pixfmt = PixelFormat::XRGB8888;
+	bool write_file = false;
 
 	OptionSet optionset = {
 		Option("s|src=", [&](string s)
@@ -281,6 +288,10 @@
 		{
 			pixfmt = FourCCToPixelFormat(s);
 		}),
+		Option("w|write", [&]()
+		{
+			write_file = true;
+		}),
 		Option("h|help", [&]()
 		{
 			puts(usage_str);
@@ -366,6 +377,13 @@
 	fds[2].fd = card.fd();
 	fds[2].events =  POLLIN;
 
+	uint32_t dst_frame_num = 0;
+
+	const string filename = "wbcap.raw";
+	unique_ptr<ofstream> os;
+	if (write_file)
+		os = unique_ptr<ofstream>(new ofstream(filename, ofstream::binary));
+
 	while (true) {
 		int r = poll(fds.data(), fds.size(), -1);
 		ASSERT(r > 0);
@@ -376,7 +394,17 @@
 		if (fds[1].revents) {
 			fds[1].revents = 0;
 
-			wb.Dequeue();
+			DumbFramebuffer* fb = wb.Dequeue();
+
+			if (write_file) {
+				printf("Writing frame %u to %s\n", dst_frame_num, filename.c_str());
+
+				for (unsigned i = 0; i < fb->num_planes(); ++i)
+					os->write((char*)fb->map(i), fb->size(i));
+
+				dst_frame_num++;
+			}
+
 			wbflipper.queue_next();
 		}