blob: 797178f1fa22fd8040afaf26da0244232e3c85f2 [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
Stephan Pleinescc500b92024-05-30 10:58:40 -07004#include <chrono>
5#include <functional>
Austin Schuh60e77942022-05-16 17:48:24 -07006#include <memory>
Stephan Pleinescc500b92024-05-30 10:58:40 -07007#include <string>
8#include <string_view>
9#include <utility>
Austin Schuh60e77942022-05-16 17:48:24 -070010
Stephan Pleinescc500b92024-05-30 10:58:40 -070011#include "aos/time/time.h"
Parker Schuh44f86922017-01-03 23:59:50 -080012#include "aos/vision/events/epoll_events.h"
Parker Schuh24ee58d2017-03-11 16:13:23 -080013#include "aos/vision/image/camera_params.pb.h"
Stephan Pleinescc500b92024-05-30 10:58:40 -070014#include "aos/vision/image/image_types.h"
Parker Schuh44f86922017-01-03 23:59:50 -080015#include "aos/vision/image/reader.h"
16
Stephan Pleinesd99b1ee2024-02-02 20:56:44 -080017namespace aos::vision {
Parker Schuh44f86922017-01-03 23:59:50 -080018
Parker Schuh2cd173d2017-01-28 00:12:01 -080019// Converts a camera reader into a virtual base class that calls ProcessImage
20// on each new image.
Parker Schuh44f86922017-01-03 23:59:50 -080021class ImageStreamEvent : public ::aos::events::EpollEvent {
22 public:
23 static std::unique_ptr<::camera::Reader> GetCamera(
24 const std::string &fname, ImageStreamEvent *obj,
Parker Schuh24ee58d2017-03-11 16:13:23 -080025 aos::vision::CameraParams params) {
Parker Schuh44f86922017-01-03 23:59:50 -080026 using namespace std::placeholders;
27 std::unique_ptr<::camera::Reader> camread(new ::camera::Reader(
Parker Schuh309dd722017-02-25 11:31:18 -080028 fname, std::bind(&ImageStreamEvent::ProcessHelper, obj, _1, _2),
29 params));
Parker Schuh44f86922017-01-03 23:59:50 -080030 camread->StartAsync();
31 return camread;
32 }
33
34 explicit ImageStreamEvent(std::unique_ptr<::camera::Reader> reader)
Parker Schuh2cd173d2017-01-28 00:12:01 -080035 : ::aos::events::EpollEvent(reader->fd()), reader_(std::move(reader)) {}
Parker Schuh44f86922017-01-03 23:59:50 -080036
37 explicit ImageStreamEvent(const std::string &fname,
Parker Schuh24ee58d2017-03-11 16:13:23 -080038 aos::vision::CameraParams params)
Parker Schuh44f86922017-01-03 23:59:50 -080039 : ImageStreamEvent(GetCamera(fname, this, params)) {}
40
Parker Schuh309dd722017-02-25 11:31:18 -080041 virtual void ProcessImage(DataRef data,
42 aos::monotonic_clock::time_point timestamp) = 0;
Parker Schuh44f86922017-01-03 23:59:50 -080043
Parker Schuh2cd173d2017-01-28 00:12:01 -080044 void ReadEvent() override { reader_->HandleFrame(); }
Parker Schuh44f86922017-01-03 23:59:50 -080045
Tyler Chatowfdd7fbf2019-04-13 21:14:05 -070046 bool SetExposure(int abs_exp) { return reader_->SetExposure(abs_exp); }
Alex Perry5b1e8e32019-04-07 13:25:31 -070047
Parker Schuh44f86922017-01-03 23:59:50 -080048 private:
Brian Silverman58899fd2019-03-24 11:03:11 -070049 void ProcessHelper(DataRef data, aos::monotonic_clock::time_point timestamp);
50
Parker Schuh44f86922017-01-03 23:59:50 -080051 std::unique_ptr<::camera::Reader> reader_;
52};
53
Stephan Pleinesd99b1ee2024-02-02 20:56:44 -080054} // namespace aos::vision
Parker Schuh44f86922017-01-03 23:59:50 -080055
Brian Silverman58899fd2019-03-24 11:03:11 -070056#endif // AOS_VISION_IMAGE_IMAGE_STREAM_H_