xref: /aosp_15_r20/external/intel-media-driver/media_softlet/linux/common/codec/ddi/enc/ddi_encode_functions.h (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1 /*
2 * Copyright (c) 2021, 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     ddi_encode_functions.h
24 //! \brief    ddi encode functions head file
25 //!
26 
27 #ifndef __DDI_ENCODE_FUNCTIONS_H__
28 #define __DDI_ENCODE_FUNCTIONS_H__
29 
30 #include "ddi_media_functions.h"
31 #include "media_libva_caps_next.h"
32 #include "ddi_libva_encoder_specific.h"
33 
34 class DdiEncodeFunctions :public DdiMediaFunctions
35 {
36 public:
37 
~DdiEncodeFunctions()38     virtual ~DdiEncodeFunctions() override{};
39 
40     //!
41     //! \brief    Create a configuration
42     //! \details  It passes in the attribute list that specifies the attributes it
43     //!           cares about, with the rest taking default values.
44     //!
45     //! \param    [in] ctx
46     //!          Pointer to VA driver context
47     //! \param    [in] profile
48     //!           VA profile
49     //! \param    [in] entrypoint
50     //!           VA entrypoint
51     //! \param    [in] attribList
52     //!           Pointer to VAConfigAttrib array that specifies the attributes
53     //! \param    [in] numAttribs
54     //!           Number of VAConfigAttrib in the array attribList
55     //! \param    [out] configId
56     //!           Pointer to returned VAConfigID if success
57     //!
58     //! \return   VAStatus
59     //!           VA_STATUS_SUCCESS if success
60     //!
61     virtual VAStatus CreateConfig(
62         VADriverContextP  ctx,
63         VAProfile         profile,
64         VAEntrypoint      entrypoint,
65         VAConfigAttrib   *attribList,
66         int32_t           numAttribs,
67         VAConfigID       *configId
68     ) override;
69 
70     //!
71     //! \brief  Create context
72     //!
73     //! \param  [in] ctx
74     //!         Pointer to VA driver context
75     //! \param  [in] configId
76     //!         VA config id
77     //! \param  [in] pictureWidth
78     //!         Picture width
79     //! \param  [in] pictureHeight
80     //!         Picture height
81     //! \param  [out] flag
82     //!         Create flag
83     //! \param  [in] renderTargets
84     //!         VA render traget
85     //! \param  [in] renderTargetsNum
86     //!         Number of render targets
87     //! \param  [out] context
88     //!         VA created context
89     //!
90     //! \return VAStatus
91     //!     VA_STATUS_SUCCESS if success, else fail reason
92     //!
93     virtual VAStatus CreateContext (
94         VADriverContextP  ctx,
95         VAConfigID        configId,
96         int32_t           pictureWidth,
97         int32_t           pictureHeight,
98         int32_t           flag,
99         VASurfaceID       *renderTargets,
100         int32_t           renderTargetsNum,
101         VAContextID       *context
102     ) override;
103 
104     //!
105     //! \brief  Destroy context
106     //!
107     //! \param  [in] ctx
108     //!         Pointer to VA driver context
109     //! \param  [in] context
110     //!         VA context to destroy
111     //!
112     //! \return VAStatus
113     //!     VA_STATUS_SUCCESS if success, else fail reason
114     //!
115     virtual VAStatus DestroyContext (
116         VADriverContextP  ctx,
117         VAContextID       context
118     ) override;
119 
120     //!
121     //! \brief  Create buffer
122     //!
123     //! \param  [in] ctx
124     //!         Pointer to VA driver context
125     //! \param  [in] context
126     //!         VA context id
127     //! \param  [in] type
128     //!         VA buffer type
129     //! \param  [in] size
130     //!         Buffer size
131     //! \param  [out] elementsNum
132     //!         Number of elements
133     //! \param  [in] data
134     //!         Buffer data
135     //! \param  [out] bufId
136     //!         VA buffer id
137     //!
138     //! \return VAStatus
139     //!     VA_STATUS_SUCCESS if success, else fail reason
140     //!
141     virtual VAStatus CreateBuffer (
142         VADriverContextP  ctx,
143         VAContextID       context,
144         VABufferType      type,
145         uint32_t          size,
146         uint32_t          elementsNum,
147         void              *data,
148         VABufferID        *bufId
149     ) override;
150 
151     //!
152     //! \brief  Map data store of the buffer into the client's address space
153     //!         vaCreateBuffer() needs to be called with "data" set to nullptr before
154     //!         calling vaMapBuffer()
155     //!
156     //! \param  [in] mediaCtx
157     //!         Pointer to media context
158     //! \param  [in] buf_id
159     //!         VA buffer ID
160     //! \param  [out] pbuf
161     //!         Pointer to buffer
162     //! \param  [in] flag
163     //!         Flag
164     //!
165     //! \return VAStatus
166     //!     VA_STATUS_SUCCESS if success, else fail reason
167     //!
168     virtual VAStatus MapBufferInternal(
169         DDI_MEDIA_CONTEXT   *mediaCtx,
170         VABufferID          buf_id,
171         void                **pbuf,
172         uint32_t            flag
173     ) override;
174 
175     //!
176     //! \brief  Unmap buffer
177     //!
178     //! \param  [in] ctx
179     //!         Pointer to VA driver context
180     //! \param  [in] buf_id
181     //!         VA buffer ID
182     //!
183     //! \return VAStatus
184     //!     VA_STATUS_SUCCESS if success, else fail reason
185     //!
186     virtual VAStatus UnmapBuffer (
187         DDI_MEDIA_CONTEXT   *mediaCtx,
188         VABufferID          buf_id
189     ) override;
190 
191     //!
192     //! \brief  Destroy buffer
193     //!
194     //! \param  [in] mediaCtx
195     //!         Pointer to media context
196     //! \param  [in] buffer_id
197     //!         VA buffer ID
198     //!
199     //! \return     VAStatus
200     //!     VA_STATUS_SUCCESS if success, else fail reason
201     //!
202     virtual VAStatus DestroyBuffer(
203         DDI_MEDIA_CONTEXT  *mediaCtx,
204         VABufferID         buffer_id
205     ) override;
206 
207     //!
208     //! \brief  Get ready to decode a picture to a target surface
209     //!
210     //! \param  [in] ctx
211     //!         Pointer to VA driver context
212     //! \param  [in] context
213     //!         VA context id
214     //! \param  [in] renderTarget
215     //!         VA render target surface
216     //!
217     //! \return VAStatus
218     //!     VA_STATUS_SUCCESS if success, else fail reason
219     //!
220     virtual VAStatus BeginPicture (
221         VADriverContextP  ctx,
222         VAContextID       context,
223         VASurfaceID       renderTarget
224     ) override;
225 
226     //!
227     //! \brief  Send decode buffers to the server
228     //! \details    Buffers are automatically destroyed afterwards
229     //! \param  [in] ctx
230     //!         Pointer to VA driver context
231     //! \param  [in] context
232     //!         VA buffer id
233     //! \param  [in] buffer
234     //!         Pointer to VA buffer id
235     //! \param  [in] buffersNum
236     //!         number of buffers
237     //!
238     //! \return VAStatus
239     //!     VA_STATUS_SUCCESS if success, else fail reason
240     //!
241     virtual VAStatus RenderPicture (
242         VADriverContextP  ctx,
243         VAContextID       context,
244         VABufferID        *buffers,
245         int32_t           buffersNum
246     ) override;
247 
248     //!
249     //! \brief  Make the end of rendering for a picture
250     //! \details    The server should start processing all pending operations for this
251     //!             surface. This call is non-blocking. The client can start another
252     //!             Begin/Render/End sequence on a different render target
253     //! \param  [in] ctx
254     //!         Pointer to VA driver context
255     //! \param  [in] context
256     //!         VA buffer id
257     //!
258     //! \return VAStatus
259     //!     VA_STATUS_SUCCESS if success, else fail reason
260     //!
261     virtual VAStatus EndPicture (
262         VADriverContextP  ctx,
263         VAContextID       context
264     ) override;
265 
266     //!
267     //! \brief  Clean and free encode context structure
268     //!
269     //! \param  [in] encCtx
270     //!     Pointer to ddi encode context
271     //!
272     void CleanUp(encode::PDDI_ENCODE_CONTEXT encCtx);
273 
274     //!
275     //! \brief  Set Encode Gpu Priority
276     //!
277     //! \param  [in] encode context
278     //!     Pointer to encode context
279     //! \param  [in] priority
280     //!     priority
281     //! \return VAStatus
282     //!
283     VAStatus SetGpuPriority(
284         encode::PDDI_ENCODE_CONTEXT encCtx,
285         int32_t             priority
286     );
287 
288     //!
289     //! \brief  Coded buffer exist in status report
290     //!
291     //! \param  [in] encCtx
292     //!     Pointer to ddi encode context
293     //! \param  [in] buf
294     //!     Pointer to ddi media buffer
295     //!
296     //! \return bool
297     //!     true if call success, else false
298     //!
299     bool CodedBufferExistInStatusReport(
300         encode::PDDI_ENCODE_CONTEXT     encCtx,
301         PDDI_MEDIA_BUFFER       buf);
302 
303     //!
304     //! \brief  Status report
305     //!
306     //! \param  [in] encCtx
307     //!     Pointer to ddi encode context
308     //! \param  [in] mediaBuf
309     //!     Ddi media buffer
310     //! \param  [out] buf
311     //!     Pointer buffer
312     //!
313     //! \return VAStatus
314     //!     VA_STATUS_SUCCESS if success, else fail reason
315     //!
316     VAStatus StatusReport (
317         encode::PDDI_ENCODE_CONTEXT encCtx,
318         DDI_MEDIA_BUFFER    *mediaBuf,
319         void                **buf
320     );
321 
322     //!
323     //! \brief  Pre encode buffer exist in status report
324     //!
325     //! \param  [in] encCtx
326     //!     Pointer to ddi encode context
327     //! \param  [in] buf
328     //!     Pointer to ddi media buffer
329     //! \param  [in] typeIdx
330     //!     Ddi encode PRE encode buffer type
331     //!
332     //! \return bool
333     //!     true if call success, else false
334     //!
335     bool PreEncBufferExistInStatusReport(
336         encode::PDDI_ENCODE_CONTEXT            encCtx,
337         PDDI_MEDIA_BUFFER              buf,
338         encode::DDI_ENCODE_PRE_ENC_BUFFER_TYPE typeIdx);
339 
340     //!
341     //! \brief  Pre encode status report
342     //!
343     //! \param  [in] encCtx
344     //!     Pointer to ddi encode context
345     //! \param  [in] mediaBuf
346     //!     Ddi media buffer
347     //! \param  [out] pbuf
348     //!     Pointer buffer
349     //!
350     //! \return VAStatus
351     //!     VA_STATUS_SUCCESS if success, else fail reason
352     //!
353     VAStatus PreEncStatusReport(
354         encode::PDDI_ENCODE_CONTEXT encCtx,
355         DDI_MEDIA_BUFFER* mediaBuf,
356         void** buf);
357 
358     //!
359     //! \brief  Encode buffer exist in status report
360     //!
361     //! \param  [in] encCtx
362     //!     Pointer to ddi encode context
363     //! \param  [in] buf
364     //!     Pointer to ddi media buffer
365     //! \param  [in] typeIdx
366     //!     Ddi encode FEI encode buffer type
367     //!
368     //! \return bool
369     //!     true if call success, else false
370     //!
371     bool EncBufferExistInStatusReport(
372         encode::PDDI_ENCODE_CONTEXT            encCtx,
373         PDDI_MEDIA_BUFFER              buf,
374         encode::DDI_ENCODE_FEI_ENC_BUFFER_TYPE typeIdx);
375 
376     //!
377     //! \brief  Encode status report
378     //!
379     //! \param  [in] encCtx
380     //!     Pointer to ddi encode context
381     //! \param  [in] mediaBuf
382     //!     Ddi media buffer
383     //! \param  [out] pbuf
384     //!     Pointer buffer
385     //!
386     //! \return VAStatus
387     //!     VA_STATUS_SUCCESS if success, else fail reason
388     //!
389     VAStatus EncStatusReport (
390         encode::PDDI_ENCODE_CONTEXT encCtx,
391         DDI_MEDIA_BUFFER    *mediaBuf,
392         void                **pbuf
393     );
394 
395     //!
396     //! \brief  Remove form preencode status report queue
397     //!
398     //! \param  [in] encCtx
399     //!     Pointer to ddi encode context
400     //! \param  [in] buf
401     //!     Pointer to ddi media buffer
402     //! \param  [in] idx
403     //!     Ddi encode PRE encode buffer type
404     //!
405     //! \return VAStatus
406     //!     VA_STATUS_SUCCESS if success, else fail reason
407     //!
408     VAStatus RemoveFromPreEncStatusReportQueue(
409         encode::PDDI_ENCODE_CONTEXT            encCtx,
410         PDDI_MEDIA_BUFFER              buf,
411         encode::DDI_ENCODE_PRE_ENC_BUFFER_TYPE typeIdx);
412 
413     //!
414     //! \brief  Remove form preencode status report queue
415     //!
416     //! \param  [in] encCtx
417     //!     Pointer to ddi encode context
418     //! \param  [in] buf
419     //!     Pointer to ddi media buffer
420     //! \param  [in] idx
421     //!     Ddi encode PRE encode buffer type
422     //!
423     //! \return VAStatus
424     //!     VA_STATUS_SUCCESS if success, else fail reason
425     //!
426     VAStatus RemoveFromEncStatusReportQueue(
427         encode::PDDI_ENCODE_CONTEXT            encCtx,
428         PDDI_MEDIA_BUFFER              buf,
429         encode::DDI_ENCODE_FEI_ENC_BUFFER_TYPE typeIdx);
430 
431 MEDIA_CLASS_DEFINE_END(DdiEncodeFunctions)
432 };
433 
434 #endif //__DDI_ENCODE_FUNCTIONS_H__