blob: faaa57d36f1af19d0fd4f3378c9cc6252d05c59a [file] [log] [blame]
Eddie James21b177e2018-12-11 13:14:46 -06001#pragma once
2
3#include "ikvm_input.hpp"
4
Eddie James90d49582018-12-11 13:22:00 -06005#include <mutex>
Eddie James21b177e2018-12-11 13:14:46 -06006#include <string>
Eddie James90d49582018-12-11 13:22:00 -06007#include <vector>
Eddie James21b177e2018-12-11 13:14:46 -06008
9namespace ikvm
10{
11
12/*
13 * @class Video
14 * @brief Sets up the V4L2 video device and performs read operations
15 */
16class Video
17{
18 public:
19 /*
20 * @brief Constructs Video object
21 *
22 * @param[in] p - Path to the V4L2 video device
23 * @param[in] input - Reference to the Input object
24 * @param[in] fr - desired frame rate of the video
25 */
26 Video(const std::string& p, Input& input, int fr = 30);
27 ~Video();
28 Video(const Video&) = default;
29 Video& operator=(const Video&) = default;
30 Video(Video&&) = default;
31 Video& operator=(Video&&) = default;
32
33 /*
Eddie James90d49582018-12-11 13:22:00 -060034 * @brief Gets the video frame data
35 *
36 * @return Pointer to the video frame data
37 */
38 char* getData();
39 /* @brief Performs read to grab latest video frame */
40 void getFrame();
41 /*
42 * @brief Gets whether or not the video frame needs to be resized
43 *
44 * @return Boolean indicating if the frame needs to be resized
45 */
46 bool needsResize();
47 /* @brief Performs the resize and re-allocates framebuffer */
48 void resize();
49 /* @brief Starts streaming from the video device */
50 void start();
51 /* @brief Stops streaming from the video device */
52 void stop();
Jae Hyun Yoof6ed0e72019-03-15 15:21:51 -070053 /* @brief Restarts streaming from the video device */
54 void restart()
55 {
56 stop();
57 start();
58 }
Eddie James90d49582018-12-11 13:22:00 -060059
60 /*
61 * @brief Gets the desired video frame rate in frames per second
62 *
63 * @return Value of the desired frame rate
64 */
65 inline int getFrameRate() const
66 {
67 return frameRate;
68 }
69 /*
70 * @brief Gets the size of the video frame data
71 *
72 * @return Value of the size of the video frame data in bytes
73 */
74 inline size_t getFrameSize() const
75 {
76 return buffers[lastFrameIndex].payload;
77 }
78 /*
Eddie James21b177e2018-12-11 13:14:46 -060079 * @brief Gets the height of the video frame
80 *
81 * @return Value of the height of video frame in pixels
82 */
83 inline size_t getHeight() const
84 {
85 return height;
86 }
87 /*
88 * @brief Gets the width of the video frame
89 *
90 * @return Value of the width of video frame in pixels
91 */
92 inline size_t getWidth() const
93 {
94 return width;
95 }
96
Eddie James90d49582018-12-11 13:22:00 -060097 /* @brief Number of bits per component of a pixel */
98 static const int bitsPerSample;
99 /* @brief Number of bytes of storage for a pixel */
100 static const int bytesPerPixel;
101 /* @brief Number of components in a pixel (i.e. 3 for RGB pixel) */
102 static const int samplesPerPixel;
103
Eddie James21b177e2018-12-11 13:14:46 -0600104 private:
Eddie James90d49582018-12-11 13:22:00 -0600105 /*
106 * @struct Buffer
107 * @brief Store the address and size of frame data from streaming
108 * operations
109 */
110 struct Buffer
111 {
112 Buffer() : data(nullptr), queued(false), payload(0), size(0)
113 {
114 }
115 ~Buffer() = default;
116 Buffer(const Buffer&) = default;
117 Buffer& operator=(const Buffer&) = default;
118 Buffer(Buffer&&) = default;
119 Buffer& operator=(Buffer&&) = default;
120
121 void* data;
122 bool queued;
123 size_t payload;
124 size_t size;
125 };
126
127 /*
128 * @brief Boolean to indicate whether the resize was triggered during
129 * the open operation
130 */
131 bool resizeAfterOpen;
132 /* @brief File descriptor for the V4L2 video device */
133 int fd;
134 /* @brief Desired frame rate of video stream in frames per second */
135 int frameRate;
136 /* @brief Buffer index for the last video frame */
137 int lastFrameIndex;
Eddie James21b177e2018-12-11 13:14:46 -0600138 /* @brief Height in pixels of the video frame */
139 size_t height;
140 /* @brief Width in pixels of the video frame */
141 size_t width;
142 /* @brief Reference to the Input object */
143 Input& input;
144 /* @brief Path to the V4L2 video device */
145 const std::string path;
Eddie James90d49582018-12-11 13:22:00 -0600146 /* @brief Streaming buffer storage */
147 std::vector<Buffer> buffers;
Eddie James21b177e2018-12-11 13:14:46 -0600148};
149
150} // namespace ikvm