xref: /aosp_15_r20/external/intel-media-driver/media_driver/linux/Xe_M/ddi/media_libva_caps_pvc.cpp (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1 /*
2 * Copyright (c) 2020-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 //!
24 //! \file     media_libva_caps_pvc.cpp
25 //! \brief    This file implements the C++ class/interface for pvc media capbilities.
26 //!
27 
28 #include "media_libva.h"
29 #include "media_libva_util.h"
30 #include "media_libva_caps_pvc.h"
31 #include "media_libva_caps_factory.h"
32 #include "mos_bufmgr_priv.h"
33 
34 extern template class MediaLibvaCapsFactory<MediaLibvaCaps, DDI_MEDIA_CONTEXT>;
35 
LoadAv1DecProfileEntrypoints()36 VAStatus MediaLibvaCapsPVC::LoadAv1DecProfileEntrypoints()
37 {
38     VAStatus status = VA_STATUS_SUCCESS;
39 
40 #if _AV1_DECODE_SUPPORTED
41     if (m_mediaCtx->pDrmBufMgr->has_full_vd)
42     {
43         status = MediaLibvaCapsG12::LoadAv1DecProfileEntrypoints();
44     }
45 #endif
46     return status;
47 }
48 
LoadHevcEncLpProfileEntrypoints()49 VAStatus MediaLibvaCapsPVC::LoadHevcEncLpProfileEntrypoints()
50 {
51     DDI_CHK_NULL(m_mediaCtx, "nullptr m_mediaCtx", VA_STATUS_ERROR_INVALID_CONTEXT);
52     DDI_CHK_NULL(m_mediaCtx->pDrmBufMgr, "nullptr pDrmBufMgr", VA_STATUS_ERROR_INVALID_PARAMETER);
53     DDI_CHK_CONDITION(m_mediaCtx->pDrmBufMgr->has_full_vd == false,
54        "Encoding is not supported",
55         VA_STATUS_SUCCESS);
56 
57     VAStatus status = VA_STATUS_SUCCESS;
58     const uint8_t rcModeSize = (sizeof(m_encRcMode))/(sizeof(m_encRcMode[0]));
59 
60     AttribMap *attributeList = nullptr;
61 
62     if (MEDIA_IS_SKU(&(m_mediaCtx->SkuTable), FtrEncodeHEVCVdencMain)
63             || MEDIA_IS_SKU(&(m_mediaCtx->SkuTable), FtrEncodeHEVCVdencMain10)
64             || MEDIA_IS_SKU(&(m_mediaCtx->SkuTable), FtrEncodeHEVCVdencMain444)
65             || MEDIA_IS_SKU(&(m_mediaCtx->SkuTable), FtrEncodeHEVCVdencMain10bit444))
66     {
67         status = CreateEncAttributes(VAProfileHEVCMain, VAEntrypointEncSliceLP, &attributeList);
68         DDI_CHK_RET(status, "Failed to initialize Caps!");
69         (*attributeList)[VAConfigAttribMaxPictureWidth] = CODEC_8K_MAX_PIC_WIDTH;
70         (*attributeList)[VAConfigAttribMaxPictureHeight] = CODEC_8K_MAX_PIC_HEIGHT;
71         (*attributeList)[VAConfigAttribEncTileSupport] = 1;
72         (*attributeList)[VAConfigAttribEncSliceStructure] = VA_ENC_SLICE_STRUCTURE_POWER_OF_TWO_ROWS | VA_ENC_SLICE_STRUCTURE_EQUAL_ROWS |
73                                                         VA_ENC_SLICE_STRUCTURE_ARBITRARY_ROWS | VA_ENC_SLICE_STRUCTURE_EQUAL_MULTI_ROWS;
74     }
75 
76     if (MEDIA_IS_SKU(&(m_mediaCtx->SkuTable), FtrEncodeHEVCVdencMain))
77     {
78         uint32_t configStartIdx = m_encConfigs.size();
79         AddEncConfig(VA_RC_CQP);
80         if (MEDIA_IS_SKU(&(m_mediaCtx->SkuTable), FtrEnableMediaKernels))
81         {
82             for (int32_t j = 3; j < rcModeSize; j++)
83             {
84                 AddEncConfig(m_encRcMode[j]);
85             }
86         }
87         AddProfileEntry(VAProfileHEVCMain, VAEntrypointEncSliceLP, attributeList,
88                 configStartIdx, m_encConfigs.size() - configStartIdx);
89     }
90 
91     if (MEDIA_IS_SKU(&(m_mediaCtx->SkuTable), FtrEncodeHEVCVdencMain10))
92     {
93         uint32_t configStartIdx = m_encConfigs.size();
94         AddEncConfig(VA_RC_CQP);
95         if (MEDIA_IS_SKU(&(m_mediaCtx->SkuTable), FtrEnableMediaKernels))
96         {
97             for (int32_t j = 3; j < rcModeSize; j++)
98             {
99                 AddEncConfig(m_encRcMode[j]);
100             }
101         }
102         AddProfileEntry(VAProfileHEVCMain10, VAEntrypointEncSliceLP, attributeList,
103                 configStartIdx, m_encConfigs.size() - configStartIdx);
104     }
105 
106     if (MEDIA_IS_SKU(&(m_mediaCtx->SkuTable), FtrEncodeHEVCVdencMain444))
107     {
108         uint32_t configStartIdx = m_encConfigs.size();
109         AddEncConfig(VA_RC_CQP);
110         if (MEDIA_IS_SKU(&(m_mediaCtx->SkuTable), FtrEnableMediaKernels))
111         {
112             for (int32_t j = 3; j < rcModeSize; j++)
113             {
114                 AddEncConfig(m_encRcMode[j]);
115             }
116         }
117         AddProfileEntry(VAProfileHEVCMain444, VAEntrypointEncSliceLP, attributeList,
118                 configStartIdx, m_encConfigs.size() - configStartIdx);
119     }
120 
121     if (MEDIA_IS_SKU(&(m_mediaCtx->SkuTable), FtrEncodeHEVCVdencMain10bit444))
122     {
123         uint32_t configStartIdx = m_encConfigs.size();
124         AddEncConfig(VA_RC_CQP);
125         if (MEDIA_IS_SKU(&(m_mediaCtx->SkuTable), FtrEnableMediaKernels))
126         {
127             for (int32_t j = 3; j < rcModeSize; j++)
128             {
129                 AddEncConfig(m_encRcMode[j]);
130             }
131         }
132         AddProfileEntry(VAProfileHEVCMain444_10, VAEntrypointEncSliceLP, attributeList,
133                 configStartIdx, m_encConfigs.size() - configStartIdx);
134     }
135 
136     return status;
137 }
138 
CheckEncodeResolution(VAProfile profile,uint32_t width,uint32_t height)139 VAStatus MediaLibvaCapsPVC::CheckEncodeResolution(
140         VAProfile profile,
141         uint32_t width,
142         uint32_t height)
143 {
144     switch (profile)
145     {
146         case VAProfileHEVCMain:
147         case VAProfileHEVCMain10:
148         case VAProfileHEVCMain444:
149         case VAProfileHEVCMain444_10:
150             if (width > CODEC_8K_MAX_PIC_WIDTH
151                     || width < m_hevcVDEncMinWidth
152                     || height > CODEC_8K_MAX_PIC_HEIGHT
153                     || height < m_hevcVDEncMinHeight)
154             {
155                 return VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED;
156             }
157             break;
158         default:
159             if (width > m_encMax4kWidth
160                     || width < m_encMinWidth
161                     || height > m_encMax4kHeight
162                     || height < m_encMinHeight)
163             {
164                 return VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED;
165             }
166             break;
167     }
168     return VA_STATUS_SUCCESS;
169 }
170 
AddEncSurfaceAttributes(VAProfile profile,VAEntrypoint entrypoint,VASurfaceAttrib * attribList,uint32_t & numAttribs)171 VAStatus MediaLibvaCapsPVC::AddEncSurfaceAttributes(
172         VAProfile profile,
173         VAEntrypoint entrypoint,
174         VASurfaceAttrib *attribList,
175         uint32_t &numAttribs)
176 {
177     DDI_CHK_NULL(attribList, "Null pointer", VA_STATUS_ERROR_INVALID_PARAMETER);
178 
179     if(entrypoint == VAEntrypointEncSliceLP)
180     {
181         if (profile == VAProfileHEVCMain10)
182         {
183             attribList[numAttribs].type = VASurfaceAttribPixelFormat;
184             attribList[numAttribs].value.type = VAGenericValueTypeInteger;
185             attribList[numAttribs].flags = VA_SURFACE_ATTRIB_GETTABLE | VA_SURFACE_ATTRIB_SETTABLE;
186             attribList[numAttribs].value.value.i = VA_FOURCC('P', '0', '1', '0');
187             numAttribs++;
188         }
189         else if (profile == VAProfileHEVCMain444)
190         {
191             attribList[numAttribs].type = VASurfaceAttribPixelFormat;
192             attribList[numAttribs].value.type = VAGenericValueTypeInteger;
193             attribList[numAttribs].flags = VA_SURFACE_ATTRIB_GETTABLE | VA_SURFACE_ATTRIB_SETTABLE;
194             attribList[numAttribs].value.value.i = VA_FOURCC_AYUV;
195             numAttribs++;
196         }
197         else if (profile == VAProfileHEVCMain444_10)
198         {
199             attribList[numAttribs].type = VASurfaceAttribPixelFormat;
200             attribList[numAttribs].value.type = VAGenericValueTypeInteger;
201             attribList[numAttribs].flags = VA_SURFACE_ATTRIB_GETTABLE | VA_SURFACE_ATTRIB_SETTABLE;
202             attribList[numAttribs].value.value.i = VA_FOURCC_Y410;
203             numAttribs++;
204         }
205         else
206         {
207             attribList[numAttribs].type = VASurfaceAttribPixelFormat;
208             attribList[numAttribs].value.type = VAGenericValueTypeInteger;
209             attribList[numAttribs].flags = VA_SURFACE_ATTRIB_GETTABLE | VA_SURFACE_ATTRIB_SETTABLE;
210             attribList[numAttribs].value.value.i = VA_FOURCC('N', 'V', '1', '2');
211             numAttribs++;
212         }
213         attribList[numAttribs].type = VASurfaceAttribMaxWidth;
214         attribList[numAttribs].value.type = VAGenericValueTypeInteger;
215         attribList[numAttribs].flags = VA_SURFACE_ATTRIB_GETTABLE;
216         attribList[numAttribs].value.value.i = CODEC_MAX_PIC_WIDTH;
217 
218         if(IsHevcProfile(profile))
219         {
220             attribList[numAttribs].value.value.i = CODEC_8K_MAX_PIC_WIDTH;
221         }
222         if(IsAvcProfile(profile))
223         {
224             attribList[numAttribs].value.value.i = CODEC_4K_MAX_PIC_WIDTH;
225         }
226         numAttribs++;
227 
228         attribList[numAttribs].type = VASurfaceAttribMaxHeight;
229         attribList[numAttribs].value.type = VAGenericValueTypeInteger;
230         attribList[numAttribs].flags = VA_SURFACE_ATTRIB_GETTABLE;
231         attribList[numAttribs].value.value.i = CODEC_MAX_PIC_HEIGHT;
232         if(IsHevcProfile(profile))
233         {
234             attribList[numAttribs].value.value.i = CODEC_8K_MAX_PIC_HEIGHT;
235         }
236         if(IsAvcProfile(profile))
237         {
238             attribList[numAttribs].value.value.i = CODEC_4K_MAX_PIC_HEIGHT;
239         }
240         numAttribs++;
241 
242         attribList[numAttribs].type = VASurfaceAttribMinWidth;
243         attribList[numAttribs].value.type = VAGenericValueTypeInteger;
244         attribList[numAttribs].flags = VA_SURFACE_ATTRIB_GETTABLE;
245         attribList[numAttribs].value.value.i = m_encMinWidth;
246         if(IsHevcProfile(profile))
247         {
248             attribList[numAttribs].value.value.i = m_hevcVDEncMinWidth;
249         }
250         numAttribs++;
251 
252         attribList[numAttribs].type = VASurfaceAttribMinHeight;
253         attribList[numAttribs].value.type = VAGenericValueTypeInteger;
254         attribList[numAttribs].flags = VA_SURFACE_ATTRIB_GETTABLE;
255         attribList[numAttribs].value.value.i = m_encMinHeight;
256         if(IsHevcProfile(profile))
257         {
258             attribList[numAttribs].value.value.i = m_hevcVDEncMinHeight;
259         }
260         numAttribs++;
261     }
262 
263     return VA_STATUS_SUCCESS;
264 }
265 
GetPlatformSpecificAttrib(VAProfile profile,VAEntrypoint entrypoint,VAConfigAttribType type,uint32_t * value)266 VAStatus MediaLibvaCapsPVC::GetPlatformSpecificAttrib(VAProfile profile,
267         VAEntrypoint entrypoint,
268         VAConfigAttribType type,
269         uint32_t *value)
270 {
271     DDI_CHK_NULL(value, "Null pointer", VA_STATUS_ERROR_INVALID_PARAMETER);
272     VAStatus status = MediaLibvaCapsG12::GetPlatformSpecificAttrib(profile, entrypoint, type, value);
273 
274     if ((int)type == VAConfigAttribDecProcessing)
275     {
276         //PVC doesn't have SFC
277         *value = VA_DEC_PROCESSING_NONE;
278     }
279 
280     return status;
281 }
282 
GetDisplayAttributes(VADisplayAttribute * attribList,int32_t numAttribs)283 VAStatus MediaLibvaCapsPVC::GetDisplayAttributes(
284             VADisplayAttribute *attribList,
285             int32_t numAttribs)
286 {
287     DDI_CHK_NULL(attribList, "Null attribList", VA_STATUS_ERROR_INVALID_PARAMETER);
288     for(auto i = 0; i < numAttribs; i ++)
289     {
290         switch(attribList->type)
291         {
292 #if VA_CHECK_VERSION(1, 15, 0)
293             case VADisplayPCIID:
294                 attribList->min_value = attribList->value = attribList->max_value = (m_mediaCtx->iDeviceId & 0xffff) | 0x80860000;
295                 attribList->flags = VA_DISPLAY_ATTRIB_GETTABLE;
296                 break;
297 #endif
298             case VADisplayAttribCopy:
299                 attribList->min_value = attribList->value = attribList->max_value =
300                     (1 << VA_EXEC_MODE_POWER_SAVING) | (1 << VA_EXEC_MODE_PERFORMANCE);
301                 // 100: perfromance model: Render copy
302                 // 10:  POWER_SAVING: BLT
303                 // 1:   default model: 1: vebox
304                 // 0:   don't support media copy.
305                 attribList->flags = VA_DISPLAY_ATTRIB_GETTABLE;
306                 break;
307             default:
308                 attribList->min_value = VA_ATTRIB_NOT_SUPPORTED;
309                 attribList->max_value = VA_ATTRIB_NOT_SUPPORTED;
310                 attribList->value = VA_ATTRIB_NOT_SUPPORTED;
311                 attribList->flags = VA_DISPLAY_ATTRIB_NOT_SUPPORTED;
312                 break;
313         }
314         attribList ++;
315     }
316     return VA_STATUS_SUCCESS;
317 }
318 
319 static bool pvcRegistered = MediaLibvaCapsFactory<MediaLibvaCaps, DDI_MEDIA_CONTEXT>::
320     RegisterCaps<MediaLibvaCapsPVC>((uint32_t)IGFX_PVC);
321