xref: /aosp_15_r20/external/intel-media-driver/media_driver/agnostic/common/cm/cm_vebox_rt.h (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1 /*
2 * Copyright (c) 2017, Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 */
22 //!
23 //! \file      cm_vebox_rt.h
24 //! \brief     Contains CmVeboxRT declarations.
25 //!
26 
27 #ifndef MEDIADRIVER_AGNOSTIC_COMMON_CM_CMVEBOXRT_H_
28 #define MEDIADRIVER_AGNOSTIC_COMMON_CM_CMVEBOXRT_H_
29 
30 #include "cm_vebox.h"
31 #include "cm_hal_vebox.h"
32 
33 namespace CMRT_UMD
34 {
35 class CmDeviceRT;
36 class CmSurface2DRT;
37 class CmVeboxData;
38 
39 //! \brief      CmVebox is the inheritance class of CmVebox_base. All the vebox
40 //!             operation go through this class API.
41 
42 class CmVeboxRT: public CmVebox
43 {
44 public:
45     static int32_t Create(CmDeviceRT *device,
46                           uint32_t index,
47                           CmVeboxRT* &cmVebox);
48 
49     static int32_t Destroy(CmVeboxRT* &cmVebox);
50 
51     //! \brief      Set vebox state
52     //! \details    Pass user defined vebox state to vebox class member
53     //!             m_veboxState
54     //! \param      [in] veboxState
55     //!             CM_VEBOX_STATE
56     //! \returns    CM_SUCCESS
57     CM_RT_API int32_t SetState(CM_VEBOX_STATE &veboxState);
58 
59     //! \brief      Set current frame input surface
60     //! \details    Bind the CM surface to current frame input surface in the vebox class
61     //! \param      [in] surface
62     //!             CmSurface2D
63     //! \retval     CM_SUCCESS if the surface index is less than max index number
64     //! \retval     CM_FAILURE if the surface index is larger or equal to max index
65     //!             number
66     CM_RT_API int32_t SetCurFrameInputSurface(CmSurface2D *surface);
67 
68     //! \brief      Set current frame input surface control bits
69     //! \details    Pass user defined current frame input surface control bits to vebox
70     //!             member, later,the control bit will control memory object state and
71     //!             compression etc
72     //! \param      [in] ctrlBits
73     //!             control bit value
74     //! \retval     CM_SUCCESS if surface index is less than max index number
75     //! \retval     CM_FAILURE if surface index is equal or larger than max index number
76     CM_RT_API int32_t
77     SetCurFrameInputSurfaceControlBits(const uint16_t ctrlBits);
78 
79     //! \brief      Set previous frame input surface
80     //! \details    Bind the CM surface to previous frame input surface in the vebox class
81     //! \param      [in] surface
82     //!             CmSurface2D
83     //! \retval     CM_SUCCESS if the surface index is less than max index number
84     //! \retval     CM_FAILURE if the surface index is larger or equal to max index
85     //!             number
86     CM_RT_API int32_t SetPrevFrameInputSurface(CmSurface2D *surface);
87 
88     //! \brief      Set previous frame input surface control bits
89     //! \details    Pass user defined previous frame input surface control bits to vebox
90     //!             member, durine enqueue, the control bit will pass to vebox command to
91     //!             control memory object state and compression etc
92     //! \param      [in] ctrlBits
93     //!             control bit value
94     //! \retval     CM_SUCCESS if surface index is less than max index number
95     //! \retval     CM_FAILURE if surface index is equal or larger than max index number
96     CM_RT_API int32_t SetPrevFrameInputSurfaceControlBits(
97         const uint16_t ctrlBits);
98 
99     //! \brief      Set STMM frame input surface
100     //! \details    Bind the CM surface to STMM input surface in the vebox class
101     //! \param      [in] surface
102     //!             CmSurface2D
103     //! \retval     CM_SUCCESS if the surface index is less than max index number
104     //! \retval     CM_FAILURE if the surface index is larger or equal to max index
105     //!             number
106     CM_RT_API int32_t SetSTMMInputSurface(CmSurface2D *surface);
107 
108     //! \brief      Set STMM frame input surface control bits
109     //! \details    Pass User defined STMM Input frame surface control bits to vebox member,
110     //!             during enqueue, the control bit will pass to vebox command to control
111     //!             memory object state and compression etc
112     //! \param      [in] ctrlBits
113     //!             control bit value
114     //! \retval     CM_SUCCESS if surface index is less than max index number
115     //! \retval     CM_FAILURE if surface index is equal or larger than max index number
116     CM_RT_API int32_t SetSTMMInputSurfaceControlBits(const uint16_t ctrlBits);
117 
118     //! \brief      Set STMM frame output surface
119     //! \details    Bind the CM surface to STMM output surface in the vebox class
120     //! \param      [in] surface
121     //!             CmSurface2D
122     //! \retval     CM_SUCCESS if the surface index is less than max index number
123     //! \retval     CM_FAILURE if the surface index is larger or equal to max index
124     //!             number
125     CM_RT_API int32_t SetSTMMOutputSurface(CmSurface2D *surface);
126 
127     //! \brief      Set STMM output frame surface control bits
128     //! \details    Pass User defined STMM Output frame surface control bits to vebox member,
129     //!             during enqueue, the control bit will pass to vebox command to control
130     //!             memory object state and compression etc
131     //! \param      [in] ctrlBits
132     //!             control bit value
133     //! \retval     CM_SUCCESS if surface index is less than max index number
134     //! \retval     CM_FAILURE if surface index is equal or larger than max index number
135     CM_RT_API int32_t SetSTMMOutputSurfaceControlBits(const uint16_t ctrlBits);
136 
137     //! \brief      Set Denoised current frame output surface
138     //! \details    Bind the CM surface to denoised current frame output surface in the vebox class
139     //! \param      [in] surface
140     //!             CmSurface2D
141     //! \retval     CM_SUCCESS if the surface index is less than max index number
142     //! \retval     CM_FAILURE if the surface index is larger or equal to max index
143     //!             number
144     CM_RT_API int32_t SetDenoisedCurFrameOutputSurface(CmSurface2D *surface);
145 
146     //! \brief      Set denoised current output frame surface control bits
147     //! \details    Pass user defined  denoised current output frame surface control bits
148     //!             to vebox member, during euqueue, the control bit will pass to vebox
149     //!             command to control memory object state and compression etc
150     //! \param      [in] ctrlBits
151     //!             control bit value
152     //! \retval     CM_SUCCESS if surface index is less than max index number
153     //! \retval     CM_FAILURE if surface index is equal or larger than max index number
154     CM_RT_API int32_t
155     SetDenoisedCurOutputSurfaceControlBits(const uint16_t ctrlBits);
156 
157     //! \brief      set current frame output surface
158     //! \details    Bind the CM surface to current frame output surface in the vebox class
159     //! \param      [in] surface
160     //!             CmSurface2D
161     //! \retval     CM_SUCCESS if the surface index is less than max index number
162     //! \retval     CM_FAILURE if the surface index is larger or equal to max index
163     //!             number
164     CM_RT_API int32_t SetCurFrameOutputSurface(CmSurface2D *surface);
165 
166     //! \brief      Set current frame output surface control bits
167     //! \details    Pass user defined current frame output surface control bits to vebox
168     //!             member, during enqueue, the control bit will pass to vebox command to
169     //!             control memory object state and compression etc
170     //! \param      [in] ctrlBits
171     //!             control bit value
172     //! \retval     CM_SUCCESS if surface index is less than max index number
173     //! \retval     CM_FAILURE if surface index is equal or larger than max index number
174     CM_RT_API int32_t
175     SetCurFrameOutputSurfaceControlBits(const uint16_t ctrlBits);
176 
177     //! \brief      Set previous frame output surface
178     //! \details    Bind the CM surface to previous frame output surface in the vebox class
179     //! \param      [in] surface
180     //!             CmSurface2D
181     //! \retval     CM_SUCCESS if the surface index is less than max index number
182     //! \retval     CM_FAILURE if the surface index is larger or equal to max index
183     //!             number
184     CM_RT_API int32_t SetPrevFrameOutputSurface(CmSurface2D *surface);
185 
186     //! \brief      Set previous frame output surface control bits
187     //! \details    Pass user defined previous frame output surface control bits to vebox
188     //!             member, during enqueue, the control bit will pass to vebox command to
189     //!             control memory object state and compression etc
190     //! \param      [in] ctrlBits
191     //!             control bit value
192     //! \retval     CM_SUCCESS if surface index is less than max index number
193     //! \retval     CM_FAILURE if surface index is equal or larger than max index number
194     CM_RT_API int32_t
195     SetPrevFrameOutputSurfaceControlBits(const uint16_t ctrlBits);
196 
197     //! \brief      Set statistics output surface
198     //! \details    Bind the CM surface to statistics output surface in the vebox class
199     //! \param      [in] surface
200     //!             CmSurface2D
201     //! \retval     CM_SUCCESS if the surface index is less than max index number
202     //! \retval     CM_FAILURE if the surface index is larger or equal to max index
203     //!             number
204     CM_RT_API int32_t SetStatisticsOutputSurface(CmSurface2D *surface);
205 
206     //! \brief      Set statistics output surface control bits
207     //! \details    Pass user defined statistics output surface control bits to vebox
208     //!             member, during euqueue, the control bit will pass to vebox command
209     //!             to control memory object state and compression etc
210     //! \param      [in] ctrlBits
211     //!             control bit value
212     //! \retval     CM_SUCCESS if surface index is less than max index number
213     //! \retval     CM_FAILURE if surface index is equal or larger than max index number
214     CM_RT_API int32_t
215     SetStatisticsOutputSurfaceControlBits(const uint16_t ctrlBits);
216 
217     //! \brief      Set vebox parameter.
218     //! \details    Pass pointer of the parameter buffer to vebox class member
219     //!             m_paramBuffer. Later on, during the enqueue stage, the
220     //!             parameter in the buffer will be bonded to the VEBOX command for
221     //!             processing.
222     //! \param      [in] paramBuffer
223     //!             CmBufferUP which contains all the vebox parameter.
224     //! \returns    CM_SUCCESS.
225     CM_RT_API int32_t SetParam(CmBufferUP *paramBuffer);
226 
227     int32_t GetSurface(uint32_t surfUsage, CmSurface2DRT *&surface);
228 
229     virtual uint32_t GetIndexInVeboxArray();
230 
231     CM_VEBOX_STATE GetState();
232 
233     CmBufferUP *GetParam();
234 
235     uint16_t GetSurfaceControlBits(uint32_t usage);
236 
237 protected:
238     CmVeboxRT(CmDeviceRT *device, uint32_t index);
239 
240     ~CmVeboxRT();
241 
242     int32_t Initialize();
243 
244     int32_t SetSurfaceInternal(VEBOX_SURF_USAGE surfUsage, CmSurface2D *surface);
245 
246     int32_t SetSurfaceControlBitsInternal(VEBOX_SURF_USAGE surfUsage,
247                                           const uint16_t ctrlBits);
248 
249     CmDeviceRT *m_device;
250     uint32_t m_maxSurfaceIndex;
251     CM_VEBOX_STATE m_veboxState;
252     CmBufferUP *m_paramBuffer;
253     CmSurface2DRT *m_surface2D[VEBOX_MAX_SURFACE_COUNT];
254     uint16_t m_surfaceCtrlBits[VEBOX_MAX_SURFACE_COUNT];
255     uint32_t m_indexInVeboxArray;
256 
257 private:
258     CmVeboxRT(const CmVeboxRT& other);
259     CmVeboxRT& operator=(const CmVeboxRT& other);
260 };
261 };  //namespace
262 
263 #endif  // #ifndef MEDIADRIVER_AGNOSTIC_COMMON_CM_CMVEBOXRT_H_
264