blob: 5a45c6f2eb153775a0b53167c482d71819091744 [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
Austin Schuh60e77942022-05-16 17:48:24 -07004#include <memory>
5
Parker Schuh44f86922017-01-03 23:59:50 -08006#include "aos/vision/events/epoll_events.h"
Parker Schuh24ee58d2017-03-11 16:13:23 -08007#include "aos/vision/image/camera_params.pb.h"
Parker Schuh44f86922017-01-03 23:59:50 -08008#include "aos/vision/image/reader.h"
9
Stephan Pleinesd99b1ee2024-02-02 20:56:44 -080010namespace aos::vision {
Parker Schuh44f86922017-01-03 23:59:50 -080011
Parker Schuh2cd173d2017-01-28 00:12:01 -080012// Converts a camera reader into a virtual base class that calls ProcessImage
13// on each new image.
Parker Schuh44f86922017-01-03 23:59:50 -080014class ImageStreamEvent : public ::aos::events::EpollEvent {
15 public:
16 static std::unique_ptr<::camera::Reader> GetCamera(
17 const std::string &fname, ImageStreamEvent *obj,
Parker Schuh24ee58d2017-03-11 16:13:23 -080018 aos::vision::CameraParams params) {
Parker Schuh44f86922017-01-03 23:59:50 -080019 using namespace std::placeholders;
20 std::unique_ptr<::camera::Reader> camread(new ::camera::Reader(
Parker Schuh309dd722017-02-25 11:31:18 -080021 fname, std::bind(&ImageStreamEvent::ProcessHelper, obj, _1, _2),
22 params));
Parker Schuh44f86922017-01-03 23:59:50 -080023 camread->StartAsync();
24 return camread;
25 }
26
27 explicit ImageStreamEvent(std::unique_ptr<::camera::Reader> reader)
Parker Schuh2cd173d2017-01-28 00:12:01 -080028 : ::aos::events::EpollEvent(reader->fd()), reader_(std::move(reader)) {}
Parker Schuh44f86922017-01-03 23:59:50 -080029
30 explicit ImageStreamEvent(const std::string &fname,
Parker Schuh24ee58d2017-03-11 16:13:23 -080031 aos::vision::CameraParams params)
Parker Schuh44f86922017-01-03 23:59:50 -080032 : ImageStreamEvent(GetCamera(fname, this, params)) {}
33
Parker Schuh309dd722017-02-25 11:31:18 -080034 virtual void ProcessImage(DataRef data,
35 aos::monotonic_clock::time_point timestamp) = 0;
Parker Schuh44f86922017-01-03 23:59:50 -080036
Parker Schuh2cd173d2017-01-28 00:12:01 -080037 void ReadEvent() override { reader_->HandleFrame(); }
Parker Schuh44f86922017-01-03 23:59:50 -080038
Tyler Chatowfdd7fbf2019-04-13 21:14:05 -070039 bool SetExposure(int abs_exp) { return reader_->SetExposure(abs_exp); }
Alex Perry5b1e8e32019-04-07 13:25:31 -070040
Parker Schuh44f86922017-01-03 23:59:50 -080041 private:
Brian Silverman58899fd2019-03-24 11:03:11 -070042 void ProcessHelper(DataRef data, aos::monotonic_clock::time_point timestamp);
43
Parker Schuh44f86922017-01-03 23:59:50 -080044 std::unique_ptr<::camera::Reader> reader_;
45};
46
Stephan Pleinesd99b1ee2024-02-02 20:56:44 -080047} // namespace aos::vision
Parker Schuh44f86922017-01-03 23:59:50 -080048
Brian Silverman58899fd2019-03-24 11:03:11 -070049#endif // AOS_VISION_IMAGE_IMAGE_STREAM_H_