blob: 8aab97d4058a281e418ddf906759371ee114e768 [file] [log] [blame]
Brian Silverman58899fd2019-03-24 11:03:11 -07001#ifndef AOS_VISION_IMAGE_IMAGE_STREAM_H_
2#define AOS_VISION_IMAGE_IMAGE_STREAM_H_
Parker Schuh44f86922017-01-03 23:59:50 -08003
4#include "aos/vision/events/epoll_events.h"
Parker Schuh24ee58d2017-03-11 16:13:23 -08005#include "aos/vision/image/camera_params.pb.h"
Parker Schuh44f86922017-01-03 23:59:50 -08006#include "aos/vision/image/reader.h"
7
8#include <memory>
9
10namespace aos {
11namespace vision {
12
Parker Schuh2cd173d2017-01-28 00:12:01 -080013// Converts a camera reader into a virtual base class that calls ProcessImage
14// on each new image.
Parker Schuh44f86922017-01-03 23:59:50 -080015class ImageStreamEvent : public ::aos::events::EpollEvent {
16 public:
17 static std::unique_ptr<::camera::Reader> GetCamera(
18 const std::string &fname, ImageStreamEvent *obj,
Parker Schuh24ee58d2017-03-11 16:13:23 -080019 aos::vision::CameraParams params) {
Parker Schuh44f86922017-01-03 23:59:50 -080020 using namespace std::placeholders;
21 std::unique_ptr<::camera::Reader> camread(new ::camera::Reader(
Parker Schuh309dd722017-02-25 11:31:18 -080022 fname, std::bind(&ImageStreamEvent::ProcessHelper, obj, _1, _2),
23 params));
Parker Schuh44f86922017-01-03 23:59:50 -080024 camread->StartAsync();
25 return camread;
26 }
27
28 explicit ImageStreamEvent(std::unique_ptr<::camera::Reader> reader)
Parker Schuh2cd173d2017-01-28 00:12:01 -080029 : ::aos::events::EpollEvent(reader->fd()), reader_(std::move(reader)) {}
Parker Schuh44f86922017-01-03 23:59:50 -080030
31 explicit ImageStreamEvent(const std::string &fname,
Parker Schuh24ee58d2017-03-11 16:13:23 -080032 aos::vision::CameraParams params)
Parker Schuh44f86922017-01-03 23:59:50 -080033 : ImageStreamEvent(GetCamera(fname, this, params)) {}
34
Parker Schuh309dd722017-02-25 11:31:18 -080035 virtual void ProcessImage(DataRef data,
36 aos::monotonic_clock::time_point timestamp) = 0;
Parker Schuh44f86922017-01-03 23:59:50 -080037
Parker Schuh2cd173d2017-01-28 00:12:01 -080038 void ReadEvent() override { reader_->HandleFrame(); }
Parker Schuh44f86922017-01-03 23:59:50 -080039
Alex Perry5b1e8e32019-04-07 13:25:31 -070040 bool SetExposure(int abs_exp) {
41 return reader_->SetCameraControl(V4L2_CID_EXPOSURE_ABSOLUTE,
42 "V4L2_CID_EXPOSURE_ABSOLUTE", abs_exp);
43 }
44
Parker Schuh44f86922017-01-03 23:59:50 -080045 private:
Brian Silverman58899fd2019-03-24 11:03:11 -070046 void ProcessHelper(DataRef data, aos::monotonic_clock::time_point timestamp);
47
Parker Schuh44f86922017-01-03 23:59:50 -080048 std::unique_ptr<::camera::Reader> reader_;
49};
50
51} // namespace vision
52} // namespace aos
53
Brian Silverman58899fd2019-03-24 11:03:11 -070054#endif // AOS_VISION_IMAGE_IMAGE_STREAM_H_