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