1 /*
2 * Copyright (c) 2019-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 encode_vp9_vdenc_const_settings.cpp
25 //! \brief Defines the common interface for vp9 vdenc const settings
26 //! \details The encode feature manager is further sub-divided by platform type
27 //! this file is for the base interface which is shared by all components.
28 //!
29
30 #include "encode_vp9_vdenc_const_settings.h"
31 #include "encode_utils.h"
32 #include "mos_utilities.h"
33
34 namespace encode
35 {
36
37 const uint32_t EncodeVp9VdencConstSettings::m_numMergeCandidateCu64x64[] = {0, 4, 4, 4, 4, 4, 2, 2};
38 const uint32_t EncodeVp9VdencConstSettings::m_numMergeCandidateCu32x32[] = {0, 3, 3, 3, 3, 3, 2, 2};
39 const uint32_t EncodeVp9VdencConstSettings::m_numMergeCandidateCu16x16[] = {0, 2, 2, 2, 2, 2, 2, 2};
40 const uint32_t EncodeVp9VdencConstSettings::m_numMergeCandidateCu8x8[] = {0, 1, 1, 1, 1, 1, 0, 0};
41 const uint8_t EncodeVp9VdencConstSettings::m_numImePredictors[] = {0, 8, 8, 8, 8, 8, 4, 4};
42
EncodeVp9VdencConstSettings()43 EncodeVp9VdencConstSettings::EncodeVp9VdencConstSettings()
44 {
45 m_featureSetting = MOS_New(Vp9VdencFeatureSettings);
46 }
47
Update(void * params)48 MOS_STATUS EncodeVp9VdencConstSettings::Update(void *params)
49 {
50 ENCODE_FUNC_CALL();
51
52 EncoderParams *encodeParams = (EncoderParams *)params;
53
54 m_vp9SeqParams =
55 static_cast<PCODEC_VP9_ENCODE_SEQUENCE_PARAMS>(encodeParams->pSeqParams);
56 ENCODE_CHK_NULL_RETURN(m_vp9SeqParams);
57
58 m_vp9PicParams =
59 static_cast<PCODEC_VP9_ENCODE_PIC_PARAMS>(encodeParams->pPicParams);
60 ENCODE_CHK_NULL_RETURN(m_vp9PicParams);
61
62 m_vp9SegmentParams =
63 static_cast<PCODEC_VP9_ENCODE_SEGMENT_PARAMS>(encodeParams->pSegmentParams);
64 ENCODE_CHK_NULL_RETURN(m_vp9SegmentParams);
65
66 return MOS_STATUS_SUCCESS;
67 }
68
PrepareConstSettings()69 MOS_STATUS EncodeVp9VdencConstSettings::PrepareConstSettings()
70 {
71 ENCODE_FUNC_CALL();
72
73 ENCODE_CHK_STATUS_RETURN(SetTUSettings());
74 ENCODE_CHK_STATUS_RETURN(SetCommonSettings());
75 ENCODE_CHK_STATUS_RETURN(SetVdencCmd1Settings());
76 ENCODE_CHK_STATUS_RETURN(SetVdencCmd2Settings());
77
78 return MOS_STATUS_SUCCESS;
79 }
80
SetTUSettings()81 MOS_STATUS EncodeVp9VdencConstSettings::SetTUSettings()
82 {
83 ENCODE_FUNC_CALL();
84 ENCODE_CHK_NULL_RETURN(m_featureSetting);
85 MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
86
87 auto setting = static_cast<Vp9VdencFeatureSettings *>(m_featureSetting);
88 ENCODE_CHK_NULL_RETURN(setting);
89
90 setting->NumMergeCandidateCu8x8 = (uint32_t *)m_numMergeCandidateCu8x8;
91 setting->NumMergeCandidateCu16x16 = (uint32_t *)m_numMergeCandidateCu16x16;
92 setting->NumMergeCandidateCu32x32 = (uint32_t *)m_numMergeCandidateCu32x32;
93 setting->NumMergeCandidateCu64x64 = (uint32_t *)m_numMergeCandidateCu64x64;
94 setting->NumImePredictors = (uint8_t *)m_numImePredictors;
95
96 return eStatus;
97 }
98
SetVdencCmd1Settings()99 MOS_STATUS EncodeVp9VdencConstSettings::SetVdencCmd1Settings()
100 {
101 ENCODE_FUNC_CALL();
102 ENCODE_CHK_NULL_RETURN(m_featureSetting);
103
104 auto setting = static_cast<Vp9VdencFeatureSettings *>(m_featureSetting);
105 ENCODE_CHK_NULL_RETURN(setting);
106
107 setting->vdencCmd1Settings = {
108 VDENC_CMD1_LAMBDA(){
109 uint8_t qp = m_vp9PicParams->LumaACQIndex;
110 uint8_t frameType = m_vp9PicParams->PicFlags.fields.frame_type;
111
112 double DLOCAL0 = (frameType == CODEC_VP9_KEY_FRAME) ? 0.31 : 0.33;
113 double DLOCAL1 = DLOCAL0 * CODECHAL_VP9_QUANT_AC[qp] / 8;
114 //
115 par.vdencCmd1Par0 = (uint16_t)(DLOCAL1 * DLOCAL1 * 4 + 0.5);
116 par.vdencCmd1Par1 = (uint16_t)(DLOCAL1 * 4 + 0.5);
117 return MOS_STATUS_SUCCESS;
118 },
119 VDENC_CMD1_LAMBDA()
120 {
121 uint8_t frameType = m_vp9PicParams->PicFlags.fields.frame_type;
122 if (CODEC_VP9_KEY_FRAME == frameType)
123 {
124 // DW9
125 par.vdencCmd1Par5 = 0;
126 par.vdencCmd1Par6 = 0;
127 par.vdencCmd1Par7 = 0;
128
129 // DW10
130 par.vdencCmd1Par13[0] = 0;
131 par.vdencCmd1Par9[0] = 0;
132 par.vdencCmd1Par12[0] = 0;
133 par.vdencCmd1Par8[0] = 0;
134
135 // DW11
136 par.vdencCmd1Par15[0] = 0;
137 par.vdencCmd1Par11[0] = 0;
138 par.vdencCmd1Par14[0] = 0;
139 par.vdencCmd1Par10[0] = 0;
140
141 // DW12
142 par.vdencCmd1Par19 = 0;
143 par.vdencCmd1Par18 = 0;
144 par.vdencCmd1Par17 = 0;
145 par.vdencCmd1Par16 = 0;
146
147 // DW13
148 par.vdencCmd1Par20 = 0;
149 par.vdencCmd1Par21 = 0;
150 par.vdencCmd1Par22 = 0;
151 par.vdencCmd1Par23 = 0x1e;
152
153 // DW16
154 par.vdencCmd1Par34 = 0x07;
155 par.vdencCmd1Par35 = 0;
156
157 // DW17
158 par.vdencCmd1Par39 = 0x0d;
159 par.vdencCmd1Par38 = 0x0e;
160 par.vdencCmd1Par37 = 0x10;
161 par.vdencCmd1Par36 = 0x07;
162
163 // DW18
164 par.vdencCmd1Par43 = 0x14;
165 par.vdencCmd1Par42 = 0x3a;
166 par.vdencCmd1Par41 = 0x1e;
167 par.vdencCmd1Par40 = 0x32;
168
169 // DW31
170 par.vdencCmd1Par89 = 0;
171 par.vdencCmd1Par88 = 0;
172 par.vdencCmd1Par87 = 0;
173
174 }
175 else
176 {
177 // DW9
178 par.vdencCmd1Par5 = 0x8;
179 par.vdencCmd1Par6 = 0x4;
180 par.vdencCmd1Par7 = 0x0c;
181
182 // DW10
183 par.vdencCmd1Par13[0] = 0x1a;
184 par.vdencCmd1Par9[0] = 0x0e;
185 par.vdencCmd1Par12[0] = 0x17;
186 par.vdencCmd1Par8[0] = 0x0b;
187
188 // DW11
189 par.vdencCmd1Par15[0] = 0x26;
190 par.vdencCmd1Par11[0] = 0x14;
191 par.vdencCmd1Par14[0] = 0x1a;
192 par.vdencCmd1Par10[0] = 0x0e;
193
194 // DW12
195 par.vdencCmd1Par19 = 0x15;
196 par.vdencCmd1Par18 = 0x5c;
197 par.vdencCmd1Par17 = 0x17;
198 par.vdencCmd1Par16 = 0x5c;
199
200 // DW13
201 par.vdencCmd1Par20 = 0x17;
202 par.vdencCmd1Par21 = 0;
203 par.vdencCmd1Par22 = 0x04;
204 par.vdencCmd1Par23 = 0x36;
205
206 // DW16
207 par.vdencCmd1Par34 = 0x07;
208 par.vdencCmd1Par35 = 0x04;
209
210 // DW17
211 par.vdencCmd1Par39 = 0x14;
212 par.vdencCmd1Par38 = 0x14;
213 par.vdencCmd1Par37 = 0x14;
214 par.vdencCmd1Par36 = 0x07;
215
216 // DW18
217 par.vdencCmd1Par43 = 0x19;
218 par.vdencCmd1Par42 = 0x18;
219 par.vdencCmd1Par41 = 0x44;
220 par.vdencCmd1Par40 = 0x1e;
221
222 // DW31
223 par.vdencCmd1Par89 = 0x14;
224 par.vdencCmd1Par88 = 0x14;
225 par.vdencCmd1Par87 = 0x14;
226 }
227 return MOS_STATUS_SUCCESS;
228 },
229 VDENC_CMD1_LAMBDA()
230 {
231 par.vdencCmd1Par2[0] = 0;
232 par.vdencCmd1Par2[1] = 2;
233 par.vdencCmd1Par2[2] = 3;
234 par.vdencCmd1Par2[3] = 5;
235 par.vdencCmd1Par2[4] = 6;
236 par.vdencCmd1Par2[5] = 8;
237 par.vdencCmd1Par2[6] = 9;
238 par.vdencCmd1Par2[7] = 11;
239 return MOS_STATUS_SUCCESS;
240 },
241 VDENC_CMD1_LAMBDA()
242 {
243 static const std::array<uint8_t, 12> data = {
244 4, 12, 20, 28, 36, 44, 52, 60, 68, 76, 84, 92};
245
246 for (size_t i = 0; i < data.size(); i++)
247 {
248 par.vdencCmd1Par3[i] = data[i];
249 par.vdencCmd1Par4[i] = data[i];
250 }
251 return MOS_STATUS_SUCCESS;
252 },
253 VDENC_CMD1_LAMBDA()
254 {
255 par.vdencCmd1Par24 = 0;
256 par.vdencCmd1Par25 = 0;
257 par.vdencCmd1Par26 = 0;
258 par.vdencCmd1Par27 = 0;
259
260 par.vdencCmd1Par28 = 0;
261 par.vdencCmd1Par29 = 0;
262 par.vdencCmd1Par30 = 0;
263 par.vdencCmd1Par31 = 0;
264
265 // DW16
266 par.vdencCmd1Par32 = 0;
267 par.vdencCmd1Par33 = 0;
268
269 return MOS_STATUS_SUCCESS;
270 },
271 VDENC_CMD1_LAMBDA()
272 {
273 // DW19
274 par.vdencCmd1Par44 = 0;
275 par.vdencCmd1Par45 = 20;
276 par.vdencCmd1Par46 = 0;
277
278 // DW20
279 par.vdencCmd1Par47 = 12;
280 par.vdencCmd1Par48 = 12;
281 par.vdencCmd1Par49 = 12;
282 par.vdencCmd1Par50 = 12;
283
284 // DW21
285 par.vdencCmd1Par51 = 12;
286 par.vdencCmd1Par52 = 12;
287 par.vdencCmd1Par53 = 12;
288 par.vdencCmd1Par54 = 12;
289
290 // DW23
291 par.vdencCmd1Par55 = 0x10;
292 par.vdencCmd1Par56 = 0x10;
293 par.vdencCmd1Par57 = 0x10;
294 par.vdencCmd1Par58 = 0x10;
295
296 // DW24
297 par.vdencCmd1Par59 = 0x10;
298 par.vdencCmd1Par60 = 0x10;
299 par.vdencCmd1Par61 = 0x10;
300 par.vdencCmd1Par62 = 0x10;
301
302 // DW25
303 par.vdencCmd1Par63 = 0x10;
304 par.vdencCmd1Par64 = 0x10;
305 par.vdencCmd1Par65 = 0x10;
306 par.vdencCmd1Par66 = 0x10;
307
308 // DW26
309 par.vdencCmd1Par67 = 0x10;
310 par.vdencCmd1Par68 = 0x10;
311 par.vdencCmd1Par69 = 0x10;
312 par.vdencCmd1Par70 = 0x10;
313
314 // DW27
315 par.vdencCmd1Par71 = 0x10;
316 par.vdencCmd1Par72 = 0x10;
317 par.vdencCmd1Par73 = 0x10;
318 par.vdencCmd1Par74 = 0x10;
319
320 // DW28
321 par.vdencCmd1Par75 = 0x10;
322 par.vdencCmd1Par76 = 0x10;
323 par.vdencCmd1Par77 = 0x10;
324 par.vdencCmd1Par78 = 0x10;
325
326 // DW29
327 par.vdencCmd1Par79 = 0x10;
328 par.vdencCmd1Par80 = 0x10;
329 par.vdencCmd1Par81 = 0x10;
330 par.vdencCmd1Par82 = 0x10;
331
332 // DW30
333 par.vdencCmd1Par83 = 0x10;
334 par.vdencCmd1Par84 = 0x10;
335 par.vdencCmd1Par85 = 0x10;
336 par.vdencCmd1Par86 = 0x10;
337
338 return MOS_STATUS_SUCCESS;
339 }
340 }; // namespace encode
341
342 return MOS_STATUS_SUCCESS;
343 }
344
SetVdencCmd2Settings()345 MOS_STATUS EncodeVp9VdencConstSettings::SetVdencCmd2Settings()
346 {
347 ENCODE_FUNC_CALL();
348 ENCODE_CHK_NULL_RETURN(m_featureSetting);
349 MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
350
351 auto setting = static_cast<Vp9VdencFeatureSettings*>(m_featureSetting);
352 ENCODE_CHK_NULL_RETURN(setting);
353
354 #if _MEDIA_RESERVED
355 #define VDENC_CMD2_SETTINGS_EXT
356 #include "encode_vp9_vdenc_const_settings_ext.h"
357 #undef VDENC_CMD2_SETTINGS_EXT
358 #else
359 setting->vdencCmd2Settings.emplace_back(
360 VDENC_CMD2_LAMBDA() {
361 par.extSettings.emplace_back(
362 [this, &par](uint32_t* data) {
363
364 uint32_t TargetUsagediv3 = m_vp9SeqParams->TargetUsage / 3;
365 uint32_t l0RefNum = par.numRefL0;
366
367 static const uint32_t dw2Lut[3] = { 0x3, 0x3, 0x20000003,};
368 data[2] |= dw2Lut[TargetUsagediv3];
369
370 static const uint32_t dw5Lut = 0xc0ac00;
371 data[5] |= dw5Lut;
372
373 static const uint32_t dw6Lut = 0x20080200;
374 data[6] |= dw6Lut;
375
376 static const uint32_t dw7Lut[4] = { 0xe2000, 0xe2000, 0x62000, 0x62000,};
377 data[7] |= dw7Lut[l0RefNum];
378
379 static const uint32_t dw9Lut[3] = { 0xc40000, 0x840000, 0x420000,};
380 data[9] |= dw9Lut[TargetUsagediv3];
381
382 static const uint32_t dw12Lut = 0xffffffff;
383 data[12] |= dw12Lut;
384
385 static const uint32_t dw14Lut = 0x1f40000;
386 data[14] |= dw14Lut;
387
388 static const uint32_t dw15Lut = 0x138807d0;
389 data[15] |= dw15Lut;
390
391 static const uint32_t dw16Lut = 0xf000000;
392 data[16] |= dw16Lut;
393
394 static const uint32_t dw17Lut = 0x2710;
395 data[17] |= dw17Lut;
396
397 static const uint32_t dw18Lut = 0x80000;
398 data[18] |= dw18Lut;
399
400 static const uint32_t dw19Lut = 0x18000040;
401 data[19] |= dw19Lut;
402
403 static const uint32_t dw23Lut = 0x6a1a0000;
404 data[23] |= dw23Lut;
405
406 static const uint32_t dw28Lut = 0x7d00fa0;
407 data[28] |= dw28Lut;
408
409 static const uint32_t dw29Lut = 0x2bc0bb8;
410 data[29] |= dw29Lut;
411
412 static const uint32_t dw30Lut = 0x32003e8;
413 data[30] |= dw30Lut;
414
415 static const uint32_t dw31Lut = 0x1f4012c;
416 data[31] |= dw31Lut;
417
418 static const uint32_t dw32Lut = 0x55220190;
419 data[32] |= dw32Lut;
420
421 static const uint32_t dw33Lut = 0x22552222;
422 data[33] |= dw33Lut;
423
424 static const uint32_t dw34Lut = 0x225522;
425 data[34] |= dw34Lut;
426
427 static const uint32_t dw35Lut = 0x800;
428 data[35] |= dw35Lut;
429
430 static const uint32_t dw51Lut[3] = { 0x33331502, 0x22333102, 0x12227256,};
431 data[51] |= dw51Lut[TargetUsagediv3];
432
433 static const uint32_t dw52Lut[3] = { 0x77f5bdb, 0x72d5949, 0x9295a5a,};
434 data[52] |= dw52Lut[TargetUsagediv3];
435
436 static const uint32_t dw53Lut[3] = { 0xffffffff, 0xfff0ffff, 0xffffffff,};
437 data[53] |= dw53Lut[TargetUsagediv3];
438
439 static const uint32_t dw54Lut[3] = { 0, 0xc4000000, 0xbc00000c,};
440 data[54] |= dw54Lut[TargetUsagediv3];
441
442 return MOS_STATUS_SUCCESS;
443 });
444
445 return MOS_STATUS_SUCCESS;
446 });
447 #endif // _MEDIA_RESERVED
448
449 return eStatus;
450 }
451
SetBrcSettings()452 MOS_STATUS EncodeVp9VdencConstSettings::SetBrcSettings()
453 {
454 return MOS_STATUS_SUCCESS;
455 }
456 } // namespace encode
457