xref: /openbmc/obmc-ikvm/ikvm_video.hpp (revision 3c110335)
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