summaryrefslogtreecommitdiff
path: root/include/ast_video_puller.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/ast_video_puller.hpp')
-rw-r--r--include/ast_video_puller.hpp318
1 files changed, 172 insertions, 146 deletions
diff --git a/include/ast_video_puller.hpp b/include/ast_video_puller.hpp
index c2ccea27c3..520fc68e18 100644
--- a/include/ast_video_puller.hpp
+++ b/include/ast_video_puller.hpp
@@ -1,186 +1,212 @@
#pragma once
#include <ast_video_types.hpp>
+#include <boost/asio.hpp>
#include <cassert>
#include <iostream>
#include <mutex>
#include <vector>
-#include <boost/asio.hpp>
-namespace ast_video {
+namespace ast_video
+{
//
// Cursor struct is used in User Mode
//
-struct AstCurAttributionTag {
- unsigned int posX;
- unsigned int posY;
- unsigned int curWidth;
- unsigned int curHeight;
- unsigned int curType; // 0:mono 1:color 2:disappear cursor
- unsigned int curChangeFlag;
+struct AstCurAttributionTag
+{
+ unsigned int posX;
+ unsigned int posY;
+ unsigned int curWidth;
+ unsigned int curHeight;
+ unsigned int curType; // 0:mono 1:color 2:disappear cursor
+ unsigned int curChangeFlag;
};
//
// For storing Cursor Information
//
-struct AstCursorTag {
- AstCurAttributionTag attr;
- // unsigned char icon[MAX_CUR_OFFSETX*MAX_CUR_OFFSETY*2];
- unsigned char *icon; //[64*64*2];
+struct AstCursorTag
+{
+ AstCurAttributionTag attr;
+ // unsigned char icon[MAX_CUR_OFFSETX*MAX_CUR_OFFSETY*2];
+ unsigned char *icon; //[64*64*2];
};
//
// For select image format, i.e. 422 JPG420, 444 JPG444, lumin/chrom table, 0
// ~ 11, low to high
//
-struct FeaturesTag {
- short jpgFmt; // 422:JPG420, 444:JPG444
- short luminTbl;
- short chromTbl;
- short toleranceNoise;
- int w;
- int h;
- unsigned char *buf;
+struct FeaturesTag
+{
+ short jpgFmt; // 422:JPG420, 444:JPG444
+ short luminTbl;
+ short chromTbl;
+ short toleranceNoise;
+ int w;
+ int h;
+ unsigned char *buf;
};
//
// For configure video engine control registers
//
-struct ImageInfo {
- short doImageRefresh; // Action 0:motion 1:fullframe 2:quick cursor
- char qcValid; // quick cursor enable/disable
- unsigned int len;
- int crypttype;
- char cryptkey[16];
- union {
- FeaturesTag features;
- AstCursorTag cursorInfo;
- } parameter;
+struct ImageInfo
+{
+ short doImageRefresh; // Action 0:motion 1:fullframe 2:quick cursor
+ char qcValid; // quick cursor enable/disable
+ unsigned int len;
+ int crypttype;
+ char cryptkey[16];
+ union
+ {
+ FeaturesTag features;
+ AstCursorTag cursorInfo;
+ } parameter;
};
-class SimpleVideoPuller {
- public:
- SimpleVideoPuller() : imageInfo(){};
-
- void initialize() {
- std::cout << "Opening /dev/video\n";
- videoFd = open("/dev/video", O_RDWR);
- if (videoFd == 0) {
- std::cout << "Failed to open /dev/video\n";
- throw std::runtime_error("Failed to open /dev/video");
- }
- std::cout << "Opened successfully\n";
- }
-
- RawVideoBuffer readVideo() {
- assert(videoFd != 0);
- RawVideoBuffer raw;
-
- imageInfo.doImageRefresh = 1; // full frame refresh
- imageInfo.qcValid = 0; // quick cursor disabled
- imageInfo.parameter.features.buf =
- reinterpret_cast<unsigned char *>(raw.buffer.data());
- imageInfo.crypttype = -1;
- std::cout << "Writing\n";
-
- int status;
- /*
- status = write(videoFd, reinterpret_cast<char*>(&imageInfo),
- sizeof(imageInfo));
- if (status != sizeof(imageInfo)) {
- std::cout << "Write failed. Return: " << status << "\n";
- perror("perror output:");
- }
-
- std::cout << "Write done\n";
- */
- std::cout << "Reading\n";
- status =
- read(videoFd, reinterpret_cast<char *>(&imageInfo), sizeof(imageInfo));
- std::cout << "Done reading\n";
-
- if (status != 0) {
- std::cerr << "Read failed with status " << status << "\n";
+class SimpleVideoPuller
+{
+ public:
+ SimpleVideoPuller() : imageInfo(){};
+
+ void initialize()
+ {
+ std::cout << "Opening /dev/video\n";
+ videoFd = open("/dev/video", O_RDWR);
+ if (videoFd == 0)
+ {
+ std::cout << "Failed to open /dev/video\n";
+ throw std::runtime_error("Failed to open /dev/video");
+ }
+ std::cout << "Opened successfully\n";
}
- raw.buffer.resize(imageInfo.len);
-
- raw.height = imageInfo.parameter.features.h;
- raw.width = imageInfo.parameter.features.w;
- if (imageInfo.parameter.features.jpgFmt == 422) {
- raw.mode = YuvMode::YUV420;
- } else {
- raw.mode = YuvMode::YUV444;
+ RawVideoBuffer readVideo()
+ {
+ assert(videoFd != 0);
+ RawVideoBuffer raw;
+
+ imageInfo.doImageRefresh = 1; // full frame refresh
+ imageInfo.qcValid = 0; // quick cursor disabled
+ imageInfo.parameter.features.buf =
+ reinterpret_cast<unsigned char *>(raw.buffer.data());
+ imageInfo.crypttype = -1;
+ std::cout << "Writing\n";
+
+ int status;
+ /*
+ status = write(videoFd, reinterpret_cast<char*>(&imageInfo),
+ sizeof(imageInfo));
+ if (status != sizeof(imageInfo)) {
+ std::cout << "Write failed. Return: " << status << "\n";
+ perror("perror output:");
+ }
+
+ std::cout << "Write done\n";
+ */
+ std::cout << "Reading\n";
+ status = read(videoFd, reinterpret_cast<char *>(&imageInfo),
+ sizeof(imageInfo));
+ std::cout << "Done reading\n";
+
+ if (status != 0)
+ {
+ std::cerr << "Read failed with status " << status << "\n";
+ }
+
+ raw.buffer.resize(imageInfo.len);
+
+ raw.height = imageInfo.parameter.features.h;
+ raw.width = imageInfo.parameter.features.w;
+ if (imageInfo.parameter.features.jpgFmt == 422)
+ {
+ raw.mode = YuvMode::YUV420;
+ }
+ else
+ {
+ raw.mode = YuvMode::YUV444;
+ }
+ return raw;
}
- return raw;
- }
- private:
- int videoFd{};
- ImageInfo imageInfo;
+ private:
+ int videoFd{};
+ ImageInfo imageInfo;
};
#if defined(BOOST_ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
-class AsyncVideoPuller {
- public:
- using video_callback = std::function<void(RawVideoBuffer &)>;
-
- explicit AsyncVideoPuller(boost::asio::io_service &ioService)
- : imageInfo(), devVideo(ioService, open("/dev/video", O_RDWR)) {
- videobuf = std::make_shared<RawVideoBuffer>();
-
- imageInfo.doImageRefresh = 1; // full frame refresh
- imageInfo.qcValid = 0; // quick cursor disabled
- imageInfo.parameter.features.buf =
- reinterpret_cast<unsigned char *>(videobuf->buffer.data());
- imageInfo.crypttype = -1;
- };
-
- void registerCallback(video_callback &callback) {
- std::lock_guard<std::mutex> lock(callbackMutex);
- callbacks.push_back(callback);
- startRead();
- }
-
- void startRead() {
- auto mutableBuffer = boost::asio::buffer(&imageInfo, sizeof(imageInfo));
- boost::asio::async_read(devVideo, mutableBuffer,
- [this](const boost::system::error_code &ec,
- std::size_t bytes_transferred) {
- if (ec) {
- std::cerr << "Read failed with status " << ec
- << "\n";
- } else {
- this->readDone();
- }
- });
- }
-
- void readDone() {
- std::cout << "Done reading\n";
- videobuf->buffer.resize(imageInfo.len);
-
- videobuf->height = imageInfo.parameter.features.h;
- videobuf->width = imageInfo.parameter.features.w;
- if (imageInfo.parameter.features.jpgFmt == 422) {
- videobuf->mode = YuvMode::YUV420;
- } else {
- videobuf->mode = YuvMode::YUV444;
+class AsyncVideoPuller
+{
+ public:
+ using video_callback = std::function<void(RawVideoBuffer &)>;
+
+ explicit AsyncVideoPuller(boost::asio::io_service &ioService) :
+ imageInfo(), devVideo(ioService, open("/dev/video", O_RDWR))
+ {
+ videobuf = std::make_shared<RawVideoBuffer>();
+
+ imageInfo.doImageRefresh = 1; // full frame refresh
+ imageInfo.qcValid = 0; // quick cursor disabled
+ imageInfo.parameter.features.buf =
+ reinterpret_cast<unsigned char *>(videobuf->buffer.data());
+ imageInfo.crypttype = -1;
+ };
+
+ void registerCallback(video_callback &callback)
+ {
+ std::lock_guard<std::mutex> lock(callbackMutex);
+ callbacks.push_back(callback);
+ startRead();
+ }
+
+ void startRead()
+ {
+ auto mutableBuffer = boost::asio::buffer(&imageInfo, sizeof(imageInfo));
+ boost::asio::async_read(devVideo, mutableBuffer,
+ [this](const boost::system::error_code &ec,
+ std::size_t bytes_transferred) {
+ if (ec)
+ {
+ std::cerr << "Read failed with status "
+ << ec << "\n";
+ }
+ else
+ {
+ this->readDone();
+ }
+ });
}
- std::lock_guard<std::mutex> lock(callbackMutex);
- for (auto &callback : callbacks) {
- // TODO(ed) call callbacks async and double buffer frames
- callback(*videobuf);
+
+ void readDone()
+ {
+ std::cout << "Done reading\n";
+ videobuf->buffer.resize(imageInfo.len);
+
+ videobuf->height = imageInfo.parameter.features.h;
+ videobuf->width = imageInfo.parameter.features.w;
+ if (imageInfo.parameter.features.jpgFmt == 422)
+ {
+ videobuf->mode = YuvMode::YUV420;
+ }
+ else
+ {
+ videobuf->mode = YuvMode::YUV444;
+ }
+ std::lock_guard<std::mutex> lock(callbackMutex);
+ for (auto &callback : callbacks)
+ {
+ // TODO(ed) call callbacks async and double buffer frames
+ callback(*videobuf);
+ }
}
- }
-
- private:
- std::shared_ptr<RawVideoBuffer> videobuf;
- boost::asio::posix::stream_descriptor devVideo;
- ImageInfo imageInfo;
- std::mutex callbackMutex;
- std::vector<video_callback> callbacks;
+
+ private:
+ std::shared_ptr<RawVideoBuffer> videobuf;
+ boost::asio::posix::stream_descriptor devVideo;
+ ImageInfo imageInfo;
+ std::mutex callbackMutex;
+ std::vector<video_callback> callbacks;
};
-#endif // defined(BOOST_ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
-} // namespace ast_video
+#endif // defined(BOOST_ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
+} // namespace ast_video