xref: /aosp_15_r20/external/intel-media-driver/media_softlet/linux/common/ddi/media_libva_util_next.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     media_libva_util_next.h
24 //! \brief    libva(and its extension) utility head file
25 //!
26 
27 #ifndef __MEDIA_LIBVA_UTIL_NEXT_H__
28 #define __MEDIA_LIBVA_UTIL_NEXT_H__
29 
30 #include "media_libva_common_next.h"
31 #include "vp_common.h"
32 
33 #ifdef ANDROID
34 #define DDI_FUNC_ENTER            UMD_ATRACE_BEGIN(__FUNCTION__)
35 #define DDI_FUNCTION_EXIT(status)       UMD_ATRACE_END
36 #else
37 #define DDI_FUNC_ENTER                                                      \
38     MOS_FUNCTION_TRACE(MOS_COMPONENT_DDI, MOS_SUBCOMP_SELF)
39 #define DDI_FUNCTION_EXIT(status)                                               \
40     MOS_FUNCTION_EXIT(MOS_COMPONENT_DDI, MOS_DDI_SUBCOMP_SELF, status)
41 #endif
42 
43 #define DDI_CODEC_FUNC_ENTER                                                \
44     MOS_FUNCTION_TRACE(MOS_COMPONENT_DDI, MOS_SUBCOMP_CODEC)
45 
46 #define DDI_VP_FUNC_ENTER                                                   \
47     MOS_FUNCTION_TRACE(MOS_COMPONENT_DDI, MOS_SUBCOMP_VP)
48 
49 #define DDI_CP_FUNC_ENTER                                                   \
50     MOS_FUNCTION_TRACE(MOS_COMPONENT_DDI, MOS_SUBCOMP_CP)
51 
52 #define DDI_ASSERT(_expr)                                                   \
53     MOS_ASSERT(MOS_COMPONENT_DDI, MOS_DDI_SUBCOMP_SELF, _expr)
54 
55 #define DDI_ASSERTMESSAGE(_message, ...)                                    \
56     MOS_ASSERTMESSAGE(MOS_COMPONENT_DDI, MOS_DDI_SUBCOMP_SELF, _message, ##__VA_ARGS__)
57 
58 #define DDI_NORMALMESSAGE(_message, ...)                                    \
59     MOS_NORMALMESSAGE(MOS_COMPONENT_DDI, MOS_DDI_SUBCOMP_SELF, _message, ##__VA_ARGS__)
60 
61 #define DDI_VERBOSEMESSAGE(_message, ...)                                   \
62     MOS_VERBOSEMESSAGE(MOS_COMPONENT_DDI, MOS_DDI_SUBCOMP_SELF, _message, ##__VA_ARGS__)
63 
64 #define DDI_CODEC_ASSERTMESSAGE(_message, ...)                              \
65     MOS_ASSERTMESSAGE(MOS_COMPONENT_DDI, MOS_SUBCOMP_CODEC, _message, ##__VA_ARGS__)
66 
67 #define DDI_CODEC_NORMALMESSAGE(_message, ...)                              \
68     MOS_NORMALMESSAGE(MOS_COMPONENT_DDI, MOS_SUBCOMP_CODEC, _message, ##__VA_ARGS__)
69 
70 #define DDI_CODEC_VERBOSEMESSAGE(_message, ...)                             \
71     MOS_VERBOSEMESSAGE(MOS_COMPONENT_DDI, MOS_SUBCOMP_CODEC, _message, ##__VA_ARGS__)
72 
73 #define DDI_VP_ASSERTMESSAGE(_message, ...)                                 \
74     MOS_ASSERTMESSAGE(MOS_COMPONENT_DDI, MOS_SUBCOMP_VP, _message, ##__VA_ARGS__)
75 
76 #define DDI_VP_NORMALMESSAGE(_message, ...)                                 \
77     MOS_NORMALMESSAGE(MOS_COMPONENT_DDI, MOS_SUBCOMP_VP, _message, ##__VA_ARGS__)
78 
79 #define DDI_VP_VERBOSEMESSAGE(_message, ...)                                \
80     MOS_VERBOSEMESSAGE(MOS_COMPONENT_DDI, MOS_SUBCOMP_VP, _message, ##__VA_ARGS__)
81 
82 #define DDI_CP_ASSERTMESSAGE(_message, ...)                                 \
83     MOS_ASSERTMESSAGE(MOS_COMPONENT_DDI, MOS_SUBCOMP_CP, _message, ##__VA_ARGS__)
84 
85 #define DDI_CP_NORMALMESSAGE(_message, ...)                                 \
86     MOS_NORMALMESSAGE(MOS_COMPONENT_DDI, MOS_SUBCOMP_CP, _message, ##__VA_ARGS__)
87 
88 #define DDI_CP_VERBOSEMESSAGE(_message, ...)                                \
89     MOS_VERBOSEMESSAGE(MOS_COMPONENT_DDI, MOS_SUBCOMP_CP, _message, ##__VA_ARGS__)
90 
91 // Check the return value of function.
92 // If failed,  print the error message and return,
93 // do nothing otherwise.
94 #define DDI_CHK_RET(_ret, _str)                                           \
95 {                                                                             \
96     VAStatus tmpRet = _ret;                                                   \
97     if (VA_STATUS_SUCCESS != tmpRet) {                                        \
98         DDI_ASSERTMESSAGE("%s [%d].", _str, tmpRet);                        \
99         return tmpRet;                                                        \
100     }                                                                         \
101 }
102 
103 #define DDI_CODEC_CHK_RET(_ret, _str)                      \
104 {                                                                             \
105     VAStatus tmpRet = _ret;                                                   \
106     if (VA_STATUS_SUCCESS != tmpRet) {                                        \
107         DDI_CODEC_ASSERTMESSAGE("%s [%d].", _str, tmpRet);                        \
108         return tmpRet;                                                        \
109     }                                                                         \
110 }
111 
112 #define DDI_VP_CHK_RET(_ret, _str)                         \
113 {                                                                             \
114     VAStatus tmpRet = _ret;                                                   \
115     if (VA_STATUS_SUCCESS != tmpRet) {                                        \
116         DDI_VP_ASSERTMESSAGE("%s [%d].", _str, tmpRet);                        \
117         return tmpRet;                                                        \
118     }                                                                         \
119 }
120 
121 #define DDI_CP_CHK_RET(_ret, _str)                         \
122 {                                                                             \
123     VAStatus tmpRet = _ret;                                                   \
124     if (VA_STATUS_SUCCESS != tmpRet) {                                        \
125         DDI_CP_ASSERTMESSAGE("%s [%d].", _str, tmpRet);                        \
126         return tmpRet;                                                        \
127     }                                                                         \
128 }
129 
130 // Check the return status of parse function in renderPicture
131 // If failed, assign new status and break
132 // do nothing otherwise.
133 #define DDI_CHK_STATUS(_ret, _newret)                                       \
134 {                                                                             \
135     if (VA_STATUS_SUCCESS != _ret) {                                          \
136         vaStatus = _newret;                                                   \
137         break;                                                                \
138     }                                                                         \
139 }
140 
141 // Check the condition, if true, print the error message
142 // and return the specified value, do nothing otherwise.
143 #define DDI_CHK_CONDITION(condition, _str, _ret)                            \
144     if (condition) {                                                        \
145         DDI_ASSERTMESSAGE(_str);                                            \
146         return _ret;                                                        \
147     }
148 
149 #define DDI_CODEC_CHK_CONDITION(condition, _str, _ret)                      \
150     if (condition) {                                                        \
151         DDI_CODEC_ASSERTMESSAGE(_str);                                      \
152         return _ret;                                                        \
153     }
154 
155 #define DDI_VP_CHK_CONDITION(condition, _str, _ret)                         \
156     if (condition) {                                                        \
157         DDI_VP_ASSERTMESSAGE(_str);                                         \
158         return _ret;                                                        \
159     }
160 
161 #define DDI_CP_CHK_CONDITION(condition, _str, _ret)                         \
162     if (condition) {                                                        \
163         DDI_CP_ASSERTMESSAGE(_str);                                         \
164         return _ret;                                                        \
165     }
166 
167 // If pointer is nullptr, print the error message and return the specified value.
168 #define DDI_CHK_NULL(_ptr, _str, _ret)                                      \
169     DDI_CHK_CONDITION((nullptr == (_ptr)), _str, _ret)
170 #define DDI_CODEC_CHK_NULL(_ptr, _str, _ret)                                \
171     DDI_CODEC_CHK_CONDITION((nullptr == (_ptr)), _str, _ret)
172 #define DDI_VP_CHK_NULL(_ptr, _str, _ret)                                   \
173     DDI_VP_CHK_CONDITION((nullptr == (_ptr)), _str, _ret)
174 #define DDI_CP_CHK_NULL(_ptr, _str, _ret)                                   \
175     DDI_CP_CHK_CONDITION((nullptr == (_ptr)), _str, _ret)
176 
177 #define DDI_CHK_LARGER(p, bottom, str, ret)                                 \
178     DDI_CHK_CONDITION((p <= bottom),str,ret)
179 #define DDI_CODEC_CHK_LARGER(p, bottom, str, ret)                           \
180     DDI_CODEC_CHK_CONDITION((p <= bottom),str,ret)
181 #define DDI_VP_CHK_LARGER(p, bottom, str, ret)                              \
182     DDI_VP_CHK_CONDITION((p <= bottom),str,ret)
183 #define DDI_CP_CHK_LARGER(p, bottom, str, ret)                              \
184     DDI_CP_CHK_CONDITION((p <= bottom),str,ret)
185 
186 #define DDI_CHK_LESS(p, upper, str, ret)                                    \
187     DDI_CHK_CONDITION((p >= upper),str,ret)
188 #define DDI_CODEC_CHK_LESS(p, upper, str, ret)                              \
189     DDI_CODEC_CHK_CONDITION((p >= upper),str,ret)
190 #define DDI_VP_CHK_LESS(p, upper, str, ret)                                 \
191     DDI_VP_CHK_CONDITION((p >= upper),str,ret)
192 #define DDI_CP_CHK_LESS(p, upper, str, ret)                                 \
193     DDI_CP_CHK_CONDITION((p >= upper),str,ret)
194 struct MEDIA_SURFACE_ALLOCATE_PARAM
195 {
196     uint32_t          pitch;
197     uint32_t          tileFormat;
198     int32_t           width;
199     int32_t           height;
200     DDI_MEDIA_FORMAT  format;
201     int32_t           alignedWidth;
202     int32_t           alignedHeight;
203     uint32_t          cpTag;
204     int               memType;
205     bool              bMemCompEnable;
206     bool              bMemCompRC;
207 };
208 
209 #define LENGTH_OF_FPS_FILE_NAME 128
210 
211 #ifdef ANDROID
212 #define FPS_FILE_NAME   "/mnt/sdcard/fps.txt"
213 #else
214 #define FPS_FILE_NAME   "./fps.txt"
215 #endif
216 
217 class MediaLibvaUtilNext
218 {
219 private:
220 
221     //!
222     //! \brief  Generate gmm parameters for external surface for none comporession mode
223     //!
224     //! \param  [out] gmmCustomParams
225     //!         gmm parameters
226     //! \param  [in] params
227     //!         surface allocate paramaters
228     //! \param  [in] mediaDrvCtx
229     //!         Pointer to ddi media context
230     //!
231     //! \return VAStatus
232     //!     VA_STATUS_SUCCESS if success, else fail reason
233     //!
234     static VAStatus GenerateGmmParamsForNoneCompressionExternalSurface(
235         GMM_RESCREATE_CUSTOM_PARAMS  &gmmCustomParams,
236         MEDIA_SURFACE_ALLOCATE_PARAM &params,
237         PDDI_MEDIA_SURFACE           mediaSurface);
238 
239     //!
240     //! \brief  Generate gmm parameters for external surface for comporession mode
241     //!
242     //! \param  [out] gmmParams
243     //!         gmm parameters
244     //! \param  [in] params
245     //!         surface allocate paramaters
246     //! \param  [in] mediaDrvCtx
247     //!         Pointer to ddi media context
248     //!
249     //! \return VAStatus
250     //!     VA_STATUS_SUCCESS if success, else fail reason
251     //!
252     static VAStatus GenerateGmmParamsForCompressionExternalSurface(
253         GMM_RESCREATE_CUSTOM_PARAMS_2 &gmmParams,
254         MEDIA_SURFACE_ALLOCATE_PARAM &params,
255         PDDI_MEDIA_SURFACE           mediaSurface,
256         PDDI_MEDIA_CONTEXT           mediaDrvCtx);
257 
258     //!
259     //! \brief  Init surface allocate parameters
260     //!
261     //! \param  [out] params
262     //!         surface allocate paramaters
263     //! \param  [in] width
264     //!         surface width
265     //! \param  [in] height
266     //!         surface height
267     //! \param  [in] format
268     //!         media format
269     //! \param  [in] memType
270     //!         memory type
271     //! \param  [in] surfaceUsageHint
272     //!         surface usage hint
273     //!
274     //! \return void
275     //!
276     static void InitSurfaceAllocateParams(
277         MEDIA_SURFACE_ALLOCATE_PARAM &params,
278         int32_t                      width,
279         int32_t                      height,
280         DDI_MEDIA_FORMAT             format,
281         int                          memType,
282         uint32_t                     surfaceUsageHint);
283 
284     //!
285     //! \brief  Set default tileformat from media foramt
286     //!
287     //! \param  [in] format
288     //!         DDI media surface format
289     //! \param  [in] surfaceUsageHint
290     //!         surface usage hint
291     //! \param  [in] skuTable
292     //!         Sku table
293     //! \param  [out] params
294     //!         surface allocate paramaters
295     //!
296     //! \return VAStatus
297     //!     VA_STATUS_SUCCESS if success, else fail reason
298     //!
299     static VAStatus SetDefaultTileFormat(
300         DDI_MEDIA_FORMAT             format,
301         uint32_t                     surfaceUsageHint,
302         MEDIA_FEATURE_TABLE          *skuTable,
303         MEDIA_SURFACE_ALLOCATE_PARAM &params);
304 
305     //!
306     //! \brief  Set surface parameter from modifier
307     //!
308     //! \param  [out] params
309     //!         surface allocate paramaters
310     //! \param  [in] modifier
311     //!         modifier from surface desc
312     //!
313     //! \return VAStatus
314     //!     VA_STATUS_SUCCESS if success, else fail reason
315     //!
316     static VAStatus SetSurfaceParameterFromModifier(
317         MEDIA_SURFACE_ALLOCATE_PARAM &params,
318         uint64_t                     modifier);
319 
320     //!
321     //! \brief  Create external surface
322     //!
323     //! \param  [in] params
324     //!         surface allocate paramaters
325     //! \param  [out] mediaSurface
326     //!         Pointer to ddi media surface
327     //! \param  [in] mediaDrvCtx
328     //!         Pointer to ddi media context
329     //!
330     //! \return VAStatus
331     //!     VA_STATUS_SUCCESS if success, else fail reason
332     //!
333     static VAStatus CreateExternalSurface(
334         MEDIA_SURFACE_ALLOCATE_PARAM &params,
335         PDDI_MEDIA_SURFACE           mediaSurface,
336         PDDI_MEDIA_CONTEXT           mediaDrvCtx);
337 
338     //!
339     //! \brief  Generate gmm parameters for internal surface
340     //!
341     //! \param  [out] gmmParams
342     //!         gmm parameters
343     //! \param  [in] params
344     //!         surface allocate paramaters
345     //! \param  [in] mediaDrvCtx
346     //!         Pointer to ddi media context
347     //!
348     //! \return VAStatus
349     //!     VA_STATUS_SUCCESS if success, else fail reason
350     //!
351     static VAStatus GenerateGmmParamsForInternalSurface(
352         GMM_RESCREATE_PARAMS         &gmmParams,
353         MEDIA_SURFACE_ALLOCATE_PARAM &params,
354         PDDI_MEDIA_CONTEXT           mediaDrvCtx);
355 
356     //!
357     //! \brief  Create internal surface
358     //!
359     //! \param  [in] params
360     //!         surface allocate paramaters
361     //! \param  [out] mediaSurface
362     //!         Pointer to ddi media surface
363     //! \param  [in] mediaDrvCtx
364     //!         Pointer to ddi media context
365     //!
366     //! \return VAStatus
367     //!     VA_STATUS_SUCCESS if success, else fail reason
368     //!
369     static VAStatus CreateInternalSurface(
370         MEDIA_SURFACE_ALLOCATE_PARAM &params,
371         PDDI_MEDIA_SURFACE           mediaSurface,
372         PDDI_MEDIA_CONTEXT           mediaDrvCtx);
373 
374     //!
375     //! \brief  Allocate surface
376     //!
377     //! \param  [in] format
378     //!         Ddi media format
379     //! \param  [in] width
380     //!         Width of the region
381     //! \param  [in] height
382     //!         Height of the region
383     //! \param  [out] mediaSurface
384     //!         Pointer to ddi media surface
385     //! \param  [in] mediaDrvCtx
386     //!         Pointer to ddi media context
387     //!
388     //! \return VAStatus
389     //!     VA_STATUS_SUCCESS if success, else fail reason
390     //!
391     static VAStatus AllocateSurface(
392         DDI_MEDIA_FORMAT            format,
393         int32_t                     width,
394         int32_t                     height,
395         PDDI_MEDIA_SURFACE          mediaSurface,
396         PDDI_MEDIA_CONTEXT          mediaDrvCtx);
397 
398     //!
399     //! \brief  Swizzle surface by Hardware, current only support VEBOX
400     //!
401     //! \param  [in] surface
402     //!         Pointer of surface
403     //! \param  [in] isDeSwizzle
404     //!         Whether it's de-swizzling or not
405     //!         Swizzling    - copying from video memory to temporary buffer
406     //!         De-swizzling - copying from temporary buffer to video memory
407     //!
408     //! \return VAStatus
409     //!     VA_STATUS_SUCCESS if success, else fail reason
410     //!
411     static VAStatus SwizzleSurfaceByHW(DDI_MEDIA_SURFACE *surface, bool isDeSwizzle = false);
412 
413     //!
414     //! \brief  Allocate 2D buffer
415     //!
416     //! \param  [in] height
417     //!         Height of the region
418     //! \param  [in] width
419     //!         Width of the region
420     //! \param  [out] mediaBuffer
421     //!         Pointer to ddi media buffer
422     //! \param  [in] bufmgr
423     //!         Mos buffer manager
424     //!
425     //! \return VAStatus
426     //!     VA_STATUS_SUCCESS if success, else fail reason
427     //!
428     static VAStatus Allocate2DBuffer(
429         uint32_t            height,
430         uint32_t            width,
431         PDDI_MEDIA_BUFFER   mediaBuffer,
432         MOS_BUFMGR          *bufmgr);
433 
434     //!
435     //! \brief  Allocate buffer
436     //!
437     //! \param  [in] format
438     //!         Ddi media format
439     //! \param  [in] size
440     //!         Size of the region
441     //! \param  [out] mediaBuffer
442     //!         Pointer to ddi media buffer
443     //! \param  [in] bufmgr
444     //!         Mos buffer manager
445     //!
446     //! \return VAStatus
447     //!     VA_STATUS_SUCCESS if success, else fail reason
448     //!
449     static VAStatus AllocateBuffer(
450         DDI_MEDIA_FORMAT      format,
451         int32_t               size,
452         PDDI_MEDIA_BUFFER     mediaBuffer,
453         MOS_BUFMGR            *bufmgr,
454         bool                  isShadowBuffer = false);
455 
456 public:
457     //!
458     //! \brief  Allocate pmedia surface from heap
459     //!
460     //! \param  [in] surfaceHeap
461     //!         Pointer to ddi media heap
462     //!
463     //! \return PDDI_MEDIA_SURFACE_HEAP_ELEMENT
464     //!     Pointer to ddi media surface heap element
465     //!
466     static PDDI_MEDIA_SURFACE_HEAP_ELEMENT AllocPMediaSurfaceFromHeap(PDDI_MEDIA_HEAP surfaceHeap);
467 
468     //!
469     //! \brief  Release pmedia surface from heap
470     //!
471     //! \param  [in] surfaceHeap
472     //!         Pointer to ddi media heap
473     //! \param  [in] vaSurfaceID
474     //!         VA surface ID
475     //!
476     static void ReleasePMediaSurfaceFromHeap(PDDI_MEDIA_HEAP surfaceHeap, uint32_t vaSurfaceID);
477 
478     //!
479     //! \brief  Create surface
480     //!
481     //! \param  [in] surface
482     //!         Ddi media surface
483     //! \param  [in] mediaDrvCtx
484     //!         Pointer to ddi media context
485     //!
486     //! \return VAStatus
487     //!     VA_STATUS_SUCCESS if success, else fail reason
488     //!
489     static VAStatus CreateSurface(DDI_MEDIA_SURFACE  *surface, PDDI_MEDIA_CONTEXT mediaDrvCtx);
490 
491     //!
492     //!
493     //!  Descripion: if the bo of media surface was allocated from App,
494     //!              should return true, otherwise, false. In current implemeation
495     //!              external buffer passed with pSurfDesc.
496     //!
497     static bool IsExternalSurface(PDDI_MEDIA_SURFACE surface);
498 
499     //!
500     //! \brief convert Media Format to Gmm Format for GmmResCreate parameter.
501     //!
502     //! \param    [in] format
503     //!         Pointer to DDI_MEDIA_FORMAT
504     //!
505     //! \return GMM_RESOURCE_FORMAT
506     //!         Pointer to gmm format type
507     //!
508     static GMM_RESOURCE_FORMAT ConvertMediaFmtToGmmFmt(DDI_MEDIA_FORMAT format);
509 
510     //!
511     //! \brief  Wait semaphore
512     //!
513     //! \param  [in] sem
514     //!         Pointer to media semaphore thread
515     //!
516     static void WaitSemaphore(PMEDIA_SEM_T sem);
517 
518     //!
519     //! \brief  Try wait semaphore
520     //!
521     //! \param  [in] sem
522     //!         Pointer to media semaphore thread
523     //!
524     //! \return int32_t
525     //!     Try wait for semaphore. Return 0 if success, else -1 if fail
526     //!
527     static int32_t TryWaitSemaphore(PMEDIA_SEM_T sem);
528 
529     //!
530     //! \brief  Post semaphore
531     //!
532     //! \param  [in] sem
533     //!         Pointer to media semaphore thread
534     //!
535     static void PostSemaphore(PMEDIA_SEM_T sem);
536 
537     //!
538     //! \brief  Destroy semaphore
539     //!
540     //! \param  [in] sem
541     //!         Pointer to media semaphore thread
542     //!
543     static void DestroySemaphore(PMEDIA_SEM_T sem);
544 
545     //!
546     //! \brief  Unregister RT surfaces
547     //!
548     //! \param  [in] ctx
549     //!     Pointer to VA driver context
550     //! \param  [in] surface
551     //!     Pointer to ddi media surface
552     //!
553     //! \return     VAStatus
554     //!     VA_STATUS_SUCCESS if success, else fail reason
555     //!
556     static VAStatus UnRegisterRTSurfaces(VADriverContextP ctx, PDDI_MEDIA_SURFACE surface);
557 
558     //!
559     //! \brief  Free surface
560     //!
561     //! \param  [in] surface
562     //!         Ddi media surface
563     //!
564     static void FreeSurface(DDI_MEDIA_SURFACE *surface);
565 
566     //!
567     //! \brief  Free buffer
568     //!
569     //! \param  [in] buf
570     //!         Ddi media buffer
571     //!
572     static void FreeBuffer(DDI_MEDIA_BUFFER *buf);
573 
574     //!
575     //! \brief  Lock surface
576     //!
577     //! \param  [in] surface
578     //!         Ddi media surface
579     //! \param  [in] flag
580     //!         Flag
581     //!
582     //! \return void*
583     //!     Pointer to lock surface data
584     //!
585     static void* LockSurface(DDI_MEDIA_SURFACE  *surface, uint32_t flag);
586 
587     //!
588     //! \brief  Lock surface
589     //!
590     //! \param  [in] surface
591     //!         Ddi media surface
592     //! \param  [in] flag
593     //!         Flag
594     //!
595     //! \return void*
596     //!     Pointer to lock surface data
597     //!
598     static void* LockSurfaceInternal(DDI_MEDIA_SURFACE *surface, uint32_t flag);
599 
600     //!
601     //! \brief  Create Shadow Resource of Ddi media surface
602     //!
603     //! \param  [in] surface
604     //!         Ddi media surface
605     //!
606     //! \return VAStatus
607     //!
608     static VAStatus CreateShadowResource(DDI_MEDIA_SURFACE *surface);
609 
610     //!
611     //! \brief  Unlock surface
612     //!
613     //! \param  [in] surface
614     //!         Ddi media surface
615     //!
616     static void UnlockSurface(DDI_MEDIA_SURFACE *surface);
617 
618     //!
619     //! \brief  Lock buffer
620     //!
621     //! \param  [in] buf
622     //!         Ddi media buffer
623     //! \param  [in] flag
624     //!         Flag
625     //!
626     //! \return void*
627     //!     Pointer to lock buffer data
628     //!
629     static void* LockBuffer(DDI_MEDIA_BUFFER *buf, uint32_t flag);
630 
631     //!
632     //! \brief  Unlock buffer
633     //!
634     //! \param  [in] buf
635     //!         Ddi media buffer
636     //!
637     static void UnlockBuffer(DDI_MEDIA_BUFFER *buf);
638 
639     //!
640     //! \brief  Swizzle Surface
641     //!
642     //! \param  [in] mediaCtx
643     //!         Pointer to VA driver context
644     //! \param  [in] pGmmResInfo
645     //!         Gmm resource info
646     //! \param  [in] pLockedAddr
647     //!         Pointer to locked address
648     //! \param  [in] TileType
649     //!         Tile type
650     //! \param  [in] pResourceBase
651     //!         Pointer to resource base
652     //! \param  [in] bUpload
653     //!         Blt upload
654     //! \return     VAStatus
655     //!     VA_STATUS_SUCCESS if success, else fail reason
656     //!
657     static VAStatus SwizzleSurface(
658         PDDI_MEDIA_CONTEXT         mediaCtx,
659         PGMM_RESOURCE_INFO         pGmmResInfo,
660         void                       *pLockedAddr,
661         uint32_t                   TileType,
662         uint8_t                    *pResourceBase,
663         bool                       bUpload);
664 
665     //!
666     //! \brief  Create buffer
667     //!
668     //! \param  [out] buffer
669     //!         Ddi media buffer
670     //! \param  [in] bufmgr
671     //!         Mos buffer manager
672     //!
673     //! \return VAStatus
674     //!     VA_STATUS_SUCCESS if success, else fail reason
675     //!
676     static VAStatus CreateBuffer(
677         DDI_MEDIA_BUFFER *buffer,
678         MOS_BUFMGR       *bufmgr);
679 
680     //!
681     //! \brief  Allocate pmedia buffer from heap
682     //!
683     //! \param  [in] bufferHeap
684     //!         Pointer to ddi media heap
685     //!
686     //! \return PDDI_MEDIA_BUFFER_HEAP_ELEMENT
687     //!     Pointer to ddi media buffer heap element
688     //!
689     static PDDI_MEDIA_BUFFER_HEAP_ELEMENT AllocPMediaBufferFromHeap(PDDI_MEDIA_HEAP bufferHeap);
690 
691     //!
692     //! \brief  Allocate PVA image from heap
693     //!
694     //! \param  [in] imageHeap
695     //!         Pointer to ddi media heap
696     //!
697     //! \return PDDI_MEDIA_IMAGE_HEAP_ELEMENT
698     //!     Pointer to ddi media image heap element
699     //!
700     static PDDI_MEDIA_IMAGE_HEAP_ELEMENT AllocPVAImageFromHeap(PDDI_MEDIA_HEAP imageHeap);
701 
702     //!
703     //! \brief convert FOURCC to Gmm Format.
704     //!
705     //! \param    [in] fourcc
706     //!
707     //! \return GMM_RESOURCE_FORMAT
708     //!         Pointer to gmm format type
709     //!
710     static GMM_RESOURCE_FORMAT ConvertFourccToGmmFmt(uint32_t fourcc);
711 
712     //! \brief Get surface drm modifier
713     //!
714     //! \param  [in] mediaCtx
715     //!         Media context
716     //! \param  [in] mediaSurface
717     //!         Pointer to the media surface
718     //! \param  [out] modifier
719     //!         Reference of the modifier
720     //!
721     //! \return   VAStatus
722     //!     VA_STATUS_SUCCESS if success
723     //!
724     static VAStatus GetSurfaceModifier(
725         DDI_MEDIA_CONTEXT  *mediaCtx,
726         DDI_MEDIA_SURFACE  *mediaSurface,
727         uint64_t           &modifier);
728 
729     //!
730     //! \brief  Release pmedia buffer from heap
731     //!
732     //! \param  [in] bufferHeap
733     //!         Pointer to ddi media heap
734     //! \param  [in] vaBufferID
735     //!         VA buffer ID
736     //!
737     static void ReleasePMediaBufferFromHeap(
738         PDDI_MEDIA_HEAP  bufferHeap,
739         uint32_t         vaBufferID);
740 
741     //!
742     //! \brief  Init a mutex
743     //!
744     //! \param  [in] mutex
745     //!         input mutex
746     //! \return     void
747     //!
748     static void InitMutex(PMEDIA_MUTEX_T mutex);
749 
750     //!
751     //! \brief  Dstroy a mutex
752     //!
753     //! \param  [in] mutex
754     //!         input mutex
755     //! \return     void
756     //!
757     static void DestroyMutex(PMEDIA_MUTEX_T mutex);
758 
759     //!
760     //! \brief  Set media reset enable flag
761     //!
762     //! \param  [in] mediaCtx
763     //!         Pointer to VA driver context
764     //! \return     VAStatus
765     //!     VA_STATUS_SUCCESS if success, else fail reason
766     //!
767     static VAStatus SetMediaResetEnableFlag(PDDI_MEDIA_CONTEXT mediaCtx);
768 
769     //!
770     //! \brief  Allocate PVA context from heap
771     //!
772     //! \param  [in] vaContextHeap
773     //!         Pointer to ddi media heap
774     //!
775     //! \return PDDI_MEDIA_VACONTEXT_HEAP_ELEMENT
776     //!     Pointer to ddi media vacontext heap element
777     //!
778     static PDDI_MEDIA_VACONTEXT_HEAP_ELEMENT DdiAllocPVAContextFromHeap(PDDI_MEDIA_HEAP vaContextHeap);
779 
780     //!
781     //! \brief  Release PVA context from heap
782     //!
783     //! \param  [in] vaContextHeap
784     //!         Pointer to ddi media heap
785     //! \param  [in] vaContextID
786     //!         VA context ID
787     //!
788     static void DdiReleasePVAContextFromHeap(PDDI_MEDIA_HEAP vaContextHeap, uint32_t vaContextID);
789 
790     //!
791     //! \brief map from media format to vphal format
792     //!
793     //! \params [in] mediaFormat
794     //!         DDI_MEDIA_FORMAT
795     //!
796     //! \returns MOS_FORMAT
797     //!
798     static MOS_FORMAT GetFormatFromMediaFormat(DDI_MEDIA_FORMAT mediaFormat);
799 
800     //! \brief Get the VP Tile Type from Media Tile Type.
801     //!
802     //! \params [in] mediaTileType
803     //!         input mediaTileType
804     //!
805     //! \returns Vp tile Type if call succeeds
806     //!
807     static MOS_TILE_TYPE GetTileTypeFromMediaTileType(uint32_t mediaTileType);
808 
809     //!
810     //! \brief Get ColorSpace from the media format
811     //!
812     //! \params [in]  format
813     //!        media format
814     //!
815     //! \returns appropriate VPHAL_CSPACE if call succeeds, CSpace_None otherwise
816     //!
817     static VPHAL_CSPACE GetColorSpaceFromMediaFormat(DDI_MEDIA_FORMAT format);
818 
819     //!
820     //! \brief  Unreference buf object media buffer
821     //!
822     //! \param  [in] buf
823     //!         Pointer to ddi media buffer
824     //!
825     static void UnRefBufObjInMediaBuffer(PDDI_MEDIA_BUFFER buf);
826 
827     //!
828     //! \brief  ReleaseP VAImage From Heap
829     //!
830     //! \param  [in] imageHeap
831     //!         Image heap
832     //! \param  [in] vaImageID
833     //!         VA image ID
834     //!
835     static void ReleasePVAImageFromHeap(PDDI_MEDIA_HEAP imageHeap, uint32_t vaImageID);
836 
837     //!
838     //! \brief  Media print frame per second
839     //!
840     static void MediaPrintFps();
841 private:
842     static int32_t         m_frameCountFps;
843     static struct timeval  m_tv1;
844     static pthread_mutex_t m_fpsMutex;
845     static int32_t         m_vaFpsSampleSize;
846     static bool m_isMediaFpsPrintFpsEnabled;
847 MEDIA_CLASS_DEFINE_END(MediaLibvaUtilNext)
848 };
849 
850 //!
851 //! \brief  Helper inline class intended to simplify mutex lock/unlock
852 //!         operations primarily used as a stack-allocated object.
853 //!         In that case, the compiler guarantees to call the destructor
854 //!         leaving the scope. The class becomes handy in functions
855 //!         where there are several return statements with different
856 //!         exit code value.
857 //!
858 class MediaLibvaUtilNext_LockGuard {
859 private:
860     PMEDIA_MUTEX_T m_pMutex;
861 public:
MediaLibvaUtilNext_LockGuard(PMEDIA_MUTEX_T pMutex)862     MediaLibvaUtilNext_LockGuard(PMEDIA_MUTEX_T pMutex):m_pMutex(pMutex)
863     {
864         MosUtilities::MosLockMutex(m_pMutex);
865     }
~MediaLibvaUtilNext_LockGuard()866     ~MediaLibvaUtilNext_LockGuard()
867     {
868         MosUtilities::MosUnlockMutex(m_pMutex);
869     }
870 MEDIA_CLASS_DEFINE_END(MediaLibvaUtilNext_LockGuard)
871 };
872 
873 #endif  //__MEDIA_LIBVA_UTIL_NEXT_H__
874