blob: d03be14a9353aef582e686f46ef39390416a613e [file] [log] [blame]
Parker Schuh2ff1fc22019-02-22 21:33:53 -08001#include "aos/vision/debug/debug_framework.h"
2
3#include <gdk/gdk.h>
4#include <fstream>
5#include <string>
6
7#include "aos/vision/image/camera_params.pb.h"
8#include "aos/vision/image/image_stream.h"
9
10namespace aos {
11namespace vision {
12
13class AveugleImageSource : public ImageSource {
14 public:
15 void Init(const std::string &jpeg_list_filename,
16 DebugFrameworkInterface *interface) override {
17 // TODO: These camera params make this ugly and less generic.
18 image_stream_.reset(new ImageStream(jpeg_list_filename,
19 interface->camera_params(), interface));
20 }
21
22 const char *GetHelpMessage() override {
23 return &R"(
24 format_spec is filename of the camera device.
25 example: jevois:/dev/video1
26 This viewer source will stream video from a jevois camera of your choice.
27)"[1];
28 }
29
30 class ImageStream : public ImageStreamEvent {
31 public:
32 ImageStream(const std::string &fname, aos::vision::CameraParams params,
33 DebugFrameworkInterface *interface)
34 : ImageStreamEvent(fname, params), interface_(interface) {
35 interface_->Loop()->Add(this);
36
37 interface_->InstallKeyPress([this](uint32_t keyval) {
38 // Takes a picture when you press 'a'.
39 // TODO(parker): Allow setting directory.
40 if (keyval == GDK_KEY_a) {
41 std::ofstream ofs(std::string("/tmp/debug_viewer_jpeg_") +
42 std::to_string(i_) + ".yuyv",
43 std::ofstream::out);
44 ofs << prev_data_;
45 ofs.close();
46 ++i_;
47 }
48 });
Alex Perry5b1e8e32019-04-07 13:25:31 -070049 interface_->InstallSetExposure([this](int abs_exp) {
50 this->SetExposure(abs_exp);
51 });
Parker Schuh2ff1fc22019-02-22 21:33:53 -080052 }
53 void ProcessImage(DataRef data, aos::monotonic_clock::time_point) override {
54 prev_data_ = std::string(data);
55 interface_->NewImage({640, 480}, [&](ImagePtr img_data) {
56 for (int y = 0; y < 480; ++y) {
57 for (int x = 0; x < 640; ++x) {
58 uint8_t v = data[y * 640 * 2 + x * 2 + 0];
59 img_data.get_px(x, y) = PixelRef{v, v, v};
60 }
61 }
62 return false;
63 });
64 }
65
66 private:
67 int i_ = 0;
68 std::string prev_data_;
69 DebugFrameworkInterface *interface_;
70 };
71
72 std::unique_ptr<ImageStream> image_stream_;
73};
74
75REGISTER_IMAGE_SOURCE("jevois", AveugleImageSource);
76
77} // namespace vision
78} // namespace aos