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