blob: 5a1ad21b64ace1e7bb2c14f6742f4dfddc4d9d8c [file] [log] [blame]
Parker Schuh44f86922017-01-03 23:59:50 -08001#ifndef _AOS_VISION_IMAGE_IMAGE_STREAM_H_
2#define _AOS_VISION_IMAGE_IMAGE_STREAM_H_
3
4#include "aos/vision/events/epoll_events.h"
5#include "aos/vision/image/reader.h"
6
7#include <memory>
8
9namespace aos {
10namespace vision {
11
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,
18 camera::CameraParams params) {
19 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,
31 camera::CameraParams params)
32 : ImageStreamEvent(GetCamera(fname, this, params)) {}
33
Parker Schuh2cd173d2017-01-28 00:12:01 -080034 void ProcessHelper(DataRef data, aos::monotonic_clock::time_point timestamp) {
Parker Schuh44f86922017-01-03 23:59:50 -080035 if (data.size() < 300) {
Parker Schuh309dd722017-02-25 11:31:18 -080036 LOG(INFO, "got bad img of size(%d)\n", static_cast<int>(data.size()));
Parker Schuh44f86922017-01-03 23:59:50 -080037 return;
38 }
39 ProcessImage(data, timestamp);
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
46 private:
47 std::unique_ptr<::camera::Reader> reader_;
48};
49
50} // namespace vision
51} // namespace aos
52
53#endif // _AOS_VISION_DEBUG_IMAGE_STREAM_H_