1 #pragma once 2 3 #include "ikvm_input.hpp" 4 5 #include <mutex> 6 #include <string> 7 #include <vector> 8 9 namespace ikvm 10 { 11 12 /* 13 * @class Video 14 * @brief Sets up the V4L2 video device and performs read operations 15 */ 16 class 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, int sub = 0); 27 ~Video(); 28 Video(const Video&) = default; 29 Video& operator=(const Video&) = default; 30 Video(Video&&) = default; 31 Video& operator=(Video&&) = default; 32 33 /* 34 * @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(); 53 /* @brief Restarts streaming from the video device */ restart()54 void restart() 55 { 56 stop(); 57 start(); 58 } 59 60 /* 61 * @brief Gets the desired video frame rate in frames per second 62 * 63 * @return Value of the desired frame rate 64 */ getFrameRate() const65 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 */ getFrameSize() const74 inline size_t getFrameSize() const 75 { 76 return buffers[lastFrameIndex].payload; 77 } 78 /* 79 * @brief Gets the height of the video frame 80 * 81 * @return Value of the height of video frame in pixels 82 */ getHeight() const83 inline size_t getHeight() const 84 { 85 return height; 86 } 87 /* 88 * @brief Gets the pixel format of the video frame 89 * 90 * @return Value of the pixel format of video frame */ getPixelformat() const91 inline uint32_t getPixelformat() const 92 { 93 return pixelformat; 94 } 95 /* 96 * @brief Gets the width of the video frame 97 * 98 * @return Value of the width of video frame in pixels 99 */ getWidth() const100 inline size_t getWidth() const 101 { 102 return width; 103 } 104 /* 105 * @brief Gets the subsampling of the video frame 106 * 107 * @return Value of the subsampling of video frame, 1:420/0:444 108 */ getSubsampling() const109 inline int getSubsampling() const 110 { 111 return subSampling; 112 } 113 /* 114 * @brief Sets the subsampling of the video frame 115 * 116 * @return Value of the subsampling of video frame, 1:420/0:444 117 */ setSubsampling(int _sub)118 inline void setSubsampling(int _sub) 119 { 120 subSampling = _sub; 121 } 122 123 /* @brief Number of bits per component of a pixel */ 124 static const int bitsPerSample; 125 /* @brief Number of bytes of storage for a pixel */ 126 static const int bytesPerPixel; 127 /* @brief Number of components in a pixel (i.e. 3 for RGB pixel) */ 128 static const int samplesPerPixel; 129 130 private: 131 /* 132 * @struct Buffer 133 * @brief Store the address and size of frame data from streaming 134 * operations 135 */ 136 struct Buffer 137 { Bufferikvm::Video::Buffer138 Buffer() : data(nullptr), queued(false), payload(0), size(0) {} 139 ~Buffer() = default; 140 Buffer(const Buffer&) = default; 141 Buffer& operator=(const Buffer&) = default; 142 Buffer(Buffer&&) = default; 143 Buffer& operator=(Buffer&&) = default; 144 145 void* data; 146 bool queued; 147 size_t payload; 148 size_t size; 149 }; 150 151 /* 152 * @brief Boolean to indicate whether the resize was triggered during 153 * the open operation 154 */ 155 bool resizeAfterOpen; 156 /* @brief Indicates whether or not timings query was last sucessful */ 157 bool timingsError; 158 /* @brief File descriptor for the V4L2 video device */ 159 int fd; 160 /* @brief Desired frame rate of video stream in frames per second */ 161 int frameRate; 162 /* @brief Buffer index for the last video frame */ 163 int lastFrameIndex; 164 /* @brief Height in pixels of the video frame */ 165 size_t height; 166 /* @brief Width in pixels of the video frame */ 167 size_t width; 168 /* @brief jpeg's subsampling, 1:420/0:444 */ 169 int subSampling; 170 /* @brief Reference to the Input object */ 171 Input& input; 172 /* @brief Path to the V4L2 video device */ 173 const std::string path; 174 /* @brief Streaming buffer storage */ 175 std::vector<Buffer> buffers; 176 177 /* @brief Pixel Format */ 178 uint32_t pixelformat; 179 }; 180 181 } // namespace ikvm 182