blob: 5eeabfc65fdf94ec46fcd214be87dcfafdec77e0 [file] [log] [blame]
Parker Schuh90641112017-02-25 12:18:36 -08001#include "aos/vision/debug/debug_framework.h"
2
3#include <gdk/gdk.h>
4#include <fstream>
5#include <string>
6
Parker Schuh24ee58d2017-03-11 16:13:23 -08007#include "aos/vision/image/camera_params.pb.h"
Parker Schuh90641112017-02-25 12:18:36 -08008#include "aos/vision/image/image_stream.h"
9
10namespace aos {
11namespace vision {
12
13class CameraImageSource : public ImageSource {
14 public:
15 void Init(const std::string &jpeg_list_filename,
16 DebugFrameworkInterface *interface) override {
Parker Schuhcd258b82017-04-09 16:28:29 -070017 // TODO: These camera params make this ugly and less generic.
18 image_stream_.reset(new ImageStream(jpeg_list_filename,
19 interface->camera_params(), interface));
Parker Schuh90641112017-02-25 12:18:36 -080020 }
21
22 const char *GetHelpMessage() override {
23 return &R"(
24 format_spec is filename of the camera device.
25 example: camera:/dev/video0
Parker Schuhcd258b82017-04-09 16:28:29 -070026 This viewer source will stream video from a usb camera of your choice.
27)"[1];
Parker Schuh90641112017-02-25 12:18:36 -080028 }
29
30 class ImageStream : public ImageStreamEvent {
31 public:
Parker Schuh24ee58d2017-03-11 16:13:23 -080032 ImageStream(const std::string &fname, aos::vision::CameraParams params,
Parker Schuh90641112017-02-25 12:18:36 -080033 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) {
Parker Schuhcd258b82017-04-09 16:28:29 -070041 std::ofstream ofs(std::string("/tmp/debug_viewer_jpeg_") +
42 std::to_string(i_) + ".jpg",
43 std::ofstream::out);
Parker Schuh90641112017-02-25 12:18:36 -080044 ofs << prev_data_;
45 ofs.close();
46 ++i_;
47 }
48 });
49 }
50 void ProcessImage(DataRef data, aos::monotonic_clock::time_point) override {
51 prev_data_ = std::string(data);
52 interface_->NewJpeg(data);
53 }
54
55 private:
56 int i_ = 0;
57 std::string prev_data_;
58 DebugFrameworkInterface *interface_;
59 };
60
61 std::unique_ptr<ImageStream> image_stream_;
62};
63
64REGISTER_IMAGE_SOURCE("camera", CameraImageSource);
65
66} // namespace vision
67} // namespace aos