xref: /openbmc/obmc-ikvm/ikvm_video.hpp (revision 8e909b75)
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 */
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      */
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     /*
79      * @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 pixel format  of the video frame
89      *
90      * @return Value of the pixel format of video frame */
91     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      */
100     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      */
109     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      */
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     {
138         Buffer() : data(nullptr), queued(false), payload(0), size(0)
139         {}
140         ~Buffer() = default;
141         Buffer(const Buffer&) = default;
142         Buffer& operator=(const Buffer&) = default;
143         Buffer(Buffer&&) = default;
144         Buffer& operator=(Buffer&&) = default;
145 
146         void* data;
147         bool queued;
148         size_t payload;
149         size_t size;
150     };
151 
152     /*
153      * @brief Boolean to indicate whether the resize was triggered during
154      *        the open operation
155      */
156     bool resizeAfterOpen;
157     /* @brief Indicates whether or not timings query was last sucessful */
158     bool timingsError;
159     /* @brief File descriptor for the V4L2 video device */
160     int fd;
161     /* @brief Desired frame rate of video stream in frames per second */
162     int frameRate;
163     /* @brief Buffer index for the last video frame */
164     int lastFrameIndex;
165     /* @brief Height in pixels of the video frame */
166     size_t height;
167     /* @brief Width in pixels of the video frame */
168     size_t width;
169     /* @brief jpeg's subsampling, 1:420/0:444 */
170     int subSampling;
171     /* @brief Reference to the Input object */
172     Input& input;
173     /* @brief Path to the V4L2 video device */
174     const std::string path;
175     /* @brief Streaming buffer storage */
176     std::vector<Buffer> buffers;
177 
178     /* @brief Pixel Format  */
179     uint32_t pixelformat;
180 };
181 
182 } // namespace ikvm
183