Adding 'jevois:' source to debug viewer.

Change-Id: I866134558bc2ac38e3665e5bad7aa6d1866806e3
diff --git a/aos/vision/debug/aveugle-source.cc b/aos/vision/debug/aveugle-source.cc
new file mode 100644
index 0000000..cbe3d0a
--- /dev/null
+++ b/aos/vision/debug/aveugle-source.cc
@@ -0,0 +1,75 @@
+#include "aos/vision/debug/debug_framework.h"
+
+#include <gdk/gdk.h>
+#include <fstream>
+#include <string>
+
+#include "aos/vision/image/camera_params.pb.h"
+#include "aos/vision/image/image_stream.h"
+
+namespace aos {
+namespace vision {
+
+class AveugleImageSource : public ImageSource {
+ public:
+  void Init(const std::string &jpeg_list_filename,
+            DebugFrameworkInterface *interface) override {
+    // TODO: These camera params make this ugly and less generic.
+    image_stream_.reset(new ImageStream(jpeg_list_filename,
+                                        interface->camera_params(), interface));
+  }
+
+  const char *GetHelpMessage() override {
+    return &R"(
+    format_spec is filename of the camera device.
+    example: jevois:/dev/video1
+    This viewer source will stream video from a jevois camera of your choice.
+)"[1];
+  }
+
+  class ImageStream : public ImageStreamEvent {
+   public:
+    ImageStream(const std::string &fname, aos::vision::CameraParams params,
+                DebugFrameworkInterface *interface)
+        : ImageStreamEvent(fname, params), interface_(interface) {
+      interface_->Loop()->Add(this);
+
+      interface_->InstallKeyPress([this](uint32_t keyval) {
+        // Takes a picture when you press 'a'.
+        // TODO(parker): Allow setting directory.
+        if (keyval == GDK_KEY_a) {
+          std::ofstream ofs(std::string("/tmp/debug_viewer_jpeg_") +
+                                std::to_string(i_) + ".yuyv",
+                            std::ofstream::out);
+          ofs << prev_data_;
+          ofs.close();
+          ++i_;
+        }
+      });
+    }
+    void ProcessImage(DataRef data, aos::monotonic_clock::time_point) override {
+      prev_data_ = std::string(data);
+      interface_->NewImage({640, 480}, [&](ImagePtr img_data) {
+        for (int y = 0; y < 480; ++y) {
+          for (int x = 0; x < 640; ++x) {
+            uint8_t v = data[y * 640 * 2 + x * 2 + 0];
+            img_data.get_px(x, y) = PixelRef{v, v, v};
+          }
+        }
+        return false;
+      });
+    }
+
+   private:
+    int i_ = 0;
+    std::string prev_data_;
+    DebugFrameworkInterface *interface_;
+  };
+
+  std::unique_ptr<ImageStream> image_stream_;
+};
+
+REGISTER_IMAGE_SOURCE("jevois", AveugleImageSource);
+
+}  // namespace vision
+}  // namespace aos