1 /*
2 * Copyright (c) 2011-2020, 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     codechal_encode_avc.cpp
24 //! \brief    This file implements the base C++ class/interface for AVC DualPipe encoding
25 //!           to be used across CODECHAL components.
26 //!
27 
28 #include "codechal_encode_avc.h"
29 #include "codechal_encode_wp.h"
30 #include "codeckrnheader.h"
31 #include "hal_oca_interface.h"
32 
33 #define CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_POCS_IN_DPB_LIST_SIZE       128
34 #define CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_POCS_IN_FINAL_LIST_SIZE     128
35 #define CODECHAL_ENCODE_AVC_CQP_NUM_OF_PASSES                               2       // 1 additional pass for IPCM
36 #define CODECHAL_ENCODE_AVC_ICQ_NUM_OF_PASSES                               2       // 1 additional pass for IPCM
37 #define CODECHAL_ENCODE_AVC_DEFAULT_TRELLIS_QUANT_ROUNDING                  6
38 #define CODECHAL_ENCODE_AVC_SEI_BUFFER_SIZE                                 10240   // 10K is just estimation
39 #define CODECHAL_ENCODE_AVC_SFD_COST_TABLE_BUFFER_SIZE_COMMON               52
40 #define CODECHAL_ENCODE_AVC_SKIP_BIAS_ADJUSTMENT_QP_THRESHOLD               22
41 #define CODECHAL_ENCODE_AVC_HME_FIRST_STEP                                  0
42 #define CODECHAL_ENCODE_AVC_HME_FOLLOWING_STEP                              1
43 #define CODECHAL_ENCODE_AVC_MV_SHIFT_FACTOR_32x                             1
44 #define CODECHAL_ENCODE_AVC_MV_SHIFT_FACTOR_16x                             2
45 #define CODECHAL_ENCODE_AVC_MV_SHIFT_FACTOR_4x                              2
46 #define CODECHAL_ENCODE_AVC_PREV_MV_READ_POSITION_16x                       1
47 #define CODECHAL_ENCODE_AVC_PREV_MV_READ_POSITION_4x                        0
48 #define CODECHAL_ENCODE_AVC_DEFAULT_TRELLIS_QUANT_INTRA_ROUNDING            5
49 
50 const uint32_t CodechalEncodeAvcEnc::MaxLenSP[NUM_TARGET_USAGE_MODES] =
51 {
52     0, 57, 57, 25, 25, 25, 16, 9
53 };
54 
55 const uint32_t CodechalEncodeAvcEnc::FTQBasedSkip[NUM_TARGET_USAGE_MODES] =
56 {
57     0, 3, 3, 3, 3, 3, 3, 0
58 };
59 
60 const uint32_t CodechalEncodeAvcEnc::HMEBCombineLen[NUM_TARGET_USAGE_MODES] =
61 {
62     0, 8, 8, 8, 8, 8, 8, 8
63 };
64 
65 const uint32_t CodechalEncodeAvcEnc::HMECombineLen[NUM_TARGET_USAGE_MODES] =
66 {
67     0, 8, 8, 8, 8, 8, 16, 8
68 };
69 
70 const uint32_t CodechalEncodeAvcEnc::SearchX[NUM_TARGET_USAGE_MODES] =
71 {
72     0, 48, 48, 48, 48, 48, 48, 28
73 };
74 
75 const uint32_t CodechalEncodeAvcEnc::SearchY[NUM_TARGET_USAGE_MODES] =
76 {
77     0, 40, 40, 40, 40, 40, 40, 28
78 };
79 
80 const uint32_t CodechalEncodeAvcEnc::BSearchX[NUM_TARGET_USAGE_MODES] =
81 {
82     0, 32, 32, 32, 32, 32, 32, 24
83 };
84 
85 const uint32_t CodechalEncodeAvcEnc::BSearchY[NUM_TARGET_USAGE_MODES] =
86 {
87     0, 32, 32, 32, 32, 32, 32, 24
88 };
89 
90 const uint32_t CodechalEncodeAvcEnc::EnableAdaptiveSearch[NUM_TARGET_USAGE_MODES] =
91 {
92     0, 1, 1, 1, 1, 1, 0, 0
93 };
94 
95 const uint32_t CodechalEncodeAvcEnc:: InterRoundingP_TQ[NUM_TARGET_USAGE_MODES] =
96 {
97     0, 3, 3, 3, 3, 3, 3, 3
98 };
99 
100 const uint32_t CodechalEncodeAvcEnc:: InterRoundingBRef_TQ[NUM_TARGET_USAGE_MODES] =
101 {
102     0, 2, 2, 2, 2, 2, 2, 2
103 };
104 
105 const uint32_t CodechalEncodeAvcEnc:: InterRoundingB_TQ[NUM_TARGET_USAGE_MODES] =
106 {
107     0, 0, 0, 0, 0, 0, 0, 0
108 };
109 
110 const uint32_t CodechalEncodeAvcEnc:: TrellisQuantizationEnable[NUM_TARGET_USAGE_MODES] =
111 {
112     0, 1, 0, 0, 0, 0, 0, 0
113 };
114 
115 const uint32_t CodechalEncodeAvcEnc:: EnableAdaptiveTrellisQuantization[NUM_TARGET_USAGE_MODES] =
116 {
117     0, 1, 0, 0, 0, 0, 0, 0
118 };
119 
120 // Lambda values for Trellis Quantization
121 const uint32_t CodechalEncodeAvcEnc::TQ_LAMBDA_I_FRAME[CODEC_AVC_NUM_QP][2] =
122 {
123     {0x00070000, 0x00060000},
124     {0x00080000, 0x00080000},
125     {0x000a0000, 0x00090000},
126     {0x000d0000, 0x000c0000},
127     {0x00110000, 0x000f0000},
128     {0x00150000, 0x00130000},
129     {0x001b0000, 0x00180000},
130     {0x00220000, 0x001f0000},
131     {0x002b0000, 0x00270000},
132     {0x00360000, 0x00310000},
133     {0x00440000, 0x003e0000},
134     {0x00550000, 0x004e0000},
135     {0x006c0000, 0x00630000},
136     {0x00870000, 0x007d0000},
137     {0x00ab0000, 0x009d0000},
138     {0x00d70000, 0x00c70000},
139     {0x010f0000, 0x00fb0000},
140     {0x01560000, 0x013d0000},
141     {0x01af0000, 0x01900000},
142     {0x021f0000, 0x01f90000},
143     {0x02ac0000, 0x027e0000},
144     {0x035e0000, 0x03260000},
145     {0x043e0000, 0x03fa0000},
146     {0x057a0000, 0x05070000},
147     {0x06f90000, 0x065a0000},
148     {0x08770000, 0x08060000},
149     {0x0af50000, 0x0a240000},
150     {0x0d720000, 0x0cd10000},
151     {0x10ef0000, 0x10340000},
152     {0x156a0000, 0x147b0000},
153     {0x1ae50000, 0x19e50000},
154     {0x225d0000, 0x20be0000},
155     {0x2ad50000, 0x29670000},
156     {0x36490000, 0x345c0000},
157     {0x443b0000, 0x423a0000},
158     {0x56290000, 0x53c50000},
159     {0x6c930000, 0x69f90000},
160     {0x88770000, 0x86130000},
161     {0xabd30000, 0xa9a40000},
162     {0xd8a60000, 0xd6aa0000},
163 
164     // Rounding offsets
165     {0xfffa0000, 0xfffa0000},
166     {0xfffa0000, 0xfffa0000},
167     {0xfffa0000, 0xfffa0000},
168     {0xfffa0000, 0xfffa0000},
169     {0xfffa0000, 0xfffa0000},
170     {0xfffa0000, 0xfffa0000},
171     {0xfffa0000, 0xfffa0000},
172     {0xfffa0000, 0xfffa0000},
173     {0xfffa0000, 0xfffa0000},
174     {0xfffa0000, 0xfffa0000},
175     {0xfffa0000, 0xfffa0000},
176     {0xfffa0000, 0xfffa0000}
177 };
178 
179 const uint32_t CodechalEncodeAvcEnc::TQ_LAMBDA_P_FRAME[CODEC_AVC_NUM_QP][2] =
180 {
181     {0x00070009, 0x00060009},
182     {0x0008000c, 0x0008000c},
183     {0x000a000f, 0x0009000f},
184     {0x000d0013, 0x000c0013},
185     {0x00110018, 0x000f0018},
186     {0x0015001e, 0x0013001e},
187     {0x001b0026, 0x00180026},
188     {0x00220030, 0x001f0030},
189     {0x002b003c, 0x0027003c},
190     {0x0036004c, 0x0031004c},
191     {0x00440060, 0x003e0060},
192     {0x00550079, 0x004e0079},
193     {0x006c0099, 0x00630099},
194     {0x008700c1, 0x007d00c1},
195     {0x00ab00f3, 0x009d00f3},
196     {0x00d70132, 0x00c70133},
197     {0x010f0181, 0x00fb0183},
198     {0x015601e5, 0x013d01e8},
199     {0x01af0264, 0x01900268},
200     {0x021f0303, 0x01f90309},
201     {0x02ac03cb, 0x027e03d5},
202     {0x035e04c8, 0x032604d5},
203     {0x043e0606, 0x03fa061a},
204     {0x057a07c7, 0x050707b3},
205     {0x06f909e6, 0x065a09b8},
206     {0x08770c05, 0x08060c45},
207     {0x0af50f8e, 0x0a240f7e},
208     {0x0d721317, 0x0cd1138f},
209     {0x10ef180a, 0x103418b2},
210     {0x156a1e67, 0x147b1f30},
211     {0x1ae5262e, 0x19e52762},
212     {0x225d30c9, 0x20be31bd},
213     {0x2ad53cce, 0x29673ed2},
214     {0x36494d11, 0x345c4f59},
215     {0x443b60dd, 0x423a643c},
216     {0x56297a51, 0x53c57e9f},
217     {0x6c939a22, 0x69f99ff9},
218     {0x8877c1ba, 0x8613ca1e},
219     {0xabd3ffef, 0xa9a4ffef},
220     {0xd8a6ffef, 0xd6aaffef},
221     {0xfffaffef, 0xfffaffef},
222     {0xfffaffef, 0xfffaffef},
223     {0xfffaffef, 0xfffaffef},
224     {0xfffaffef, 0xfffaffef},
225     {0xfffaffef, 0xfffaffef},
226     {0xfffaffef, 0xfffaffef},
227     {0xfffaffef, 0xfffaffef},
228     {0xfffaffef, 0xfffaffef},
229     {0xfffaffef, 0xfffaffef},
230     {0xfffaffef, 0xfffaffef},
231     {0xfffaffef, 0xfffaffef},
232     {0xfffaffef, 0xfffaffef}
233 };
234 
235 const uint32_t CodechalEncodeAvcEnc::TQ_LAMBDA_B_FRAME[CODEC_AVC_NUM_QP][2] =
236 {
237     {0x00070009, 0x00060009},
238     {0x0008000c, 0x0008000c},
239     {0x000a000f, 0x0009000f},
240     {0x000d0013, 0x000c0013},
241     {0x00110018, 0x000f0018},
242     {0x0015001e, 0x0013001e},
243     {0x001b0026, 0x00180026},
244     {0x00220030, 0x001f0030},
245     {0x002b003c, 0x0027003c},
246     {0x0036004c, 0x0031004c},
247     {0x00440060, 0x003e0060},
248     {0x00550079, 0x004e0079},
249     {0x006c0099, 0x00630099},
250     {0x008700c1, 0x007d00c1},
251     {0x00ab00f3, 0x009d00f3},
252     {0x00d70132, 0x00c70133},
253     {0x010f0181, 0x00fb0183},
254     {0x015601e5, 0x013d01e8},
255     {0x01af0264, 0x01900268},
256     {0x021f0303, 0x01f90309},
257     {0x02ac03cb, 0x027e03d5},
258     {0x035e04c8, 0x032604d5},
259     {0x043e0606, 0x03fa061a},
260     {0x057a07c7, 0x050707b3},
261     {0x06f909e6, 0x065a09b8},
262     {0x08770c05, 0x08060c45},
263     {0x0af50f8e, 0x0a240f7e},
264     {0x0d721317, 0x0cd1138f},
265     {0x10ef180a, 0x103418b2},
266     {0x156a1e67, 0x147b1f30},
267     {0x1ae5262e, 0x19e52762},
268     {0x225d30c9, 0x20be31bd},
269     {0x2ad53cce, 0x29673ed2},
270     {0x36494d11, 0x345c4f59},
271     {0x443b60dd, 0x423a643c},
272     {0x56297a51, 0x53c57e9f},
273     {0x6c939a22, 0x69f99ff9},
274     {0x8877c1ba, 0x8613ca1e},
275     {0xabd3ffef, 0xa9a4ffef},
276     {0xd8a6ffef, 0xd6aaffef},
277     {0xfffaffef, 0xfffaffef},
278     {0xfffaffef, 0xfffaffef},
279     {0xfffaffef, 0xfffaffef},
280     {0xfffaffef, 0xfffaffef},
281     {0xfffaffef, 0xfffaffef},
282     {0xfffaffef, 0xfffaffef},
283     {0xfffaffef, 0xfffaffef},
284     {0xfffaffef, 0xfffaffef},
285     {0xfffaffef, 0xfffaffef},
286     {0xfffaffef, 0xfffaffef},
287     {0xfffaffef, 0xfffaffef},
288     {0xfffaffef, 0xfffaffef}
289 };
290 
291 typedef enum _CODECHAL_ENCODE_AVC_BINDING_TABLE_OFFSET_ME_CM
292 {
293     CODECHAL_ENCODE_AVC_ME_MV_DATA_SURFACE_CM = 0,
294     CODECHAL_ENCODE_AVC_16xME_MV_DATA_SURFACE_CM = 1,
295     CODECHAL_ENCODE_AVC_32xME_MV_DATA_SURFACE_CM = 1,
296     CODECHAL_ENCODE_AVC_ME_DISTORTION_SURFACE_CM = 2,
297     CODECHAL_ENCODE_AVC_ME_BRC_DISTORTION_CM = 3,
298     CODECHAL_ENCODE_AVC_ME_RESERVED0_CM = 4,
299     CODECHAL_ENCODE_AVC_ME_CURR_FOR_FWD_REF_CM = 5,
300     CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX0_CM = 6,
301     CODECHAL_ENCODE_AVC_ME_RESERVED1_CM = 7,
302     CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX1_CM = 8,
303     CODECHAL_ENCODE_AVC_ME_RESERVED2_CM = 9,
304     CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX2_CM = 10,
305     CODECHAL_ENCODE_AVC_ME_RESERVED3_CM = 11,
306     CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX3_CM = 12,
307     CODECHAL_ENCODE_AVC_ME_RESERVED4_CM = 13,
308     CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX4_CM = 14,
309     CODECHAL_ENCODE_AVC_ME_RESERVED5_CM = 15,
310     CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX5_CM = 16,
311     CODECHAL_ENCODE_AVC_ME_RESERVED6_CM = 17,
312     CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX6_CM = 18,
313     CODECHAL_ENCODE_AVC_ME_RESERVED7_CM = 19,
314     CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX7_CM = 20,
315     CODECHAL_ENCODE_AVC_ME_RESERVED8_CM = 21,
316     CODECHAL_ENCODE_AVC_ME_CURR_FOR_BWD_REF_CM = 22,
317     CODECHAL_ENCODE_AVC_ME_BWD_REF_IDX0_CM = 23,
318     CODECHAL_ENCODE_AVC_ME_RESERVED9_CM = 24,
319     CODECHAL_ENCODE_AVC_ME_BWD_REF_IDX1_CM = 25,
320     CODECHAL_ENCODE_AVC_ME_VDENC_STREAMIN_CM = 26,
321     CODECHAL_ENCODE_AVC_ME_NUM_SURFACES_CM = 27
322 } CODECHAL_ENCODE_AVC_BINDING_TABLE_OFFSET_ME_CM;
323 
324 // binding table for State Content Detection
325 typedef enum _CODECHAL_ENCODE_AVC_BINDING_TABLE_OFFSET_SFD_COMMON
326 {
327     CODECHAL_ENCODE_AVC_SFD_VDENC_INPUT_IMAGE_STATE_COMMON = 0,
328     CODECHAL_ENCODE_AVC_SFD_MV_DATA_SURFACE_COMMON = 1,
329     CODECHAL_ENCODE_AVC_SFD_INTER_DISTORTION_SURFACE_COMMON = 2,
330     CODECHAL_ENCODE_AVC_SFD_OUTPUT_DATA_SURFACE_COMMON = 3,
331     CODECHAL_ENCODE_AVC_SFD_VDENC_OUTPUT_IMAGE_STATE_COMMON = 4,
332     CODECHAL_ENCODE_AVC_SFD_NUM_SURFACES = 5
333 } CODECHAL_ENCODE_AVC_BINDING_TABLE_OFFSET_SFD_COMMON;
334 
335 // QP is from 0 - 51, pad it to 64 since BRC needs array size to be 64 bytes
336 const uint8_t CodechalEncodeAvcEnc::IntraScalingFactor_Cm_Common[64] =
337 {
338     0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
339     0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
340     0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x10, 0x10, 0x10,
341     0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
342     0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
343     0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
344     0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
345     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
346 };
347 
348 // QP is from 0 - 51, pad it to 64 since BRC needs array size to be 64 bytes
349 const uint8_t CodechalEncodeAvcEnc::AdaptiveIntraScalingFactor_Cm_Common[64] =
350 {
351     0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
352     0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c,
353     0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e,
354     0x0e, 0x0e, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
355     0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
356     0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
357     0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
358     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
359 };
360 
361 const uint32_t CodechalEncodeAvcEnc::OldIntraModeCost_Cm_Common[CODEC_AVC_NUM_QP] =
362 {
363     0x1e03000a, 0x1e03000a, 0x1e03000a, 0x1e03000a, 0x1e03000a, 0x1e03000a, 0x1e03000a, 0x1e03000a,
364     0x1e03000a, 0x1e03000a, 0x1e03000a, 0x1e03000a, 0x1e03000a, 0x1e03000a, 0x1e03000a, 0x1e03000a,
365     0x2e06001a, 0x2e06001a, 0x2e06001a, 0x2e06001a, 0x3b09001f, 0x3b09001f, 0x3b09001f, 0x3e0c002a,
366     0x3e0c002a, 0x3e0c002a, 0x490f002d, 0x4b19002f, 0x4b19002f, 0x4c1b0039, 0x4e1c003a, 0x581e003b,
367     0x591f003d, 0x5a28003e, 0x5b2a0048, 0x5c2b0049, 0x5e2c004a, 0x682e004b, 0x692f004d, 0x6a39004e,
368     0x6b390058, 0x6d3b0059, 0x6e3c005a, 0x783e005b, 0x793f005d, 0x7a48005e, 0x7b4a0068, 0x7c4b0069,
369     0x7e4c006a, 0x884e006b, 0x894f006d, 0x8a59006e
370 };
371 
372 const uint32_t CodechalEncodeAvcEnc::MvCost_PSkipAdjustment_Cm_Common[CODEC_AVC_NUM_QP] =
373 {
374     0x09060500, 0x09060500, 0x09060500, 0x09060500, 0x09060500, 0x09060500, 0x09060500, 0x09060500,
375     0x09060500, 0x09060500, 0x09060500, 0x09060500, 0x09060500, 0x09060500, 0x09060500, 0x09060500,
376     0x190c0a00, 0x190c0a00, 0x190c0a00, 0x190c0a00, 0x1e190f00, 0x1e190f00, 0x1e190f00, 0x291c1a00,
377     0x291c1a00, 0x291c1a00, 0x2b1f1d00, 0x2e291f00, 0x2e291f00, 0x382b2900, 0x392c2a00, 0x3a2e2b00,
378     0x3b2f2d00, 0x3c382e00, 0x3f3a3800, 0x483b3900, 0x493c3a00, 0x4a3e3b00, 0x4b3f3d00, 0x4d493e00,
379     0x4e494800, 0x584b4900, 0x594c4a00, 0x5a4e4b00, 0x5b4f4d00, 0x5d584e00, 0x5e5a5800, 0x685b5900,
380     0x695c5a00, 0x6a5e5b00, 0x6b5f5d00, 0x6d695e00
381 };
382 
383 const uint16_t CodechalEncodeAvcEnc::SkipVal_B_Common[2][2][64] =
384 {
385     {
386         // Block Based Skip = 0 and Transform Flag = 0
387         {
388             0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0024,
389             0x0024, 0x0060, 0x0060, 0x0099, 0x0099, 0x00cf, 0x00cf, 0x0105,
390             0x0105, 0x0141, 0x0141, 0x0183, 0x0183, 0x01ce, 0x01ce, 0x0228,
391             0x0228, 0x0291, 0x0291, 0x030c, 0x030c, 0x039f, 0x039f, 0x0447,
392             0x0447, 0x050d, 0x050d, 0x05f1, 0x05f1, 0x06f6, 0x06f6, 0x0822,
393             0x0822, 0x0972, 0x0972, 0x0aef, 0x0aef, 0x0c96, 0x0c96, 0x0e70,
394             0x0e70, 0x107a, 0x107a, 0x1284, 0x0000, 0x0000, 0x0000, 0x0000,
395             0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
396         },
397     // Block Based Skip = 0 and Transform Flag = 1
398         {
399             0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0024,
400             0x0024, 0x0060, 0x0060, 0x0099, 0x0099, 0x00cf, 0x00cf, 0x0105,
401             0x0105, 0x0141, 0x0141, 0x0183, 0x0183, 0x01ce, 0x01ce, 0x0228,
402             0x0228, 0x0291, 0x0291, 0x030c, 0x030c, 0x039f, 0x039f, 0x0447,
403             0x0447, 0x050d, 0x050d, 0x05f1, 0x05f1, 0x06f6, 0x06f6, 0x0822,
404             0x0822, 0x0972, 0x0972, 0x0aef, 0x0aef, 0x0c96, 0x0c96, 0x0e70,
405             0x0e70, 0x107a, 0x107a, 0x1284, 0x0000, 0x0000, 0x0000, 0x0000,
406             0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
407         }
408     },
409     {
410         // Block Based Skip = 1 and Transform Flag = 0
411         {
412             0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006,
413             0x0006, 0x0010, 0x0010, 0x0019, 0x0019, 0x0022, 0x0022, 0x002b,
414             0x002b, 0x0035, 0x0035, 0x0040, 0x0040, 0x004d, 0x004d, 0x005c,
415             0x005c, 0x006d, 0x006d, 0x0082, 0x0082, 0x009a, 0x009a, 0x00b6,
416             0x00b6, 0x00d7, 0x00d7, 0x00fd, 0x00fd, 0x0129, 0x0129, 0x015b,
417             0x015b, 0x0193, 0x0193, 0x01d2, 0x01d2, 0x0219, 0x0219, 0x0268,
418             0x0268, 0x02bf, 0x02bf, 0x0316, 0x0000, 0x0000, 0x0000, 0x0000,
419             0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
420         },
421     // Block Based Skip = 1 and Transform Flag = 1
422         {
423             0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000c,
424             0x000c, 0x0020, 0x0020, 0x0033, 0x0033, 0x0045, 0x0045, 0x0057,
425             0x0057, 0x006b, 0x006b, 0x0081, 0x0081, 0x009a, 0x009a, 0x00b8,
426             0x00b8, 0x00db, 0x00db, 0x0104, 0x0104, 0x0135, 0x0135, 0x016d,
427             0x016d, 0x01af, 0x01af, 0x01fb, 0x01fb, 0x0252, 0x0252, 0x02b6,
428             0x02b6, 0x0326, 0x0326, 0x03a5, 0x03a5, 0x0432, 0x0432, 0x04d0,
429             0x04d0, 0x057e, 0x057e, 0x062c, 0x0000, 0x0000, 0x0000, 0x0000,
430             0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
431         }
432     }
433 };
434 
435 // AVC MBEnc SkipVal Table, index [BlockBasedSkip][TransformFlag][SliceQP]
436 // QP is from 0 - 51, pad it to 64 since BRC needs each subarray size to be 128bytes.
437 const uint16_t CodechalEncodeAvcEnc::SkipVal_P_Common[2][2][64] =
438 {
439     {
440         // Block Based Skip = 0 and Transform Flag = 0
441         {
442             0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006,
443             0x0006, 0x000c, 0x000c, 0x0015, 0x0015, 0x0021, 0x0021, 0x0033,
444             0x0033, 0x004b, 0x004b, 0x0069, 0x0069, 0x0096, 0x0096, 0x00cc,
445             0x00cc, 0x0111, 0x0111, 0x0165, 0x0165, 0x01cb, 0x01cb, 0x0246,
446             0x0246, 0x02d3, 0x02d3, 0x0378, 0x0378, 0x0438, 0x0438, 0x0510,
447             0x0510, 0x0603, 0x0603, 0x0714, 0x0714, 0x0846, 0x0846, 0x0999,
448             0x0999, 0x0b10, 0x0b10, 0x0c3c, 0x0000, 0x0000, 0x0000, 0x0000,
449             0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
450         },
451 
452     // Block Based Skip = 0 and Transform Flag = 1
453         {
454             0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006,
455             0x0006, 0x000c, 0x000c, 0x0015, 0x0015, 0x0021, 0x0021, 0x0033,
456             0x0033, 0x004b, 0x004b, 0x0069, 0x0069, 0x0096, 0x0096, 0x00cc,
457             0x00cc, 0x0111, 0x0111, 0x0165, 0x0165, 0x01cb, 0x01cb, 0x0246,
458             0x0246, 0x02d3, 0x02d3, 0x0378, 0x0378, 0x0438, 0x0438, 0x0510,
459             0x0510, 0x0603, 0x0603, 0x0714, 0x0714, 0x0846, 0x0846, 0x0999,
460             0x0999, 0x0b10, 0x0b10, 0x0c3c, 0x0000, 0x0000, 0x0000, 0x0000,
461             0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
462         }
463     },
464     {
465         // Block Based Skip = 1 and Transform Flag = 0
466         {
467             0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001,
468             0x0001, 0x0002, 0x0002, 0x0003, 0x0003, 0x0005, 0x0005, 0x0008,
469             0x0008, 0x000c, 0x000c, 0x0011, 0x0011, 0x0019, 0x0019, 0x0022,
470             0x0022, 0x002d, 0x002d, 0x003b, 0x003b, 0x004c, 0x004c, 0x0061,
471             0x0061, 0x0078, 0x0078, 0x0094, 0x0094, 0x00b4, 0x00b4, 0x00d8,
472             0x00d8, 0x0100, 0x0100, 0x012e, 0x012e, 0x0161, 0x0161, 0x0199,
473             0x0199, 0x01d8, 0x01d8, 0x020a, 0x0000, 0x0000, 0x0000, 0x0000,
474             0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
475         },
476 
477     // Block Based Skip = 1 and Transform Flag = 1
478         {
479             0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002,
480             0x0002, 0x0004, 0x0004, 0x0007, 0x0007, 0x000b, 0x000b, 0x0011,
481             0x0011, 0x0019, 0x0019, 0x0023, 0x0023, 0x0032, 0x0032, 0x0044,
482             0x0044, 0x005b, 0x005b, 0x0077, 0x0077, 0x0099, 0x0099, 0x00c2,
483             0x00c2, 0x00f1, 0x00f1, 0x0128, 0x0128, 0x0168, 0x0168, 0x01b0,
484             0x01b0, 0x0201, 0x0201, 0x025c, 0x025c, 0x02c2, 0x02c2, 0x0333,
485             0x0333, 0x03b0, 0x03b0, 0x0414, 0x0000, 0x0000, 0x0000, 0x0000,
486             0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
487         }
488     }
489 };
490 
491 const uint32_t CodechalEncodeAvcEnc::PreProcFtqLut_Cm_Common[CODEC_AVC_NUM_QP][16] =
492 {
493     //ModeCOST(0), ModeCOST(1), ModeCOST(2), MVCOST(3),   MVCOST(4),   QP(5),       FTQ Thds(6), FTQ Thds(7), RefCost(8),  SkipVal(9),  IntraSF(10) ,Zero(11),  Zero(12),   Zero(13),   Zero(14) ,  Zero(15)
494     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff000000,  0x00000000,  0x00000000,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
495     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff010101,  0x00000000,  0x00000000,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
496     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff020202,  0x00000000,  0x00000000,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
497     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff030303,  0x00000000,  0x00000000,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
498     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff040404,  0x00000000,  0x00000000,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
499     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff050505,  0x00000000,  0x00000000,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
500     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff060606,  0x00000000,  0x00000000,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
501     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff070707,  0x01010001,  0x01010101,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
502     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff080808,  0x01010001,  0x01010101,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
503     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff090909,  0x03030003,  0x03030303,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
504     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff0a0a0a,  0x03030003,  0x03030303,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
505     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff0b0b0b,  0x06060006,  0x06060606,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
506     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff0c0c0c,  0x06060006,  0x06060606,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
507     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff0d0d0d,  0x08080008,  0x08080808,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
508     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff0e0e0e,  0x08080008,  0x08080808,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
509     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff0f0f0f,  0x0b0b000b,  0x0b0b0b0b,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
510     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff101010,  0x0b0b000b,  0x0b0b0b0b,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
511     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff111111,  0x0d0d000d,  0x0d0d0d0d,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
512     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff121212,  0x0d0d000d,  0x0d0d0d0d,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
513     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff131313,  0x10100010,  0x10101010,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
514     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff141414,  0x10100010,  0x10101010,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
515     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff151515,  0x13130013,  0x13131313,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
516     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff161616,  0x13130013,  0x13131313,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
517     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff171717,  0x16160016,  0x16161616,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
518     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff181818,  0x16160016,  0x16161616,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
519     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff191919,  0x1a1a001a,  0x1a1a1a1a,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
520     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff1a1a1a,  0x1a1a001a,  0x1a1a1a1a,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
521     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff1b1b1b,  0x1e1e001e,  0x1e1e1e1e,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
522     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff1c1c1c,  0x1e1e001e,  0x1e1e1e1e,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
523     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff1d1d1d,  0x22220022,  0x22222222,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
524     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff1e1e1e,  0x22220022,  0x22222222,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
525     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff1f1f1f,  0x27270027,  0x27272727,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
526     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff202020,  0x27270027,  0x27272727,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
527     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff212121,  0x2c2c002c,  0x2c2c2c2c,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
528     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff222222,  0x2c2c002c,  0x2c2c2c2c,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
529     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff232323,  0x32320032,  0x32323232,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
530     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff242424,  0x32320032,  0x32323232,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
531     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff252525,  0x38380038,  0x38383838,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
532     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff262626,  0x38380038,  0x38383838,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
533     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff272727,  0x3e3e003e,  0x3e3e3e3e,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
534     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff282828,  0x3e3e003e,  0x3e3e3e3e,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
535     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff292929,  0x45450045,  0x45454545,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
536     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff2a2a2a,  0x45450045,  0x45454545,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
537     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff2b2b2b,  0x4d4d004d,  0x4d4d4d4d,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
538     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff2c2c2c,  0x4d4d004d,  0x4d4d4d4d,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
539     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff2d2d2d,  0x55550055,  0x55555555,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
540     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff2e2e2e,  0x55550055,  0x55555555,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
541     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff2f2f2f,  0x5e5e005e,  0x5e5e5e5e,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
542     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff303030,  0x5e5e005e,  0x5e5e5e5e,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
543     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff313131,  0x68680068,  0x68686868,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
544     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff323232,  0x68680068,  0x68686868,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
545     { 0x00000000,   0x00000000,  0x00000000,  0x00000000,  0x00000000,  0xff333333,  0x73730073,  0x73737373,  0x00000000,  0x00000000,  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }
546 };
547 
548 // SkipVal (DW offset 9) in the following table needs to be changed by Driver based on the BlockbasedSkip and Transform Flag.
549 // Kernel indexes this table based on the MB QP. it's different with g75, but mainline did not support g75 anymore
550 const uint32_t CodechalEncodeAvcEnc::MBBrcConstantData_Cm_Common[3][CODEC_AVC_NUM_QP][16] =
551 {
552     //I-slice
553     {
554         //ModeCOST(0), ModeCOST(1), ModeCOST(2), MVCOST(3),   MVCOST(4),   QP(5),       FTQ Thds(6), FTQ Thds(7), RefCost(8),  SkipVal(9),  IntraSF(10) ,Zero(11),  Zero(12),   Zero(13),   Zero(14) ,  Zero(15)
555         { 0x0d000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
556         { 0x0f000004, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff010101, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
557         { 0x19000004, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff020202, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
558         { 0x1a000005, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff030303, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
559         { 0x1b000005, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff040404, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
560         { 0x1c000006, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff050505, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
561         { 0x1e000007, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff060606, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
562         { 0x28000008, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff070707, 0x01010001, 0x01010101, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
563         { 0x29000009, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff080808, 0x01010001, 0x01010101, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
564         { 0x2a00000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff090909, 0x03030003, 0x03030303, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
565         { 0x2b00000b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0a0a0a, 0x03030003, 0x03030303, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
566         { 0x2c00000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0b0b0b, 0x06060006, 0x06060606, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
567         { 0x2e00000e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0c0c0c, 0x06060006, 0x06060606, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
568         { 0x38000018, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0d0d0d, 0x08080008, 0x08080808, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
569         { 0x39000019, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0e0e0e, 0x08080008, 0x08080808, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
570         { 0x3a00001b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0f0f0f, 0x0b0b000b, 0x0b0b0b0b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
571         { 0x3b00001c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff101010, 0x0b0b000b, 0x0b0b0b0b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
572         { 0x3c00001d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff111111, 0x0d0d000d, 0x0d0d0d0d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
573         { 0x3e00001f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff121212, 0x0d0d000d, 0x0d0d0d0d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
574         { 0x48020028, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff131313, 0x10100010, 0x10101010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
575         { 0x49020029, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff141414, 0x10100010, 0x10101010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
576         { 0x4a03002a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff151515, 0x13130013, 0x13131313, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
577         { 0x4b03002b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff161616, 0x13130013, 0x13131313, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
578         { 0x4c04002b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff171717, 0x16160016, 0x16161616, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
579         { 0x4e04002c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff181818, 0x16160016, 0x16161616, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
580         { 0x5805002e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff191919, 0x1a1a001a, 0x1a1a1a1a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
581         { 0x5905002f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1a1a1a, 0x1a1a001a, 0x1a1a1a1a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
582         { 0x5a06002e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1b1b1b, 0x1e1e001e, 0x1e1e1e1e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
583         { 0x5b07002f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1c1c1c, 0x1e1e001e, 0x1e1e1e1e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
584         { 0x5c080039, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1d1d1d, 0x22220022, 0x22222222, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
585         { 0x5e09003a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1e1e1e, 0x22220022, 0x22222222, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
586         { 0x6828003a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1f1f1f, 0x27270027, 0x27272727, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
587         { 0x6929003b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff202020, 0x27270027, 0x27272727, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
588         { 0x6a2a003c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff212121, 0x2c2c002c, 0x2c2c2c2c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
589         { 0x6b2c003e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff222222, 0x2c2c002c, 0x2c2c2c2c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
590         { 0x6c3a003e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff232323, 0x32320032, 0x32323232, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
591         { 0x6e3b0048, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff242424, 0x32320032, 0x32323232, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
592         { 0x783c0049, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff252525, 0x38380038, 0x38383838, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
593         { 0x793e004a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff262626, 0x38380038, 0x38383838, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
594         { 0x7a3e004b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff272727, 0x3e3e003e, 0x3e3e3e3e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
595         { 0x7b48004c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff282828, 0x3e3e003e, 0x3e3e3e3e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
596         { 0x7c49004e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff292929, 0x45450045, 0x45454545, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
597         { 0x7e4a0058, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2a2a2a, 0x45450045, 0x45454545, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
598         { 0x884d0059, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2b2b2b, 0x4d4d004d, 0x4d4d4d4d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
599         { 0x894f005a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2c2c2c, 0x4d4d004d, 0x4d4d4d4d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
600         { 0x8a58005b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2d2d2d, 0x55550055, 0x55555555, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
601         { 0x8b59005c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2e2e2e, 0x55550055, 0x55555555, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
602         { 0x8c5c005b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2f2f2f, 0x5e5e005e, 0x5e5e5e5e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
603         { 0x8e5d005c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff303030, 0x5e5e005e, 0x5e5e5e5e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
604         { 0x8f5f005d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff313131, 0x68680068, 0x68686868, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
605         { 0x8f68005f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff323232, 0x68680068, 0x68686868, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
606         { 0x8f690068, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff333333, 0x73730073, 0x73737373, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }
607     },
608     //P-slice
609     {
610         //ModeCOST(0), ModeCOST(1), ModeCOST(2), MVCOST(3),   MVCOST(4),   QP(5),       FTQ Thds(6), FTQ Thds(7), RefCost(8),  SkipVal(9),  IntraSF(10) ,Zero(11),  Zero(12),   Zero(13),   Zero(14) ,  Zero(15)
611         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
612         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff010101, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
613         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff020202, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
614         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff030303, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
615         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff040404, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
616         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff050505, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
617         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff060606, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
618         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff070707, 0x01010001, 0x01010101, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
619         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff080808, 0x01010001, 0x01010101, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
620         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff090909, 0x03030003, 0x03030303, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
621         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0a0a0a, 0x03030003, 0x03030303, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
622         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0b0b0b, 0x06060006, 0x06060606, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
623         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0c0c0c, 0x06060006, 0x06060606, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
624         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0d0d0d, 0x08080008, 0x08080808, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
625         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0e0e0e, 0x08080008, 0x08080808, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
626         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0f0f0f, 0x0b0b000b, 0x0b0b0b0b, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
627         { 0x492e2a0e, 0x0d090519, 0x0008000b, 0x190a0802, 0x1f1e1c1a, 0xff101010, 0x0b0b000b, 0x0b0b0b0b, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
628         { 0x492e2a0e, 0x0d090519, 0x0008000b, 0x190a0802, 0x1f1e1c1a, 0xff111111, 0x0d0d000d, 0x0d0d0d0d, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
629         { 0x492e2a0e, 0x0d090519, 0x0008000b, 0x190a0802, 0x1f1e1c1a, 0xff121212, 0x0d0d000d, 0x0d0d0d0d, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
630         { 0x492e2a0e, 0x0d090519, 0x0008000b, 0x190a0802, 0x1f1e1c1a, 0xff131313, 0x10100010, 0x10101010, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
631         { 0x4d3b2f1b, 0x1a0d071d, 0x000c0018, 0x1e0f0c03, 0x2b2b291f, 0xff141414, 0x10100010, 0x10101010, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
632         { 0x4d3b2f1b, 0x1a0d071d, 0x000c0018, 0x1e0f0c03, 0x2b2b291f, 0xff151515, 0x13130013, 0x13131313, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
633         { 0x4d3b2f1b, 0x1a0d071d, 0x000c0018, 0x1e0f0c03, 0x2b2b291f, 0xff161616, 0x13130013, 0x13131313, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
634         { 0x593e3a1e, 0x1d190a29, 0x0018001b, 0x291a1804, 0x2f2e2c2a, 0xff171717, 0x16160016, 0x16161616, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
635         { 0x593e3a1e, 0x1d190a29, 0x0018001b, 0x291a1804, 0x2f2e2c2a, 0xff181818, 0x16160016, 0x16161616, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
636         { 0x593e3a1e, 0x1d190a29, 0x0018001b, 0x291a1804, 0x2f2e2c2a, 0xff191919, 0x1a1a001a, 0x1a1a1a1a, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
637         { 0x5b493d29, 0x281c0d2b, 0x001a001e, 0x2b1d1a05, 0x39392f2d, 0xff1a1a1a, 0x1a1a001a, 0x1a1a1a1a, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
638         { 0x5d4b3f2b, 0x2a1e0f2d, 0x001c0028, 0x2e1f1c06, 0x3b3b392f, 0xff1b1b1b, 0x1e1e001e, 0x1e1e1e1e, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
639         { 0x5d4b3f2b, 0x2a1e0f2d, 0x001c0028, 0x2e1f1c06, 0x3b3b392f, 0xff1c1c1c, 0x1e1e001e, 0x1e1e1e1e, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
640         { 0x5f4c492c, 0x2c28192f, 0x001e002a, 0x38291e07, 0x3d3c3b39, 0xff1d1d1d, 0x22220022, 0x22222222, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
641         { 0x694e4a2e, 0x2d291b39, 0x0028002b, 0x392a2808, 0x3f3e3c3a, 0xff1e1e1e, 0x22220022, 0x22222222, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
642         { 0x6a584b38, 0x2f2a1c3a, 0x0029002c, 0x3a2b2909, 0x48483e3b, 0xff1f1f1f, 0x27270027, 0x27272727, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
643         { 0x6b594d39, 0x382c1d3b, 0x002a002e, 0x3b2d2a0a, 0x49493f3d, 0xff202020, 0x27270027, 0x27272727, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
644         { 0x6c5a4e3a, 0x392d1f3c, 0x002b002f, 0x3c2e2b0b, 0x4a4a483e, 0xff212121, 0x2c2c002c, 0x2c2c2c2c, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
645         { 0x6e5b583b, 0x3b2f293e, 0x002d0039, 0x3f382d0d, 0x4c4b4a48, 0xff222222, 0x2c2c002c, 0x2c2c2c2c, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
646         { 0x6f5c593c, 0x3c38293f, 0x002e003a, 0x48392e0e, 0x4d4c4b49, 0xff232323, 0x32320032, 0x32323232, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
647         { 0x795e5a3e, 0x3d392b49, 0x0038003b, 0x493a3818, 0x4f4e4c4a, 0xff242424, 0x32320032, 0x32323232, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
648         { 0x7a685b48, 0x3f3a2c4a, 0x0039003c, 0x4a3b3919, 0x58584e4b, 0xff252525, 0x38380038, 0x38383838, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
649         { 0x7b695d49, 0x483c2d4b, 0x003a003e, 0x4b3d3a1a, 0x59594f4d, 0xff262626, 0x38380038, 0x38383838, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
650         { 0x7d6a5e4a, 0x4a3d2f4c, 0x003c0048, 0x4d3e3c1c, 0x5b5a594e, 0xff272727, 0x3e3e003e, 0x3e3e3e3e, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
651         { 0x7e6b684b, 0x4a3e384d, 0x003d0049, 0x4e483d1d, 0x5c5b5958, 0xff282828, 0x3e3e003e, 0x3e3e3e3e, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
652         { 0x886d694d, 0x4c483a4f, 0x003f004a, 0x58493f1f, 0x5e5d5b59, 0xff292929, 0x45450045, 0x45454545, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
653         { 0x896e6a4e, 0x4d493b59, 0x0048004b, 0x594a4828, 0x5f5e5c5a, 0xff2a2a2a, 0x45450045, 0x45454545, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
654         { 0x8a786b58, 0x4f4a3c5a, 0x0049004c, 0x5a4b4929, 0x68685e5b, 0xff2b2b2b, 0x4d4d004d, 0x4d4d4d4d, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
655         { 0x8b796d59, 0x584c3d5b, 0x004a004e, 0x5b4d4a2a, 0x69695f5d, 0xff2c2c2c, 0x4d4d004d, 0x4d4d4d4d, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
656         { 0x8c7a6e5a, 0x594d3f5c, 0x004b004f, 0x5d4e4b2b, 0x6b6a685e, 0xff2d2d2d, 0x55550055, 0x55555555, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
657         { 0x8e7b785b, 0x5b4f485e, 0x004d0059, 0x5e584d2d, 0x6c6b6a68, 0xff2e2e2e, 0x55550055, 0x55555555, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
658         { 0x8f7c795c, 0x5c58495f, 0x004e005a, 0x68594e2e, 0x6d6c6b69, 0xff2f2f2f, 0x5e5e005e, 0x5e5e5e5e, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
659         { 0x8f7e7a5e, 0x5d594b69, 0x0058005b, 0x695a5838, 0x6f6e6c6a, 0xff303030, 0x5e5e005e, 0x5e5e5e5e, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
660         { 0x8f887b68, 0x5f5a4c6a, 0x0059005c, 0x6a5b5939, 0x6f6f6e6b, 0xff313131, 0x68680068, 0x68686868, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
661         { 0x8f897d69, 0x685c4d6b, 0x005a005e, 0x6b5d5a3a, 0x6f6f6f6d, 0xff323232, 0x68680068, 0x68686868, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
662         { 0x8f8a7e6a, 0x695d4f6c, 0x005b0068, 0x6d5e5b3b, 0x6f6f6f6e, 0xff333333, 0x73730073, 0x73737373, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }
663     },
664     //B-slice
665     {
666         //ModeCOST(0), ModeCOST(1), ModeCOST(2), MVCOST(3),   MVCOST(4),   QP(5),       FTQ Thds(6), FTQ Thds(7), RefCost(8),  SkipVal(9),  IntraSF(10) ,Zero(11),  Zero(12),   Zero(13),   Zero(14) ,  Zero(15)
667         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
668         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff010101, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
669         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff020202, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
670         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff030303, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
671         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff040404, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
672         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff050505, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
673         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff060606, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
674         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff070707, 0x01010001, 0x01010101, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
675         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff080808, 0x01010001, 0x01010101, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
676         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff090909, 0x03030003, 0x03030303, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
677         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0a0a0a, 0x03030003, 0x03030303, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
678         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0b0b0b, 0x06060006, 0x06060606, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
679         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0c0c0c, 0x06060006, 0x06060606, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
680         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0d0d0d, 0x08080008, 0x08080808, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
681         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0e0e0e, 0x08080008, 0x08080808, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
682         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0f0f0f, 0x0b0b000b, 0x0b0b0b0b, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
683         { 0x4a3a390e, 0x1b190d1c, 0x0008040c, 0x0c040400, 0x281e1c1a, 0xff101010, 0x0b0b000b, 0x0b0b0b0b, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
684         { 0x4a3a390e, 0x1b190d1c, 0x0008040c, 0x0c040400, 0x281e1c1a, 0xff111111, 0x0d0d000d, 0x0d0d0d0d, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
685         { 0x4a3a390e, 0x1b190d1c, 0x0008040c, 0x0c040400, 0x281e1c1a, 0xff121212, 0x0d0d000d, 0x0d0d0d0d, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
686         { 0x4a3a390e, 0x1b190d1c, 0x0008040c, 0x0c040400, 0x281e1c1a, 0xff131313, 0x10100010, 0x10101010, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
687         { 0x4f3f3d1b, 0x281d1a29, 0x000c0619, 0x19060600, 0x2c2b291f, 0xff141414, 0x10100010, 0x10101010, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
688         { 0x4f3f3d1b, 0x281d1a29, 0x000c0619, 0x19060600, 0x2c2b291f, 0xff151515, 0x13130013, 0x13131313, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
689         { 0x4f3f3d1b, 0x281d1a29, 0x000c0619, 0x19060600, 0x2c2b291f, 0xff161616, 0x13130013, 0x13131313, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
690         { 0x5a4a491e, 0x2b291d2c, 0x0018081c, 0x1c080800, 0x382e2c2a, 0xff171717, 0x16160016, 0x16161616, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
691         { 0x5a4a491e, 0x2b291d2c, 0x0018081c, 0x1c080800, 0x382e2c2a, 0xff181818, 0x16160016, 0x16161616, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
692         { 0x5a4a491e, 0x2b291d2c, 0x0018081c, 0x1c080800, 0x382e2c2a, 0xff191919, 0x1a1a001a, 0x1a1a1a1a, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
693         { 0x5d4d4b29, 0x2d2b282f, 0x001a0a1f, 0x1f0a0a00, 0x3a392f2d, 0xff1a1a1a, 0x1a1a001a, 0x1a1a1a1a, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
694         { 0x5f4f4d2b, 0x382d2a39, 0x001c0c29, 0x290c0c00, 0x3c3b392f, 0xff1b1b1b, 0x1e1e001e, 0x1e1e1e1e, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
695         { 0x5f4f4d2b, 0x382d2a39, 0x001c0c29, 0x290c0c00, 0x3c3b392f, 0xff1c1c1c, 0x1e1e001e, 0x1e1e1e1e, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
696         { 0x69594f2c, 0x392f2b3b, 0x001e0e2b, 0x2b0e0e00, 0x3e3c3b39, 0xff1d1d1d, 0x22220022, 0x22222222, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
697         { 0x6a5a592e, 0x3b392d3c, 0x0028182c, 0x2c181800, 0x483e3c3a, 0xff1e1e1e, 0x22220022, 0x22222222, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
698         { 0x6b5b5a38, 0x3c3a2f3e, 0x0029192e, 0x2e191900, 0x49483e3b, 0xff1f1f1f, 0x27270027, 0x27272727, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
699         { 0x6d5d5b39, 0x3d3b383f, 0x002a1a2f, 0x2f1a1a00, 0x4a493f3d, 0xff202020, 0x27270027, 0x27272727, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
700         { 0x6e5e5c3a, 0x3e3c3948, 0x002b1b38, 0x381b1b00, 0x4b4a483e, 0xff212121, 0x2c2c002c, 0x2c2c2c2c, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
701         { 0x78685e3b, 0x493e3b4a, 0x002d1d3a, 0x3a1d1d00, 0x4d4b4a48, 0xff222222, 0x2c2c002c, 0x2c2c2c2c, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
702         { 0x79695f3c, 0x493f3b4b, 0x002e1e3b, 0x3b1e1e00, 0x4e4c4b49, 0xff232323, 0x32320032, 0x32323232, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
703         { 0x7a6a693e, 0x4b493d4c, 0x0038283c, 0x3c282800, 0x584e4c4a, 0xff242424, 0x32320032, 0x32323232, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
704         { 0x7b6b6a48, 0x4c4a3f4e, 0x0039293e, 0x3e292900, 0x59584e4b, 0xff252525, 0x38380038, 0x38383838, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
705         { 0x7d6d6b49, 0x4d4b484f, 0x003a2a3f, 0x3f2a2a00, 0x5a594f4d, 0xff262626, 0x38380038, 0x38383838, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
706         { 0x7e6e6c4a, 0x4f4c4959, 0x003c2c49, 0x492c2c00, 0x5c5a594e, 0xff272727, 0x3e3e003e, 0x3e3e3e3e, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
707         { 0x88786d4b, 0x584d4a59, 0x003d2d49, 0x492d2d00, 0x5d5b5958, 0xff282828, 0x3e3e003e, 0x3e3e3e3e, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
708         { 0x89796f4d, 0x5a4f4c5b, 0x003f2f4b, 0x4b2f2f00, 0x5f5d5b59, 0xff292929, 0x45450045, 0x45454545, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
709         { 0x8a7a794e, 0x5b594d5c, 0x0048384c, 0x4c383800, 0x685e5c5a, 0xff2a2a2a, 0x45450045, 0x45454545, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
710         { 0x8b7b7a58, 0x5c5a4f5e, 0x0049394e, 0x4e393900, 0x69685e5b, 0xff2b2b2b, 0x4d4d004d, 0x4d4d4d4d, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
711         { 0x8d7d7b59, 0x5d5b585f, 0x004a3a4f, 0x4f3a3a00, 0x6a695f5d, 0xff2c2c2c, 0x4d4d004d, 0x4d4d4d4d, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
712         { 0x8e7e7c5a, 0x5f5c5968, 0x004b3b58, 0x583b3b00, 0x6b6a685e, 0xff2d2d2d, 0x55550055, 0x55555555, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
713         { 0x8f887e5b, 0x685e5a6a, 0x004d3d5a, 0x5a3d3d00, 0x6d6b6a68, 0xff2e2e2e, 0x55550055, 0x55555555, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
714         { 0x8f897f5c, 0x695f5c6b, 0x004e3e5b, 0x5b3e3e00, 0x6e6c6b69, 0xff2f2f2f, 0x5e5e005e, 0x5e5e5e5e, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
715         { 0x8f8a895e, 0x6b695d6c, 0x0058485c, 0x5c484800, 0x6f6e6c6a, 0xff303030, 0x5e5e005e, 0x5e5e5e5e, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
716         { 0x8f8b8a68, 0x6c6a5f6e, 0x0059495e, 0x5e494900, 0x6f6f6e6b, 0xff313131, 0x68680068, 0x68686868, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
717         { 0x8f8d8b69, 0x6d6b686f, 0x005a4a5f, 0x5f4a4a00, 0x6f6f6f6d, 0xff323232, 0x68680068, 0x68686868, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
718         { 0x8f8e8c6a, 0x6f6c6979, 0x005b4b69, 0x694b4b00, 0x6f6f6f6e, 0xff333333, 0x73730073, 0x73737373, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }
719     }
720 };
721 
722 // AVC MBEnc ModeCost and MVCost tables, index [CodingType][QP] and
723 const uint32_t CodechalEncodeAvcEnc::ModeMvCost_Common[3][CODEC_AVC_NUM_QP][8] =
724 {
725     // I-Frame
726     {
727         { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff000000, 0x00000000, 0x00000000 },
728         { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff010101, 0x00000000, 0x00000000 },
729         { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff020202, 0x00000000, 0x00000000 },
730         { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff030303, 0x00000000, 0x00000000 },
731         { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff040404, 0x00000000, 0x00000000 },
732         { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff050505, 0x00000000, 0x00000000 },
733         { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff060606, 0x00000000, 0x00000000 },
734         { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff070707, 0x01010001, 0x01010101 },
735         { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff080808, 0x01010001, 0x01010101 },
736         { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff090909, 0x03030003, 0x03030303 },
737         { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0a0a0a, 0x03030003, 0x03030303 },
738         { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0b0b0b, 0x06060006, 0x06060606 },
739         { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0c0c0c, 0x06060006, 0x06060606 },
740         { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0d0d0d, 0x08080008, 0x08080808 },
741         { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0e0e0e, 0x08080008, 0x08080808 },
742         { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0f0f0f, 0x0b0b000b, 0x0b0b0b0b },
743         { 0x2e06001a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff101010, 0x0b0b000b, 0x0b0b0b0b },
744         { 0x2e06001a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff111111, 0x0d0d000d, 0x0d0d0d0d },
745         { 0x2e06001a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff121212, 0x0d0d000d, 0x0d0d0d0d },
746         { 0x2e06001a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff131313, 0x10100010, 0x10101010 },
747         { 0x3b09001f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff141414, 0x10100010, 0x10101010 },
748         { 0x3b09001f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff151515, 0x13130013, 0x13131313 },
749         { 0x3b09001f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff161616, 0x13130013, 0x13131313 },
750         { 0x3e0c002a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff171717, 0x16160016, 0x16161616 },
751         { 0x3e0c002a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff181818, 0x16160016, 0x16161616 },
752         { 0x3e0c002a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff191919, 0x1a1a001a, 0x1a1a1a1a },
753         { 0x490f002d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1a1a1a, 0x1a1a001a, 0x1a1a1a1a },
754         { 0x4b19002f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1b1b1b, 0x1e1e001e, 0x1e1e1e1e },
755         { 0x4b19002f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1c1c1c, 0x1e1e001e, 0x1e1e1e1e },
756         { 0x4c1b0039, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1d1d1d, 0x22220022, 0x22222222 },
757         { 0x4e1c003a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1e1e1e, 0x22220022, 0x22222222 },
758         { 0x581e003b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1f1f1f, 0x27270027, 0x27272727 },
759         { 0x591f003d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff202020, 0x27270027, 0x27272727 },
760         { 0x5a28003e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff212121, 0x2c2c002c, 0x2c2c2c2c },
761         { 0x5b2a0048, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff222222, 0x2c2c002c, 0x2c2c2c2c },
762         { 0x5c2b0049, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff232323, 0x32320032, 0x32323232 },
763         { 0x5e2c004a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff242424, 0x32320032, 0x32323232 },
764         { 0x682e004b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff252525, 0x38380038, 0x38383838 },
765         { 0x692f004d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff262626, 0x38380038, 0x38383838 },
766         { 0x6a39004e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff272727, 0x3e3e003e, 0x3e3e3e3e },
767         { 0x6b390058, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff282828, 0x3e3e003e, 0x3e3e3e3e },
768         { 0x6d3b0059, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff292929, 0x45450045, 0x45454545 },
769         { 0x6e3c005a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2a2a2a, 0x45450045, 0x45454545 },
770         { 0x783e005b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2b2b2b, 0x4d4d004d, 0x4d4d4d4d },
771         { 0x793f005d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2c2c2c, 0x4d4d004d, 0x4d4d4d4d },
772         { 0x7a48005e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2d2d2d, 0x55550055, 0x55555555 },
773         { 0x7b4a0068, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2e2e2e, 0x55550055, 0x55555555 },
774         { 0x7c4b0069, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2f2f2f, 0x5e5e005e, 0x5e5e5e5e },
775         { 0x7e4c006a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff303030, 0x5e5e005e, 0x5e5e5e5e },
776         { 0x884e006b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff313131, 0x68680068, 0x68686868 },
777         { 0x894f006d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff323232, 0x68680068, 0x68686868 },
778         { 0x8a59006e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff333333, 0x73730073, 0x73737373 },
779     },
780     // P-Frame
781     {
782         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff000000, 0x00000000, 0x00000000 },
783         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff010101, 0x00000000, 0x00000000 },
784         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff020202, 0x00000000, 0x00000000 },
785         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff030303, 0x00000000, 0x00000000 },
786         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff040404, 0x00000000, 0x00000000 },
787         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff050505, 0x00000000, 0x00000000 },
788         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff060606, 0x00000000, 0x00000000 },
789         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff070707, 0x01010001, 0x01010101 },
790         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff080808, 0x01010001, 0x01010101 },
791         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff090909, 0x03030003, 0x03030303 },
792         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0a0a0a, 0x03030003, 0x03030303 },
793         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0b0b0b, 0x06060006, 0x06060606 },
794         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0c0c0c, 0x06060006, 0x06060606 },
795         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0d0d0d, 0x08080008, 0x08080808 },
796         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0e0e0e, 0x08080008, 0x08080808 },
797         { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0f0f0f, 0x0b0b000b, 0x0b0b0b0b },
798         { 0x492e2a0e, 0x0d090519, 0x0008000b, 0x190a0802, 0x1f1e1c1a, 0xff101010, 0x0b0b000b, 0x0b0b0b0b },
799         { 0x492e2a0e, 0x0d090519, 0x0008000b, 0x190a0802, 0x1f1e1c1a, 0xff111111, 0x0d0d000d, 0x0d0d0d0d },
800         { 0x492e2a0e, 0x0d090519, 0x0008000b, 0x190a0802, 0x1f1e1c1a, 0xff121212, 0x0d0d000d, 0x0d0d0d0d },
801         { 0x492e2a0e, 0x0d090519, 0x0008000b, 0x190a0802, 0x1f1e1c1a, 0xff131313, 0x10100010, 0x10101010 },
802         { 0x4d3b2f1b, 0x1a0d071d, 0x000c0018, 0x1e0f0c03, 0x2b2b291f, 0xff141414, 0x10100010, 0x10101010 },
803         { 0x4d3b2f1b, 0x1a0d071d, 0x000c0018, 0x1e0f0c03, 0x2b2b291f, 0xff151515, 0x13130013, 0x13131313 },
804         { 0x4d3b2f1b, 0x1a0d071d, 0x000c0018, 0x1e0f0c03, 0x2b2b291f, 0xff161616, 0x13130013, 0x13131313 },
805         { 0x593e3a1e, 0x1d190a29, 0x0018001b, 0x291a1804, 0x2f2e2c2a, 0xff171717, 0x16160016, 0x16161616 },
806         { 0x593e3a1e, 0x1d190a29, 0x0018001b, 0x291a1804, 0x2f2e2c2a, 0xff181818, 0x16160016, 0x16161616 },
807         { 0x593e3a1e, 0x1d190a29, 0x0018001b, 0x291a1804, 0x2f2e2c2a, 0xff191919, 0x1a1a001a, 0x1a1a1a1a },
808         { 0x5b493d29, 0x281c0d2b, 0x001a001e, 0x2b1d1a05, 0x39392f2d, 0xff1a1a1a, 0x1a1a001a, 0x1a1a1a1a },
809         { 0x5d4b3f2b, 0x2a1e0f2d, 0x001c0028, 0x2e1f1c06, 0x3b3b392f, 0xff1b1b1b, 0x1e1e001e, 0x1e1e1e1e },
810         { 0x5d4b3f2b, 0x2a1e0f2d, 0x001c0028, 0x2e1f1c06, 0x3b3b392f, 0xff1c1c1c, 0x1e1e001e, 0x1e1e1e1e },
811         { 0x5f4c492c, 0x2c28192f, 0x001e002a, 0x38291e07, 0x3d3c3b39, 0xff1d1d1d, 0x22220022, 0x22222222 },
812         { 0x694e4a2e, 0x2d291b39, 0x0028002b, 0x392a2808, 0x3f3e3c3a, 0xff1e1e1e, 0x22220022, 0x22222222 },
813         { 0x6a584b38, 0x2f2a1c3a, 0x0029002c, 0x3a2b2909, 0x48483e3b, 0xff1f1f1f, 0x27270027, 0x27272727 },
814         { 0x6b594d39, 0x382c1d3b, 0x002a002e, 0x3b2d2a0a, 0x49493f3d, 0xff202020, 0x27270027, 0x27272727 },
815         { 0x6c5a4e3a, 0x392d1f3c, 0x002b002f, 0x3c2e2b0b, 0x4a4a483e, 0xff212121, 0x2c2c002c, 0x2c2c2c2c },
816         { 0x6e5b583b, 0x3b2f293e, 0x002d0039, 0x3f382d0d, 0x4c4b4a48, 0xff222222, 0x2c2c002c, 0x2c2c2c2c },
817         { 0x6f5c593c, 0x3c38293f, 0x002e003a, 0x48392e0e, 0x4d4c4b49, 0xff232323, 0x32320032, 0x32323232 },
818         { 0x795e5a3e, 0x3d392b49, 0x0038003b, 0x493a3818, 0x4f4e4c4a, 0xff242424, 0x32320032, 0x32323232 },
819         { 0x7a685b48, 0x3f3a2c4a, 0x0039003c, 0x4a3b3919, 0x58584e4b, 0xff252525, 0x38380038, 0x38383838 },
820         { 0x7b695d49, 0x483c2d4b, 0x003a003e, 0x4b3d3a1a, 0x59594f4d, 0xff262626, 0x38380038, 0x38383838 },
821         { 0x7d6a5e4a, 0x4a3d2f4c, 0x003c0048, 0x4d3e3c1c, 0x5b5a594e, 0xff272727, 0x3e3e003e, 0x3e3e3e3e },
822         { 0x7e6b684b, 0x4a3e384d, 0x003d0049, 0x4e483d1d, 0x5c5b5958, 0xff282828, 0x3e3e003e, 0x3e3e3e3e },
823         { 0x886d694d, 0x4c483a4f, 0x003f004a, 0x58493f1f, 0x5e5d5b59, 0xff292929, 0x45450045, 0x45454545 },
824         { 0x896e6a4e, 0x4d493b59, 0x0048004b, 0x594a4828, 0x5f5e5c5a, 0xff2a2a2a, 0x45450045, 0x45454545 },
825         { 0x8a786b58, 0x4f4a3c5a, 0x0049004c, 0x5a4b4929, 0x68685e5b, 0xff2b2b2b, 0x4d4d004d, 0x4d4d4d4d },
826         { 0x8b796d59, 0x584c3d5b, 0x004a004e, 0x5b4d4a2a, 0x69695f5d, 0xff2c2c2c, 0x4d4d004d, 0x4d4d4d4d },
827         { 0x8c7a6e5a, 0x594d3f5c, 0x004b004f, 0x5d4e4b2b, 0x6b6a685e, 0xff2d2d2d, 0x55550055, 0x55555555 },
828         { 0x8e7b785b, 0x5b4f485e, 0x004d0059, 0x5e584d2d, 0x6c6b6a68, 0xff2e2e2e, 0x55550055, 0x55555555 },
829         { 0x8f7c795c, 0x5c58495f, 0x004e005a, 0x68594e2e, 0x6d6c6b69, 0xff2f2f2f, 0x5e5e005e, 0x5e5e5e5e },
830         { 0x8f7e7a5e, 0x5d594b69, 0x0058005b, 0x695a5838, 0x6f6e6c6a, 0xff303030, 0x5e5e005e, 0x5e5e5e5e },
831         { 0x8f887b68, 0x5f5a4c6a, 0x0059005c, 0x6a5b5939, 0x6f6f6e6b, 0xff313131, 0x68680068, 0x68686868 },
832         { 0x8f897d69, 0x685c4d6b, 0x005a005e, 0x6b5d5a3a, 0x6f6f6f6d, 0xff323232, 0x68680068, 0x68686868 },
833         { 0x8f8a7e6a, 0x695d4f6c, 0x005b0068, 0x6d5e5b3b, 0x6f6f6f6e, 0xff333333, 0x73730073, 0x73737373 },
834     },
835     // B-Frame
836     {
837         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff000000, 0x00000000, 0x00000000 },
838         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff010101, 0x00000000, 0x00000000 },
839         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff020202, 0x00000000, 0x00000000 },
840         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff030303, 0x00000000, 0x00000000 },
841         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff040404, 0x00000000, 0x00000000 },
842         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff050505, 0x00000000, 0x00000000 },
843         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff060606, 0x00000000, 0x00000000 },
844         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff070707, 0x01010001, 0x01010101 },
845         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff080808, 0x01010001, 0x01010101 },
846         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff090909, 0x03030003, 0x03030303 },
847         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0a0a0a, 0x03030003, 0x03030303 },
848         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0b0b0b, 0x06060006, 0x06060606 },
849         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0c0c0c, 0x06060006, 0x06060606 },
850         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0d0d0d, 0x08080008, 0x08080808 },
851         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0e0e0e, 0x08080008, 0x08080808 },
852         { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0f0f0f, 0x0b0b000b, 0x0b0b0b0b },
853         { 0x4a3a390e, 0x1b190d1c, 0x0008040c, 0x0c040400, 0x281e1c1a, 0xff101010, 0x0b0b000b, 0x0b0b0b0b },
854         { 0x4a3a390e, 0x1b190d1c, 0x0008040c, 0x0c040400, 0x281e1c1a, 0xff111111, 0x0d0d000d, 0x0d0d0d0d },
855         { 0x4a3a390e, 0x1b190d1c, 0x0008040c, 0x0c040400, 0x281e1c1a, 0xff121212, 0x0d0d000d, 0x0d0d0d0d },
856         { 0x4a3a390e, 0x1b190d1c, 0x0008040c, 0x0c040400, 0x281e1c1a, 0xff131313, 0x10100010, 0x10101010 },
857         { 0x4f3f3d1b, 0x281d1a29, 0x000c0619, 0x19060600, 0x2c2b291f, 0xff141414, 0x10100010, 0x10101010 },
858         { 0x4f3f3d1b, 0x281d1a29, 0x000c0619, 0x19060600, 0x2c2b291f, 0xff151515, 0x13130013, 0x13131313 },
859         { 0x4f3f3d1b, 0x281d1a29, 0x000c0619, 0x19060600, 0x2c2b291f, 0xff161616, 0x13130013, 0x13131313 },
860         { 0x5a4a491e, 0x2b291d2c, 0x0018081c, 0x1c080800, 0x382e2c2a, 0xff171717, 0x16160016, 0x16161616 },
861         { 0x5a4a491e, 0x2b291d2c, 0x0018081c, 0x1c080800, 0x382e2c2a, 0xff181818, 0x16160016, 0x16161616 },
862         { 0x5a4a491e, 0x2b291d2c, 0x0018081c, 0x1c080800, 0x382e2c2a, 0xff191919, 0x1a1a001a, 0x1a1a1a1a },
863         { 0x5d4d4b29, 0x2d2b282f, 0x001a0a1f, 0x1f0a0a00, 0x3a392f2d, 0xff1a1a1a, 0x1a1a001a, 0x1a1a1a1a },
864         { 0x5f4f4d2b, 0x382d2a39, 0x001c0c29, 0x290c0c00, 0x3c3b392f, 0xff1b1b1b, 0x1e1e001e, 0x1e1e1e1e },
865         { 0x5f4f4d2b, 0x382d2a39, 0x001c0c29, 0x290c0c00, 0x3c3b392f, 0xff1c1c1c, 0x1e1e001e, 0x1e1e1e1e },
866         { 0x69594f2c, 0x392f2b3b, 0x001e0e2b, 0x2b0e0e00, 0x3e3c3b39, 0xff1d1d1d, 0x22220022, 0x22222222 },
867         { 0x6a5a592e, 0x3b392d3c, 0x0028182c, 0x2c181800, 0x483e3c3a, 0xff1e1e1e, 0x22220022, 0x22222222 },
868         { 0x6b5b5a38, 0x3c3a2f3e, 0x0029192e, 0x2e191900, 0x49483e3b, 0xff1f1f1f, 0x27270027, 0x27272727 },
869         { 0x6d5d5b39, 0x3d3b383f, 0x002a1a2f, 0x2f1a1a00, 0x4a493f3d, 0xff202020, 0x27270027, 0x27272727 },
870         { 0x6e5e5c3a, 0x3e3c3948, 0x002b1b38, 0x381b1b00, 0x4b4a483e, 0xff212121, 0x2c2c002c, 0x2c2c2c2c },
871         { 0x78685e3b, 0x493e3b4a, 0x002d1d3a, 0x3a1d1d00, 0x4d4b4a48, 0xff222222, 0x2c2c002c, 0x2c2c2c2c },
872         { 0x79695f3c, 0x493f3b4b, 0x002e1e3b, 0x3b1e1e00, 0x4e4c4b49, 0xff232323, 0x32320032, 0x32323232 },
873         { 0x7a6a693e, 0x4b493d4c, 0x0038283c, 0x3c282800, 0x584e4c4a, 0xff242424, 0x32320032, 0x32323232 },
874         { 0x7b6b6a48, 0x4c4a3f4e, 0x0039293e, 0x3e292900, 0x59584e4b, 0xff252525, 0x38380038, 0x38383838 },
875         { 0x7d6d6b49, 0x4d4b484f, 0x003a2a3f, 0x3f2a2a00, 0x5a594f4d, 0xff262626, 0x38380038, 0x38383838 },
876         { 0x7e6e6c4a, 0x4f4c4959, 0x003c2c49, 0x492c2c00, 0x5c5a594e, 0xff272727, 0x3e3e003e, 0x3e3e3e3e },
877         { 0x88786d4b, 0x584d4a59, 0x003d2d49, 0x492d2d00, 0x5d5b5958, 0xff282828, 0x3e3e003e, 0x3e3e3e3e },
878         { 0x89796f4d, 0x5a4f4c5b, 0x003f2f4b, 0x4b2f2f00, 0x5f5d5b59, 0xff292929, 0x45450045, 0x45454545 },
879         { 0x8a7a794e, 0x5b594d5c, 0x0048384c, 0x4c383800, 0x685e5c5a, 0xff2a2a2a, 0x45450045, 0x45454545 },
880         { 0x8b7b7a58, 0x5c5a4f5e, 0x0049394e, 0x4e393900, 0x69685e5b, 0xff2b2b2b, 0x4d4d004d, 0x4d4d4d4d },
881         { 0x8d7d7b59, 0x5d5b585f, 0x004a3a4f, 0x4f3a3a00, 0x6a695f5d, 0xff2c2c2c, 0x4d4d004d, 0x4d4d4d4d },
882         { 0x8e7e7c5a, 0x5f5c5968, 0x004b3b58, 0x583b3b00, 0x6b6a685e, 0xff2d2d2d, 0x55550055, 0x55555555 },
883         { 0x8f887e5b, 0x685e5a6a, 0x004d3d5a, 0x5a3d3d00, 0x6d6b6a68, 0xff2e2e2e, 0x55550055, 0x55555555 },
884         { 0x8f897f5c, 0x695f5c6b, 0x004e3e5b, 0x5b3e3e00, 0x6e6c6b69, 0xff2f2f2f, 0x5e5e005e, 0x5e5e5e5e },
885         { 0x8f8a895e, 0x6b695d6c, 0x0058485c, 0x5c484800, 0x6f6e6c6a, 0xff303030, 0x5e5e005e, 0x5e5e5e5e },
886         { 0x8f8b8a68, 0x6c6a5f6e, 0x0059495e, 0x5e494900, 0x6f6f6e6b, 0xff313131, 0x68680068, 0x68686868 },
887         { 0x8f8d8b69, 0x6d6b686f, 0x005a4a5f, 0x5f4a4a00, 0x6f6f6f6d, 0xff323232, 0x68680068, 0x68686868 },
888         { 0x8f8e8c6a, 0x6f6c6979, 0x005b4b69, 0x694b4b00, 0x6f6f6f6e, 0xff333333, 0x73730073, 0x73737373 },
889     }
890 };
891 
892 // AVC MBEnc RefCost tables, index [CodingType][QP]
893 // QP is from 0 - 51, pad it to 64 since BRC needs each subarray size to be 128bytes
894 const uint16_t CodechalEncodeAvcEnc::RefCost_Common[3][64] =
895 {
896     // I-frame
897     {
898         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
899         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
900         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
901         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
902         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
903         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
904         0x0000, 0x0000, 0x0000, 0x0000
905     },
906     // P-slice
907     {
908         0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
909         0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0008, 0x0008, 0x0008, 0x0008,
910         0x000C, 0x000C, 0x000C, 0x0010, 0x0010, 0x0010, 0x0014, 0x0018, 0x0018, 0x001C,
911         0x0020, 0x0024, 0x0028, 0x002C, 0x0034, 0x0038, 0x0040, 0x0048, 0x0050, 0x005C,
912         0x0064, 0x0074, 0x0080, 0x0090, 0x00A0, 0x00B4, 0x00CC, 0x00E4, 0x0100, 0x0120,
913         0x0144, 0x016C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
914         0x0000, 0x0000, 0x0000, 0x0000
915     },
916     //B-slice
917     {
918         0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
919         0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0008, 0x0008, 0x0008, 0x0008,
920         0x000C, 0x000C, 0x000C, 0x0010, 0x0010, 0x0010, 0x0014, 0x0018, 0x0018, 0x001C,
921         0x0020, 0x0024, 0x0028, 0x002C, 0x0034, 0x0038, 0x0040, 0x0048, 0x0050, 0x005C,
922         0x0064, 0x0074, 0x0080, 0x0090, 0x00A0, 0x00B4, 0x00CC, 0x00E4, 0x0100, 0x0120,
923         0x0144, 0x016C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
924         0x0000, 0x0000, 0x0000, 0x0000
925     }
926 };
927 
928 const uint8_t CodechalEncodeAvcEnc::MaxRefIdx0_Progressive_4K[NUM_TARGET_USAGE_MODES] =
929 {
930     0, 3, 3, 2, 2, 2, 0, 0
931 };
932 
933 const uint8_t CodechalEncodeAvcEnc::MaxRefIdx0[NUM_TARGET_USAGE_MODES] =
934 {
935     0, 7, 5, 2, 2, 2, 0, 0
936 };
937 
938 const uint8_t CodechalEncodeAvcEnc::MaxBRefIdx0[NUM_TARGET_USAGE_MODES] =
939 {
940     0, 3, 3, 1, 1, 1, 0, 0
941 };
942 
943 const uint8_t CodechalEncodeAvcEnc::MaxRefIdx1[NUM_TARGET_USAGE_MODES] =
944 {
945     0, 1, 1, 1, 1, 1, 0, 0
946 };
947 
948 const uint32_t CodechalEncodeAvcEnc::SuperHME[NUM_TARGET_USAGE_MODES] =
949 {
950     0, 1, 1, 1, 1, 1, 1, 1
951 };
952 
953 const uint32_t CodechalEncodeAvcEnc::UltraHME[NUM_TARGET_USAGE_MODES] =
954 {
955     0, 1, 1, 1, 1, 1, 1, 0
956 };
957 
958 const uint32_t CodechalEncodeAvcEnc::ModeMvCost_Cm[3][52][8] =
959 {
960 // I-Frame
961 {
962     { 0x0d000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff000000, 0x00000000, 0x00000000 },
963     { 0x0f000004, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff010101, 0x00000000, 0x00000000 },
964     { 0x19000004, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff020202, 0x00000000, 0x00000000 },
965     { 0x1a000005, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff030303, 0x00000000, 0x00000000 },
966     { 0x1b000005, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff040404, 0x00000000, 0x00000000 },
967     { 0x1c000006, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff050505, 0x00000000, 0x00000000 },
968     { 0x1e000007, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff060606, 0x00000000, 0x00000000 },
969     { 0x28000008, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff070707, 0x01010001, 0x01010101 },
970     { 0x29000009, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff080808, 0x01010001, 0x01010101 },
971     { 0x2a00000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff090909, 0x03030003, 0x03030303 },
972     { 0x2b00000b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0a0a0a, 0x03030003, 0x03030303 },
973     { 0x2c00000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0b0b0b, 0x06060006, 0x06060606 },
974     { 0x2e00000e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0c0c0c, 0x06060006, 0x06060606 },
975     { 0x38000018, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0d0d0d, 0x08080008, 0x08080808 },
976     { 0x39000019, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0e0e0e, 0x08080008, 0x08080808 },
977     { 0x3a00001b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0f0f0f, 0x0b0b000b, 0x0b0b0b0b },
978     { 0x3b00001c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff101010, 0x0b0b000b, 0x0b0b0b0b },
979     { 0x3c00001d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff111111, 0x0d0d000d, 0x0d0d0d0d },
980     { 0x3e00001f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff121212, 0x0d0d000d, 0x0d0d0d0d },
981     { 0x48020028, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff131313, 0x10100010, 0x10101010 },
982     { 0x49020029, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff141414, 0x10100010, 0x10101010 },
983     { 0x4a03002a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff151515, 0x13130013, 0x13131313 },
984     { 0x4b03002b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff161616, 0x13130013, 0x13131313 },
985     { 0x4c04002b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff171717, 0x16160016, 0x16161616 },
986     { 0x4e04002c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff181818, 0x16160016, 0x16161616 },
987     { 0x5805002e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff191919, 0x1a1a001a, 0x1a1a1a1a },
988     { 0x5905002f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1a1a1a, 0x1a1a001a, 0x1a1a1a1a },
989     { 0x5a06002e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1b1b1b, 0x1e1e001e, 0x1e1e1e1e },
990     { 0x5b07002f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1c1c1c, 0x1e1e001e, 0x1e1e1e1e },
991     { 0x5c080039, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1d1d1d, 0x22220022, 0x22222222 },
992     { 0x5e09003a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1e1e1e, 0x22220022, 0x22222222 },
993     { 0x6828003a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1f1f1f, 0x27270027, 0x27272727 },
994     { 0x6929003b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff202020, 0x27270027, 0x27272727 },
995     { 0x6a2a003c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff212121, 0x2c2c002c, 0x2c2c2c2c },
996     { 0x6b2c003e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff222222, 0x2c2c002c, 0x2c2c2c2c },
997     { 0x6c3a003e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff232323, 0x32320032, 0x32323232 },
998     { 0x6e3b0048, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff242424, 0x32320032, 0x32323232 },
999     { 0x783c0049, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff252525, 0x38380038, 0x38383838 },
1000     { 0x793e004a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff262626, 0x38380038, 0x38383838 },
1001     { 0x7a3e004b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff272727, 0x3e3e003e, 0x3e3e3e3e },
1002     { 0x7b48004c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff282828, 0x3e3e003e, 0x3e3e3e3e },
1003     { 0x7c49004e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff292929, 0x45450045, 0x45454545 },
1004     { 0x7e4a0058, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2a2a2a, 0x45450045, 0x45454545 },
1005     { 0x884d0059, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2b2b2b, 0x4d4d004d, 0x4d4d4d4d },
1006     { 0x894f005a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2c2c2c, 0x4d4d004d, 0x4d4d4d4d },
1007     { 0x8a58005b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2d2d2d, 0x55550055, 0x55555555 },
1008     { 0x8b59005c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2e2e2e, 0x55550055, 0x55555555 },
1009     { 0x8c5c005b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2f2f2f, 0x5e5e005e, 0x5e5e5e5e },
1010     { 0x8e5d005c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff303030, 0x5e5e005e, 0x5e5e5e5e },
1011     { 0x8f5f005d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff313131, 0x68680068, 0x68686868 },
1012     { 0x8f68005f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff323232, 0x68680068, 0x68686868 },
1013     { 0x8f690068, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff333333, 0x73730073, 0x73737373 }
1014 },
1015     // P-Frame
1016 {
1017     { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff000000, 0x00000000, 0x00000000 },
1018     { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff010101, 0x00000000, 0x00000000 },
1019     { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff020202, 0x00000000, 0x00000000 },
1020     { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff030303, 0x00000000, 0x00000000 },
1021     { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff040404, 0x00000000, 0x00000000 },
1022     { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff050505, 0x00000000, 0x00000000 },
1023     { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff060606, 0x00000000, 0x00000000 },
1024     { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff070707, 0x01010001, 0x01010101 },
1025     { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff080808, 0x01010001, 0x01010101 },
1026     { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff090909, 0x03030003, 0x03030303 },
1027     { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0a0a0a, 0x03030003, 0x03030303 },
1028     { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0b0b0b, 0x06060006, 0x06060606 },
1029     { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0c0c0c, 0x06060006, 0x06060606 },
1030     { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0d0d0d, 0x08080008, 0x08080808 },
1031     { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0e0e0e, 0x08080008, 0x08080808 },
1032     { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0f0f0f, 0x0b0b000b, 0x0b0b0b0b },
1033     { 0x492e2a0e, 0x0d090519, 0x0008000b, 0x190a0802, 0x1f1e1c1a, 0xff101010, 0x0b0b000b, 0x0b0b0b0b },
1034     { 0x492e2a0e, 0x0d090519, 0x0008000b, 0x190a0802, 0x1f1e1c1a, 0xff111111, 0x0d0d000d, 0x0d0d0d0d },
1035     { 0x492e2a0e, 0x0d090519, 0x0008000b, 0x190a0802, 0x1f1e1c1a, 0xff121212, 0x0d0d000d, 0x0d0d0d0d },
1036     { 0x492e2a0e, 0x0d090519, 0x0008000b, 0x190a0802, 0x1f1e1c1a, 0xff131313, 0x10100010, 0x10101010 },
1037     { 0x4d3b2f1b, 0x1a0d071d, 0x000c0018, 0x1e0f0c03, 0x2b2b291f, 0xff141414, 0x10100010, 0x10101010 },
1038     { 0x4d3b2f1b, 0x1a0d071d, 0x000c0018, 0x1e0f0c03, 0x2b2b291f, 0xff151515, 0x13130013, 0x13131313 },
1039     { 0x4d3b2f1b, 0x1a0d071d, 0x000c0018, 0x1e0f0c03, 0x2b2b291f, 0xff161616, 0x13130013, 0x13131313 },
1040     { 0x593e3a1e, 0x1d190a29, 0x0018001b, 0x291a1804, 0x2f2e2c2a, 0xff171717, 0x16160016, 0x16161616 },
1041     { 0x593e3a1e, 0x1d190a29, 0x0018001b, 0x291a1804, 0x2f2e2c2a, 0xff181818, 0x16160016, 0x16161616 },
1042     { 0x593e3a1e, 0x1d190a29, 0x0018001b, 0x291a1804, 0x2f2e2c2a, 0xff191919, 0x1a1a001a, 0x1a1a1a1a },
1043     { 0x5b493d29, 0x281c0d2b, 0x001a001e, 0x2b1d1a05, 0x39392f2d, 0xff1a1a1a, 0x1a1a001a, 0x1a1a1a1a },
1044     { 0x5d4b3f2b, 0x2a1e0f2d, 0x001c0028, 0x2e1f1c06, 0x3b3b392f, 0xff1b1b1b, 0x1e1e001e, 0x1e1e1e1e },
1045     { 0x5d4b3f2b, 0x2a1e0f2d, 0x001c0028, 0x2e1f1c06, 0x3b3b392f, 0xff1c1c1c, 0x1e1e001e, 0x1e1e1e1e },
1046     { 0x5f4c492c, 0x2c28192f, 0x001e002a, 0x38291e07, 0x3d3c3b39, 0xff1d1d1d, 0x22220022, 0x22222222 },
1047     { 0x694e4a2e, 0x2d291b39, 0x0028002b, 0x392a2808, 0x3f3e3c3a, 0xff1e1e1e, 0x22220022, 0x22222222 },
1048     { 0x6a584b38, 0x2f2a1c3a, 0x0029002c, 0x3a2b2909, 0x48483e3b, 0xff1f1f1f, 0x27270027, 0x27272727 },
1049     { 0x6b594d39, 0x382c1d3b, 0x002a002e, 0x3b2d2a0a, 0x49493f3d, 0xff202020, 0x27270027, 0x27272727 },
1050     { 0x6c5a4e3a, 0x392d1f3c, 0x002b002f, 0x3c2e2b0b, 0x4a4a483e, 0xff212121, 0x2c2c002c, 0x2c2c2c2c },
1051     { 0x6e5b583b, 0x3b2f293e, 0x002d0039, 0x3f382d0d, 0x4c4b4a48, 0xff222222, 0x2c2c002c, 0x2c2c2c2c },
1052     { 0x6f5c593c, 0x3c38293f, 0x002e003a, 0x48392e0e, 0x4d4c4b49, 0xff232323, 0x32320032, 0x32323232 },
1053     { 0x795e5a3e, 0x3d392b49, 0x0038003b, 0x493a3818, 0x4f4e4c4a, 0xff242424, 0x32320032, 0x32323232 },
1054     { 0x7a685b48, 0x3f3a2c4a, 0x0039003c, 0x4a3b3919, 0x58584e4b, 0xff252525, 0x38380038, 0x38383838 },
1055     { 0x7b695d49, 0x483c2d4b, 0x003a003e, 0x4b3d3a1a, 0x59594f4d, 0xff262626, 0x38380038, 0x38383838 },
1056     { 0x7d6a5e4a, 0x4a3d2f4c, 0x003c0048, 0x4d3e3c1c, 0x5b5a594e, 0xff272727, 0x3e3e003e, 0x3e3e3e3e },
1057     { 0x7e6b684b, 0x4a3e384d, 0x003d0049, 0x4e483d1d, 0x5c5b5958, 0xff282828, 0x3e3e003e, 0x3e3e3e3e },
1058     { 0x886d694d, 0x4c483a4f, 0x003f004a, 0x58493f1f, 0x5e5d5b59, 0xff292929, 0x45450045, 0x45454545 },
1059     { 0x896e6a4e, 0x4d493b59, 0x0048004b, 0x594a4828, 0x5f5e5c5a, 0xff2a2a2a, 0x45450045, 0x45454545 },
1060     { 0x8a786b58, 0x4f4a3c5a, 0x0049004c, 0x5a4b4929, 0x68685e5b, 0xff2b2b2b, 0x4d4d004d, 0x4d4d4d4d },
1061     { 0x8b796d59, 0x584c3d5b, 0x004a004e, 0x5b4d4a2a, 0x69695f5d, 0xff2c2c2c, 0x4d4d004d, 0x4d4d4d4d },
1062     { 0x8c7a6e5a, 0x594d3f5c, 0x004b004f, 0x5d4e4b2b, 0x6b6a685e, 0xff2d2d2d, 0x55550055, 0x55555555 },
1063     { 0x8e7b785b, 0x5b4f485e, 0x004d0059, 0x5e584d2d, 0x6c6b6a68, 0xff2e2e2e, 0x55550055, 0x55555555 },
1064     { 0x8f7c795c, 0x5c58495f, 0x004e005a, 0x68594e2e, 0x6d6c6b69, 0xff2f2f2f, 0x5e5e005e, 0x5e5e5e5e },
1065     { 0x8f7e7a5e, 0x5d594b69, 0x0058005b, 0x695a5838, 0x6f6e6c6a, 0xff303030, 0x5e5e005e, 0x5e5e5e5e },
1066     { 0x8f887b68, 0x5f5a4c6a, 0x0059005c, 0x6a5b5939, 0x6f6f6e6b, 0xff313131, 0x68680068, 0x68686868 },
1067     { 0x8f897d69, 0x685c4d6b, 0x005a005e, 0x6b5d5a3a, 0x6f6f6f6d, 0xff323232, 0x68680068, 0x68686868 },
1068     { 0x8f8a7e6a, 0x695d4f6c, 0x005b0068, 0x6d5e5b3b, 0x6f6f6f6e, 0xff333333, 0x73730073, 0x73737373 }
1069 },
1070     // B-Frame
1071 {
1072     { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff000000, 0x00000000, 0x00000000 },
1073     { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff010101, 0x00000000, 0x00000000 },
1074     { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff020202, 0x00000000, 0x00000000 },
1075     { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff030303, 0x00000000, 0x00000000 },
1076     { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff040404, 0x00000000, 0x00000000 },
1077     { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff050505, 0x00000000, 0x00000000 },
1078     { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff060606, 0x00000000, 0x00000000 },
1079     { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff070707, 0x01010001, 0x01010101 },
1080     { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff080808, 0x01010001, 0x01010101 },
1081     { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff090909, 0x03030003, 0x03030303 },
1082     { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0a0a0a, 0x03030003, 0x03030303 },
1083     { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0b0b0b, 0x06060006, 0x06060606 },
1084     { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0c0c0c, 0x06060006, 0x06060606 },
1085     { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0d0d0d, 0x08080008, 0x08080808 },
1086     { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0e0e0e, 0x08080008, 0x08080808 },
1087     { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0f0f0f, 0x0b0b000b, 0x0b0b0b0b },
1088     { 0x4a3a390e, 0x1b190d1c, 0x0008040c, 0x0c040400, 0x281e1c1a, 0xff101010, 0x0b0b000b, 0x0b0b0b0b },
1089     { 0x4a3a390e, 0x1b190d1c, 0x0008040c, 0x0c040400, 0x281e1c1a, 0xff111111, 0x0d0d000d, 0x0d0d0d0d },
1090     { 0x4a3a390e, 0x1b190d1c, 0x0008040c, 0x0c040400, 0x281e1c1a, 0xff121212, 0x0d0d000d, 0x0d0d0d0d },
1091     { 0x4a3a390e, 0x1b190d1c, 0x0008040c, 0x0c040400, 0x281e1c1a, 0xff131313, 0x10100010, 0x10101010 },
1092     { 0x4f3f3d1b, 0x281d1a29, 0x000c0619, 0x19060600, 0x2c2b291f, 0xff141414, 0x10100010, 0x10101010 },
1093     { 0x4f3f3d1b, 0x281d1a29, 0x000c0619, 0x19060600, 0x2c2b291f, 0xff151515, 0x13130013, 0x13131313 },
1094     { 0x4f3f3d1b, 0x281d1a29, 0x000c0619, 0x19060600, 0x2c2b291f, 0xff161616, 0x13130013, 0x13131313 },
1095     { 0x5a4a491e, 0x2b291d2c, 0x0018081c, 0x1c080800, 0x382e2c2a, 0xff171717, 0x16160016, 0x16161616 },
1096     { 0x5a4a491e, 0x2b291d2c, 0x0018081c, 0x1c080800, 0x382e2c2a, 0xff181818, 0x16160016, 0x16161616 },
1097     { 0x5a4a491e, 0x2b291d2c, 0x0018081c, 0x1c080800, 0x382e2c2a, 0xff191919, 0x1a1a001a, 0x1a1a1a1a },
1098     { 0x5d4d4b29, 0x2d2b282f, 0x001a0a1f, 0x1f0a0a00, 0x3a392f2d, 0xff1a1a1a, 0x1a1a001a, 0x1a1a1a1a },
1099     { 0x5f4f4d2b, 0x382d2a39, 0x001c0c29, 0x290c0c00, 0x3c3b392f, 0xff1b1b1b, 0x1e1e001e, 0x1e1e1e1e },
1100     { 0x5f4f4d2b, 0x382d2a39, 0x001c0c29, 0x290c0c00, 0x3c3b392f, 0xff1c1c1c, 0x1e1e001e, 0x1e1e1e1e },
1101     { 0x69594f2c, 0x392f2b3b, 0x001e0e2b, 0x2b0e0e00, 0x3e3c3b39, 0xff1d1d1d, 0x22220022, 0x22222222 },
1102     { 0x6a5a592e, 0x3b392d3c, 0x0028182c, 0x2c181800, 0x483e3c3a, 0xff1e1e1e, 0x22220022, 0x22222222 },
1103     { 0x6b5b5a38, 0x3c3a2f3e, 0x0029192e, 0x2e191900, 0x49483e3b, 0xff1f1f1f, 0x27270027, 0x27272727 },
1104     { 0x6d5d5b39, 0x3d3b383f, 0x002a1a2f, 0x2f1a1a00, 0x4a493f3d, 0xff202020, 0x27270027, 0x27272727 },
1105     { 0x6e5e5c3a, 0x3e3c3948, 0x002b1b38, 0x381b1b00, 0x4b4a483e, 0xff212121, 0x2c2c002c, 0x2c2c2c2c },
1106     { 0x78685e3b, 0x493e3b4a, 0x002d1d3a, 0x3a1d1d00, 0x4d4b4a48, 0xff222222, 0x2c2c002c, 0x2c2c2c2c },
1107     { 0x79695f3c, 0x493f3b4b, 0x002e1e3b, 0x3b1e1e00, 0x4e4c4b49, 0xff232323, 0x32320032, 0x32323232 },
1108     { 0x7a6a693e, 0x4b493d4c, 0x0038283c, 0x3c282800, 0x584e4c4a, 0xff242424, 0x32320032, 0x32323232 },
1109     { 0x7b6b6a48, 0x4c4a3f4e, 0x0039293e, 0x3e292900, 0x59584e4b, 0xff252525, 0x38380038, 0x38383838 },
1110     { 0x7d6d6b49, 0x4d4b484f, 0x003a2a3f, 0x3f2a2a00, 0x5a594f4d, 0xff262626, 0x38380038, 0x38383838 },
1111     { 0x7e6e6c4a, 0x4f4c4959, 0x003c2c49, 0x492c2c00, 0x5c5a594e, 0xff272727, 0x3e3e003e, 0x3e3e3e3e },
1112     { 0x88786d4b, 0x584d4a59, 0x003d2d49, 0x492d2d00, 0x5d5b5958, 0xff282828, 0x3e3e003e, 0x3e3e3e3e },
1113     { 0x89796f4d, 0x5a4f4c5b, 0x003f2f4b, 0x4b2f2f00, 0x5f5d5b59, 0xff292929, 0x45450045, 0x45454545 },
1114     { 0x8a7a794e, 0x5b594d5c, 0x0048384c, 0x4c383800, 0x685e5c5a, 0xff2a2a2a, 0x45450045, 0x45454545 },
1115     { 0x8b7b7a58, 0x5c5a4f5e, 0x0049394e, 0x4e393900, 0x69685e5b, 0xff2b2b2b, 0x4d4d004d, 0x4d4d4d4d },
1116     { 0x8d7d7b59, 0x5d5b585f, 0x004a3a4f, 0x4f3a3a00, 0x6a695f5d, 0xff2c2c2c, 0x4d4d004d, 0x4d4d4d4d },
1117     { 0x8e7e7c5a, 0x5f5c5968, 0x004b3b58, 0x583b3b00, 0x6b6a685e, 0xff2d2d2d, 0x55550055, 0x55555555 },
1118     { 0x8f887e5b, 0x685e5a6a, 0x004d3d5a, 0x5a3d3d00, 0x6d6b6a68, 0xff2e2e2e, 0x55550055, 0x55555555 },
1119     { 0x8f897f5c, 0x695f5c6b, 0x004e3e5b, 0x5b3e3e00, 0x6e6c6b69, 0xff2f2f2f, 0x5e5e005e, 0x5e5e5e5e },
1120     { 0x8f8a895e, 0x6b695d6c, 0x0058485c, 0x5c484800, 0x6f6e6c6a, 0xff303030, 0x5e5e005e, 0x5e5e5e5e },
1121     { 0x8f8b8a68, 0x6c6a5f6e, 0x0059495e, 0x5e494900, 0x6f6f6e6b, 0xff313131, 0x68680068, 0x68686868 },
1122     { 0x8f8d8b69, 0x6d6b686f, 0x005a4a5f, 0x5f4a4a00, 0x6f6f6f6d, 0xff323232, 0x68680068, 0x68686868 },
1123     { 0x8f8e8c6a, 0x6f6c6979, 0x005b4b69, 0x694b4b00, 0x6f6f6f6e, 0xff333333, 0x73730073, 0x73737373 }
1124 }
1125 };
1126 
1127 // QP is from 0 - 51, pad it to 64 since BRC needs array size to be 64 bytes
1128 const uint8_t CodechalEncodeAvcEnc::m_qpDistMaxFrameAdjustmentCm[576] =
1129 {
1130     0x01, 0x02, 0x03, 0x05, 0x06, 0x01, 0x01, 0x02, 0x03, 0x05, 0x00, 0x00, 0x01, 0x02, 0x03, 0xff,
1131     0x00, 0x00, 0x01, 0x02, 0xff, 0x00, 0x00, 0x00, 0x01, 0xfe, 0xfe, 0xff, 0x00, 0x01, 0xfd, 0xfd,
1132     0xff, 0xff, 0x00, 0xfb, 0xfd, 0xfe, 0xff, 0xff, 0xfa, 0xfb, 0xfd, 0xfe, 0xff, 0x00, 0x04, 0x1e,
1133     0x3c, 0x50, 0x78, 0x8c, 0xc8, 0xff, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
1134     0x01, 0x02, 0x03, 0x05, 0x06, 0x01, 0x01, 0x02, 0x03, 0x05, 0x00, 0x01, 0x01, 0x02, 0x03, 0xff,
1135     0x00, 0x00, 0x01, 0x02, 0xff, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0x00, 0x01, 0xfe, 0xff,
1136     0xff, 0xff, 0x00, 0xfc, 0xfe, 0xff, 0xff, 0x00, 0xfb, 0xfc, 0xfe, 0xff, 0xff, 0x00, 0x04, 0x1e,
1137     0x3c, 0x50, 0x78, 0x8c, 0xc8, 0xff, 0x04, 0x05, 0x06, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
1138     0x01, 0x01, 0x02, 0x04, 0x05, 0x01, 0x01, 0x01, 0x02, 0x04, 0x00, 0x00, 0x01, 0x01, 0x02, 0xff,
1139     0x00, 0x00, 0x01, 0x01, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x01, 0xfe, 0xff,
1140     0xff, 0xff, 0x00, 0xfd, 0xfe, 0xff, 0xff, 0x00, 0xfb, 0xfc, 0xfe, 0xff, 0xff, 0x00, 0x02, 0x14,
1141     0x28, 0x46, 0x82, 0xa0, 0xc8, 0xff, 0x04, 0x04, 0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,
1142     0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03,
1143     0x03, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x03, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00,
1144     0x01, 0x02, 0x02, 0x02, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0xfe, 0xff, 0xff,
1145     0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0xfe, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x01, 0x02, 0xfe,
1146     0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x01, 0xfe, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01,
1147     0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1148     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1149     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1150     0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03,
1151     0x03, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x03, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00,
1152     0x01, 0x02, 0x02, 0x02, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0xfe, 0xff, 0xff,
1153     0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0xfe, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x01, 0x02, 0xfe,
1154     0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x01, 0xfe, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01,
1155     0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1156     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1157     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1158     0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03,
1159     0x03, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x03, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00,
1160     0x01, 0x02, 0x02, 0x02, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0xfe, 0xff, 0xff,
1161     0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0xfe, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x01, 0x02, 0xfe,
1162     0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x01, 0xfe, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01,
1163     0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1164     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1165     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1166 };
1167 
1168 const uint32_t CodechalEncodeAvcEnc::MultiPred[NUM_TARGET_USAGE_MODES] =
1169 {
1170 0, 3, 3, 0, 0, 0, 0, 0
1171 };
1172 const uint32_t CodechalEncodeAvcEnc::MRDisableQPCheck[NUM_TARGET_USAGE_MODES] =
1173 {
1174 0, 1, 0, 0, 0, 0, 0, 0
1175 };
1176 // AVC MBEnc RefCost tables, index [CodingType][QP]
1177 // QP is from 0 - 51, pad it to 64 since BRC needs each subarray size to be 128bytes
1178 const uint16_t CodechalEncodeAvcEnc::RefCost_MultiRefQp[NUM_PIC_TYPES][64] =
1179 {
1180 // I-frame
1181 {
1182     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1183     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1184     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1185     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1186     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1187     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1188     0x0000, 0x0000, 0x0000, 0x0000
1189 },
1190 // P-slice
1191 {
1192     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1193     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1194     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1195     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1196     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1197     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1198     0x0000, 0x0000, 0x0000, 0x0000
1199 },
1200 //B-slice
1201 {
1202     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1203     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1204     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1205     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1206     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1207     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1208     0x0000, 0x0000, 0x0000, 0x0000
1209 }
1210 };
1211 
1212 // 1 for P, 3 for P & B
1213 const uint32_t CodechalEncodeAvcEnc::CODECHAL_ENCODE_AVC_AllFractional_Common[NUM_TARGET_USAGE_MODES] =
1214 {
1215     0, 3, 3, 3, 3, 3, 3, 0
1216 };
1217 
CalcSkipVal(bool encBlockBasedSkipEn,bool transform8x8Flag,uint16_t skipVal)1218 uint16_t CodechalEncodeAvcEnc::CalcSkipVal(bool encBlockBasedSkipEn, bool transform8x8Flag, uint16_t skipVal)
1219 {
1220     if(!encBlockBasedSkipEn)
1221     {
1222         skipVal *= 3;
1223     }
1224     else if(!transform8x8Flag)
1225     {
1226         skipVal /= 2;
1227     }
1228 
1229     return skipVal;
1230 }
1231 
GetMaxMvsPer2Mb(uint8_t levelIdc)1232 uint32_t CodechalEncodeAvcEnc::GetMaxMvsPer2Mb(uint8_t levelIdc)
1233 {
1234     uint32_t maxMvsPer2Mb = 32;
1235 
1236     // See JVT Spec Annex A Table A-1 Level limits for below mapping
1237     switch (levelIdc)
1238     {
1239     case CODEC_AVC_LEVEL_3:
1240         maxMvsPer2Mb = 32;
1241         break;
1242     case CODEC_AVC_LEVEL_31:
1243     case CODEC_AVC_LEVEL_32:
1244     case CODEC_AVC_LEVEL_4:
1245     case CODEC_AVC_LEVEL_41:
1246     case CODEC_AVC_LEVEL_42:
1247     case CODEC_AVC_LEVEL_5:
1248     case CODEC_AVC_LEVEL_51:
1249     case CODEC_AVC_LEVEL_52:
1250         maxMvsPer2Mb = 16;
1251         break;
1252     default:
1253         break;
1254     }
1255 
1256     return maxMvsPer2Mb;
1257 }
1258 
1259 // Indicates if reference picture is a FIELD picture, if check ppRefList, the flags is always the second field flag;
1260 // because the first field flag will be overwrited by the second one.
1261 // if check the reference flag is top or bottom, using pParams->pSlcParams->RefPicList[list][index].PicFlags is better
GetRefPicFieldFlag(PCODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS params,uint32_t list,uint32_t index)1262 uint32_t CodechalEncodeAvcEnc::GetRefPicFieldFlag(
1263     PCODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS     params,
1264     uint32_t                                    list,
1265     uint32_t                                    index)
1266 {
1267     CODEC_PICTURE       refPic;
1268     uint32_t            refPicFieldFlag;
1269 
1270     refPicFieldFlag = 0;
1271 
1272     if(params == nullptr){
1273         CODECHAL_ENCODE_ASSERTMESSAGE("Invalid (NULL) Pointer.");
1274         return refPicFieldFlag;
1275     }
1276 
1277     CODECHAL_ENCODE_ASSERT(list == LIST_0 || list == LIST_1);
1278     CODECHAL_ENCODE_ASSERT(index < 32);
1279 
1280     refPic = params->pSlcParams->RefPicList[list][index];
1281     if (!CodecHal_PictureIsInvalid(refPic))
1282     {
1283         refPic = params->pPicParams->RefFrameList[refPic.FrameIdx];
1284         if (!CodecHal_PictureIsInvalid(refPic))
1285         {
1286             refPicFieldFlag = CodecHal_PictureIsField(params->ppRefList[refPic.FrameIdx]->RefPic);
1287         }
1288     }
1289 
1290     return refPicFieldFlag;
1291 }
1292 
AVCGetQPValueFromRefList(PCODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS params,uint32_t list,uint32_t index)1293 uint8_t CodechalEncodeAvcEnc::AVCGetQPValueFromRefList(
1294     PCODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS params,
1295     uint32_t                                list,
1296     uint32_t                                index)
1297 {
1298     uint8_t                             picIdx;
1299     CODEC_PICTURE                       picture;
1300 
1301     if(params == nullptr){
1302         CODECHAL_ENCODE_ASSERTMESSAGE("Invalid (NULL) Pointer.");
1303         return 0;
1304     }
1305 
1306     CODECHAL_ENCODE_ASSERT(list == LIST_0 || list == LIST_1);
1307     CODECHAL_ENCODE_ASSERT(index < CODEC_AVC_MAX_NUM_REF_FRAME * 2);
1308 
1309     picture = params->pSlcParams->RefPicList[list][index];
1310 
1311     if (!CodecHal_PictureIsInvalid(picture) && params->pPicIdx[picture.FrameIdx].bValid)
1312     {
1313         picIdx = params->pPicIdx[picture.FrameIdx].ucPicIdx;
1314         if (CodecHal_PictureIsBottomField(picture))
1315         {
1316             return params->ppRefList[picIdx]->ucQPValue[1];
1317         }
1318         else
1319         {
1320             return params->ppRefList[picIdx]->ucQPValue[0];
1321         }
1322     }
1323     else
1324     {
1325         return 0;
1326     }
1327 
1328     return 0;
1329 }
1330 
1331 //------------------------------------------------------------------------------------
1332 // Send surfaces for the AVC BRC Block Copy kernel
1333 //------------------------------------------------------------------------------------
SendBrcBlockCopySurfaces(CodechalHwInterface * hwInterface,PMOS_COMMAND_BUFFER cmdBuffer,PMHW_KERNEL_STATE mbEncKernelState,PMHW_KERNEL_STATE kernelState,PMOS_RESOURCE advancedDsh)1334 MOS_STATUS CodechalEncodeAvcEnc::SendBrcBlockCopySurfaces(
1335     CodechalHwInterface                        *hwInterface,
1336     PMOS_COMMAND_BUFFER                         cmdBuffer,
1337     PMHW_KERNEL_STATE                           mbEncKernelState,
1338     PMHW_KERNEL_STATE                           kernelState,
1339     PMOS_RESOURCE                               advancedDsh)
1340 {
1341     MOS_SURFACE                                 dshBuffer;
1342     CODECHAL_SURFACE_CODEC_PARAMS               surfaceCodecParams;
1343     MOS_RESOURCE                                *dsh = nullptr;
1344     MOS_STATUS                                  eStatus = MOS_STATUS_SUCCESS;
1345 
1346     CODECHAL_ENCODE_CHK_NULL_RETURN(hwInterface);
1347     CODECHAL_ENCODE_CHK_NULL_RETURN(cmdBuffer);
1348     CODECHAL_ENCODE_CHK_NULL_RETURN(mbEncKernelState);
1349     CODECHAL_ENCODE_CHK_NULL_RETURN(kernelState);
1350 
1351     // Set up artificial MOS_SURFACE for DSH buffers
1352     MOS_ZeroMemory(&dshBuffer, sizeof(dshBuffer));
1353     dshBuffer.TileType         = MOS_TILE_LINEAR;
1354     dshBuffer.bArraySpacing    = true;
1355     dshBuffer.Format           = Format_Buffer_2D;
1356     dshBuffer.dwWidth          = CODECHAL_ENCODE_AVC_BRC_COPY_BLOCK_WIDTH;
1357     dshBuffer.dwHeight         =
1358     mbEncKernelState->m_dshRegion.GetSize() / CODECHAL_ENCODE_AVC_BRC_COPY_BLOCK_WIDTH;
1359     dshBuffer.dwPitch          = CODECHAL_ENCODE_AVC_BRC_COPY_BLOCK_WIDTH;
1360 
1361     // Input
1362     dshBuffer.dwOffset         = mbEncKernelState->m_dshRegion.GetOffset();
1363     CODECHAL_ENCODE_CHK_NULL_RETURN(dsh = mbEncKernelState->m_dshRegion.GetResource());
1364     dshBuffer.OsResource = *dsh;
1365 
1366     MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
1367     surfaceCodecParams.bIs2DSurface          = true;
1368     surfaceCodecParams.bMediaBlockRW         = true;
1369     surfaceCodecParams.psSurface             = &dshBuffer;
1370     surfaceCodecParams.dwBindingTableOffset  = CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_INPUT;
1371     CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
1372         hwInterface,
1373         cmdBuffer,
1374         &surfaceCodecParams,
1375         kernelState));
1376 
1377     // Output
1378     dshBuffer.dwOffset         = 0;
1379     dshBuffer.OsResource       = *advancedDsh;
1380 
1381     MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
1382     surfaceCodecParams.bIs2DSurface          = true;
1383     surfaceCodecParams.bMediaBlockRW         = true;
1384     surfaceCodecParams.psSurface             = &dshBuffer;
1385     surfaceCodecParams.dwBindingTableOffset  = CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_OUTPUT;
1386     surfaceCodecParams.bRenderTarget         = true;
1387     surfaceCodecParams.bIsWritable           = true;
1388     CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
1389         hwInterface,
1390         cmdBuffer,
1391         &surfaceCodecParams,
1392         kernelState));
1393 
1394     return eStatus;
1395 }
1396 
CodechalEncodeAvcEnc(CodechalHwInterface * hwInterface,CodechalDebugInterface * debugInterface,PCODECHAL_STANDARD_INFO standardInfo)1397 CodechalEncodeAvcEnc::CodechalEncodeAvcEnc(
1398     CodechalHwInterface *   hwInterface,
1399     CodechalDebugInterface *debugInterface,
1400     PCODECHAL_STANDARD_INFO standardInfo) : CodechalEncodeAvcBase(hwInterface, debugInterface, standardInfo)
1401 
1402 {
1403     CODECHAL_ENCODE_FUNCTION_ENTER;
1404 
1405     InitializeDataMember();
1406 
1407     // Setup initial data
1408     bBrcInit = true;
1409     // enable codec specific user feature key reporting for AVC
1410     m_userFeatureKeyReport = true;
1411 
1412     m_kuid = IDR_CODEC_AllAVCEnc;
1413 
1414     m_swBrcMode = nullptr;
1415 
1416     m_cmKernelEnable = true;
1417     bBrcSplitEnable = true;
1418     bBrcRoiSupported = true;
1419     bHighTextureModeCostEnable = true;
1420 
1421     for (uint8_t i = 0; i < CODECHAL_ENCODE_BRC_IDX_NUM; i++)
1422     {
1423         BrcKernelStates[i] = MHW_KERNEL_STATE();
1424     }
1425 
1426     if (m_cmKernelEnable)
1427     {
1428         m_useCmScalingKernel = 1;
1429     }
1430 }
1431 
~CodechalEncodeAvcEnc()1432 CodechalEncodeAvcEnc::~CodechalEncodeAvcEnc()
1433 {
1434     CODECHAL_ENCODE_FUNCTION_ENTER;
1435 
1436     if (SeiData.pSEIBuffer)
1437     {
1438         MOS_FreeMemory(SeiData.pSEIBuffer);
1439         SeiData.pSEIBuffer = nullptr;
1440     }
1441 
1442     if (pWPKernelState)
1443     {
1444         MOS_Delete(pWPKernelState);
1445         pWPKernelState = nullptr;
1446     }
1447 
1448     MOS_Delete(pSFDKernelState);
1449     pSFDKernelState = nullptr;
1450 
1451     if (m_pakEnabled)
1452     {
1453         // release skip frame copy buffer
1454         m_osInterface->pfnFreeResource(m_osInterface, &resSkipFrameBuffer);
1455     }
1456 
1457     if (m_encEnabled)
1458     {
1459         ReleaseResourcesBrc();
1460         ReleaseResourcesMbBrc();
1461         m_osInterface->pfnFreeResource(m_osInterface, &resVMEScratchBuffer);
1462 
1463         if (bVMEKernelDump)
1464         {
1465             m_osInterface->pfnFreeResource(m_osInterface, &resVmeKernelDumpBuffer);
1466         }
1467 
1468         // RefPicSelectList
1469         for (uint32_t i = 0; i < CODECHAL_ENCODE_AVC_REF_PIC_SELECT_ENTRIES; i++)
1470         {
1471             m_osInterface->pfnFreeResource(
1472                 m_osInterface,
1473                 &RefPicSelectList[i].sBuffer.OsResource);
1474         }
1475 
1476         MOS_DeleteArray(pMbEncKernelStates);
1477     }
1478 
1479     //WP output surface
1480     for (uint32_t i = 0; i < CODEC_AVC_NUM_WP_FRAME; i++)
1481     {
1482         m_osInterface->pfnFreeResource(
1483             m_osInterface,
1484             &WeightedPredOutputPicSelectList[i].sBuffer.OsResource);
1485     }
1486 
1487     // SFD surfaces
1488     {
1489         // SFD output buffer
1490         for (uint32_t i = 0; i < CODECHAL_ENCODE_RECYCLED_BUFFER_NUM; i++)
1491         {
1492             m_osInterface->pfnFreeResource(
1493                 m_osInterface,
1494                 &resSFDOutputBuffer[i]);
1495         }
1496 
1497         m_osInterface->pfnFreeResource(
1498             m_osInterface,
1499             &resSFDCostTablePFrameBuffer);
1500 
1501         m_osInterface->pfnFreeResource(
1502             m_osInterface,
1503             &resSFDCostTableBFrameBuffer);
1504     }
1505 
1506     if (m_swBrcMode != nullptr)
1507     {
1508         m_osInterface->pfnFreeLibrary(m_swBrcMode);
1509         m_swBrcMode = nullptr;
1510     }
1511 
1512     // MB specific data buffer
1513     for (uint32_t i = 0; i < CODECHAL_ENCODE_RECYCLED_BUFFER_NUM; i++)
1514     {
1515         m_osInterface->pfnFreeResource(
1516             m_osInterface,
1517             &resMbSpecificDataBuffer[i]);
1518     }
1519 
1520     return;
1521 
1522 }
1523 
Initialize(CodechalSetting * settings)1524 MOS_STATUS CodechalEncodeAvcEnc::Initialize(CodechalSetting * settings)
1525 {
1526     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
1527 
1528     CODECHAL_ENCODE_FUNCTION_ENTER;
1529 
1530     CODECHAL_ENCODE_CHK_NULL_RETURN(settings);
1531 
1532     CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalEncodeAvcBase::Initialize(settings));
1533 
1534     // for AVC: the Ds+Copy kernel is by default used to do CSC and copy non-aligned surface
1535     m_cscDsState->EnableCopy();
1536     m_cscDsState->EnableColor();
1537 
1538     MOS_USER_FEATURE_VALUE_DATA userFeatureData;
1539 #if (_DEBUG || _RELEASE_INTERNAL)
1540     /*MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1541     MOS_UserFeature_ReadValue_ID(
1542         nullptr,
1543         __MEDIA_USER_FEATURE_VALUE_AVC_BRC_SOFTWARE_ID,
1544         &userFeatureData);
1545 
1546     if (userFeatureData.i32Data)
1547     {
1548         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnLoadLibrary(m_osInterface, CODECHAL_DBG_STRING_SWAVCBRCLIBRARY, &m_swBrcMode));
1549     }*/
1550 
1551     // SW BRC DLL Reporting
1552     CodecHalEncode_WriteKey(__MEDIA_USER_FEATURE_VALUE_AVC_BRC_SOFTWARE_IN_USE_ID, (m_swBrcMode == nullptr) ? false : true);
1553 #endif // (_DEBUG || _RELEASE_INTERNAL)
1554 
1555     if (!(m_codecFunction == CODECHAL_FUNCTION_PAK || m_codecFunction == CODECHAL_FUNCTION_FEI_PAK))
1556     {
1557         MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1558         MOS_UserFeature_ReadValue_ID(
1559             nullptr,
1560             __MEDIA_USER_FEATURE_VALUE_AVC_ENCODE_ME_ENABLE_ID,
1561             &userFeatureData);
1562         m_hmeSupported = (userFeatureData.u32Data) ? true : false;
1563 
1564         MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1565         MOS_UserFeature_ReadValue_ID(
1566             nullptr,
1567             __MEDIA_USER_FEATURE_VALUE_AVC_ENCODE_16xME_ENABLE_ID,
1568             &userFeatureData);
1569 
1570         if (userFeatureData.i32Data == 0 || userFeatureData.i32Data == 1)
1571         {
1572             m_16xMeUserfeatureControl = true;
1573             m_16xMeSupported = (userFeatureData.i32Data) ? true : false;
1574         }
1575         else
1576         {
1577             m_16xMeUserfeatureControl = false;
1578             m_16xMeSupported = true;
1579         }
1580 
1581         // Flatness check enable
1582         m_flatnessCheckSupported = 1; // Enabled by default for AVC when supported
1583 
1584         MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1585         MOS_UserFeature_ReadValue_ID(
1586             nullptr,
1587             __MEDIA_USER_FEATURE_VALUE_FLATNESS_CHECK_ENABLE_ID,
1588             &userFeatureData);
1589         m_flatnessCheckSupported = (userFeatureData.i32Data) ? true : false;
1590 
1591         MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1592         MOS_UserFeature_ReadValue_ID(
1593             nullptr,
1594             __MEDIA_USER_FEATURE_VALUE_STATIC_FRAME_DETECTION_ENABLE_ID,
1595             &userFeatureData);
1596         bStaticFrameDetectionEnable = (userFeatureData.i32Data) ? true : false;
1597 
1598         MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1599         MOS_UserFeature_ReadValue_ID(
1600             nullptr,
1601             __MEDIA_USER_FEATURE_VALUE_AVC_ADAPTIVE_SEARCH_WINDOW_ENABLE_ID,
1602             &userFeatureData);
1603         bApdatvieSearchWindowEnable = (userFeatureData.i32Data) ? true : false;
1604 
1605         MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1606         MOS_UserFeature_ReadValue_ID(
1607             nullptr,
1608             __MEDIA_USER_FEATURE_VALUE_AVC_FORCE_TO_SKIP_ENABLE_ID,
1609             &userFeatureData);
1610         bForceToSkipEnable = (userFeatureData.u32Data) ? true : false;
1611 
1612         MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1613         MOS_UserFeature_ReadValue_ID(
1614             nullptr,
1615             __MEDIA_USER_FEATURE_VALUE_AVC_SLIDING_WINDOW_SIZE_ID,
1616             &userFeatureData);
1617         dwSlidingWindowSize = userFeatureData.u32Data;
1618 
1619         // Colorbit support (encoding multiple slices in parallel)
1620         m_colorbitSupported = 1;  // Enable by default for AVC
1621 #if (_DEBUG || _RELEASE_INTERNAL)
1622         MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1623         MOS_UserFeature_ReadValue_ID(
1624             nullptr,
1625             __MEDIA_USER_FEATURE_VALUE_COLOR_BIT_SUPPORT_ENABLE_ID,
1626             &userFeatureData);
1627         m_colorbitSupported = (userFeatureData.i32Data) ? true : false;
1628 #endif
1629 
1630         m_groupIdSelectSupported = 0; // Disabled by default for AVC for now
1631 #if (_DEBUG || _RELEASE_INTERNAL)
1632         MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1633         MOS_UserFeature_ReadValue_ID(
1634             nullptr,
1635             __MEDIA_USER_FEATURE_VALUE_GROUP_ID_SELECT_ENABLE_ID,
1636             &userFeatureData);
1637         m_groupIdSelectSupported = (userFeatureData.i32Data) ? true : false;
1638 #endif
1639 
1640         m_groupId = 0; // default value for group ID  = 0
1641 #if (_DEBUG || _RELEASE_INTERNAL)
1642         MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1643         MOS_UserFeature_ReadValue_ID(
1644             nullptr,
1645             __MEDIA_USER_FEATURE_VALUE_GROUP_ID_ID,
1646             &userFeatureData);
1647         m_groupId = (uint8_t)userFeatureData.i32Data;
1648 #endif
1649     }
1650 
1651     // disable BRC and HME for FEI encoder
1652     if ((m_feiEnable) && (m_codecFunction != CODECHAL_FUNCTION_FEI_PRE_ENC))
1653     {
1654         m_hmeSupported = false;
1655         m_16xMeSupported = false;
1656         m_32xMeSupported = false;
1657     }
1658 
1659     // Initialize hardware resources for the current Os/Platform
1660     CODECHAL_ENCODE_CHK_STATUS_RETURN(InitializeState());
1661     {
1662         MotionEstimationDisableCheck();
1663     }
1664     CODECHAL_ENCODE_CHK_STATUS_RETURN(Initialize());
1665 
1666     // common function for all codecs needed
1667     if (CodecHalUsesRenderEngine(m_codecFunction, m_standard))
1668     {
1669         CODECHAL_ENCODE_CHK_STATUS_RETURN(InitKernelState());
1670     }
1671 
1672     // Picture Level Commands
1673     m_hwInterface->GetMfxStateCommandsDataSize(
1674         CODECHAL_ENCODE_MODE_AVC,
1675         &m_pictureStatesSize,
1676         &m_picturePatchListSize,
1677         false);
1678 
1679     // Slice Level Commands
1680     m_hwInterface->GetMfxPrimitiveCommandsDataSize(
1681         CODECHAL_ENCODE_MODE_AVC,
1682         &m_sliceStatesSize,
1683         &m_slicePatchListSize,
1684         m_singleTaskPhaseSupported);
1685 
1686     return eStatus;
1687 }
1688 
InitializeDataMember()1689 void CodechalEncodeAvcEnc::InitializeDataMember()
1690 {
1691     CODECHAL_ENCODE_FUNCTION_ENTER;
1692 
1693     // SEI
1694     MOS_ZeroMemory(&SeiData, sizeof(CodechalEncodeSeiData));
1695     dwSEIDataOffset = false;
1696     pSeiParamBuffer = nullptr;
1697 
1698     bMbEncCurbeSetInBrcUpdate = false;
1699     bMbEncIFrameDistEnabled = false;
1700     bBrcInit = false;
1701     bBrcReset = false;
1702     bBrcEnabled = false;
1703     bMbBrcEnabled = false;
1704     bBrcRoiEnabled = false;                 // BRC ROI feature
1705     bROIValueInDeltaQP = false;
1706     bROISmoothEnabled = false;
1707     bMbBrcUserFeatureKeyControl = false;
1708     dBrcTargetSize = 0.0f;
1709     dwTrellis = false;
1710     bAcceleratorHeaderPackingCaps = false; //flag set by driver from driver caps
1711     dwIntraRefreshQpThreshold = false;
1712     bSquareRollingIEnabled = false;
1713 
1714     // VME Scratch Buffers
1715     MOS_ZeroMemory(&resVMEScratchBuffer, sizeof(MOS_RESOURCE));            // HSW+
1716     bVMEScratchBuffer = false;
1717     MOS_ZeroMemory(&resVmeKernelDumpBuffer, sizeof(MOS_RESOURCE));
1718     bVMEKernelDump = false;
1719     ulVMEKernelDumpBottomFieldOffset = 0;
1720 
1721     // MbEnc
1722     pMbEncKernelStates = nullptr;
1723     MOS_ZeroMemory(&MbEncBindingTable, sizeof(CODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC));
1724     dwNumMbEncEncKrnStates = false;
1725     MOS_ZeroMemory(RefPicSelectList, CODECHAL_ENCODE_AVC_REF_PIC_SELECT_ENTRIES * sizeof(CODEC_AVC_REF_PIC_SELECT_LIST));
1726     ucCurrRefPicSelectIndex = 0;
1727     ulRefPicSelectBottomFieldOffset = 0;
1728     dwMbEncBlockBasedSkipEn = false;
1729     bKernelTrellis = false; // Kernel controlled Trellis Quantization
1730     bExtendedMvCostRange = false; // Extended MV Cost Range for Gen10+
1731 
1732     // WP
1733     pWPKernelState = nullptr;
1734     MOS_ZeroMemory(WeightedPredOutputPicSelectList, CODEC_AVC_NUM_WP_FRAME * sizeof(CODEC_AVC_REF_PIC_SELECT_LIST));
1735 
1736     // BRC Params
1737     MOS_ZeroMemory(&BrcUpdateBindingTable, sizeof(CODECHAL_ENCODE_AVC_BINDING_TABLE_BRC_UPDATE));
1738 
1739     // PreProc
1740     MOS_ZeroMemory(&PreProcBindingTable, sizeof(CODECHAL_ENCODE_AVC_BINDING_TABLE_PREPROC));
1741 
1742     MOS_ZeroMemory(&BrcBuffers, sizeof(EncodeBrcBuffers));
1743     usAVBRAccuracy = 0;
1744     usAVBRConvergence = 0;
1745     dBrcInitCurrentTargetBufFullInBits = 0;
1746     dBrcInitResetInputBitsPerFrame = 0;
1747     dwBrcInitResetBufSizeInBits = false;
1748     dwBrcInitPreviousTargetBufFullInBits = false;
1749     // Below values will be set if qp control params are sent by app
1750     bMinMaxQPControlEnabled = false;  // Flag to indicate if min/max QP feature is enabled or not.
1751     ucIMinQP = 0;
1752     ucIMaxQP = 0;
1753     ucPMinQP = 0;
1754     ucPMaxQP = 0;
1755     ucBMinQP = 0;
1756     ucBMaxQP = 0;
1757     bPFrameMinMaxQPControl = false;   // Indicates min/max QP values for P-frames are set separately or not.
1758     bBFrameMinMaxQPControl = false;   // Indicates min/max QP values for B-frames are set separately or not.
1759 
1760     dwSkipFrameBufferSize = false;     // size of skip frame packed data
1761     MOS_ZeroMemory(&resSkipFrameBuffer, sizeof(MOS_RESOURCE));        // copy skip frame packed data from DDI
1762     // Mb Disable Skip Map
1763     bMbDisableSkipMapEnabled = false;
1764     psMbDisableSkipMapSurface = nullptr;
1765 
1766     // Mb Qp Data
1767     bMbQpDataEnabled = false;
1768     MOS_ZeroMemory(&sMbQpDataSurface, sizeof(MOS_SURFACE));
1769 
1770     // Mb Specific Data
1771     bMbSpecificDataEnabled = false;
1772     MOS_ZeroMemory(&resMbSpecificDataBuffer, sizeof(MOS_RESOURCE) * CODECHAL_ENCODE_RECYCLED_BUFFER_NUM);
1773 
1774     // Static frame detection
1775     bStaticFrameDetectionEnable = false;    // Static frame detection enable
1776     bApdatvieSearchWindowEnable = false;    // allow search window size change when SFD enabled
1777     bPerMbSFD = false;
1778     MOS_ZeroMemory(&resSFDOutputBuffer, sizeof(MOS_RESOURCE)* CODECHAL_ENCODE_RECYCLED_BUFFER_NUM);
1779 
1780     MOS_ZeroMemory(&resSFDCostTablePFrameBuffer, sizeof(MOS_RESOURCE));
1781     MOS_ZeroMemory(&resSFDCostTableBFrameBuffer, sizeof(MOS_RESOURCE));
1782     pSFDKernelState = nullptr;
1783 
1784     // Generation Specific Support Flags & User Feature Key Reads
1785     bBrcDistortionBufferSupported = false;
1786     bRefPicSelectListSupported = false;
1787     ucMbBrcSupportCaps = 0;
1788     bMultiPredEnable = false;               // MultiPredictor enable, 6 predictors
1789     bFTQEnable = false;                     // FTQEnable
1790     bCAFSupported = false;                  // CAFSupported
1791     bCAFEnable = false;                     // CAFEnable
1792     bCAFDisableHD = false;                  // Disable CAF for HD
1793     bSkipBiasAdjustmentSupported = false;   // SkipBiasAdjustment support for P frame
1794     bAdaptiveIntraScalingEnable = false;    // Enable AdaptiveIntraScaling
1795     bOldModeCostEnable = false;             // Enable Old Mode Cost (HSW cost table for BDW)
1796     bMultiRefQpEnabled = false;             // BDW Mutiref Qp
1797     bAdvancedDshInUse  = false;             // Use MbEnc Adv kernel
1798     bUseMbEncAdvKernel = false;             // Use MbEnc Adv kernel
1799     bUseWeightedSurfaceForL0 = false;       //Use WP Surface for L0
1800     bUseWeightedSurfaceForL1 = false;       //Use WP Surface for L1
1801     bWeightedPredictionSupported = false;   //Weighted prediction support
1802     bBrcSplitEnable = false;                // starting GEN9 BRC kernel has split into frame-level and MB-level update.
1803     bDecoupleMbEncCurbeFromBRC = false;     // starting GEN95 BRC kernel write to extra surface instread of MBEnc curbe.
1804     bSliceLevelReportSupported = false;     // Slice Level Report support
1805     bFBRBypassEnable = false;               // FBRBypassEnable
1806     bBrcRoiSupported = false;
1807     bMvDataNeededByBRC = false;             // starting from G95,
1808     bHighTextureModeCostEnable = false;
1809 
1810     bRoundingInterEnable = false;
1811     bAdaptiveRoundingInterEnable = false;
1812     dwRoundingInterP = false;
1813     dwRoundingInterB = false;
1814     dwRoundingInterBRef = false;
1815     dwBrcConstantSurfaceWidth = false;
1816     dwBrcConstantSurfaceHeight = false;
1817 
1818     dwSlidingWindowSize = false;
1819     bForceToSkipEnable = false;
1820 }
1821 
Initialize()1822 MOS_STATUS CodechalEncodeAvcEnc::Initialize()
1823 {
1824     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
1825 
1826     CODECHAL_ENCODE_FUNCTION_ENTER;
1827 
1828     CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalEncodeAvcBase::Initialize());
1829     return eStatus;
1830 }
1831 
InitializeState()1832 MOS_STATUS CodechalEncodeAvcEnc::InitializeState()
1833 {
1834     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
1835 
1836     CODECHAL_ENCODE_FUNCTION_ENTER;
1837 
1838     MOS_USER_FEATURE_VALUE_DATA userFeatureData;
1839     MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1840     MOS_UserFeature_ReadValue_ID(
1841         nullptr,
1842         __MEDIA_USER_FEATURE_VALUE_SINGLE_TASK_PHASE_ENABLE_ID,
1843         &userFeatureData);
1844     m_singleTaskPhaseSupported = (userFeatureData.i32Data) ? true : false;
1845 
1846     // Set interleaved scaling output to support PAFF.
1847     m_fieldScalingOutputInterleaved = true;
1848 
1849     if (m_encEnabled)
1850     {
1851         MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1852         MOS_UserFeature_ReadValue_ID(
1853             nullptr,
1854             __MEDIA_USER_FEATURE_VALUE_AVC_ENCODE_MULTIPRED_ENABLE_ID,
1855             &userFeatureData);
1856         bMultiPredEnable = (userFeatureData.i32Data) ? true : false;
1857 
1858         MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1859         MOS_UserFeature_ReadValue_ID(
1860             nullptr,
1861             __MEDIA_USER_FEATURE_VALUE_AVC_FTQ_ENABLE_ID,
1862             &userFeatureData);
1863         bFTQEnable = (userFeatureData.i32Data) ? true : false;
1864 
1865         MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1866         MOS_UserFeature_ReadValue_ID(
1867             nullptr,
1868             __MEDIA_USER_FEATURE_VALUE_AVC_CAF_ENABLE_ID,
1869             &userFeatureData);
1870         bCAFSupported = (userFeatureData.i32Data) ? true : false;
1871 
1872         MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1873         MOS_UserFeature_ReadValue_ID(
1874             nullptr,
1875             __MEDIA_USER_FEATURE_VALUE_AVC_CAF_DISABLE_HD_ID,
1876             &userFeatureData);
1877         bCAFDisableHD = (userFeatureData.i32Data) ? true : false;
1878 
1879         ucMbBrcSupportCaps = 1;
1880         if (ucMbBrcSupportCaps)
1881         {
1882             // If the MBBRC user feature key does not exist, MBBRC will be set in SPS parsing
1883             MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1884             MOS_UserFeature_ReadValue_ID(
1885                 nullptr,
1886                 __MEDIA_USER_FEATURE_VALUE_AVC_MB_BRC_ENABLE_ID,
1887                 &userFeatureData);
1888             if (userFeatureData.i32Data == 0 || userFeatureData.i32Data == 1)
1889             {
1890                 bMbBrcUserFeatureKeyControl = true;
1891                 bMbBrcEnabled = userFeatureData.i32Data ? true : false;
1892             }
1893         }
1894 
1895         MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1896         MOS_UserFeature_ReadValue_ID(
1897             nullptr,
1898             __MEDIA_USER_FEATURE_VALUE_AVC_MULTIREF_QP_ID,
1899             &userFeatureData);
1900         bMultiRefQpEnabled = (userFeatureData.i32Data) ? true : false;
1901 
1902         MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1903         MOS_UserFeature_ReadValue_ID(
1904             nullptr,
1905             __MEDIA_USER_FEATURE_VALUE_AVC_ENCODE_32xME_ENABLE_ID,
1906             &userFeatureData);
1907 
1908         if (userFeatureData.i32Data == 0 || userFeatureData.i32Data == 1)
1909         {
1910             m_32xMeUserfeatureControl = true;
1911             m_32xMeSupported = (userFeatureData.i32Data) ? true : false;
1912         }
1913         else
1914         {
1915             m_32xMeUserfeatureControl = false;
1916             m_32xMeSupported = true;
1917         }
1918     }
1919 
1920     MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1921     MOS_UserFeature_ReadValue_ID(
1922         nullptr,
1923         __MEDIA_USER_FEATURE_VALUE_AVC_ROUNDING_INTER_ENABLE_ID,
1924         &userFeatureData);
1925     bRoundingInterEnable = (userFeatureData.i32Data) ? true : false;
1926 
1927     MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1928     userFeatureData.i32Data = CODECHAL_ENCODE_AVC_INVALID_ROUNDING;
1929     userFeatureData.i32DataFlag = MOS_USER_FEATURE_VALUE_DATA_FLAG_CUSTOM_DEFAULT_VALUE_TYPE;
1930     MOS_UserFeature_ReadValue_ID(
1931         nullptr,
1932         __MEDIA_USER_FEATURE_VALUE_AVC_ROUNDING_INTER_P_ID,
1933         &userFeatureData);
1934     dwRoundingInterP = userFeatureData.i32Data;
1935 
1936     MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1937     userFeatureData.i32Data = CODECHAL_ENCODE_AVC_INVALID_ROUNDING;
1938     userFeatureData.i32DataFlag = MOS_USER_FEATURE_VALUE_DATA_FLAG_CUSTOM_DEFAULT_VALUE_TYPE;
1939     MOS_UserFeature_ReadValue_ID(
1940         nullptr,
1941         __MEDIA_USER_FEATURE_VALUE_AVC_ROUNDING_INTER_B_ID,
1942         &userFeatureData);
1943     dwRoundingInterB = userFeatureData.i32Data;
1944 
1945     MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1946     userFeatureData.i32Data = CODECHAL_ENCODE_AVC_INVALID_ROUNDING;
1947     userFeatureData.i32DataFlag = MOS_USER_FEATURE_VALUE_DATA_FLAG_CUSTOM_DEFAULT_VALUE_TYPE;
1948     MOS_UserFeature_ReadValue_ID(
1949         nullptr,
1950         __MEDIA_USER_FEATURE_VALUE_AVC_ROUNDING_INTER_BREF_ID,
1951         &userFeatureData);
1952     dwRoundingInterBRef = userFeatureData.i32Data;
1953 
1954     MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1955     userFeatureData.i32Data = 1;
1956     userFeatureData.i32DataFlag = MOS_USER_FEATURE_VALUE_DATA_FLAG_CUSTOM_DEFAULT_VALUE_TYPE;
1957     MOS_UserFeature_ReadValue_ID(
1958         nullptr,
1959         __MEDIA_USER_FEATURE_VALUE_AVC_ADAPTIVE_ROUNDING_INTER_ENABLE_ID,
1960         &userFeatureData);
1961     bAdaptiveRoundingInterEnable = (userFeatureData.i32Data) ? true : false;
1962 
1963     MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1964     MOS_UserFeature_ReadValue_ID(
1965         nullptr,
1966         __MEDIA_USER_FEATURE_VALUE_AVC_SKIP_BIAS_ADJUSTMENT_ENABLE_ID,
1967         &userFeatureData);
1968     bSkipBiasAdjustmentSupported = (userFeatureData.i32Data) ? true : false;
1969 
1970     MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1971     MOS_UserFeature_ReadValue_ID(
1972         nullptr,
1973         __MEDIA_USER_FEATURE_VALUE_AVC_ADAPTIVE_INTRA_SCALING_ENABLE_ID,
1974         &userFeatureData);
1975     bAdaptiveIntraScalingEnable = (userFeatureData.i32Data) ? true : false;
1976 
1977     MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1978     MOS_UserFeature_ReadValue_ID(
1979         nullptr,
1980         __MEDIA_USER_FEATURE_VALUE_AVC_OLD_MODE_COST_ENABLE_ID,
1981         &userFeatureData);
1982     bOldModeCostEnable = (userFeatureData.i32Data) ? true : false;
1983 
1984     //Check if ATD has been disabled by user feature key. The TU check happens in CodecHalAvcEncode_SetPictureStructs()
1985     MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1986     userFeatureData.i32Data = 1;
1987     MOS_UserFeature_ReadValue_ID(
1988         nullptr,
1989         __MEDIA_USER_FEATURE_VALUE_ADAPTIVE_TRANSFORM_DECISION_ENABLE_ID,
1990         &userFeatureData);
1991     m_adaptiveTransformDecisionEnabled = (userFeatureData.i32Data) ? true : false;
1992 
1993     // add user feature key to test FBR Bypass on SKL
1994     MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
1995     MOS_UserFeature_ReadValue_ID(
1996         nullptr,
1997         __MEDIA_USER_FEATURE_VALUE_FBR_BYPASS_ENABLE_ID,
1998         &userFeatureData);
1999     bFBRBypassEnable = (userFeatureData.i32Data) ? true : false;
2000 
2001     // add user feature key to enable/disable variance computation in BRC kernel
2002     MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
2003     MOS_UserFeature_ReadValue_ID(
2004         nullptr,
2005         __MEDIA_USER_FEATURE_VALUE_AVC_BRC_VAR_COMPU_BYPASS_ID,
2006         &userFeatureData);
2007     bBRCVarCompuBypass = (userFeatureData.i32Data) ? true : false;
2008 
2009     // add user feature key to switch on/off ARB WA of CNL AVC MBEnc hang
2010     MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
2011     MOS_UserFeature_ReadValue_ID(
2012         nullptr,
2013         __MEDIA_USER_FEATURE_VALUE_ENABLE_CNL_AVC_ENCODE_ARB_WA_ID,
2014         &userFeatureData);
2015     if ((userFeatureData.i32Data) == 0)
2016     {
2017         MEDIA_WR_WA(m_waTable, WaArbitraryNumMbsInSlice, 0);
2018     }
2019 
2020     m_4xMeDistortionBufferSupported = true;
2021     bBrcDistortionBufferSupported = true;
2022     bRefPicSelectListSupported = true;
2023 
2024     bPerMbSFD = true;
2025 
2026     bWeightedPredictionSupported = true;
2027 
2028     m_forceBrcMbStatsEnabled = true;
2029 
2030     return eStatus;
2031 }
2032 
ValidateNumReferences(PCODECHAL_ENCODE_AVC_VALIDATE_NUM_REFS_PARAMS params)2033 MOS_STATUS CodechalEncodeAvcEnc::ValidateNumReferences(PCODECHAL_ENCODE_AVC_VALIDATE_NUM_REFS_PARAMS params)
2034 {
2035     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
2036 
2037     CODECHAL_ENCODE_CHK_NULL_RETURN(params);
2038     CODECHAL_ENCODE_CHK_NULL_RETURN(params->pSeqParams);
2039     CODECHAL_ENCODE_CHK_NULL_RETURN(params->pAvcSliceParams);
2040 
2041     uint8_t numRefIdx0MinusOne = params->pAvcSliceParams->num_ref_idx_l0_active_minus1;
2042     uint8_t numRefIdx1MinusOne = params->pAvcSliceParams->num_ref_idx_l1_active_minus1;
2043 
2044     // Nothing to do here if numRefIdx = 0 and frame encoded
2045     if (numRefIdx0MinusOne == 0 && !CodecHal_PictureIsField(params->pPicParams->CurrOriginalPic))
2046     {
2047         if (params->wPictureCodingType == P_TYPE ||
2048             (params->wPictureCodingType == B_TYPE && numRefIdx1MinusOne == 0))
2049         {
2050             return eStatus;
2051         }
2052     }
2053 
2054     uint8_t   maxPNumRefIdx0MinusOne;
2055     if (params->wPictureCodingType == P_TYPE || params->wPictureCodingType == B_TYPE)
2056     {
2057         if (params->wPictureCodingType == P_TYPE)
2058         {
2059             if ((((params->wPicHeightInMB * CODECHAL_MACROBLOCK_HEIGHT) * (params->wFrameFieldHeightInMB * CODECHAL_MACROBLOCK_WIDTH)) >= 3840 * 2160)
2060                 && CodecHal_PictureIsFrame(params->pPicParams->CurrOriginalPic))
2061             {
2062                 maxPNumRefIdx0MinusOne = MaxRefIdx0_Progressive_4K[params->pSeqParams->TargetUsage];
2063             }
2064             else
2065             {
2066                 maxPNumRefIdx0MinusOne = MaxRefIdx0[params->pSeqParams->TargetUsage];
2067             }
2068 
2069             if (numRefIdx0MinusOne > maxPNumRefIdx0MinusOne)
2070             {
2071                 CODECHAL_ENCODE_NORMALMESSAGE("Invalid active reference list size.");
2072                 numRefIdx0MinusOne = maxPNumRefIdx0MinusOne;
2073             }
2074 
2075             numRefIdx1MinusOne = 0;
2076         }
2077         else // B_TYPE
2078         {
2079             if (numRefIdx0MinusOne > MaxBRefIdx0[params->pSeqParams->TargetUsage])
2080             {
2081                 CODECHAL_ENCODE_NORMALMESSAGE("Invalid active reference list size.");
2082                 numRefIdx0MinusOne = MaxBRefIdx0[params->pSeqParams->TargetUsage];
2083             }
2084 
2085             if (numRefIdx1MinusOne > MaxRefIdx1[params->pSeqParams->TargetUsage])
2086             {
2087                 CODECHAL_ENCODE_NORMALMESSAGE("Invalid active reference list size.");
2088                 numRefIdx1MinusOne = MaxRefIdx1[params->pSeqParams->TargetUsage];
2089             }
2090 
2091             // supports at most 1 L1 ref for frame picture
2092             if (CodecHal_PictureIsFrame(params->pPicParams->CurrOriginalPic) && numRefIdx1MinusOne > 0)
2093             {
2094                 numRefIdx1MinusOne = 0;
2095             }
2096         }
2097     }
2098     // Override number of references used by VME. PAK uses value from DDI (num_ref_idx_l*_active_minus1_from_DDI)
2099     params->pAvcSliceParams->num_ref_idx_l0_active_minus1 = numRefIdx0MinusOne;
2100     params->pAvcSliceParams->num_ref_idx_l1_active_minus1 = numRefIdx1MinusOne;
2101 
2102     return eStatus;
2103 }
2104 
InitBrcConstantBuffer(PCODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS params)2105 MOS_STATUS CodechalEncodeAvcEnc::InitBrcConstantBuffer(PCODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS params)
2106 {
2107     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
2108 
2109     CODECHAL_ENCODE_FUNCTION_ENTER;
2110     CODECHAL_ENCODE_CHK_NULL_RETURN(params);
2111     CODECHAL_ENCODE_CHK_NULL_RETURN(params->pOsInterface);
2112 
2113     MOS_LOCK_PARAMS lockFlags;
2114     MOS_ZeroMemory(&lockFlags, sizeof(MOS_LOCK_PARAMS));
2115     lockFlags.WriteOnly = 1;
2116     uint8_t* pbData = (uint8_t*)params->pOsInterface->pfnLockResource(
2117         params->pOsInterface,
2118         &params->sBrcConstantDataBuffer.OsResource,
2119         &lockFlags);
2120     CODECHAL_ENCODE_CHK_NULL_RETURN(pbData);
2121 
2122     MOS_ZeroMemory(pbData, params->sBrcConstantDataBuffer.dwWidth * params->sBrcConstantDataBuffer.dwHeight);
2123 
2124     // Fill surface with qp Adjustment table, Distortion threshold table, MaxFrame threshold table, Distortion qp Adjustment Table for I frame
2125     eStatus = MOS_SecureMemcpy(
2126         pbData,
2127         sizeof(m_qpDistMaxFrameAdjustmentCm),
2128         (void*)m_qpDistMaxFrameAdjustmentCm,
2129         sizeof(m_qpDistMaxFrameAdjustmentCm));
2130     if (eStatus != MOS_STATUS_SUCCESS)
2131     {
2132         CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory.");
2133         return eStatus;
2134     }
2135 
2136     pbData += sizeof(m_qpDistMaxFrameAdjustmentCm);
2137 
2138     uint8_t qp = 0;
2139     if (params->wPictureCodingType == I_TYPE)
2140     {
2141         // skip early skip table for I frame
2142         pbData += m_brcConstantSurfaceEarlySkipTableSize;
2143 
2144         // POCs not used for now, set to zeroes
2145         pbData += CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_POCS_IN_DPB_LIST_SIZE;
2146         pbData += CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_POCS_IN_FINAL_LIST_SIZE;
2147 
2148         // Mode cost and MV cost
2149         eStatus = MOS_SecureMemcpy(
2150             pbData,
2151             m_brcConstantSurfacModeMvCostSize,
2152             (void*)&ModeMvCost_Common[0][0][0],
2153             m_brcConstantSurfacModeMvCostSize);
2154         if (eStatus != MOS_STATUS_SUCCESS)
2155         {
2156             CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory.");
2157             return eStatus;
2158         }
2159 
2160         if (params->pAvcQCParams)
2161         {
2162             for (qp = 0; qp < CODEC_AVC_NUM_QP; qp++)
2163             {
2164                 if (params->pAvcQCParams->FTQSkipThresholdLUT[qp])
2165                 {
2166                     *(pbData + (qp * 32) + 24) =
2167                         *(pbData + (qp * 32) + 25) =
2168                         *(pbData + (qp * 32) + 27) =
2169                         *(pbData + (qp * 32) + 28) =
2170                         *(pbData + (qp * 32) + 29) =
2171                         *(pbData + (qp * 32) + 30) =
2172                         *(pbData + (qp * 32) + 31) = params->pAvcQCParams->FTQSkipThresholdLUT[qp];
2173                 }
2174             }
2175         }
2176 
2177         pbData += m_brcConstantSurfacModeMvCostSize;
2178 
2179         // Refcost
2180         eStatus = MOS_SecureMemcpy(
2181             pbData,
2182             m_brcConstantSurfaceRefCostSize,
2183             (void*)&RefCost_Common[0][0],
2184             m_brcConstantSurfaceRefCostSize);
2185         if (eStatus != MOS_STATUS_SUCCESS)
2186         {
2187             CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory.");
2188             return eStatus;
2189         }
2190     }
2191     else if (params->wPictureCodingType == P_TYPE)
2192     {
2193         if (!params->dwMbEncBlockBasedSkipEn)
2194         {
2195             if (params->pPicParams->transform_8x8_mode_flag)
2196             {
2197                 eStatus = MOS_SecureMemcpy(
2198                     pbData,
2199                     m_brcConstantSurfaceEarlySkipTableSize,
2200                     (void*)&SkipVal_P_Common[0][1][0],
2201                     m_brcConstantSurfaceEarlySkipTableSize);
2202                 if (eStatus != MOS_STATUS_SUCCESS)
2203                 {
2204                     CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory.");
2205                     return eStatus;
2206                 }
2207             }
2208             else
2209             {
2210                 eStatus = MOS_SecureMemcpy(
2211                     pbData,
2212                     m_brcConstantSurfaceEarlySkipTableSize,
2213                     (void*)&SkipVal_P_Common[0][0][0],
2214                     m_brcConstantSurfaceEarlySkipTableSize);
2215                 if (eStatus != MOS_STATUS_SUCCESS)
2216                 {
2217                     CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory.");
2218                     return eStatus;
2219                 }
2220             }
2221         }
2222         else
2223         {
2224             if (params->pPicParams->transform_8x8_mode_flag)
2225             {
2226                 eStatus = MOS_SecureMemcpy(
2227                     pbData,
2228                     m_brcConstantSurfaceEarlySkipTableSize,
2229                     (void*)&SkipVal_P_Common[1][1][0],
2230                     m_brcConstantSurfaceEarlySkipTableSize);
2231                 if (eStatus != MOS_STATUS_SUCCESS)
2232                 {
2233                     CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory.");
2234                     return eStatus;
2235                 }
2236             }
2237             else
2238             {
2239                 eStatus = MOS_SecureMemcpy(
2240                     pbData,
2241                     m_brcConstantSurfaceEarlySkipTableSize,
2242                     (void*)&SkipVal_P_Common[1][0][0],
2243                     m_brcConstantSurfaceEarlySkipTableSize);
2244                 if (eStatus != MOS_STATUS_SUCCESS)
2245                 {
2246                     CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory.");
2247                     return eStatus;
2248                 }
2249             }
2250         }
2251 
2252         if ((params->pAvcQCParams != nullptr) && (params->pAvcQCParams->NonFTQSkipThresholdLUTInput))
2253         {
2254             for (qp = 0; qp < CODEC_AVC_NUM_QP; qp++)
2255             {
2256                 *(pbData + 1 + (qp * 2)) = (uint8_t)CalcSkipVal((params->dwMbEncBlockBasedSkipEn ? true : false), (params->pPicParams->transform_8x8_mode_flag ? true : false), params->pAvcQCParams->NonFTQSkipThresholdLUT[qp]);
2257             }
2258         }
2259 
2260         pbData += m_brcConstantSurfaceEarlySkipTableSize;
2261 
2262         // POCs not used for now, set to zeroes
2263         pbData += CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_POCS_IN_DPB_LIST_SIZE;
2264         pbData += CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_POCS_IN_FINAL_LIST_SIZE;
2265 
2266         // Mode cost and MV cost
2267         eStatus = MOS_SecureMemcpy(
2268             pbData,
2269             m_brcConstantSurfacModeMvCostSize,
2270             (void*)&ModeMvCost_Common[1][0][0],
2271             m_brcConstantSurfacModeMvCostSize);
2272         if (eStatus != MOS_STATUS_SUCCESS)
2273         {
2274             CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory.");
2275             return eStatus;
2276         }
2277 
2278         if (params->pAvcQCParams)
2279         {
2280             for (qp = 0; qp < CODEC_AVC_NUM_QP; qp++)
2281             {
2282                 if (params->pAvcQCParams->FTQSkipThresholdLUTInput)
2283                 {
2284                     *(pbData + (qp * 32) + 24) =
2285                         *(pbData + (qp * 32) + 25) =
2286                         *(pbData + (qp * 32) + 27) =
2287                         *(pbData + (qp * 32) + 28) =
2288                         *(pbData + (qp * 32) + 29) =
2289                         *(pbData + (qp * 32) + 30) =
2290                         *(pbData + (qp * 32) + 31) = params->pAvcQCParams->FTQSkipThresholdLUT[qp];
2291                 }
2292             }
2293         }
2294 
2295         pbData += m_brcConstantSurfacModeMvCostSize;
2296 
2297         // Refcost
2298         eStatus = MOS_SecureMemcpy(
2299             pbData,
2300             m_brcConstantSurfaceRefCostSize,
2301             (void*)&RefCost_Common[1][0],
2302             m_brcConstantSurfaceRefCostSize);
2303         if (eStatus != MOS_STATUS_SUCCESS)
2304         {
2305             CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory.");
2306             return eStatus;
2307         }
2308     }
2309     else // B picture
2310     {
2311         if (!params->dwMbEncBlockBasedSkipEn)
2312         {
2313             if (params->pPicParams->transform_8x8_mode_flag)
2314             {
2315                 eStatus = MOS_SecureMemcpy(
2316                     pbData,
2317                     m_brcConstantSurfaceEarlySkipTableSize,
2318                     (void*)&SkipVal_B_Common[0][1][0],
2319                     m_brcConstantSurfaceEarlySkipTableSize);
2320                 if (eStatus != MOS_STATUS_SUCCESS)
2321                 {
2322                     CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory.");
2323                     return eStatus;
2324                 }
2325             }
2326             else
2327             {
2328                 eStatus = MOS_SecureMemcpy(
2329                     pbData,
2330                     m_brcConstantSurfaceEarlySkipTableSize,
2331                     (void*)&SkipVal_B_Common[0][0][0],
2332                     m_brcConstantSurfaceEarlySkipTableSize);
2333                 if (eStatus != MOS_STATUS_SUCCESS)
2334                 {
2335                     CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory.");
2336                     return eStatus;
2337                 }
2338             }
2339         }
2340         else
2341         {
2342             if (params->pPicParams->transform_8x8_mode_flag)
2343             {
2344                 eStatus = MOS_SecureMemcpy(
2345                     pbData,
2346                     m_brcConstantSurfaceEarlySkipTableSize,
2347                     (void*)&SkipVal_B_Common[1][1][0],
2348                     m_brcConstantSurfaceEarlySkipTableSize);
2349                 if (eStatus != MOS_STATUS_SUCCESS)
2350                 {
2351                     CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory.");
2352                     return eStatus;
2353                 }
2354             }
2355             else
2356             {
2357                 eStatus = MOS_SecureMemcpy(
2358                     pbData,
2359                     m_brcConstantSurfaceEarlySkipTableSize,
2360                     (void*)&SkipVal_B_Common[1][0][0],
2361                     m_brcConstantSurfaceEarlySkipTableSize);
2362                 if (eStatus != MOS_STATUS_SUCCESS)
2363                 {
2364                     CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory.");
2365                     return eStatus;
2366                 }
2367             }
2368         }
2369 
2370         if (params->pAvcQCParams != nullptr && params->pAvcQCParams->NonFTQSkipThresholdLUTInput)
2371         {
2372             for (qp = 0; qp < CODEC_AVC_NUM_QP; qp++)
2373             {
2374                 *(pbData + 1 + (qp * 2)) = (uint8_t)CalcSkipVal((params->dwMbEncBlockBasedSkipEn ? true : false), (params->pPicParams->transform_8x8_mode_flag ? true : false), params->pAvcQCParams->NonFTQSkipThresholdLUT[qp]);
2375             }
2376         }
2377 
2378         pbData += m_brcConstantSurfaceEarlySkipTableSize;
2379 
2380         // POCs not used for now, set to zeroes
2381         pbData += CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_POCS_IN_DPB_LIST_SIZE;
2382         pbData += CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_POCS_IN_FINAL_LIST_SIZE;
2383 
2384         // Mode cost and MV cost
2385         eStatus = MOS_SecureMemcpy(
2386             pbData,
2387             m_brcConstantSurfacModeMvCostSize,
2388             (void*)&ModeMvCost_Common[2][0][0],
2389             m_brcConstantSurfacModeMvCostSize);
2390         if (eStatus != MOS_STATUS_SUCCESS)
2391         {
2392             CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory.");
2393             return eStatus;
2394         }
2395 
2396         if (params->pAvcQCParams)
2397         {
2398             for (qp = 0; qp < CODEC_AVC_NUM_QP; qp++)
2399             {
2400                 if (params->pAvcQCParams->FTQSkipThresholdLUTInput)
2401                 {
2402                     *(pbData + (qp * 32) + 24) =
2403                         *(pbData + (qp * 32) + 25) =
2404                         *(pbData + (qp * 32) + 27) =
2405                         *(pbData + (qp * 32) + 28) =
2406                         *(pbData + (qp * 32) + 29) =
2407                         *(pbData + (qp * 32) + 30) =
2408                         *(pbData + (qp * 32) + 31) = params->pAvcQCParams->FTQSkipThresholdLUT[qp];
2409                 }
2410             }
2411         }
2412 
2413         pbData += m_brcConstantSurfacModeMvCostSize;
2414 
2415         // Refcost
2416         eStatus = MOS_SecureMemcpy(
2417             pbData,
2418             m_brcConstantSurfaceRefCostSize,
2419             (void*)&RefCost_Common[2][0],
2420             m_brcConstantSurfaceRefCostSize);
2421         if (eStatus != MOS_STATUS_SUCCESS)
2422         {
2423             CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory.");
2424             return eStatus;
2425         }
2426     }
2427 
2428     params->pOsInterface->pfnUnlockResource(
2429         params->pOsInterface,
2430         &params->sBrcConstantDataBuffer.OsResource);
2431 
2432     return eStatus;
2433 }
2434 
InitMbBrcConstantDataBuffer(PCODECHAL_ENCODE_AVC_INIT_MBBRC_CONSTANT_DATA_BUFFER_PARAMS params)2435 MOS_STATUS CodechalEncodeAvcEnc::InitMbBrcConstantDataBuffer(PCODECHAL_ENCODE_AVC_INIT_MBBRC_CONSTANT_DATA_BUFFER_PARAMS params)
2436 {
2437     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
2438 
2439     CODECHAL_ENCODE_FUNCTION_ENTER;
2440 
2441     CODECHAL_ENCODE_CHK_NULL_RETURN(params);
2442     CODECHAL_ENCODE_CHK_NULL_RETURN(params->presBrcConstantDataBuffer);
2443 
2444     // 16 DWs per QP value
2445     uint32_t size = 16 * CODEC_AVC_NUM_QP;
2446 
2447     MOS_LOCK_PARAMS lockFlags;
2448     MOS_ZeroMemory(&lockFlags, sizeof(MOS_LOCK_PARAMS));
2449     lockFlags.WriteOnly = 1;
2450     // using an async lock because the wait has already occured for recycled buffers
2451     lockFlags.NoOverWrite = 1;
2452     lockFlags.Uncached = 1;
2453     uint32_t* pData = (uint32_t*)m_osInterface->pfnLockResource(
2454         m_osInterface,
2455         params->presBrcConstantDataBuffer,
2456         &lockFlags);
2457     CODECHAL_ENCODE_CHK_NULL_RETURN(pData);
2458 
2459     if (params->bPreProcEnable)
2460     {
2461         eStatus = MOS_SecureMemcpy(pData, size * sizeof(uint32_t), (void*)PreProcFtqLut_Cm_Common, size * sizeof(uint32_t));
2462         if (eStatus != MOS_STATUS_SUCCESS)
2463         {
2464             CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory.");
2465             m_osInterface->pfnUnlockResource(
2466                 m_osInterface,
2467                 params->presBrcConstantDataBuffer);
2468             return eStatus;
2469         }
2470     }
2471     else
2472     {
2473         CODECHAL_ENCODE_CHK_NULL_RETURN(params->pPicParams);
2474 
2475         uint8_t tableIdx = params->wPictureCodingType - 1;
2476         bool blockBasedSkipEn = params->dwMbEncBlockBasedSkipEn ? true : false;
2477         bool transform_8x8_mode_flag = params->pPicParams->transform_8x8_mode_flag ? true : false;
2478 
2479         if (tableIdx >= 3)
2480         {
2481             CODECHAL_ENCODE_ASSERTMESSAGE("Invalid input parameter.");
2482             eStatus = MOS_STATUS_INVALID_PARAMETER;
2483             m_osInterface->pfnUnlockResource(
2484                 m_osInterface,
2485                 params->presBrcConstantDataBuffer);
2486             return eStatus;
2487         }
2488 
2489         eStatus = MOS_SecureMemcpy(pData, size * sizeof(uint32_t), (void*)MBBrcConstantData_Cm_Common[tableIdx], size * sizeof(uint32_t));
2490         if (eStatus != MOS_STATUS_SUCCESS)
2491         {
2492             CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory.");
2493             m_osInterface->pfnUnlockResource(
2494                 m_osInterface,
2495                 params->presBrcConstantDataBuffer);
2496             return eStatus;
2497         }
2498 
2499         uint32_t* databk = pData;
2500         uint8_t qp = 0;
2501         switch (params->wPictureCodingType)
2502         {
2503         case I_TYPE:
2504             for (qp = 0; qp < CODEC_AVC_NUM_QP; qp++)
2505             {
2506                 // Writing to DW0 in each sub-array of 16 DWs
2507                 if (params->bOldModeCostEnable)
2508                 {
2509                     *pData = (uint32_t)OldIntraModeCost_Cm_Common[qp];
2510                 }
2511                 pData += 16;
2512             }
2513             break;
2514         case P_TYPE:
2515         case B_TYPE:
2516             for (qp = 0; qp < CODEC_AVC_NUM_QP; qp++)
2517             {
2518                 if (params->wPictureCodingType == P_TYPE)
2519                 {
2520                     // Writing to DW3 in each sub-array of 16 DWs
2521                     if (params->bSkipBiasAdjustmentEnable)
2522                     {
2523                         *(pData + 3) = (uint32_t)MvCost_PSkipAdjustment_Cm_Common[qp];
2524                     }
2525                 }
2526 
2527                 // Writing to DW9 in each sub-array of 16 DWs
2528                 if (params->pAvcQCParams && params->pAvcQCParams->NonFTQSkipThresholdLUTInput)
2529                 {
2530                     *(pData + 9) = (uint32_t)CalcSkipVal((params->dwMbEncBlockBasedSkipEn ? true : false),
2531                         (transform_8x8_mode_flag ? true : false),
2532                         params->pAvcQCParams->NonFTQSkipThresholdLUT[qp]);
2533                 }
2534                 else if (params->wPictureCodingType == P_TYPE)
2535                 {
2536                     *(pData + 9) = (uint32_t)SkipVal_P_Common[blockBasedSkipEn][transform_8x8_mode_flag][qp];
2537                 }
2538                 else
2539                 {
2540                     *(pData + 9) = (uint32_t)SkipVal_B_Common[blockBasedSkipEn][transform_8x8_mode_flag][qp];
2541                 }
2542 
2543                 // Writing to DW10 in each sub-array of 16 DWs
2544                 if (params->bAdaptiveIntraScalingEnable)
2545                 {
2546                     *(pData + 10) = (uint32_t)AdaptiveIntraScalingFactor_Cm_Common[qp];
2547                 }
2548                 else
2549                 {
2550                     *(pData + 10) = (uint32_t)IntraScalingFactor_Cm_Common[qp];
2551                 }
2552                 pData += 16;
2553             }
2554             break;
2555         default:
2556             break;
2557         }
2558 
2559         pData = databk;
2560         for (qp = 0; qp < CODEC_AVC_NUM_QP; qp++)
2561         {
2562             if (params->pAvcQCParams && params->pAvcQCParams->FTQSkipThresholdLUTInput)
2563             {
2564                 *(pData + 6) = ((uint32_t)params->pAvcQCParams->FTQSkipThresholdLUT[qp])
2565                     | (((uint32_t)params->pAvcQCParams->FTQSkipThresholdLUT[qp]) << 16)
2566                     | (((uint32_t)params->pAvcQCParams->FTQSkipThresholdLUT[qp]) << 24);
2567                 *(pData + 7) = ((uint32_t)params->pAvcQCParams->FTQSkipThresholdLUT[qp])
2568                     | (((uint32_t)params->pAvcQCParams->FTQSkipThresholdLUT[qp]) << 8)
2569                     | (((uint32_t)params->pAvcQCParams->FTQSkipThresholdLUT[qp]) << 16)
2570                     | (((uint32_t)params->pAvcQCParams->FTQSkipThresholdLUT[qp]) << 24);
2571             }
2572 
2573             if (params->bEnableKernelTrellis)
2574             {
2575                 // Writing uint32_t 11 and uint32_t 12 with Lambda values
2576                 *(pData + 11) = (uint32_t)params->Lambda[qp][0];
2577                 *(pData + 12) = (uint32_t)params->Lambda[qp][1];
2578             }
2579             pData += 16;
2580         }
2581     }
2582 
2583     m_osInterface->pfnUnlockResource(
2584         m_osInterface,
2585         params->presBrcConstantDataBuffer);
2586 
2587     return eStatus;
2588 }
2589 
CalcLambdaTable(uint16_t slice_type,uint32_t * lambda)2590 MOS_STATUS CodechalEncodeAvcEnc::CalcLambdaTable(
2591         uint16_t slice_type,
2592         uint32_t* lambda)
2593 {
2594     MOS_STATUS                          eStatus = MOS_STATUS_SUCCESS;
2595 
2596     CODECHAL_ENCODE_FUNCTION_ENTER;
2597 
2598     CODECHAL_ENCODE_CHK_NULL_RETURN( m_avcSeqParam);
2599     CODECHAL_ENCODE_CHK_NULL_RETURN( m_refList);
2600     CODECHAL_ENCODE_CHK_NULL_RETURN(lambda);
2601 
2602     // Initialize Lambda Table
2603     switch (slice_type)
2604     {
2605     case I_TYPE:
2606         eStatus = MOS_SecureMemcpy((void*)lambda, CODEC_AVC_NUM_QP * 2 * sizeof(uint32_t), (void*)TQ_LAMBDA_I_FRAME, CODEC_AVC_NUM_QP * 2 * sizeof(uint32_t));
2607         if (eStatus != MOS_STATUS_SUCCESS)
2608         {
2609             CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory.");
2610             return eStatus;
2611         }
2612         break;
2613 
2614     case B_TYPE:
2615         eStatus = MOS_SecureMemcpy((void*)lambda, CODEC_AVC_NUM_QP * 2 * sizeof(uint32_t), (void*)TQ_LAMBDA_B_FRAME, CODEC_AVC_NUM_QP * 2 * sizeof(uint32_t));
2616         if (eStatus != MOS_STATUS_SUCCESS)
2617         {
2618             CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory.");
2619             return eStatus;
2620         }
2621         break;
2622 
2623     case P_TYPE:
2624         eStatus = MOS_SecureMemcpy((void*)lambda, CODEC_AVC_NUM_QP * 2 * sizeof(uint32_t), (void*)TQ_LAMBDA_P_FRAME, CODEC_AVC_NUM_QP * 2 * sizeof(uint32_t));
2625         if (eStatus != MOS_STATUS_SUCCESS)
2626         {
2627             CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory.");
2628             return eStatus;
2629         }
2630         break;
2631 
2632     default:
2633         eStatus = MOS_STATUS_UNKNOWN;
2634         break;
2635     }
2636 
2637     uint32_t roundingValue = 0;
2638     for (uint8_t sliceQP = 0; sliceQP < CODEC_AVC_NUM_QP; sliceQP++)
2639     {
2640         for (uint8_t col = 0; col < 2; col++)
2641         {
2642             uint32_t value = *(lambda + sliceQP * 2 + col);
2643             uint32_t intra = value >> 16;
2644 
2645             if (intra > CODECHAL_ENCODE_AVC_MAX_LAMBDA)
2646             {
2647                 if (intra == 0xfffa)
2648                 {
2649                     intra = 0xf000 + CODECHAL_ENCODE_AVC_DEFAULT_TRELLIS_QUANT_INTRA_ROUNDING;
2650                 }
2651             }
2652 
2653             intra = intra << 16;
2654             uint32_t inter = value & 0xffff;
2655             if (inter > CODECHAL_ENCODE_AVC_MAX_LAMBDA)
2656             {
2657                 if (inter == 0xffef)
2658                 {
2659 
2660                     switch (slice_type)
2661                     {
2662                     case P_TYPE:
2663                         if ( dwRoundingInterP == CODECHAL_ENCODE_AVC_INVALID_ROUNDING)
2664                         {
2665                             roundingValue = InterRoundingP_TQ[m_avcSeqParam->TargetUsage];
2666                         }
2667                         else
2668                         {
2669                             roundingValue =  dwRoundingInterP;
2670                         }
2671                         break;
2672                     case B_TYPE:
2673                         if (m_refList[m_currReconstructedPic.FrameIdx]->bUsedAsRef)
2674                         {
2675                             roundingValue = ( dwRoundingInterBRef == CODECHAL_ENCODE_AVC_INVALID_ROUNDING) ?
2676                                 InterRoundingBRef_TQ[m_avcSeqParam->TargetUsage] :  dwRoundingInterBRef;
2677                         }
2678                         else
2679                         {
2680                             if ( dwRoundingInterB == CODECHAL_ENCODE_AVC_INVALID_ROUNDING)
2681                             {
2682                                 roundingValue = InterRoundingB_TQ[m_avcSeqParam->TargetUsage];
2683                             }
2684                             else
2685                             {
2686                                 roundingValue =  dwRoundingInterB;
2687                             }
2688                         }
2689                         break;
2690                     default:
2691                         // do nothing
2692                         break;
2693                     }
2694 
2695                     inter = 0xf000 + roundingValue;
2696                 }
2697             }
2698 
2699             *(lambda + sliceQP * 2 + col) = intra + inter;
2700         }
2701     }
2702     return eStatus;
2703 }
2704 
2705 static uint8_t CODECHAL_ENCODE_AVC_AdaptiveInterRoundingPWithoutB[CODEC_AVC_NUM_QP] =
2706 {
2707     //QP =  0   1   2   3   4   5   6   7   8   9   10  11  12
2708     3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,  //QP=[0~12]
2709     3, 3, 3, 3, 3, 3, 3, 3, 1, 0, 0, 0, 0,  //QP=[13~25]
2710     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  //QP=[26~38]
2711     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0   //QP=[39~51]
2712 };
2713 
2714 static uint8_t CODECHAL_ENCODE_AVC_AdaptiveInterRoundingP[CODEC_AVC_NUM_QP] =
2715 {
2716     //QP =  0   1   2   3   4   5   6   7   8   9   10  11  12
2717     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,  //QP=[0~12]
2718     4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3,  //QP=[13~25]
2719     3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,  //QP=[26~38]
2720     3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3   //QP=[39~51]
2721 };
2722 
2723 static const uint32_t CODECHAL_ENCODE_AVC_InterRoundingP[NUM_TARGET_USAGE_MODES] =
2724 {
2725     0, 3, 3, 3, 3, 3, 3, 3
2726 };
2727 
2728 static const uint32_t CODECHAL_ENCODE_AVC_InterRoundingBRef[NUM_TARGET_USAGE_MODES] =
2729 {
2730     0, 2, 2, 2, 2, 2, 2, 2
2731 };
2732 
2733 static uint8_t CODECHAL_ENCODE_AVC_AdaptiveInterRoundingB[CODEC_AVC_NUM_QP] =
2734 {
2735     //QP =  0   1   2   3   4   5   6   7   8   9   10  11  12
2736     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,  //QP=[0~12]
2737     4, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0,  //QP=[13~25]
2738     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  //QP=[26~38]
2739     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0   //QP=[39~51]
2740 };
2741 
2742 static const uint32_t CODECHAL_ENCODE_AVC_InterRoundingB[NUM_TARGET_USAGE_MODES] =
2743 {
2744     0, 0, 0, 0, 0, 0, 0, 0
2745 };
2746 
GetInterRounding(PMHW_VDBOX_AVC_SLICE_STATE sliceState)2747 MOS_STATUS CodechalEncodeAvcEnc::GetInterRounding(PMHW_VDBOX_AVC_SLICE_STATE sliceState)
2748 {
2749     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
2750 
2751     CODECHAL_ENCODE_CHK_NULL_RETURN(sliceState);
2752     CODECHAL_ENCODE_CHK_NULL_RETURN(sliceState->pEncodeAvcSeqParams);
2753     CODECHAL_ENCODE_CHK_NULL_RETURN(sliceState->pEncodeAvcPicParams);
2754     CODECHAL_ENCODE_CHK_NULL_RETURN(sliceState->pEncodeAvcSliceParams);
2755 
2756     auto avcSeqParams = sliceState->pEncodeAvcSeqParams;
2757     auto avcPicParams = sliceState->pEncodeAvcPicParams;
2758     auto avcSliceParams = sliceState->pEncodeAvcSliceParams;
2759     uint8_t sliceQP = avcPicParams->pic_init_qp_minus26 + 26 + avcSliceParams->slice_qp_delta;
2760 
2761     switch (Slice_Type[avcSliceParams->slice_type])
2762     {
2763     case SLICE_P:
2764         if (dwRoundingInterP == CODECHAL_ENCODE_AVC_INVALID_ROUNDING)
2765         {
2766             // Adaptive Rounding is only used in CQP case
2767             if (bAdaptiveRoundingInterEnable && !bBrcEnabled)
2768             {
2769                 // If IPPP scenario
2770                 if (avcSeqParams->GopRefDist == 1)
2771                 {
2772                     sliceState->dwRoundingValue = CODECHAL_ENCODE_AVC_AdaptiveInterRoundingPWithoutB[sliceQP];
2773                 }
2774                 else
2775                 {
2776                     sliceState->dwRoundingValue = CODECHAL_ENCODE_AVC_AdaptiveInterRoundingP[sliceQP];
2777                 }
2778             }
2779             else
2780             {
2781                 sliceState->dwRoundingValue = CODECHAL_ENCODE_AVC_InterRoundingP[avcSeqParams->TargetUsage];
2782             }
2783         }
2784         else
2785         {
2786             sliceState->dwRoundingValue = dwRoundingInterP;
2787         }
2788         break;
2789     case SLICE_B:
2790         if (m_refList[m_currReconstructedPic.FrameIdx]->bUsedAsRef)
2791         {
2792             sliceState->dwRoundingValue = (dwRoundingInterBRef == CODECHAL_ENCODE_AVC_INVALID_ROUNDING) ?
2793                 CODECHAL_ENCODE_AVC_InterRoundingBRef[avcSeqParams->TargetUsage] : dwRoundingInterBRef;
2794         }
2795         else
2796         {
2797             if (dwRoundingInterB == CODECHAL_ENCODE_AVC_INVALID_ROUNDING)
2798             {
2799                 if (bAdaptiveRoundingInterEnable && !bBrcEnabled)
2800                 {
2801                     sliceState->dwRoundingValue = CODECHAL_ENCODE_AVC_AdaptiveInterRoundingB[sliceQP];
2802                 }
2803                 else
2804                 {
2805                     sliceState->dwRoundingValue = CODECHAL_ENCODE_AVC_InterRoundingB[avcSeqParams->TargetUsage];
2806                 }
2807             }
2808             else
2809             {
2810                 sliceState->dwRoundingValue = dwRoundingInterB;
2811             }
2812         }
2813         break;
2814     default:
2815         // do nothing
2816         break;
2817     }
2818 
2819     return eStatus;
2820 }
2821 
2822 // This applies only for progressive pictures. For interlaced, CAF is currently not disabled.
2823 const uint32_t CodechalEncodeAvcEnc::CODECHAL_ENCODE_AVC_DisableAllFractionalCheckForHighRes_Common[NUM_TARGET_USAGE_MODES] =
2824 {
2825     0, 0, 0, 1, 1, 1, 1, 1
2826 };
2827 
GetSkipBiasAdjustment(uint8_t sliceQP,uint16_t gopRefDist,bool * skipBiasAdjustmentEnable)2828 MOS_STATUS CodechalEncodeAvcEnc::GetSkipBiasAdjustment(uint8_t sliceQP, uint16_t gopRefDist, bool* skipBiasAdjustmentEnable)
2829 {
2830     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
2831 
2832     CODECHAL_ENCODE_CHK_NULL_RETURN(skipBiasAdjustmentEnable);
2833 
2834     // Determine if SkipBiasAdjustment should be enabled for P picture
2835     // 1. No B frame 2. Qp >= 22 3. CQP mode
2836     *skipBiasAdjustmentEnable = bSkipBiasAdjustmentSupported && (m_pictureCodingType == P_TYPE)
2837         && (gopRefDist == 1) && (sliceQP >= CODECHAL_ENCODE_AVC_SKIP_BIAS_ADJUSTMENT_QP_THRESHOLD) && !bBrcEnabled;
2838 
2839     return eStatus;
2840 }
2841 
GetHmeSupportedBasedOnTU(HmeLevel hmeLevel,bool * supported)2842 MOS_STATUS CodechalEncodeAvcEnc::GetHmeSupportedBasedOnTU(HmeLevel hmeLevel, bool *supported)
2843 {
2844     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
2845 
2846     CODECHAL_ENCODE_CHK_NULL_RETURN(supported);
2847 
2848     switch (hmeLevel)
2849     {
2850     case HME_LEVEL_4x:
2851         //HME always supported
2852         *supported = true;
2853         break;
2854     case HME_LEVEL_16x:
2855         *supported = SuperHME[m_targetUsage & 0x7] ? true : false;
2856         break;
2857     case HME_LEVEL_32x:
2858         *supported = UltraHME[m_targetUsage & 0x7] ? true : false;
2859         break;
2860     default:
2861         CODECHAL_ENCODE_ASSERTMESSAGE("Invalid hme Level");
2862         eStatus = MOS_STATUS_INVALID_PARAMETER;
2863         break;
2864     }
2865 
2866     return eStatus;
2867 }
2868 
2869 static const bool CODECHAL_ENCODE_AVC_MBBRCEnabled_Common[NUM_TARGET_USAGE_MODES] =
2870 {
2871     false, true, true, false, false, false, false, false
2872 };
2873 
GetMbBrcEnabled(uint32_t targetUsage,bool * mbBrcEnabled)2874 MOS_STATUS CodechalEncodeAvcEnc::GetMbBrcEnabled(uint32_t targetUsage, bool *mbBrcEnabled)
2875 {
2876     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
2877     CODECHAL_ENCODE_CHK_NULL_RETURN(mbBrcEnabled);
2878 
2879     *mbBrcEnabled = CODECHAL_ENCODE_AVC_MBBRCEnabled_Common[targetUsage & 0x7];
2880 
2881     return eStatus;
2882 }
2883 
GetCAFEnabled(bool * cafenable)2884 MOS_STATUS CodechalEncodeAvcEnc::GetCAFEnabled(bool *cafenable)
2885 {
2886     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
2887 
2888     CODECHAL_ENCODE_CHK_NULL_RETURN(cafenable);
2889 
2890     auto picParams = m_avcPicParam;
2891     auto targetUsage = m_targetUsage & 0x7;
2892     auto framePicture = CodecHal_PictureIsFrame(picParams->CurrOriginalPic);
2893 
2894     if (bCAFSupported)
2895     {
2896         switch (m_pictureCodingType)
2897         {
2898         case I_TYPE:
2899             *cafenable = false;
2900             break;
2901         case P_TYPE:
2902             *cafenable = (CODECHAL_ENCODE_AVC_AllFractional_Common[targetUsage] & 0x01) ? true : false;
2903             break;
2904         case B_TYPE:
2905             *cafenable = ((CODECHAL_ENCODE_AVC_AllFractional_Common[targetUsage] >> 1) & 0x01) ? true : false;
2906             break;
2907         default:
2908             CODECHAL_ENCODE_ASSERTMESSAGE("Invalid picture coding type");
2909             eStatus = MOS_STATUS_INVALID_PARAMETER;
2910             break;
2911         }
2912 
2913         // For performance reason, disable CAF for picture resolution >= 720P
2914         // a. Based on Target Usage.
2915         // b. For progressive pictures only.
2916         if (*cafenable)
2917         {
2918             if ((bCAFDisableHD && CODECHAL_ENCODE_AVC_DisableAllFractionalCheckForHighRes_Common[targetUsage] && framePicture)
2919                 && (m_picWidthInMb * CODECHAL_MACROBLOCK_WIDTH >= 1280) && (m_frameFieldHeightInMb * CODECHAL_MACROBLOCK_HEIGHT >= 720))
2920             {
2921                 *cafenable = false;
2922             }
2923         }
2924     }
2925     else
2926     {
2927         *cafenable = false;
2928     }
2929 
2930     return eStatus;
2931 }
2932 
2933 static const uint8_t CODECHAL_ENCODE_AVC_EnableAdaptiveTxDecision_Common[NUM_TARGET_USAGE_MODES] =
2934 {
2935     0, 1, 1, 1, 1, 1, 1, 0
2936 };
2937 
GetATDEnabled()2938 MOS_STATUS CodechalEncodeAvcEnc::GetATDEnabled()
2939 {
2940     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
2941 
2942     // If ATD has been disabled by user feature key, don't turn it on because it is supported by the TU.
2943     if (CODECHAL_ENCODE_AVC_EnableAdaptiveTxDecision_Common[m_targetUsage & 0x7] == 0)
2944         m_adaptiveTransformDecisionEnabled = false;
2945 
2946     return eStatus;
2947 }
2948 
BrcInitResetKernel()2949 MOS_STATUS CodechalEncodeAvcEnc::BrcInitResetKernel()
2950 {
2951     MOS_STATUS                                          eStatus = MOS_STATUS_SUCCESS;
2952 
2953     CODECHAL_ENCODE_FUNCTION_ENTER;
2954 
2955     uint32_t kernelIdx =
2956         (bBrcInit) ? CODECHAL_ENCODE_BRC_IDX_INIT : CODECHAL_ENCODE_BRC_IDX_RESET;
2957     auto kernelState = &BrcKernelStates[kernelIdx];
2958 
2959     PerfTagSetting perfTag;
2960     perfTag.Value = 0;
2961     perfTag.Mode = (uint16_t)m_mode & CODECHAL_ENCODE_MODE_BIT_MASK;
2962     perfTag.CallType = m_singleTaskPhaseSupported ? CODECHAL_ENCODE_PERFTAG_CALL_SCALING_KERNEL :
2963         CODECHAL_ENCODE_PERFTAG_CALL_BRC_INIT_RESET;
2964     perfTag.PictureCodingType = m_pictureCodingType;
2965     m_osInterface->pfnSetPerfTag(m_osInterface, perfTag.Value);
2966 
2967     CODECHAL_MEDIA_STATE_TYPE encFunctionType = CODECHAL_MEDIA_STATE_BRC_INIT_RESET;
2968 
2969     // If Single Task Phase is not enabled, use BT count for the kernel state.
2970     if (m_firstTaskInPhase == true || !m_singleTaskPhaseSupported)
2971     {
2972         uint32_t dwMaxBtCount = m_singleTaskPhaseSupported ?
2973             m_maxBtCount : kernelState->KernelParams.iBTCount;
2974         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnRequestSshSpaceForCmdBuf(
2975             m_stateHeapInterface,
2976             dwMaxBtCount));
2977         m_vmeStatesSize = m_hwInterface->GetKernelLoadCommandSize(dwMaxBtCount);
2978         CODECHAL_ENCODE_CHK_STATUS_RETURN(VerifySpaceAvailable());
2979     }
2980 
2981     // Setup AVC Curbe
2982     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace(
2983         m_stateHeapInterface,
2984         kernelState,
2985         false,
2986         0,
2987         false,
2988         m_storeData));
2989 
2990     MHW_INTERFACE_DESCRIPTOR_PARAMS idParams;
2991     MOS_ZeroMemory(&idParams, sizeof(idParams));
2992     idParams.pKernelState = kernelState;
2993     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetInterfaceDescriptor(
2994         m_stateHeapInterface,
2995         1,
2996         &idParams));
2997 
2998     CODECHAL_ENCODE_AVC_BRC_INIT_RESET_CURBE_PARAMS brcInitResetCurbeParams;
2999     brcInitResetCurbeParams.pdBrcInitCurrentTargetBufFullInBits =
3000         &dBrcInitCurrentTargetBufFullInBits;
3001     brcInitResetCurbeParams.pdwBrcInitResetBufSizeInBits =
3002         &dwBrcInitResetBufSizeInBits;
3003     brcInitResetCurbeParams.pdBrcInitResetInputBitsPerFrame =
3004         &dBrcInitResetInputBitsPerFrame;
3005     brcInitResetCurbeParams.pKernelState = kernelState;
3006     CODECHAL_ENCODE_CHK_STATUS_RETURN(SetCurbeAvcBrcInitReset(
3007         &brcInitResetCurbeParams));
3008 
3009     CODECHAL_DEBUG_TOOL(
3010         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
3011             encFunctionType,
3012             MHW_DSH_TYPE,
3013             kernelState));
3014         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe(
3015             encFunctionType,
3016             kernelState));
3017         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
3018             encFunctionType,
3019             MHW_ISH_TYPE,
3020             kernelState));
3021     )
3022 
3023 //#if (_DEBUG || _RELEASE_INTERNAL)
3024 //    if (m_swBrcMode != nullptr)
3025 //    {
3026 //        CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHal_DbgCallAvcSwBrcImpl(
3027 //            m_debugInterface,
3028 //            encFunctionType,
3029 //            this,
3030 //            &BrcBuffers,
3031 //            bBrcReset,
3032 //            kernelState,
3033 //            kernelState));
3034 //        return eStatus;
3035 //    }
3036 //#endif
3037 
3038     MOS_COMMAND_BUFFER cmdBuffer;
3039     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0));
3040 
3041     SendKernelCmdsParams sendKernelCmdsParams = SendKernelCmdsParams();
3042     sendKernelCmdsParams.EncFunctionType = encFunctionType;
3043     sendKernelCmdsParams.bBrcResetRequested = bBrcInit ? false : bBrcReset; // Set BrcResetRequested to false if init is also set
3044     sendKernelCmdsParams.pKernelState = kernelState;
3045 
3046     CODECHAL_ENCODE_CHK_STATUS_RETURN(SendGenericKernelCmds(&cmdBuffer, &sendKernelCmdsParams));
3047 
3048     // Add binding table
3049     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetBindingTable(
3050         m_stateHeapInterface,
3051         kernelState));
3052 
3053     //Add surface states
3054     CODECHAL_ENCODE_AVC_BRC_INIT_RESET_SURFACE_PARAMS brcInitResetSurfaceParams;
3055     brcInitResetSurfaceParams.presBrcHistoryBuffer =
3056         &BrcBuffers.resBrcHistoryBuffer;
3057     brcInitResetSurfaceParams.psMeBrcDistortionBuffer =
3058         &BrcBuffers.sMeBrcDistortionBuffer;
3059     brcInitResetSurfaceParams.dwMeBrcDistortionBottomFieldOffset =
3060         BrcBuffers.dwMeBrcDistortionBottomFieldOffset;
3061     brcInitResetSurfaceParams.dwDownscaledWidthInMb4x = m_downscaledWidthInMb4x;
3062     brcInitResetSurfaceParams.dwDownscaledFrameFieldHeightInMb4x =
3063         m_downscaledFrameFieldHeightInMb4x;
3064     CODECHAL_ENCODE_CHK_STATUS_RETURN(SendBrcInitResetSurfaces(
3065         &cmdBuffer,
3066         &brcInitResetSurfaceParams));
3067 
3068     CODECHAL_DEBUG_TOOL(
3069         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
3070             encFunctionType,
3071             MHW_SSH_TYPE,
3072             kernelState));
3073     )
3074 
3075     MHW_MEDIA_OBJECT_PARAMS mediaObjectParams;
3076     MediaObjectInlineData mediaObjectInlineData;
3077     MOS_ZeroMemory(&mediaObjectParams, sizeof(mediaObjectParams));
3078     MOS_ZeroMemory(&mediaObjectInlineData, sizeof(mediaObjectInlineData));
3079     mediaObjectParams.pInlineData = &mediaObjectInlineData;
3080     mediaObjectParams.dwInlineDataSize = sizeof(mediaObjectInlineData);
3081     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_renderEngineInterface->AddMediaObject(
3082         &cmdBuffer,
3083         nullptr,
3084         &mediaObjectParams));
3085 
3086     CODECHAL_ENCODE_CHK_STATUS_RETURN(EndStatusReport(&cmdBuffer, encFunctionType));
3087 
3088     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSubmitBlocks(
3089         m_stateHeapInterface,
3090         kernelState));
3091     if (!m_singleTaskPhaseSupported || m_lastTaskInPhase)
3092     {
3093         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnUpdateGlobalCmdBufId(
3094             m_stateHeapInterface));
3095         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetMiInterface()->AddMiBatchBufferEnd(&cmdBuffer, nullptr));
3096     }
3097 
3098     CODECHAL_DEBUG_TOOL(CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer(
3099         &cmdBuffer,
3100         encFunctionType,
3101         nullptr)));
3102 
3103     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->UpdateSSEuForCmdBuffer(&cmdBuffer, m_singleTaskPhaseSupported, m_lastTaskInPhase));
3104 
3105     m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0);
3106 
3107     if (!m_singleTaskPhaseSupported || m_lastTaskInPhase)
3108     {
3109         HalOcaInterface::On1stLevelBBEnd(cmdBuffer, *m_osInterface->pOsContext);
3110         m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, m_renderContextUsesNullHw);
3111         m_lastTaskInPhase = false;
3112     }
3113 
3114     return eStatus;
3115 }
3116 
InitKernelStateSFD()3117 MOS_STATUS CodechalEncodeAvcEnc::InitKernelStateSFD()
3118 {
3119     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
3120 
3121     CODECHAL_ENCODE_FUNCTION_ENTER;
3122 
3123     pSFDKernelState = MOS_New(MHW_KERNEL_STATE);
3124     CODECHAL_ENCODE_CHK_NULL_RETURN(pSFDKernelState);
3125 
3126     uint8_t* kernelBinary;
3127     uint32_t kernelSize;
3128 
3129     uint32_t kuid = m_useCommonKernel ? m_kuidCommon : m_kuid;
3130     CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalGetKernelBinaryAndSize(m_kernelBase, kuid, &kernelBinary, &kernelSize));
3131 
3132     CODECHAL_KERNEL_HEADER currKrnHeader;
3133     CODECHAL_ENCODE_CHK_STATUS_RETURN(pfnGetKernelHeaderAndSize(
3134         kernelBinary,
3135         ENC_SFD,
3136         0,
3137         &currKrnHeader,
3138         (uint32_t*)&kernelSize));
3139 
3140     auto kernelStatePtr = pSFDKernelState;
3141     kernelStatePtr->KernelParams.iBTCount = CODECHAL_ENCODE_AVC_SFD_NUM_SURFACES;
3142     kernelStatePtr->KernelParams.iThreadCount = m_renderEngineInterface->GetHwCaps()->dwMaxThreads;
3143     kernelStatePtr->KernelParams.iCurbeLength = sizeof(CODECHAL_ENCODE_AVC_SFD_CURBE_COMMON);
3144     kernelStatePtr->KernelParams.iBlockWidth = CODECHAL_MACROBLOCK_WIDTH;
3145     kernelStatePtr->KernelParams.iBlockHeight = CODECHAL_MACROBLOCK_HEIGHT;
3146     kernelStatePtr->KernelParams.iIdCount = 1;
3147     kernelStatePtr->KernelParams.iInlineDataLength = 0;
3148 
3149     kernelStatePtr->dwCurbeOffset = m_stateHeapInterface->pStateHeapInterface->GetSizeofCmdInterfaceDescriptorData();
3150     kernelStatePtr->KernelParams.pBinary = kernelBinary + (currKrnHeader.KernelStartPointer << MHW_KERNEL_OFFSET_SHIFT);
3151     kernelStatePtr->KernelParams.iSize = kernelSize;
3152 
3153     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnCalculateSshAndBtSizesRequested(
3154         m_stateHeapInterface,
3155         kernelStatePtr->KernelParams.iBTCount,
3156         &kernelStatePtr->dwSshSize,
3157         &kernelStatePtr->dwBindingTableSize));
3158 
3159     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->MhwInitISH(m_stateHeapInterface, kernelStatePtr));
3160 
3161     return eStatus;
3162 }
3163 
InitKernelState()3164 MOS_STATUS CodechalEncodeAvcEnc::InitKernelState()
3165 {
3166     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
3167 
3168     CODECHAL_ENCODE_FUNCTION_ENTER;
3169 
3170     CODECHAL_ENCODE_CHK_STATUS_RETURN(InitKernelStateMe());
3171     CODECHAL_ENCODE_CHK_STATUS_RETURN(InitKernelStateMbEnc());
3172     if(!CodecHalIsFeiEncode(m_codecFunction))
3173     {
3174         CODECHAL_ENCODE_CHK_STATUS_RETURN(InitKernelStateMfeMbEnc());
3175         CODECHAL_ENCODE_CHK_NULL_RETURN(pMbEncKernelStates);
3176     }
3177 
3178     if (CodecHalIsFeiEncode(m_codecFunction))
3179     {
3180         CODECHAL_ENCODE_CHK_STATUS_RETURN(InitKernelStatePreProc());
3181     }
3182     else
3183     {
3184         CODECHAL_ENCODE_CHK_STATUS_RETURN(InitKernelStateBrc());
3185     }
3186     if (bWeightedPredictionSupported)
3187     {
3188         if(m_feiEnable == false)
3189         {
3190             if (m_wpUseCommonKernel)
3191             {
3192                 CODECHAL_ENCODE_CHK_STATUS_RETURN(m_wpState->InitKernelState());
3193             }
3194             else
3195             {
3196                 CODECHAL_ENCODE_CHK_STATUS_RETURN(InitKernelStateWP());
3197             }
3198         }
3199         else
3200         {
3201             if((m_codecFunction == CODECHAL_FUNCTION_FEI_ENC_PAK)||(m_codecFunction == CODECHAL_FUNCTION_FEI_ENC))
3202             {
3203                 if (m_wpUseCommonKernel)
3204                 {
3205                     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_wpState->InitKernelState());
3206                 }
3207                 else
3208                 {
3209                     CODECHAL_ENCODE_CHK_STATUS_RETURN(InitKernelStateWP());
3210                 }
3211             }
3212         }
3213     }
3214 
3215     if ((bStaticFrameDetectionEnable) && (!bPerMbSFD) && (!m_feiEnable))
3216     {
3217         // init Static frame detection kernel
3218         CODECHAL_ENCODE_CHK_STATUS_RETURN(InitKernelStateSFD());
3219     }
3220 
3221     if (m_singleTaskPhaseSupported)
3222     {
3223         if (m_codecFunction == CODECHAL_FUNCTION_FEI_PRE_ENC)
3224         {
3225             uint32_t dwScalingBtCount = MOS_ALIGN_CEIL(
3226                     m_scaling4xKernelStates[0].KernelParams.iBTCount,
3227                     m_stateHeapInterface->pStateHeapInterface->GetBtIdxAlignment());
3228             uint32_t dwMeBtCount = MOS_ALIGN_CEIL(
3229                     m_meKernelStates[0].KernelParams.iBTCount,
3230                     m_stateHeapInterface->pStateHeapInterface->GetBtIdxAlignment());
3231             uint32_t dwPreProcBtCount = MOS_ALIGN_CEIL(
3232                     PreProcKernelState.KernelParams.iBTCount,
3233                     m_stateHeapInterface->pStateHeapInterface->GetBtIdxAlignment());
3234             // in preenc stateless case, the maximum scaling pass number is 1(for current frame/field)
3235             // + 4 (4 forward ref frames/fields) + 2(2 backward ref frames/fields)
3236             m_maxBtCount = dwScalingBtCount*(1 + 4 + 2) + dwMeBtCount + dwPreProcBtCount;
3237         }
3238         else
3239         {
3240             uint32_t dwScalingBtCount = MOS_ALIGN_CEIL(
3241                     m_scaling4xKernelStates[0].KernelParams.iBTCount,
3242                     m_stateHeapInterface->pStateHeapInterface->GetBtIdxAlignment());
3243             uint32_t dwMeBtCount = MOS_ALIGN_CEIL(
3244                     m_hmeKernel ? m_hmeKernel->GetBTCount() : m_meKernelStates[0].KernelParams.iBTCount,
3245                     m_stateHeapInterface->pStateHeapInterface->GetBtIdxAlignment());
3246 
3247             uint32_t wpbtCount = 0;
3248             if(bWeightedPredictionSupported)
3249             {
3250                 if (m_wpUseCommonKernel)
3251                 {
3252                     wpbtCount += MOS_ALIGN_CEIL(
3253                             m_wpState->GetBTCount(),
3254                             m_stateHeapInterface->pStateHeapInterface->GetBtIdxAlignment());
3255                 }
3256                 else
3257                 {
3258                     wpbtCount += MOS_ALIGN_CEIL(
3259                             pWPKernelState->KernelParams.iBTCount,
3260                             m_stateHeapInterface->pStateHeapInterface->GetBtIdxAlignment());
3261                 }
3262             }
3263 
3264             uint32_t mbEncBtCount = 0;
3265             if (nullptr != pMbEncKernelStates)
3266             {
3267                 mbEncBtCount = MOS_ALIGN_CEIL(
3268                         pMbEncKernelStates->KernelParams.iBTCount,
3269                         m_stateHeapInterface->pStateHeapInterface->GetBtIdxAlignment());
3270             }
3271 
3272             uint32_t brcBtCount = 0;
3273             for (uint32_t i = 0; i < CODECHAL_ENCODE_BRC_IDX_NUM; i++)
3274             {
3275                 brcBtCount += MOS_ALIGN_CEIL(
3276                         BrcKernelStates[i].KernelParams.iBTCount,
3277                         m_stateHeapInterface->pStateHeapInterface->GetBtIdxAlignment());
3278             }
3279 
3280             uint32_t encOneBtCount = dwScalingBtCount + dwMeBtCount;
3281             encOneBtCount += (m_16xMeSupported) ? encOneBtCount : 0;
3282             encOneBtCount += (m_32xMeSupported) ? encOneBtCount : 0;
3283             uint32_t encTwoBtCount = mbEncBtCount + brcBtCount + wpbtCount;
3284             m_maxBtCount = MOS_MAX(encOneBtCount, encTwoBtCount);
3285         }
3286     }
3287 
3288     return eStatus;
3289 }
3290 
InsertInRefPicSelectList()3291 MOS_STATUS CodechalEncodeAvcEnc::InsertInRefPicSelectList()
3292 {
3293     MOS_STATUS                          eStatus = MOS_STATUS_SUCCESS;
3294 
3295     CODECHAL_ENCODE_FUNCTION_ENTER;
3296 
3297     auto refPicSelectList = &RefPicSelectList[0];
3298     auto picParams = m_avcPicParam;
3299     auto currEncodeRefList = m_refList[picParams->CurrReconstructedPic.FrameIdx];
3300 
3301     uint8_t index = 0;
3302     uint8_t refFrameListIndex = 0;
3303     bool inserted = false;
3304     // Check if current PicIdx is already present in the list
3305     for (index = 0; index < CODECHAL_ENCODE_AVC_REF_PIC_SELECT_ENTRIES; index++)
3306     {
3307         if (refPicSelectList[index].FrameIdx == picParams->CurrReconstructedPic.FrameIdx)
3308         {
3309             ucCurrRefPicSelectIndex = index;
3310             return eStatus;
3311         }
3312     }
3313 
3314     // Save this picture in the list for future use
3315     // Use the first available index to save it
3316     for (index = 0; index < CODECHAL_ENCODE_AVC_REF_PIC_SELECT_ENTRIES; index++)
3317     {
3318         if (refPicSelectList[index].FrameIdx == CODECHAL_ENCODE_AVC_INVALID_PIC_ID) // Index not used
3319         {
3320             refPicSelectList[index].FrameIdx = picParams->CurrReconstructedPic.FrameIdx;
3321             ucCurrRefPicSelectIndex = index;
3322             inserted = true;
3323             break;
3324         }
3325     }
3326 
3327     if (!inserted)
3328     {
3329         // No unused index available, need to bump off an existing entry
3330         // Compare with RefFrameList sent through PicParams
3331         for (index = 0; index < CODECHAL_ENCODE_AVC_REF_PIC_SELECT_ENTRIES; index++)
3332         {
3333             bool foundMatch = false;
3334 
3335             for (refFrameListIndex = 0; refFrameListIndex < CODEC_AVC_MAX_NUM_REF_FRAME; refFrameListIndex++)
3336             {
3337                 if (currEncodeRefList->RefList[refFrameListIndex].FrameIdx == refPicSelectList[index].FrameIdx)
3338                 {
3339                     // reference still present in ref frame list, cannot be replaced
3340                     foundMatch = true;
3341                 }
3342             }
3343 
3344             // Found an entry thats not in ref frame list anymore, safe to reuse
3345             if (foundMatch == false)
3346             {
3347                 refPicSelectList[index].FrameIdx = picParams->CurrReconstructedPic.FrameIdx;
3348                 ucCurrRefPicSelectIndex = index;
3349                 inserted = true;
3350                 break;
3351             }
3352         }
3353 
3354         if (!inserted)
3355         {
3356             CODECHAL_ENCODE_ASSERTMESSAGE("Could not find an unused entry, this should never happen.");
3357             eStatus = MOS_STATUS_UNKNOWN;
3358             return eStatus;
3359         }
3360     }
3361 
3362     return eStatus;
3363 }
3364 
MbEncKernel(bool mbEncIFrameDistInUse)3365 MOS_STATUS CodechalEncodeAvcEnc::MbEncKernel(bool mbEncIFrameDistInUse)
3366 {
3367     MOS_STATUS                                  eStatus = MOS_STATUS_SUCCESS;
3368 
3369     CODECHAL_ENCODE_FUNCTION_ENTER;
3370 
3371     uint8_t ppsidx = m_avcSliceParams->pic_parameter_set_id;
3372     uint8_t spsidx = m_avcPicParams[ppsidx]->seq_parameter_set_id;
3373     auto refList = &m_refList[0];
3374     auto currRefList = m_refList[m_currReconstructedPic.FrameIdx];
3375     bool use45DegreePattern = false;
3376     bool roiEnabled = (m_avcPicParams[ppsidx]->NumROI > 0) ? true : false;
3377     uint8_t refPicListIdx = m_avcSliceParams[ppsidx].RefPicList[0][0].FrameIdx;
3378     uint8_t refFrameListIdx = m_avcPicParam[ppsidx].RefFrameList[refPicListIdx].FrameIdx;
3379     bool bDirtyRoiEnabled = (m_pictureCodingType == P_TYPE
3380         && m_avcPicParams[ppsidx]->NumDirtyROI > 0
3381         && m_prevReconFrameIdx == refFrameListIdx);
3382 
3383     //  Two flags(bMbConstDataBufferNeeded, bMbQpBufferNeeded)
3384     //  would be used as there are two buffers and not all cases need both the buffers
3385     //  Constant Data buffer  needed for MBBRC, MBQP, ROI, RollingIntraRefresh
3386     //  Please note that this surface needs to be programmed for
3387     //  all usage cases(including CQP cases) because DWord13 includes mode cost for high texture MB?s cost.
3388     bool bMbConstDataBufferInUse = bMbBrcEnabled || bMbQpDataEnabled || roiEnabled || bDirtyRoiEnabled ||
3389         m_avcPicParam->EnableRollingIntraRefresh || bHighTextureModeCostEnable;
3390 
3391     bool mbQpBufferInUse = bMbBrcEnabled || bBrcRoiEnabled || bMbQpDataEnabled;
3392 
3393     if (m_feiEnable)
3394     {
3395         CODECHAL_ENCODE_CHK_NULL_RETURN(m_avcFeiPicParams);
3396         bMbConstDataBufferInUse |= m_avcFeiPicParams->bMBQp;
3397         mbQpBufferInUse |= m_avcFeiPicParams->bMBQp;
3398     }
3399 
3400     // MFE MBEnc kernel handles several frames from different streams in one submission.
3401     // All the streams use the same HW/OS/StateHeap interfaces during this submssion.
3402     // All the streams use the kernel state from the first stream.
3403     // The first stream allocates the DSH and SSH, send the binding table.
3404     // The last stream sets mfe curbe, prepare and submit the command buffer.
3405     // All the streams set their own curbe surfaces and surface states.
3406     CODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC     origMbEncBindingTable;
3407     if (IsMfeMbEncEnabled(mbEncIFrameDistInUse))
3408     {
3409         auto mfeEncodeSharedState = m_mfeEncodeSharedState;
3410         if (m_mfeFirstStream)
3411         {
3412             mfeEncodeSharedState->pHwInterface = m_hwInterface;
3413             mfeEncodeSharedState->pOsInterface = m_osInterface;
3414             m_hwInterface->GetRenderInterface()->m_stateHeapInterface = m_stateHeapInterface;
3415             m_osInterface->pfnResetOsStates(m_osInterface);
3416         }
3417         else
3418         {
3419             m_hwInterface           = mfeEncodeSharedState->pHwInterface;
3420             m_osInterface           = mfeEncodeSharedState->pOsInterface;
3421             m_stateHeapInterface    = m_hwInterface->GetRenderInterface()->m_stateHeapInterface;
3422             m_renderEngineInterface->SetOsInterface(m_osInterface);
3423         }
3424         // Set maximum width/height, it is used for initializing media walker parameters
3425         // during submitting the command buffer at the last stream.
3426         if (m_picWidthInMb > mfeEncodeSharedState->dwPicWidthInMB)
3427         {
3428             mfeEncodeSharedState->dwPicWidthInMB = m_picWidthInMb;
3429         }
3430         if (m_frameFieldHeightInMb > mfeEncodeSharedState->dwPicHeightInMB)
3431         {
3432             mfeEncodeSharedState->dwPicHeightInMB = m_frameFieldHeightInMb;
3433         }
3434 
3435         uint16_t sliceHeight = m_arbitraryNumMbsInSlice ? m_frameFieldHeightInMb : m_sliceHeight;
3436 
3437         if (sliceHeight > mfeEncodeSharedState->sliceHeight)
3438         {
3439             mfeEncodeSharedState->sliceHeight = sliceHeight;
3440         }
3441 
3442         m_osInterface->pfnSetGpuContext(m_osInterface, m_renderContext);
3443         CODECHAL_DEBUG_TOOL(
3444             m_debugInterface->m_osInterface = m_osInterface;)
3445         // bookkeeping the original binding table
3446         origMbEncBindingTable = MbEncBindingTable;
3447     }
3448 
3449     PerfTagSetting perfTag;
3450     perfTag.Value = 0;
3451     perfTag.Mode = (uint16_t)m_mode & CODECHAL_ENCODE_MODE_BIT_MASK;
3452     perfTag.CallType = (mbEncIFrameDistInUse && !m_singleTaskPhaseSupported) ?
3453         CODECHAL_ENCODE_PERFTAG_CALL_INTRA_DIST : CODECHAL_ENCODE_PERFTAG_CALL_MBENC_KERNEL;
3454     perfTag.PictureCodingType = m_pictureCodingType;
3455     m_osInterface->pfnSetPerfTag(m_osInterface, perfTag.Value);
3456 
3457     CODECHAL_MEDIA_STATE_TYPE encFunctionType;
3458     if (mbEncIFrameDistInUse)
3459     {
3460         encFunctionType = CODECHAL_MEDIA_STATE_ENC_I_FRAME_DIST;
3461     }
3462     else if (bUseMbEncAdvKernel)
3463     {
3464         encFunctionType = CODECHAL_MEDIA_STATE_ENC_ADV;
3465     }
3466     else if (m_kernelMode == encodeNormalMode)
3467     {
3468         encFunctionType = CODECHAL_MEDIA_STATE_ENC_NORMAL;
3469     }
3470     else if (m_kernelMode == encodePerformanceMode)
3471     {
3472         encFunctionType = CODECHAL_MEDIA_STATE_ENC_PERFORMANCE;
3473     }
3474     else
3475     {
3476         encFunctionType = CODECHAL_MEDIA_STATE_ENC_QUALITY;
3477     }
3478 
3479     // Initialize DSH kernel region
3480     PMHW_KERNEL_STATE kernelState;
3481     if (mbEncIFrameDistInUse)
3482     {
3483         kernelState = &BrcKernelStates[CODECHAL_ENCODE_BRC_IDX_IFRAMEDIST];
3484     }
3485     else if (IsMfeMbEncEnabled(mbEncIFrameDistInUse))
3486     {
3487         kernelState = &mfeMbEncKernelState;
3488     }
3489     else
3490     {
3491         CodechalEncodeIdOffsetParams idOffsetParams;
3492         MOS_ZeroMemory(&idOffsetParams, sizeof(idOffsetParams));
3493         idOffsetParams.Standard = m_standard;
3494         idOffsetParams.EncFunctionType = encFunctionType;
3495         idOffsetParams.wPictureCodingType = m_pictureCodingType;
3496         idOffsetParams.ucDmvPredFlag = m_avcSliceParams->direct_spatial_mv_pred_flag;
3497         idOffsetParams.interlacedField = CodecHal_PictureIsField(m_currOriginalPic);
3498 
3499         uint32_t krnStateIdx;
3500         CODECHAL_ENCODE_CHK_STATUS_RETURN(GetMbEncKernelStateIdx(
3501             &idOffsetParams,
3502             &krnStateIdx));
3503         kernelState = &pMbEncKernelStates[krnStateIdx];
3504     }
3505 
3506     // All the streams use the kernel state from the first stream.
3507     if (IsMfeMbEncEnabled(mbEncIFrameDistInUse))
3508     {
3509         if (m_mfeFirstStream)
3510         {
3511             m_mfeEncodeSharedState->pMfeMbEncKernelState = kernelState;
3512         }
3513         else
3514         {
3515             kernelState = m_mfeEncodeSharedState->pMfeMbEncKernelState;
3516         }
3517     }
3518 
3519     // If Single Task Phase is not enabled, use BT count for the kernel state.
3520     if (m_firstTaskInPhase == true || !m_singleTaskPhaseSupported ||
3521             (IsMfeMbEncEnabled(mbEncIFrameDistInUse) && m_mfeFirstStream))
3522     {
3523         uint32_t dwMaxBtCount = m_singleTaskPhaseSupported ?
3524             m_maxBtCount : kernelState->KernelParams.iBTCount;
3525         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnRequestSshSpaceForCmdBuf(
3526             m_stateHeapInterface,
3527             dwMaxBtCount));
3528         m_vmeStatesSize = m_hwInterface->GetKernelLoadCommandSize(dwMaxBtCount);
3529         CODECHAL_ENCODE_CHK_STATUS_RETURN(VerifySpaceAvailable());
3530     }
3531 
3532     // Allocate DSH and SSH for the first stream, which will be passed to other streams through the shared kernel state.
3533      if ((IsMfeMbEncEnabled(mbEncIFrameDistInUse) && m_mfeFirstStream) ||
3534          (!IsMfeMbEncEnabled(mbEncIFrameDistInUse) && !bMbEncCurbeSetInBrcUpdate))
3535     {
3536             CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace(
3537                 m_stateHeapInterface,
3538                 kernelState,
3539                 false,
3540                 0,
3541                 false,
3542                 m_storeData));
3543 
3544             MHW_INTERFACE_DESCRIPTOR_PARAMS idParams;
3545             MOS_ZeroMemory(&idParams, sizeof(idParams));
3546             idParams.pKernelState = kernelState;
3547             CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetInterfaceDescriptor(
3548                 m_stateHeapInterface,
3549                 1,
3550                 &idParams));
3551     }
3552 
3553     if (bMbEncCurbeSetInBrcUpdate)
3554     {
3555         if (!IsMfeMbEncEnabled(mbEncIFrameDistInUse))
3556         {
3557             // If BRC update was used to set up the DSH & SSH, SSH only needs to
3558             // be obtained if single task phase is enabled because the same SSH
3559             // could not be shared between BRC update and MbEnc
3560             CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace(
3561                 m_stateHeapInterface,
3562                 kernelState,
3563                 true,
3564                 0,
3565                 m_singleTaskPhaseSupported,
3566                 m_storeData));
3567         }
3568     }
3569     else
3570     {
3571         // Setup AVC Curbe
3572         CODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS mbEncCurbeParams;
3573         MOS_ZeroMemory(&mbEncCurbeParams, sizeof(mbEncCurbeParams));
3574         mbEncCurbeParams.pPicParams = m_avcPicParams[ppsidx];
3575         mbEncCurbeParams.pSeqParams = m_avcSeqParams[spsidx];
3576         mbEncCurbeParams.pSlcParams = m_avcSliceParams;
3577         mbEncCurbeParams.ppRefList = &(m_refList[0]);
3578         mbEncCurbeParams.pPicIdx = &(m_picIdx[0]);
3579         mbEncCurbeParams.bRoiEnabled = roiEnabled;
3580         mbEncCurbeParams.bDirtyRoiEnabled = bDirtyRoiEnabled;
3581         mbEncCurbeParams.bMbEncIFrameDistEnabled = mbEncIFrameDistInUse;
3582         mbEncCurbeParams.pdwBlockBasedSkipEn = &dwMbEncBlockBasedSkipEn;
3583         if (mbEncIFrameDistInUse)
3584         {
3585             mbEncCurbeParams.bBrcEnabled = false;
3586             mbEncCurbeParams.wPicWidthInMb = (uint16_t)m_downscaledWidthInMb4x;
3587             mbEncCurbeParams.wFieldFrameHeightInMb = (uint16_t)m_downscaledFrameFieldHeightInMb4x;
3588             mbEncCurbeParams.usSliceHeight = (m_sliceHeight + SCALE_FACTOR_4x - 1) / SCALE_FACTOR_4x;
3589         }
3590         else
3591         {
3592             mbEncCurbeParams.bBrcEnabled = bBrcEnabled;
3593             mbEncCurbeParams.wPicWidthInMb = m_picWidthInMb;
3594             mbEncCurbeParams.wFieldFrameHeightInMb = m_frameFieldHeightInMb;
3595             mbEncCurbeParams.usSliceHeight = (m_arbitraryNumMbsInSlice) ?
3596                 m_frameFieldHeightInMb : m_sliceHeight;
3597             mbEncCurbeParams.bUseMbEncAdvKernel = bUseMbEncAdvKernel;
3598         }
3599         mbEncCurbeParams.pKernelState = kernelState;
3600         mbEncCurbeParams.pAvcQCParams = m_avcQCParams ;
3601         mbEncCurbeParams.bMbDisableSkipMapEnabled = bMbDisableSkipMapEnabled;
3602         mbEncCurbeParams.bStaticFrameDetectionEnabled = bStaticFrameDetectionEnable && m_hmeEnabled;
3603         mbEncCurbeParams.bApdatvieSearchWindowSizeEnabled = bApdatvieSearchWindowEnable;
3604         mbEncCurbeParams.bSquareRollingIEnabled = bSquareRollingIEnabled;
3605         CODECHAL_ENCODE_CHK_STATUS_RETURN(SetCurbeAvcMbEnc(
3606             &mbEncCurbeParams));
3607     }
3608 
3609     if (IsMfeMbEncEnabled(mbEncIFrameDistInUse))
3610     {
3611         // Set MFE specific curbe in the last stream
3612         // MFE MBEnc specific curbe is different from the normal MBEnc curbe which is passed
3613         // to MFE MBEnc kernel as a surface.
3614         if (m_mfeLastStream)
3615         {
3616             CODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_PARAMS mfeMbEncCurbeParams;
3617             MOS_ZeroMemory(&mfeMbEncCurbeParams, sizeof(mfeMbEncCurbeParams));
3618             mfeMbEncCurbeParams.submitNumber = m_mfeEncodeParams.submitNumber;
3619             mfeMbEncCurbeParams.pKernelState = kernelState;
3620             mfeMbEncCurbeParams.pBindingTable = &MbEncBindingTable;
3621             CODECHAL_ENCODE_CHK_STATUS_RETURN(SetCurbeAvcMfeMbEnc(&mfeMbEncCurbeParams));
3622         }
3623         // Change the binding table according to the index during this submission
3624         UpdateMfeMbEncBindingTable(m_mfeEncodeParams.submitIndex);
3625     }
3626 
3627     CODECHAL_DEBUG_TOOL(
3628         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
3629             encFunctionType,
3630             MHW_DSH_TYPE,
3631             kernelState));
3632 
3633         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe(
3634             encFunctionType,
3635             kernelState));
3636 
3637         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
3638             encFunctionType,
3639             MHW_ISH_TYPE,
3640             kernelState));
3641     )
3642 
3643     for (uint8_t i = 0; i < CODEC_AVC_MAX_NUM_REF_FRAME; i++)
3644     {
3645         if (m_picIdx[i].bValid)
3646         {
3647             uint8_t index = m_picIdx[i].ucPicIdx;
3648             refList[index]->sRefBuffer = m_userFlags.bUseRawPicForRef ?
3649                 refList[index]->sRefRawBuffer : refList[index]->sRefReconBuffer;
3650 
3651             CodecHalGetResourceInfo(m_osInterface, &refList[index]->sRefBuffer);
3652         }
3653     }
3654 
3655     MOS_COMMAND_BUFFER cmdBuffer;
3656     MOS_ZeroMemory(&cmdBuffer,sizeof(cmdBuffer));
3657     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0));
3658 
3659     // For MFE, All the commands are sent in the last stream and can not be sent in different streams
3660     // since cmdBuffer is zeroed for each stream and cmd buffer pointer is reset.
3661     if (!IsMfeMbEncEnabled(mbEncIFrameDistInUse) || m_mfeLastStream)
3662     {
3663         SendKernelCmdsParams sendKernelCmdsParams = SendKernelCmdsParams();
3664         sendKernelCmdsParams.EncFunctionType = encFunctionType;
3665         sendKernelCmdsParams.ucDmvPredFlag =
3666             m_avcSliceParams->direct_spatial_mv_pred_flag;
3667         sendKernelCmdsParams.pKernelState = kernelState;
3668         CODECHAL_ENCODE_CHK_STATUS_RETURN(SendGenericKernelCmds(&cmdBuffer, &sendKernelCmdsParams));
3669     }
3670 
3671     // Set up MB BRC Constant Data Buffer if there is QP change within a frame
3672     if (bMbConstDataBufferInUse)
3673     {
3674         CODECHAL_ENCODE_AVC_INIT_MBBRC_CONSTANT_DATA_BUFFER_PARAMS initMbBrcConstantDataBufferParams;
3675 
3676         MOS_ZeroMemory(&initMbBrcConstantDataBufferParams, sizeof(initMbBrcConstantDataBufferParams));
3677         initMbBrcConstantDataBufferParams.pOsInterface = m_osInterface;
3678         initMbBrcConstantDataBufferParams.presBrcConstantDataBuffer =
3679             &BrcBuffers.resMbBrcConstDataBuffer[m_currRecycledBufIdx];
3680         initMbBrcConstantDataBufferParams.dwMbEncBlockBasedSkipEn = dwMbEncBlockBasedSkipEn;
3681         initMbBrcConstantDataBufferParams.pPicParams = m_avcPicParams[ppsidx];
3682         initMbBrcConstantDataBufferParams.wPictureCodingType = m_pictureCodingType;
3683         initMbBrcConstantDataBufferParams.bSkipBiasAdjustmentEnable = m_skipBiasAdjustmentEnable;
3684         initMbBrcConstantDataBufferParams.bAdaptiveIntraScalingEnable = bAdaptiveIntraScalingEnable;
3685         initMbBrcConstantDataBufferParams.bOldModeCostEnable = bOldModeCostEnable;
3686         initMbBrcConstantDataBufferParams.pAvcQCParams = m_avcQCParams ;
3687         initMbBrcConstantDataBufferParams.bEnableKernelTrellis = bKernelTrellis && m_trellisQuantParams.dwTqEnabled;
3688 
3689         // Kernel controlled Trellis Quantization
3690         if (bKernelTrellis && m_trellisQuantParams.dwTqEnabled)
3691         {
3692             CODECHAL_ENCODE_CHK_STATUS_RETURN(CalcLambdaTable(
3693                 m_pictureCodingType,
3694                 &initMbBrcConstantDataBufferParams.Lambda[0][0]));
3695         }
3696 
3697         CODECHAL_ENCODE_CHK_STATUS_RETURN(InitMbBrcConstantDataBuffer(&initMbBrcConstantDataBufferParams));
3698 
3699         // dump MbBrcLut
3700         CODECHAL_DEBUG_TOOL(CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
3701             initMbBrcConstantDataBufferParams.presBrcConstantDataBuffer,
3702             CodechalDbgAttr::attrInput,
3703             "MbBrcLut",
3704             16 * (CODEC_AVC_NUM_QP) * sizeof(uint32_t),
3705             0,
3706             CODECHAL_MEDIA_STATE_ENC_QUALITY)));
3707 
3708     }
3709 
3710     // Add binding table
3711     // For MFE first stream sends binding table since the function zeros the whole SSH.
3712     // If last stream sends binding table it will clean the surface states from other streams.
3713     if (!IsMfeMbEncEnabled(mbEncIFrameDistInUse) || m_mfeFirstStream)
3714     {
3715         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetBindingTable(
3716             m_stateHeapInterface,
3717             kernelState));
3718     }
3719 
3720     //Add surface states
3721     CODECHAL_ENCODE_AVC_MBENC_SURFACE_PARAMS mbEncSurfaceParams;
3722     MOS_ZeroMemory(&mbEncSurfaceParams, sizeof(mbEncSurfaceParams));
3723     mbEncSurfaceParams.MediaStateType = encFunctionType;
3724     mbEncSurfaceParams.pAvcSlcParams = m_avcSliceParams;
3725     mbEncSurfaceParams.ppRefList = &m_refList[0];
3726     mbEncSurfaceParams.pAvcPicIdx = &m_picIdx[0];
3727     mbEncSurfaceParams.pCurrOriginalPic = &m_currOriginalPic;
3728     mbEncSurfaceParams.pCurrReconstructedPic = &m_currReconstructedPic;
3729     mbEncSurfaceParams.wPictureCodingType = m_pictureCodingType;
3730     mbEncSurfaceParams.psCurrPicSurface = mbEncIFrameDistInUse ? m_trackedBuf->Get4xDsSurface(CODEC_CURR_TRACKED_BUFFER) : m_rawSurfaceToEnc;
3731     if (mbEncIFrameDistInUse && CodecHal_PictureIsBottomField(m_currOriginalPic))
3732     {
3733         mbEncSurfaceParams.dwCurrPicSurfaceOffset = m_scaledBottomFieldOffset;
3734     }
3735     mbEncSurfaceParams.dwMbCodeBottomFieldOffset = (uint32_t)m_mbcodeBottomFieldOffset;
3736     mbEncSurfaceParams.dwMvBottomFieldOffset = (uint32_t)m_mvBottomFieldOffset;
3737     mbEncSurfaceParams.ps4xMeMvDataBuffer = m_hmeKernel ? m_hmeKernel->GetSurface(CodechalKernelHme::SurfaceId::me4xMvDataBuffer) : &m_4xMeMvDataBuffer;
3738     mbEncSurfaceParams.ps4xMeDistortionBuffer = m_hmeKernel ? m_hmeKernel->GetSurface(CodechalKernelHme::SurfaceId::me4xDistortionBuffer) : &m_4xMeDistortionBuffer;
3739     mbEncSurfaceParams.dwMeMvBottomFieldOffset = m_hmeKernel ? m_hmeKernel->Get4xMeMvBottomFieldOffset(): (uint32_t)m_meMvBottomFieldOffset;
3740     mbEncSurfaceParams.psMeBrcDistortionBuffer = &BrcBuffers.sMeBrcDistortionBuffer;
3741     mbEncSurfaceParams.dwMeBrcDistortionBottomFieldOffset = BrcBuffers.dwMeBrcDistortionBottomFieldOffset;
3742     mbEncSurfaceParams.dwMeDistortionBottomFieldOffset = m_hmeKernel ? m_hmeKernel->GetDistortionBottomFieldOffset() : (uint32_t)m_meDistortionBottomFieldOffset;
3743     mbEncSurfaceParams.dwRefPicSelectBottomFieldOffset = (uint32_t)ulRefPicSelectBottomFieldOffset;
3744     mbEncSurfaceParams.dwFrameWidthInMb = (uint32_t)m_picWidthInMb;
3745     mbEncSurfaceParams.dwFrameFieldHeightInMb = (uint32_t)m_frameFieldHeightInMb;
3746     mbEncSurfaceParams.dwFrameHeightInMb = (uint32_t)m_picHeightInMb;
3747     // Interleaved input surfaces
3748     mbEncSurfaceParams.dwVerticalLineStride = m_verticalLineStride;
3749     mbEncSurfaceParams.dwVerticalLineStrideOffset = m_verticalLineStrideOffset;
3750     // Vertical line stride is not used for the case of scaled surfaces saved as separate fields
3751     if (!m_fieldScalingOutputInterleaved && mbEncIFrameDistInUse)
3752     {
3753         mbEncSurfaceParams.dwVerticalLineStride = 0;
3754         mbEncSurfaceParams.dwVerticalLineStrideOffset = 0;
3755     }
3756     mbEncSurfaceParams.bHmeEnabled = m_hmeSupported;
3757     mbEncSurfaceParams.bMbEncIFrameDistInUse = mbEncIFrameDistInUse;
3758     mbEncSurfaceParams.presMbBrcConstDataBuffer = &BrcBuffers.resMbBrcConstDataBuffer[m_currRecycledBufIdx];
3759     mbEncSurfaceParams.psMbQpBuffer =
3760         bMbQpDataEnabled ? &sMbQpDataSurface : &BrcBuffers.sBrcMbQpBuffer;
3761     mbEncSurfaceParams.dwMbQpBottomFieldOffset = bMbQpDataEnabled ? 0 : BrcBuffers.dwBrcMbQpBottomFieldOffset;
3762     mbEncSurfaceParams.bUsedAsRef =
3763         m_refList[m_currReconstructedPic.FrameIdx]->bUsedAsRef;
3764     mbEncSurfaceParams.presMADDataBuffer = &m_resMadDataBuffer[m_currMadBufferIdx];
3765     mbEncSurfaceParams.bMbQpBufferInUse = mbQpBufferInUse;
3766     mbEncSurfaceParams.bMbSpecificDataEnabled = bMbSpecificDataEnabled;
3767     mbEncSurfaceParams.presMbSpecificDataBuffer = &resMbSpecificDataBuffer[m_currRecycledBufIdx];
3768     mbEncSurfaceParams.bMbConstDataBufferInUse = bMbConstDataBufferInUse;
3769     mbEncSurfaceParams.bMADEnabled              = mbEncIFrameDistInUse ? false : m_madEnabled;
3770     mbEncSurfaceParams.bUseMbEncAdvKernel = mbEncIFrameDistInUse ? false : bUseMbEncAdvKernel;
3771     mbEncSurfaceParams.presMbEncCurbeBuffer =
3772         (mbEncIFrameDistInUse && bUseMbEncAdvKernel) ? nullptr : &BrcBuffers.resMbEncAdvancedDsh;
3773     mbEncSurfaceParams.presMbEncBRCBuffer = &BrcBuffers.resMbEncBrcBuffer;
3774 
3775     if (IsMfeMbEncEnabled(mbEncIFrameDistInUse) || bDecoupleMbEncCurbeFromBRC)
3776     {
3777         mbEncSurfaceParams.dwMbEncBRCBufferSize = m_mbencBrcBufferSize;
3778     }
3779 
3780     mbEncSurfaceParams.bUseAdvancedDsh = bAdvancedDshInUse;
3781     mbEncSurfaceParams.bBrcEnabled = bBrcEnabled;
3782     mbEncSurfaceParams.bArbitraryNumMbsInSlice = m_arbitraryNumMbsInSlice;
3783     mbEncSurfaceParams.psSliceMapSurface = &m_sliceMapSurface[m_currRecycledBufIdx];
3784     mbEncSurfaceParams.dwSliceMapBottomFieldOffset = (uint32_t)m_sliceMapBottomFieldOffset;
3785     mbEncSurfaceParams.pMbEncBindingTable = &MbEncBindingTable;
3786     mbEncSurfaceParams.pKernelState = kernelState;
3787 
3788     if (m_mbStatsSupported)
3789     {
3790         mbEncSurfaceParams.bMBVProcStatsEnabled = m_flatnessCheckEnabled ||
3791                                                   m_adaptiveTransformDecisionEnabled ||
3792                                                   bMbBrcEnabled ||
3793                                                   bMbQpDataEnabled;
3794         mbEncSurfaceParams.presMBVProcStatsBuffer = &m_resMbStatsBuffer;
3795         mbEncSurfaceParams.dwMBVProcStatsBottomFieldOffset = m_mbStatsBottomFieldOffset;
3796     }
3797     else
3798     {
3799         mbEncSurfaceParams.bFlatnessCheckEnabled = m_flatnessCheckEnabled;
3800         mbEncSurfaceParams.psFlatnessCheckSurface = &m_flatnessCheckSurface;
3801         mbEncSurfaceParams.dwFlatnessCheckBottomFieldOffset = (uint32_t)m_flatnessCheckBottomFieldOffset;
3802     }
3803 
3804     // Set up pFeiPicParams
3805     mbEncSurfaceParams.pFeiPicParams = m_avcFeiPicParams;
3806 
3807     mbEncSurfaceParams.bMbDisableSkipMapEnabled = bMbDisableSkipMapEnabled;
3808     mbEncSurfaceParams.psMbDisableSkipMapSurface = psMbDisableSkipMapSurface;
3809 
3810     if (bUseWeightedSurfaceForL0 || bUseWeightedSurfaceForL1)
3811     {
3812         if (!m_wpUseCommonKernel)
3813         {
3814             mbEncSurfaceParams.pWeightedPredOutputPicSelectList = &WeightedPredOutputPicSelectList[0];
3815         }
3816         mbEncSurfaceParams.bUseWeightedSurfaceForL0 = bUseWeightedSurfaceForL0;
3817         mbEncSurfaceParams.bUseWeightedSurfaceForL1 = bUseWeightedSurfaceForL1;
3818     }
3819 
3820     // Clear the MAD buffer -- the kernel requires it to be 0 as it accumulates the result
3821     if (mbEncSurfaceParams.bMADEnabled)
3822     {
3823         // set lock flag to WRITE_ONLY
3824         MOS_LOCK_PARAMS lockFlags;
3825         MOS_ZeroMemory(&lockFlags, sizeof(MOS_LOCK_PARAMS));
3826         lockFlags.WriteOnly = 1;
3827 
3828         uint8_t* pbData = (uint8_t*)m_osInterface->pfnLockResource(
3829             m_osInterface,
3830             mbEncSurfaceParams.presMADDataBuffer,
3831             &lockFlags);
3832 
3833         CODECHAL_ENCODE_CHK_NULL_RETURN(pbData);
3834 
3835         MOS_ZeroMemory(pbData, CODECHAL_MAD_BUFFER_SIZE);
3836 
3837         m_osInterface->pfnUnlockResource(
3838             m_osInterface,
3839             mbEncSurfaceParams.presMADDataBuffer);
3840 
3841         CODECHAL_DEBUG_TOOL(CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
3842             &m_resMadDataBuffer[m_currMadBufferIdx],
3843             CodechalDbgAttr::attrOutput,
3844             "MADRead",
3845             CODECHAL_MAD_BUFFER_SIZE,
3846             0,
3847             encFunctionType)));
3848     }
3849 
3850     // static frame detection buffer
3851     mbEncSurfaceParams.bStaticFrameDetectionEnabled = bStaticFrameDetectionEnable && m_hmeEnabled;
3852     mbEncSurfaceParams.presSFDOutputBuffer = &resSFDOutputBuffer[0];
3853     if (m_pictureCodingType == P_TYPE)
3854     {
3855         mbEncSurfaceParams.presSFDCostTableBuffer = &resSFDCostTablePFrameBuffer;
3856     }
3857     else if (m_pictureCodingType == B_TYPE)
3858     {
3859         mbEncSurfaceParams.presSFDCostTableBuffer = &resSFDCostTableBFrameBuffer;
3860     }
3861 
3862     CODECHAL_ENCODE_CHK_STATUS_RETURN(SendAvcMbEncSurfaces(&cmdBuffer, &mbEncSurfaceParams));
3863 
3864     // For MFE, only one walker processes frame in parallel through color bits.
3865     if (!IsMfeMbEncEnabled(mbEncIFrameDistInUse) || m_mfeLastStream)
3866     {
3867         uint32_t dwResolutionX = mbEncIFrameDistInUse ?
3868             m_downscaledWidthInMb4x : (uint32_t)m_picWidthInMb;
3869         uint32_t dwResolutionY = mbEncIFrameDistInUse ?
3870             m_downscaledFrameFieldHeightInMb4x : (uint32_t)m_frameFieldHeightInMb;
3871 
3872         CODECHAL_WALKER_CODEC_PARAMS walkerCodecParams;
3873         MOS_ZeroMemory(&walkerCodecParams, sizeof(walkerCodecParams));
3874         walkerCodecParams.WalkerMode = m_walkerMode;
3875         walkerCodecParams.bUseScoreboard = m_useHwScoreboard;
3876         walkerCodecParams.wPictureCodingType = m_pictureCodingType;
3877         walkerCodecParams.bMbEncIFrameDistInUse = mbEncIFrameDistInUse;
3878         walkerCodecParams.bMbaff = m_mbaffEnabled;
3879         walkerCodecParams.bDirectSpatialMVPredFlag = m_avcSliceParams->direct_spatial_mv_pred_flag;
3880 
3881         if (IsMfeMbEncEnabled(mbEncIFrameDistInUse))
3882         {
3883             walkerCodecParams.bColorbitSupported = true;
3884             walkerCodecParams.dwNumSlices = m_mfeEncodeParams.submitNumber;  // MFE use color bit to handle frames in parallel
3885             walkerCodecParams.WalkerDegree = CODECHAL_26_DEGREE;                        // MFE use 26 degree dependency
3886             walkerCodecParams.dwResolutionX = m_mfeEncodeSharedState->dwPicWidthInMB;
3887             walkerCodecParams.dwResolutionY = m_mfeEncodeSharedState->dwPicHeightInMB;
3888             walkerCodecParams.usSliceHeight = m_mfeEncodeSharedState->sliceHeight;
3889         }
3890         else
3891         {
3892             walkerCodecParams.bColorbitSupported = (m_colorbitSupported && !m_arbitraryNumMbsInSlice) ? m_cmKernelEnable : false;
3893             walkerCodecParams.dwResolutionX = dwResolutionX;
3894             walkerCodecParams.dwResolutionY = dwResolutionY;
3895             walkerCodecParams.dwNumSlices = m_numSlices;
3896             walkerCodecParams.usSliceHeight = m_sliceHeight;
3897         }
3898         walkerCodecParams.bGroupIdSelectSupported = m_groupIdSelectSupported;
3899         walkerCodecParams.ucGroupId = m_groupId;
3900 
3901         MHW_WALKER_PARAMS walkerParams;
3902         CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalInitMediaObjectWalkerParams(
3903             m_hwInterface,
3904             &walkerParams,
3905             &walkerCodecParams));
3906 
3907         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_renderEngineInterface->AddMediaObjectWalkerCmd(
3908             &cmdBuffer,
3909             &walkerParams));
3910 
3911         CODECHAL_ENCODE_CHK_STATUS_RETURN(EndStatusReport(&cmdBuffer, encFunctionType));
3912 
3913         // Add dump for MBEnc surface state heap here
3914         CODECHAL_DEBUG_TOOL(
3915             CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
3916                 encFunctionType,
3917                 MHW_SSH_TYPE,
3918                 kernelState));
3919         )
3920 
3921         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSubmitBlocks(
3922             m_stateHeapInterface,
3923             kernelState));
3924         if (!m_singleTaskPhaseSupported || m_lastTaskInPhase)
3925         {
3926             CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnUpdateGlobalCmdBufId(
3927                 m_stateHeapInterface));
3928             CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiBatchBufferEnd(&cmdBuffer, nullptr));
3929         }
3930 
3931         CODECHAL_DEBUG_TOOL(CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer(
3932             &cmdBuffer,
3933             encFunctionType,
3934             nullptr)));
3935 
3936         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->UpdateSSEuForCmdBuffer(&cmdBuffer, m_singleTaskPhaseSupported, m_lastTaskInPhase));
3937 
3938         m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0);
3939 
3940         if ((!m_singleTaskPhaseSupported || m_lastTaskInPhase))
3941         {
3942             HalOcaInterface::On1stLevelBBEnd(cmdBuffer, *m_osInterface->pOsContext);
3943             m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, m_renderContextUsesNullHw);
3944             m_lastTaskInPhase = false;
3945         }
3946     }
3947 
3948     CODECHAL_DEBUG_TOOL(CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
3949         &BrcBuffers.sBrcMbQpBuffer.OsResource,
3950         CodechalDbgAttr::attrInput,
3951         "MbQp",
3952         BrcBuffers.sBrcMbQpBuffer.dwPitch*BrcBuffers.sBrcMbQpBuffer.dwHeight,
3953         BrcBuffers.dwBrcMbQpBottomFieldOffset,
3954         CODECHAL_MEDIA_STATE_ENC_NORMAL)));
3955 
3956     currRefList->ucMADBufferIdx = m_currMadBufferIdx;
3957     currRefList->bMADEnabled    = m_madEnabled;
3958 
3959     if (IsMfeMbEncEnabled(mbEncIFrameDistInUse))
3960     {
3961         m_stateHeapInterface    = m_origStateHeapInterface;
3962         m_hwInterface           = m_origHwInterface;
3963         m_osInterface           = m_origOsInterface;
3964         m_renderEngineInterface->SetOsInterface(m_origOsInterface);
3965 
3966         MbEncBindingTable       = origMbEncBindingTable;
3967 
3968         CODECHAL_DEBUG_TOOL(
3969             m_debugInterface->m_osInterface = m_osInterface;)
3970     }
3971 
3972     return eStatus;
3973 }
3974 
BrcFrameUpdateKernel()3975 MOS_STATUS CodechalEncodeAvcEnc::BrcFrameUpdateKernel()
3976 {
3977     MOS_STATUS                                          eStatus = MOS_STATUS_SUCCESS;
3978 
3979     CODECHAL_ENCODE_FUNCTION_ENTER;
3980 
3981     PerfTagSetting perfTag;
3982     perfTag.Value = 0;
3983     perfTag.Mode = (uint16_t)m_mode & CODECHAL_ENCODE_MODE_BIT_MASK;
3984     if (m_lastTaskInPhase)
3985     {
3986         perfTag.CallType = CODECHAL_ENCODE_PERFTAG_CALL_BRC_UPDATE;
3987     }
3988     else
3989     {
3990         perfTag.CallType = m_singleTaskPhaseSupported ? CODECHAL_ENCODE_PERFTAG_CALL_MBENC_KERNEL : CODECHAL_ENCODE_PERFTAG_CALL_BRC_UPDATE;
3991     }
3992     perfTag.PictureCodingType = m_pictureCodingType;
3993     m_osInterface->pfnSetPerfTag(m_osInterface, perfTag.Value);
3994 
3995     auto kernelState = &BrcKernelStates[CODECHAL_ENCODE_BRC_IDX_FrameBRC_UPDATE];
3996 
3997     uint8_t ppsidx = m_avcSliceParams->pic_parameter_set_id;
3998     uint8_t refPicListIdx = m_avcSliceParams[ppsidx].RefPicList[0][0].FrameIdx;
3999     uint8_t refFrameListIdx = m_avcPicParam[ppsidx].RefFrameList[refPicListIdx].FrameIdx;
4000 
4001     bool bDirtyRoiEnabled = (m_pictureCodingType == P_TYPE
4002         && m_avcPicParams[ppsidx]->NumDirtyROI > 0
4003         && m_prevReconFrameIdx == refFrameListIdx);
4004 
4005     // If Single Task Phase is not enabled, use BT count for the kernel state.
4006     if (m_firstTaskInPhase == true || !m_singleTaskPhaseSupported)
4007     {
4008         uint32_t dwMaxBtCount = m_singleTaskPhaseSupported ?
4009             m_maxBtCount : kernelState->KernelParams.iBTCount;
4010         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnRequestSshSpaceForCmdBuf(
4011             m_stateHeapInterface,
4012             dwMaxBtCount));
4013         m_vmeStatesSize = m_hwInterface->GetKernelLoadCommandSize(dwMaxBtCount);
4014         CODECHAL_ENCODE_CHK_STATUS_RETURN(VerifySpaceAvailable());
4015     }
4016 
4017     CODECHAL_MEDIA_STATE_TYPE encFunctionType = CODECHAL_MEDIA_STATE_BRC_UPDATE;
4018     CODECHAL_MEDIA_STATE_TYPE mbEncFunctionType;
4019     if (bUseMbEncAdvKernel)
4020     {
4021         mbEncFunctionType = CODECHAL_MEDIA_STATE_ENC_ADV;
4022     }
4023     else if (m_kernelMode == encodeNormalMode)
4024     {
4025         mbEncFunctionType = CODECHAL_MEDIA_STATE_ENC_NORMAL;
4026     }
4027     else if (m_kernelMode == encodePerformanceMode)
4028     {
4029         mbEncFunctionType = CODECHAL_MEDIA_STATE_ENC_PERFORMANCE;
4030     }
4031     else
4032     {
4033         mbEncFunctionType = CODECHAL_MEDIA_STATE_ENC_QUALITY;
4034     }
4035 
4036     uint32_t krnStateIdx;
4037     CodechalEncodeIdOffsetParams idOffsetParams;
4038     MOS_ZeroMemory(&idOffsetParams, sizeof(idOffsetParams));
4039     idOffsetParams.Standard = m_standard;
4040     idOffsetParams.EncFunctionType = mbEncFunctionType;
4041     idOffsetParams.wPictureCodingType = m_pictureCodingType;
4042     idOffsetParams.ucDmvPredFlag = m_avcSliceParams->direct_spatial_mv_pred_flag;
4043     idOffsetParams.interlacedField = CodecHal_PictureIsField(m_currOriginalPic);
4044     CODECHAL_ENCODE_CHK_STATUS_RETURN(GetMbEncKernelStateIdx(
4045         &idOffsetParams,
4046         &krnStateIdx));
4047     auto mbEncKernelState = &pMbEncKernelStates[krnStateIdx];
4048 
4049     auto brcImageStatesReadBuffer =
4050         &BrcBuffers.resBrcImageStatesReadBuffer[m_currRecycledBufIdx];
4051 
4052     // No need to setup MBEnc Curbe for Gen95+ platforms.
4053     if (!bDecoupleMbEncCurbeFromBRC)
4054     {
4055         // Mfe use MBEnc Curbe buffer instead of DSH
4056         if (IsMfeMbEncEnabled(false))
4057         {
4058             BrcBuffers.pMbEncKernelStateInUse = nullptr;
4059         }
4060         else
4061         {
4062             BrcBuffers.pMbEncKernelStateInUse = mbEncKernelState;
4063             CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace(
4064                 m_stateHeapInterface,
4065                 mbEncKernelState,
4066                 false,
4067                 0,
4068                 !m_singleTaskPhaseSupported,
4069                 m_storeData));
4070 
4071             MHW_INTERFACE_DESCRIPTOR_PARAMS idParams;
4072             MOS_ZeroMemory(&idParams, sizeof(idParams));
4073             idParams.pKernelState = mbEncKernelState;
4074             CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetInterfaceDescriptor(
4075                 m_stateHeapInterface,
4076                 1,
4077                 &idParams));
4078         }
4079 
4080         CODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS mbEncCurbeParams;
4081         MOS_ZeroMemory(&mbEncCurbeParams, sizeof(mbEncCurbeParams));
4082         mbEncCurbeParams.pPicParams = m_avcPicParam;
4083         mbEncCurbeParams.pSeqParams = m_avcSeqParam;
4084         mbEncCurbeParams.pSlcParams = m_avcSliceParams;
4085         mbEncCurbeParams.ppRefList = &(m_refList[0]);
4086         mbEncCurbeParams.pPicIdx = &(m_picIdx[0]);
4087         mbEncCurbeParams.pdwBlockBasedSkipEn = &dwMbEncBlockBasedSkipEn;
4088         mbEncCurbeParams.wPicWidthInMb = m_picWidthInMb;
4089         mbEncCurbeParams.wFieldFrameHeightInMb = m_frameFieldHeightInMb;
4090         mbEncCurbeParams.usSliceHeight = (m_arbitraryNumMbsInSlice) ?
4091             m_frameFieldHeightInMb : m_sliceHeight;
4092         mbEncCurbeParams.bRoiEnabled = (m_avcPicParams[m_avcSliceParams->pic_parameter_set_id]->NumROI > 0) ? true : false;
4093         mbEncCurbeParams.bDirtyRoiEnabled = bDirtyRoiEnabled;
4094         mbEncCurbeParams.bBrcEnabled = true;
4095         mbEncCurbeParams.pKernelState = mbEncKernelState;
4096         mbEncCurbeParams.pAvcQCParams = m_avcQCParams ;
4097         mbEncCurbeParams.bMbDisableSkipMapEnabled = bMbDisableSkipMapEnabled;
4098         mbEncCurbeParams.bStaticFrameDetectionEnabled = bStaticFrameDetectionEnable && m_hmeEnabled;
4099         mbEncCurbeParams.bApdatvieSearchWindowSizeEnabled = bApdatvieSearchWindowEnable;
4100         mbEncCurbeParams.bSquareRollingIEnabled = bSquareRollingIEnabled;
4101         CODECHAL_ENCODE_CHK_STATUS_RETURN(SetCurbeAvcMbEnc(&mbEncCurbeParams));
4102 
4103         // BrcCopy is not needed if MbEnc Adv kenrel is used.
4104         if (!bUseMbEncAdvKernel && bAdvancedDshInUse)
4105         {
4106             CODECHAL_ENCODE_CHK_STATUS_RETURN(BrcCopyKernel());
4107         }
4108     }
4109 
4110     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace(
4111         m_stateHeapInterface,
4112         kernelState,
4113         false,
4114         0,
4115         (m_swBrcMode != nullptr),
4116         m_storeData));
4117 
4118     MHW_INTERFACE_DESCRIPTOR_PARAMS idParams;
4119     MOS_ZeroMemory(&idParams, sizeof(idParams));
4120     idParams.pKernelState = kernelState;
4121     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetInterfaceDescriptor(
4122         m_stateHeapInterface,
4123         1,
4124         &idParams));
4125 
4126     // Setup BRC Update Curbe
4127     CODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS brcUpdateCurbeParams;
4128     MOS_ZeroMemory(&brcUpdateCurbeParams, sizeof(brcUpdateCurbeParams));
4129     // set skipped frame params to be used in pfnSetCurbeAvcFrameBrcUpdate()
4130     if (m_numSkipFrames > 0)
4131     {
4132         // CP case: one or more frames with skip flag = 2 received and copied
4133         brcUpdateCurbeParams.dwNumSkipFrames = m_numSkipFrames;
4134         brcUpdateCurbeParams.dwSizeSkipFrames = m_sizeSkipFrames;
4135 
4136         // this should not happen since skip flag == 1 means non-CP user case
4137         // but we accumulate the num/size of skipped frame per BRC
4138         if (FRAME_SKIP_NORMAL == m_skipFrameFlag)
4139         {
4140             brcUpdateCurbeParams.dwNumSkipFrames += m_avcPicParam->NumSkipFrames;
4141             brcUpdateCurbeParams.dwSizeSkipFrames += m_avcPicParam->SizeSkipFrames;
4142         }
4143     }
4144     else if (FRAME_SKIP_NORMAL == m_skipFrameFlag)
4145     {
4146         // non-CP case: use the num/size of skipped frames passed in by MSDK
4147         brcUpdateCurbeParams.dwNumSkipFrames = m_avcPicParam->NumSkipFrames;
4148         brcUpdateCurbeParams.dwSizeSkipFrames = m_avcPicParam->SizeSkipFrames;
4149     }
4150     else
4151         brcUpdateCurbeParams.dwNumSkipFrames = 0;
4152 
4153     // Setting min/max QP to zero indicates to the kernel that no QP control is desired
4154     if (m_pictureCodingType == I_TYPE)
4155     {
4156         brcUpdateCurbeParams.ucMinQP = ucIMinQP;
4157         brcUpdateCurbeParams.ucMaxQP = ucIMaxQP;
4158     }
4159     else if (m_pictureCodingType == P_TYPE)
4160     {
4161         brcUpdateCurbeParams.ucMinQP = ucPMinQP;
4162         brcUpdateCurbeParams.ucMaxQP = ucPMaxQP;
4163     }
4164     else
4165     {
4166         brcUpdateCurbeParams.ucMinQP = ucBMinQP;
4167         brcUpdateCurbeParams.ucMaxQP = ucBMaxQP;
4168     }
4169     // reset skip frame statistics
4170     m_numSkipFrames = 0;
4171     m_sizeSkipFrames = 0;
4172 
4173     bMbEncCurbeSetInBrcUpdate = !bDecoupleMbEncCurbeFromBRC;
4174 
4175     brcUpdateCurbeParams.pdBrcInitCurrentTargetBufFullInBits = &dBrcInitCurrentTargetBufFullInBits;
4176     brcUpdateCurbeParams.pKernelState = kernelState;
4177     brcUpdateCurbeParams.ucEnableROI = (uint8_t)bBrcRoiEnabled;
4178     brcUpdateCurbeParams.dwIntraRefreshQpThreshold = dwIntraRefreshQpThreshold;
4179     brcUpdateCurbeParams.bSquareRollingIEnabled = bSquareRollingIEnabled;
4180 
4181     CODECHAL_ENCODE_CHK_STATUS_RETURN(SetCurbeAvcFrameBrcUpdate(
4182         &brcUpdateCurbeParams));
4183 
4184     CODECHAL_DEBUG_TOOL(
4185         if (!bDecoupleMbEncCurbeFromBRC && !IsMfeMbEncEnabled(false))
4186         {
4187             CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
4188                 mbEncFunctionType,
4189                 MHW_DSH_TYPE,
4190                 mbEncKernelState));
4191         }
4192 
4193         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
4194             encFunctionType,
4195             MHW_DSH_TYPE,
4196             kernelState));
4197 
4198         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe(
4199             encFunctionType,
4200             kernelState));
4201 
4202         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
4203             encFunctionType,
4204             MHW_ISH_TYPE,
4205             kernelState));
4206     )
4207 
4208     auto trellisQuantParams = &m_trellisQuantParams;
4209 
4210 #if (_DEBUG || _RELEASE_INTERNAL)
4211 
4212     if (m_swBrcMode != nullptr)
4213     {
4214         CODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS initBrcConstantBufferParams;
4215         // Check if the constant data surface is present
4216         initBrcConstantBufferParams.pOsInterface = m_osInterface;
4217         initBrcConstantBufferParams.pAvcSlcParams = m_avcSliceParams;
4218         initBrcConstantBufferParams.pAvcPicIdx = &m_picIdx[0];
4219         initBrcConstantBufferParams.sBrcConstantDataBuffer =
4220             BrcBuffers.sBrcConstantDataBuffer[m_currRecycledBufIdx];
4221         initBrcConstantBufferParams.dwMbEncBlockBasedSkipEn = dwMbEncBlockBasedSkipEn;
4222         initBrcConstantBufferParams.pPicParams = m_avcPicParam;
4223         initBrcConstantBufferParams.wPictureCodingType = m_pictureCodingType;
4224         initBrcConstantBufferParams.bSkipBiasAdjustmentEnable = m_skipBiasAdjustmentEnable;
4225         initBrcConstantBufferParams.bAdaptiveIntraScalingEnable = bAdaptiveIntraScalingEnable;
4226         initBrcConstantBufferParams.bOldModeCostEnable = bOldModeCostEnable;
4227         initBrcConstantBufferParams.pAvcQCParams = m_avcQCParams ;
4228 
4229         CODECHAL_ENCODE_CHK_STATUS_RETURN(InitBrcConstantBuffer(&initBrcConstantBufferParams));
4230 
4231         MHW_VDBOX_AVC_IMG_PARAMS imageStateParams;
4232         imageStateParams.pEncodeAvcPicParams = m_avcPicParam;
4233         imageStateParams.pEncodeAvcSeqParams = m_avcSeqParam;
4234         imageStateParams.wPicWidthInMb = m_picWidthInMb;
4235         imageStateParams.wPicHeightInMb = m_picHeightInMb;
4236         imageStateParams.ppRefList = &(m_refList[0]);
4237         imageStateParams.dwTqEnabled = trellisQuantParams->dwTqEnabled;
4238         imageStateParams.dwTqRounding = trellisQuantParams->dwTqRounding;
4239         imageStateParams.dwMaxVmvR = CodecHalAvcEncode_GetMaxVmvR(m_avcSeqParam->Level);
4240         imageStateParams.ucKernelMode = m_kernelMode;
4241 
4242         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxAvcImgBrcBuffer(
4243             brcImageStatesReadBuffer,
4244             &imageStateParams));
4245 
4246         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
4247             &BrcBuffers.resBrcImageStatesReadBuffer[m_currRecycledBufIdx],
4248             CodechalDbgAttr::attrInput,
4249             "ImgStateRead",
4250             BRC_IMG_STATE_SIZE_PER_PASS * m_hwInterface->GetMfxInterface()->GetBrcNumPakPasses(),
4251             0,
4252             CODECHAL_MEDIA_STATE_BRC_UPDATE));
4253 
4254         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
4255             &BrcBuffers.sBrcConstantDataBuffer[m_currRecycledBufIdx].OsResource,
4256             CodechalDbgAttr::attrInput,
4257             "ConstData",
4258             BrcBuffers.sBrcConstantDataBuffer[m_currRecycledBufIdx].dwPitch * BrcBuffers.sBrcConstantDataBuffer[m_currRecycledBufIdx].dwHeight,
4259             0,
4260             CODECHAL_MEDIA_STATE_BRC_UPDATE));
4261 
4262         // PAK statistics buffer is only dumped for BrcUpdate kernel input
4263         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
4264             &BrcBuffers.resBrcPakStatisticBuffer[0],
4265             CodechalDbgAttr::attrInput,
4266             "PakStats",
4267             m_brcPakStatisticsSize,
4268             0,
4269             CODECHAL_MEDIA_STATE_BRC_UPDATE));
4270 
4271         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
4272             &BrcBuffers.sMeBrcDistortionBuffer.OsResource,
4273             CodechalDbgAttr::attrInput,
4274             "BrcDist",
4275             BrcBuffers.sMeBrcDistortionBuffer.dwPitch * BrcBuffers.sMeBrcDistortionBuffer.dwHeight,
4276             BrcBuffers.dwMeBrcDistortionBottomFieldOffset,
4277             CODECHAL_MEDIA_STATE_BRC_UPDATE));
4278 
4279         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
4280             &BrcBuffers.resBrcHistoryBuffer,
4281             CodechalDbgAttr::attrInput,
4282             "HistoryRead",
4283             m_brcHistoryBufferSize,
4284             0,
4285             CODECHAL_MEDIA_STATE_BRC_UPDATE));
4286         if (BrcBuffers.pMbEncKernelStateInUse)
4287         {
4288             CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe(
4289                 CODECHAL_MEDIA_STATE_BRC_UPDATE,
4290                 BrcBuffers.pMbEncKernelStateInUse));
4291         }
4292         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
4293             &m_resMbStatsBuffer,
4294             CodechalDbgAttr::attrInput,
4295             "MBStatsSurf",
4296             m_hwInterface->m_avcMbStatBufferSize,
4297             0,
4298             CODECHAL_MEDIA_STATE_BRC_UPDATE));
4299 
4300         // CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHal_DbgCallAvcSwBrcImpl(
4301         //     m_debugInterface,
4302         //     encFunctionType,
4303         //     this,
4304         //     &BrcBuffers,
4305         //     false,
4306         //     kernelState,
4307         //     mbEncKernelState));
4308 
4309         return eStatus;
4310     }
4311 
4312 #endif
4313     MOS_COMMAND_BUFFER cmdBuffer;
4314     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0));
4315 
4316     SendKernelCmdsParams sendKernelCmdsParams = SendKernelCmdsParams();
4317     sendKernelCmdsParams.EncFunctionType = encFunctionType;
4318     sendKernelCmdsParams.pKernelState = kernelState;
4319     CODECHAL_ENCODE_CHK_STATUS_RETURN(SendGenericKernelCmds(&cmdBuffer, &sendKernelCmdsParams));
4320 
4321     CODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS initBrcConstantBufferParams;
4322     // Check if the constant data surface is present
4323     initBrcConstantBufferParams.pOsInterface = m_osInterface;
4324     initBrcConstantBufferParams.pAvcSlcParams = m_avcSliceParams;
4325     initBrcConstantBufferParams.pAvcPicIdx = &m_picIdx[0];
4326     initBrcConstantBufferParams.sBrcConstantDataBuffer =
4327         BrcBuffers.sBrcConstantDataBuffer[m_currRecycledBufIdx];
4328     initBrcConstantBufferParams.dwMbEncBlockBasedSkipEn = dwMbEncBlockBasedSkipEn;
4329     initBrcConstantBufferParams.pPicParams = m_avcPicParam;
4330     initBrcConstantBufferParams.wPictureCodingType = m_pictureCodingType;
4331     initBrcConstantBufferParams.bSkipBiasAdjustmentEnable = m_skipBiasAdjustmentEnable;
4332     initBrcConstantBufferParams.bAdaptiveIntraScalingEnable = bAdaptiveIntraScalingEnable;
4333     initBrcConstantBufferParams.bOldModeCostEnable = bOldModeCostEnable;
4334     initBrcConstantBufferParams.pAvcQCParams = m_avcQCParams ;
4335     CODECHAL_ENCODE_CHK_STATUS_RETURN(InitBrcConstantBuffer(&initBrcConstantBufferParams));
4336 
4337     MHW_VDBOX_AVC_IMG_PARAMS imageStateParams;
4338     imageStateParams.pEncodeAvcPicParams = m_avcPicParam;
4339     imageStateParams.pEncodeAvcSeqParams = m_avcSeqParam;
4340     imageStateParams.wPicWidthInMb = m_picWidthInMb;
4341     imageStateParams.wPicHeightInMb = m_picHeightInMb;
4342     imageStateParams.ppRefList = &(m_refList[0]);
4343     imageStateParams.dwTqEnabled = trellisQuantParams->dwTqEnabled;
4344     imageStateParams.dwTqRounding = trellisQuantParams->dwTqRounding;
4345     imageStateParams.dwMaxVmvR = CodecHalAvcEncode_GetMaxVmvR(m_avcSeqParam->Level);
4346     imageStateParams.ucKernelMode = m_kernelMode;
4347     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxAvcImgBrcBuffer(
4348         brcImageStatesReadBuffer,
4349         &imageStateParams));
4350 
4351     CODECHAL_DEBUG_TOOL(
4352         CODECHAL_ENCODE_CHK_STATUS_RETURN(PopulatePakParam(
4353             nullptr,
4354             nullptr));
4355     )
4356 
4357     // Add binding table
4358     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetBindingTable(
4359         m_stateHeapInterface,
4360         kernelState));
4361 
4362     //Add surface state
4363     CODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS brcUpdateSurfaceParams;
4364     MOS_ZeroMemory(&brcUpdateSurfaceParams, sizeof(brcUpdateSurfaceParams));
4365     brcUpdateSurfaceParams.MbEncMediaStateType = mbEncFunctionType;
4366     brcUpdateSurfaceParams.pBrcBuffers = &BrcBuffers;
4367     brcUpdateSurfaceParams.dwDownscaledWidthInMb4x = m_downscaledWidthInMb4x;
4368     brcUpdateSurfaceParams.dwDownscaledFrameFieldHeightInMb4x = m_downscaledFrameFieldHeightInMb4x;
4369     brcUpdateSurfaceParams.bMbBrcEnabled = bMbBrcEnabled;
4370     brcUpdateSurfaceParams.bUseAdvancedDsh = bAdvancedDshInUse;
4371     brcUpdateSurfaceParams.dwBrcPakStatisticsSize = m_brcPakStatisticsSize;
4372     brcUpdateSurfaceParams.dwBrcHistoryBufferSize = m_brcHistoryBufferSize;
4373     brcUpdateSurfaceParams.presMbEncCurbeBuffer = &BrcBuffers.resMbEncAdvancedDsh;
4374     brcUpdateSurfaceParams.ucCurrRecycledBufIdx = m_currRecycledBufIdx;
4375     brcUpdateSurfaceParams.pBrcUpdateBindingTable = &BrcUpdateBindingTable;
4376     brcUpdateSurfaceParams.pKernelState = kernelState;
4377     brcUpdateSurfaceParams.presMbEncBRCBuffer = &BrcBuffers.resMbEncBrcBuffer;
4378 
4379     if (bDecoupleMbEncCurbeFromBRC || IsMfeMbEncEnabled(false))
4380     {
4381         brcUpdateSurfaceParams.dwMbEncBRCBufferSize = m_mbencBrcBufferSize;
4382     }
4383     brcUpdateSurfaceParams.presMbStatBuffer = &m_resMbStatsBuffer;  //Starting from GEN9
4384 
4385     PMOS_SURFACE buffer4xMeMvData = m_hmeKernel ? m_hmeKernel->GetSurface(CodechalKernelHme::SurfaceId::me4xMvDataBuffer) : &m_4xMeMvDataBuffer;
4386     uint32_t dwMvBufferHeightBack = buffer4xMeMvData->dwHeight; // save 4x ME output MV buffer height
4387     if (bMvDataNeededByBRC) //starting from G95
4388     {
4389         brcUpdateSurfaceParams.psMvDataBuffer = buffer4xMeMvData;
4390         brcUpdateSurfaceParams.dwMvBottomFieldOffset = (uint32_t)m_mvBottomFieldOffset;
4391 
4392         // BRC kernel only needs the MV data for reference 0
4393         brcUpdateSurfaceParams.psMvDataBuffer->dwHeight = m_downscaledFrameFieldHeightInMb4x * 4;
4394     }
4395 
4396     CODECHAL_ENCODE_CHK_STATUS_RETURN(SendAvcBrcFrameUpdateSurfaces(
4397         &cmdBuffer,
4398         &brcUpdateSurfaceParams));
4399 
4400     CODECHAL_DEBUG_TOOL(
4401         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
4402             encFunctionType,
4403             MHW_SSH_TYPE,
4404             kernelState));
4405     )
4406 
4407     if (bMvDataNeededByBRC) //starting from G95
4408     {
4409         // restore back 4x ME mv buffer height
4410         buffer4xMeMvData->dwHeight = dwMvBufferHeightBack;
4411     }
4412 
4413     MHW_MEDIA_OBJECT_PARAMS mediaObjectParams;
4414     MediaObjectInlineData mediaObjectInlineData;
4415     MOS_ZeroMemory(&mediaObjectParams, sizeof(mediaObjectParams));
4416     MOS_ZeroMemory(&mediaObjectInlineData, sizeof(mediaObjectInlineData));
4417     mediaObjectParams.pInlineData = &mediaObjectInlineData;
4418     mediaObjectParams.dwInlineDataSize = sizeof(mediaObjectInlineData);
4419     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_renderEngineInterface->AddMediaObject(
4420         &cmdBuffer,
4421         nullptr,
4422         &mediaObjectParams));
4423 
4424     CODECHAL_ENCODE_CHK_STATUS_RETURN(EndStatusReport(&cmdBuffer, encFunctionType));
4425 
4426     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSubmitBlocks(
4427         m_stateHeapInterface,
4428         kernelState));
4429     if (!m_singleTaskPhaseSupported || m_lastTaskInPhase)
4430     {
4431         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnUpdateGlobalCmdBufId(
4432             m_stateHeapInterface));
4433         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiBatchBufferEnd(&cmdBuffer, nullptr));
4434     }
4435 
4436     CODECHAL_DEBUG_TOOL(
4437         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer(
4438             &cmdBuffer,
4439             encFunctionType,
4440             nullptr));
4441 
4442         if (m_swBrcMode == nullptr)
4443         {
4444             CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
4445                 &BrcBuffers.resBrcImageStatesReadBuffer[m_currRecycledBufIdx],
4446                 CodechalDbgAttr::attrInput,
4447                 "ImgStateRead",
4448                 BRC_IMG_STATE_SIZE_PER_PASS * m_hwInterface->GetMfxInterface()->GetBrcNumPakPasses(),
4449                 0,
4450                 CODECHAL_MEDIA_STATE_BRC_UPDATE));
4451 
4452             CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
4453                 &BrcBuffers.sBrcConstantDataBuffer[m_currRecycledBufIdx].OsResource,
4454                 CodechalDbgAttr::attrInput,
4455                 "ConstData",
4456                 BrcBuffers.sBrcConstantDataBuffer[m_currRecycledBufIdx].dwPitch * BrcBuffers.sBrcConstantDataBuffer[m_currRecycledBufIdx].dwHeight,
4457                 0,
4458                 CODECHAL_MEDIA_STATE_BRC_UPDATE));
4459 
4460             // PAK statistics buffer is only dumped for BrcUpdate kernel input
4461             CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
4462                 &BrcBuffers.resBrcPakStatisticBuffer[0],
4463                 CodechalDbgAttr::attrInput,
4464                 "PakStats",
4465                 m_brcPakStatisticsSize,
4466                 0,
4467                 CODECHAL_MEDIA_STATE_BRC_UPDATE));
4468 
4469             CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
4470                 &BrcBuffers.sMeBrcDistortionBuffer.OsResource,
4471                 CodechalDbgAttr::attrInput,
4472                 "BrcDist",
4473                 BrcBuffers.sMeBrcDistortionBuffer.dwPitch * BrcBuffers.sMeBrcDistortionBuffer.dwHeight,
4474                 BrcBuffers.dwMeBrcDistortionBottomFieldOffset,
4475                 CODECHAL_MEDIA_STATE_BRC_UPDATE));
4476 
4477             CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
4478                 &BrcBuffers.resBrcHistoryBuffer,
4479                 CodechalDbgAttr::attrInput,
4480                 "HistoryRead",
4481                 m_brcHistoryBufferSize,
4482                 0,
4483                 CODECHAL_MEDIA_STATE_BRC_UPDATE));
4484             if (BrcBuffers.pMbEncKernelStateInUse)
4485             {
4486                 CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe(
4487                     CODECHAL_MEDIA_STATE_BRC_UPDATE,
4488                     BrcBuffers.pMbEncKernelStateInUse));
4489             }
4490             CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
4491                 &m_resMbStatsBuffer,
4492                 CodechalDbgAttr::attrInput,
4493                 "MBStatsSurf",
4494                 m_hwInterface->m_avcMbStatBufferSize,
4495                 0,
4496                 CODECHAL_MEDIA_STATE_BRC_UPDATE));
4497         }
4498     )
4499 
4500     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->UpdateSSEuForCmdBuffer(&cmdBuffer, m_singleTaskPhaseSupported, m_lastTaskInPhase));
4501 
4502     m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0);
4503 
4504     if (!m_singleTaskPhaseSupported || m_lastTaskInPhase)
4505     {
4506         HalOcaInterface::On1stLevelBBEnd(cmdBuffer, *m_osInterface->pOsContext);
4507         m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, m_renderContextUsesNullHw);
4508         m_lastTaskInPhase = false;
4509     }
4510 
4511     CODECHAL_DEBUG_TOOL(
4512         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
4513             &BrcBuffers.resBrcHistoryBuffer,
4514             CodechalDbgAttr::attrOutput,
4515             "HistoryWrite",
4516             m_brcHistoryBufferSize,
4517             0,
4518             CODECHAL_MEDIA_STATE_BRC_UPDATE));)
4519 
4520     return eStatus;
4521 }
4522 
BrcCopyKernel()4523 MOS_STATUS CodechalEncodeAvcEnc::BrcCopyKernel()
4524 {
4525     MOS_STATUS                                          eStatus = MOS_STATUS_SUCCESS;
4526 
4527     CODECHAL_ENCODE_FUNCTION_ENTER;
4528 
4529     CODECHAL_ENCODE_CHK_NULL_RETURN(BrcBuffers.pMbEncKernelStateInUse);
4530 
4531     PerfTagSetting perfTag;
4532     perfTag.Value = 0;
4533     perfTag.Mode = (uint16_t)m_mode & CODECHAL_ENCODE_MODE_BIT_MASK;
4534     perfTag.CallType = m_singleTaskPhaseSupported ? CODECHAL_ENCODE_PERFTAG_CALL_MBENC_KERNEL :
4535         CODECHAL_ENCODE_PERFTAG_CALL_BRC_COPY;
4536     perfTag.PictureCodingType = m_pictureCodingType;
4537     m_osInterface->pfnSetPerfTag(m_osInterface, perfTag.Value);
4538 
4539     CODECHAL_MEDIA_STATE_TYPE encFunctionType = CODECHAL_MEDIA_STATE_BRC_BLOCK_COPY;
4540     auto kernelState = &BrcKernelStates[CODECHAL_ENCODE_BRC_IDX_BLOCKCOPY];
4541     auto mbEncKernelState = BrcBuffers.pMbEncKernelStateInUse;
4542     uint32_t blockCopyHeight =
4543         mbEncKernelState->m_dshRegion.GetSize() / CODECHAL_ENCODE_AVC_BRC_COPY_BLOCK_WIDTH;
4544 
4545     // If Single Task Phase is not enabled, use BT count for the kernel state.
4546     if (m_firstTaskInPhase == true || !m_singleTaskPhaseSupported)
4547     {
4548         uint32_t dwMaxBtCount = m_singleTaskPhaseSupported ?
4549             m_maxBtCount : kernelState->KernelParams.iBTCount;
4550         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnRequestSshSpaceForCmdBuf(
4551             m_stateHeapInterface,
4552             dwMaxBtCount));
4553         m_vmeStatesSize = m_hwInterface->GetKernelLoadCommandSize(dwMaxBtCount);
4554         CODECHAL_ENCODE_CHK_STATUS_RETURN(VerifySpaceAvailable());
4555     }
4556 
4557     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace(
4558         m_stateHeapInterface,
4559         kernelState,
4560         false,
4561         0,
4562         false,
4563         m_storeData));
4564 
4565     MHW_INTERFACE_DESCRIPTOR_PARAMS idParams;
4566     MOS_ZeroMemory(&idParams, sizeof(idParams));
4567     idParams.pKernelState = kernelState;
4568     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetInterfaceDescriptor(
4569         m_stateHeapInterface,
4570         1,
4571         &idParams));
4572 
4573     if (kernelState->KernelParams.iCurbeLength > 0)
4574     {
4575         CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_CURBE_PARAMS brcBlockCopyCurbeParams;
4576         brcBlockCopyCurbeParams.pKernelState = kernelState;
4577         brcBlockCopyCurbeParams.dwBufferOffset = 0x00;
4578         brcBlockCopyCurbeParams.dwBlockHeight = blockCopyHeight;
4579 
4580         CODECHAL_ENCODE_CHK_STATUS_RETURN(SetCurbeAvcBrcBlockCopy(
4581             &brcBlockCopyCurbeParams));
4582     }
4583 
4584     CODECHAL_DEBUG_TOOL(
4585         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
4586             encFunctionType,
4587             MHW_DSH_TYPE,
4588             kernelState));
4589 
4590         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe(
4591             encFunctionType,
4592             kernelState));
4593     )
4594 
4595     MOS_COMMAND_BUFFER cmdBuffer;
4596     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0));
4597 
4598     SendKernelCmdsParams sendKernelCmdsParams = SendKernelCmdsParams();
4599     sendKernelCmdsParams.EncFunctionType = encFunctionType;
4600     sendKernelCmdsParams.pKernelState = kernelState;
4601 
4602     CODECHAL_ENCODE_CHK_STATUS_RETURN(SendGenericKernelCmds(&cmdBuffer, &sendKernelCmdsParams));
4603 
4604     // Add binding table
4605     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetBindingTable(
4606         m_stateHeapInterface,
4607         kernelState));
4608 
4609     //Add surface states for Brc Copy
4610     CODECHAL_ENCODE_CHK_STATUS_RETURN(SendBrcBlockCopySurfaces(
4611         m_hwInterface,
4612         &cmdBuffer,
4613         mbEncKernelState,
4614         kernelState,
4615         &BrcBuffers.resMbEncAdvancedDsh));
4616 
4617     CODECHAL_DEBUG_TOOL(
4618         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
4619             encFunctionType,
4620             MHW_SSH_TYPE,
4621             kernelState));
4622     )
4623 
4624     MHW_MEDIA_OBJECT_PARAMS mediaObjectParams;
4625     MediaObjectInlineData mediaObjectInlineData;
4626     MOS_ZeroMemory(&mediaObjectParams, sizeof(mediaObjectParams));
4627     MOS_ZeroMemory(&mediaObjectInlineData, sizeof(mediaObjectInlineData));
4628     mediaObjectParams.pInlineData = &mediaObjectInlineData;
4629     mediaObjectParams.dwInlineDataSize = sizeof(mediaObjectInlineData);
4630 
4631     uint32_t blockHeight =
4632         CODECHAL_ENCODE_AVC_BRC_COPY_NUM_ROWS_PER_VME_SEND_MSG * CODECHAL_ENCODE_AVC_BRC_COPY_NUM_SEND_MSGS_PER_KERNEL;
4633     uint32_t remainingRows = blockCopyHeight;
4634     for (uint32_t i = 0; i < blockCopyHeight; i++)
4635     {
4636         if (remainingRows < blockHeight)
4637         {
4638             blockHeight = remainingRows;
4639         }
4640         mediaObjectInlineData.DW0.blockHeight = blockHeight;
4641         mediaObjectInlineData.DW0.bufferOffset = i;
4642 
4643         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetRenderInterface()->AddMediaObject(
4644             &cmdBuffer,
4645             nullptr,
4646             &mediaObjectParams));
4647 
4648         remainingRows -= blockHeight;
4649     }
4650 
4651     CODECHAL_ENCODE_CHK_STATUS_RETURN(EndStatusReport(&cmdBuffer, encFunctionType));
4652 
4653     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSubmitBlocks(
4654         m_stateHeapInterface,
4655         kernelState));
4656     if (!m_singleTaskPhaseSupported || m_lastTaskInPhase)
4657     {
4658         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnUpdateGlobalCmdBufId(
4659             m_stateHeapInterface));
4660         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetMiInterface()->AddMiBatchBufferEnd(&cmdBuffer, nullptr));
4661     }
4662 
4663     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->UpdateSSEuForCmdBuffer(&cmdBuffer, m_singleTaskPhaseSupported, m_lastTaskInPhase));
4664 
4665     m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0);
4666 
4667     if (!m_singleTaskPhaseSupported || m_lastTaskInPhase)
4668     {
4669         HalOcaInterface::On1stLevelBBEnd(cmdBuffer, *m_osInterface->pOsContext);
4670         m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, m_renderContextUsesNullHw);
4671         m_lastTaskInPhase = false;
4672     }
4673 
4674     return eStatus;
4675 }
4676 
BrcMbUpdateKernel()4677 MOS_STATUS CodechalEncodeAvcEnc::BrcMbUpdateKernel()
4678 {
4679     MOS_STATUS                                      eStatus = MOS_STATUS_SUCCESS;
4680 
4681     CODECHAL_ENCODE_FUNCTION_ENTER;
4682 
4683     PerfTagSetting perfTag;
4684     perfTag.Value = 0;
4685     perfTag.Mode = (uint16_t)m_mode & CODECHAL_ENCODE_MODE_BIT_MASK;
4686     perfTag.CallType = m_singleTaskPhaseSupported ? CODECHAL_ENCODE_PERFTAG_CALL_MBENC_KERNEL : CODECHAL_ENCODE_PERFTAG_CALL_BRC_UPDATE;
4687     perfTag.PictureCodingType = m_pictureCodingType;
4688     m_osInterface->pfnSetPerfTag(m_osInterface, perfTag.Value);
4689 
4690     auto kernelState = &BrcKernelStates[CODECHAL_ENCODE_BRC_IDX_MbBRC_UPDATE];
4691 
4692     // If Single Task Phase is not enabled, use BT count for the kernel state.
4693     if (m_firstTaskInPhase == true || !m_singleTaskPhaseSupported)
4694     {
4695         uint32_t dwMaxBtCount = m_singleTaskPhaseSupported ?
4696             m_maxBtCount : kernelState->KernelParams.iBTCount;
4697         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnRequestSshSpaceForCmdBuf(
4698             m_stateHeapInterface,
4699             dwMaxBtCount));
4700         m_vmeStatesSize = m_hwInterface->GetKernelLoadCommandSize(dwMaxBtCount);
4701         CODECHAL_ENCODE_CHK_STATUS_RETURN(VerifySpaceAvailable());
4702     }
4703 
4704     CODECHAL_MEDIA_STATE_TYPE encFunctionType = CODECHAL_MEDIA_STATE_MB_BRC_UPDATE;
4705 
4706     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace(
4707         m_stateHeapInterface,
4708         kernelState,
4709         false,
4710         0,
4711         false,
4712         m_storeData));
4713 
4714     MHW_INTERFACE_DESCRIPTOR_PARAMS idParams;
4715     MOS_ZeroMemory(&idParams, sizeof(idParams));
4716     idParams.pKernelState = kernelState;
4717     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetInterfaceDescriptor(
4718         m_stateHeapInterface,
4719         1,
4720         &idParams));
4721 
4722     // Setup MbBRC Curbe
4723     CODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS brcUpdateCurbeParams;
4724     MOS_ZeroMemory(&brcUpdateCurbeParams, sizeof(brcUpdateCurbeParams));
4725     brcUpdateCurbeParams.ucEnableROI = (uint8_t)bBrcRoiEnabled;
4726     brcUpdateCurbeParams.pKernelState = kernelState;
4727     CODECHAL_ENCODE_CHK_STATUS_RETURN(SetCurbeAvcMbBrcUpdate(
4728         &brcUpdateCurbeParams));
4729 
4730     CODECHAL_DEBUG_TOOL(
4731         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
4732             encFunctionType,
4733             MHW_DSH_TYPE,
4734             kernelState));
4735 
4736         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe(
4737             encFunctionType,
4738             kernelState));
4739 
4740         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
4741             encFunctionType,
4742             MHW_ISH_TYPE,
4743             kernelState));
4744     )
4745 
4746     // Setup ROI Surface
4747     if (bBrcRoiSupported && bBrcRoiEnabled)
4748     {
4749         SetupROISurface();
4750     }
4751 
4752     CODECHAL_DEBUG_TOOL(
4753         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
4754             &BrcBuffers.resBrcHistoryBuffer,
4755             CodechalDbgAttr::attrInput,
4756             "HistoryRead",
4757             m_brcHistoryBufferSize,
4758             0,
4759             CODECHAL_MEDIA_STATE_MB_BRC_UPDATE));)
4760 
4761     MOS_COMMAND_BUFFER cmdBuffer;
4762     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0));
4763 
4764     SendKernelCmdsParams sendKernelCmdsParams = SendKernelCmdsParams();
4765     sendKernelCmdsParams.EncFunctionType = encFunctionType;
4766     sendKernelCmdsParams.pKernelState = kernelState;
4767     CODECHAL_ENCODE_CHK_STATUS_RETURN(SendGenericKernelCmds(&cmdBuffer, &sendKernelCmdsParams));
4768 
4769     // Add binding table
4770     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetBindingTable(
4771         m_stateHeapInterface,
4772         kernelState));
4773 
4774     //Add surface state
4775     CODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS brcUpdateSurfaceParams;
4776     MOS_ZeroMemory(&brcUpdateSurfaceParams, sizeof(brcUpdateSurfaceParams));
4777     brcUpdateSurfaceParams.pBrcBuffers = &BrcBuffers;
4778     brcUpdateSurfaceParams.bMbBrcEnabled = bMbBrcEnabled;
4779     brcUpdateSurfaceParams.bBrcRoiEnabled = bBrcRoiEnabled;
4780     brcUpdateSurfaceParams.dwDownscaledWidthInMb4x = m_downscaledWidthInMb4x;
4781     brcUpdateSurfaceParams.dwDownscaledFrameFieldHeightInMb4x = m_downscaledFrameFieldHeightInMb4x;
4782     brcUpdateSurfaceParams.psRoiSurface = &BrcBuffers.sBrcRoiSurface;
4783     brcUpdateSurfaceParams.presMbStatBuffer = &m_resMbStatsBuffer;
4784     brcUpdateSurfaceParams.dwBrcPakStatisticsSize = m_brcPakStatisticsSize;
4785     brcUpdateSurfaceParams.dwBrcHistoryBufferSize = m_brcHistoryBufferSize;
4786     brcUpdateSurfaceParams.ucCurrRecycledBufIdx = m_currRecycledBufIdx;
4787     brcUpdateSurfaceParams.pBrcUpdateBindingTable = &BrcUpdateBindingTable;
4788     brcUpdateSurfaceParams.pKernelState = kernelState;
4789     CODECHAL_ENCODE_CHK_STATUS_RETURN(SendAvcBrcMbUpdateSurfaces(
4790         &cmdBuffer,
4791         &brcUpdateSurfaceParams));
4792 
4793     CODECHAL_DEBUG_TOOL(
4794         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
4795             encFunctionType,
4796             MHW_SSH_TYPE,
4797             kernelState));
4798     )
4799 
4800     // set-up media walker
4801     CODECHAL_WALKER_CODEC_PARAMS walkerCodecParams;
4802     MOS_ZeroMemory(&walkerCodecParams, sizeof(walkerCodecParams));
4803     walkerCodecParams.WalkerMode = m_walkerMode;
4804     walkerCodecParams.dwResolutionX = MOS_ROUNDUP_SHIFT(m_picWidthInMb, 2);
4805     walkerCodecParams.dwResolutionY = MOS_ROUNDUP_SHIFT(m_picHeightInMb, 2);
4806     walkerCodecParams.bNoDependency = true;
4807     walkerCodecParams.bGroupIdSelectSupported = m_groupIdSelectSupported;
4808 
4809     MHW_WALKER_PARAMS walkerParams;
4810     CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalInitMediaObjectWalkerParams(
4811         m_hwInterface,
4812         &walkerParams,
4813         &walkerCodecParams));
4814 
4815     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_renderEngineInterface->AddMediaObjectWalkerCmd(
4816         &cmdBuffer,
4817         &walkerParams));
4818 
4819     CODECHAL_ENCODE_CHK_STATUS_RETURN(EndStatusReport(&cmdBuffer, encFunctionType));
4820 
4821     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSubmitBlocks(
4822         m_stateHeapInterface,
4823         kernelState));
4824     if (!m_singleTaskPhaseSupported || m_lastTaskInPhase)
4825     {
4826         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnUpdateGlobalCmdBufId(
4827             m_stateHeapInterface));
4828         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiBatchBufferEnd(&cmdBuffer, nullptr));
4829     }
4830 
4831     CODECHAL_DEBUG_TOOL(
4832         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer(
4833             &cmdBuffer,
4834             encFunctionType,
4835             nullptr));
4836     )
4837 
4838     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->UpdateSSEuForCmdBuffer(&cmdBuffer, m_singleTaskPhaseSupported, m_lastTaskInPhase));
4839 
4840     m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0);
4841 
4842     if (!m_singleTaskPhaseSupported || m_lastTaskInPhase)
4843     {
4844         HalOcaInterface::On1stLevelBBEnd(cmdBuffer, *m_osInterface->pOsContext);
4845         m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, m_renderContextUsesNullHw);
4846         m_lastTaskInPhase = false;
4847     }
4848 
4849     return eStatus;
4850 }
4851 
WPKernel(bool useRefPicList1,uint32_t index)4852 MOS_STATUS CodechalEncodeAvcEnc::WPKernel(bool useRefPicList1, uint32_t index)
4853 {
4854     MOS_STATUS                              eStatus = MOS_STATUS_SUCCESS;
4855 
4856     CODECHAL_ENCODE_FUNCTION_ENTER;
4857 
4858     if (Mos_ResourceIsNull(&WeightedPredOutputPicSelectList[0].sBuffer.OsResource))
4859     {
4860         // initiate allocation parameters
4861         MOS_ALLOC_GFXRES_PARAMS allocParamsForBufferNV12;
4862         MOS_ZeroMemory(&allocParamsForBufferNV12, sizeof(MOS_ALLOC_GFXRES_PARAMS));
4863         allocParamsForBufferNV12.Type = MOS_GFXRES_2D;
4864         allocParamsForBufferNV12.TileType = MOS_TILE_Y;
4865         allocParamsForBufferNV12.Format = Format_NV12;
4866 
4867         // WP allocation
4868         auto refPicSelect = WeightedPredOutputPicSelectList;
4869         for (uint32_t i = 0; i < CODEC_AVC_NUM_WP_FRAME; i++)
4870         {
4871             MOS_ZeroMemory(&refPicSelect[i].sBuffer, sizeof(MOS_SURFACE));
4872             refPicSelect[i].FrameIdx = CODECHAL_ENCODE_AVC_INVALID_PIC_ID;
4873             refPicSelect[i].sBuffer.dwWidth = m_frameWidth;
4874             refPicSelect[i].sBuffer.dwHeight = m_frameHeight;
4875 
4876             allocParamsForBufferNV12.dwWidth = refPicSelect[i].sBuffer.dwWidth;
4877             allocParamsForBufferNV12.dwHeight = refPicSelect[i].sBuffer.dwHeight;
4878             allocParamsForBufferNV12.pBufName = "WP Scaled output Buffer";
4879 
4880             CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(m_osInterface->pfnAllocateResource(
4881                 m_osInterface,
4882                 &allocParamsForBufferNV12,
4883                 &refPicSelect[i].sBuffer.OsResource),
4884                 "Failed to allocate WP Scaled output Buffer.");
4885 
4886             CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalGetResourceInfo(
4887                 m_osInterface,
4888                 &refPicSelect[i].sBuffer));
4889         }
4890     }
4891 
4892     auto refList = &m_refList[0];
4893     auto currRefList = m_refList[m_currReconstructedPic.FrameIdx];
4894 
4895     PerfTagSetting perfTag;
4896     perfTag.Value = 0;
4897     perfTag.Mode = (uint16_t)m_mode & CODECHAL_ENCODE_MODE_BIT_MASK;
4898     perfTag.CallType = CODECHAL_ENCODE_PERFTAG_CALL_WP_KERNEL;
4899     perfTag.PictureCodingType = m_pictureCodingType;
4900     m_osInterface->pfnSetPerfTag(m_osInterface, perfTag.Value);
4901 
4902     CODECHAL_MEDIA_STATE_TYPE encFunctionType = CODECHAL_MEDIA_STATE_ENC_WP;
4903 
4904     auto kernelState = pWPKernelState;
4905 
4906     // If Single Task Phase is not enabled, use BT count for the kernel state.
4907     if (m_firstTaskInPhase == true || !m_singleTaskPhaseSupported)
4908     {
4909         uint32_t dwMaxBtCount = m_singleTaskPhaseSupported ?
4910             m_maxBtCount : kernelState->KernelParams.iBTCount;
4911         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnRequestSshSpaceForCmdBuf(
4912             m_stateHeapInterface,
4913             dwMaxBtCount));
4914         m_vmeStatesSize = m_hwInterface->GetKernelLoadCommandSize(dwMaxBtCount);
4915         CODECHAL_ENCODE_CHK_STATUS_RETURN(VerifySpaceAvailable());
4916     }
4917 
4918     // Set up the DSH/SSH as normal
4919     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace(
4920         m_stateHeapInterface,
4921         kernelState,
4922         false,
4923         0,
4924         false,
4925         m_storeData));
4926 
4927     MHW_INTERFACE_DESCRIPTOR_PARAMS idParams;
4928     MOS_ZeroMemory(&idParams, sizeof(idParams));
4929     idParams.pKernelState = kernelState;
4930     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetInterfaceDescriptor(
4931         m_stateHeapInterface,
4932         1,
4933         &idParams));
4934 
4935     // Setup AVC Curbe
4936     CODECHAL_ENCODE_AVC_WP_CURBE_PARAMS wpcurbeParams;
4937     MOS_ZeroMemory(&wpcurbeParams, sizeof(wpcurbeParams));
4938     wpcurbeParams.RefPicListIdx = (useRefPicList1) ? LIST_1 : LIST_0;
4939     wpcurbeParams.WPIdx = index;
4940     CODECHAL_ENCODE_CHK_STATUS_RETURN(SetCurbeAvcWP(
4941         &wpcurbeParams));
4942 
4943     CODECHAL_DEBUG_TOOL(
4944         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
4945             encFunctionType,
4946             MHW_DSH_TYPE,
4947             kernelState));
4948 
4949         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe(
4950             encFunctionType,
4951             kernelState));
4952 
4953         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
4954             encFunctionType,
4955             MHW_ISH_TYPE,
4956             kernelState));
4957     )
4958 
4959     MOS_COMMAND_BUFFER cmdBuffer;
4960     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0));
4961 
4962     SendKernelCmdsParams sendKernelCmdsParams = SendKernelCmdsParams();
4963     sendKernelCmdsParams.EncFunctionType = encFunctionType;
4964     sendKernelCmdsParams.pKernelState = kernelState;
4965     CODECHAL_ENCODE_CHK_STATUS_RETURN(SendGenericKernelCmds(&cmdBuffer, &sendKernelCmdsParams));
4966 
4967     // Add binding table
4968     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetBindingTable(
4969         m_stateHeapInterface,
4970         kernelState));
4971 
4972     uint8_t picIndex = 0;
4973     uint8_t wpindex;
4974     uint8_t refVDirection;
4975     uint32_t refVerticalLineStride;
4976     uint32_t refVerticalLineStrideOffset;
4977     auto refPic = m_avcSliceParams->RefPicList[useRefPicList1][index];
4978     if (!CodecHal_PictureIsInvalid(refPic) && m_picIdx[refPic.FrameIdx].bValid)
4979     {
4980         picIndex = m_picIdx[refPic.FrameIdx].ucPicIdx;
4981         refList[picIndex]->sRefBuffer = m_userFlags.bUseRawPicForRef ?
4982             refList[picIndex]->sRefRawBuffer : refList[picIndex]->sRefReconBuffer;
4983 
4984         bool currFieldPicture = CodecHal_PictureIsField(m_currOriginalPic);
4985         bool refBottomField = (CodecHal_PictureIsBottomField(refPic));
4986 
4987         // Program the surface based on current picture's field/frame mode
4988         if (currFieldPicture) // if current picture is field
4989         {
4990             if (refBottomField)
4991             {
4992                 refVDirection = CODECHAL_VDIRECTION_BOT_FIELD;
4993                 refVerticalLineStride = CODECHAL_VLINESTRIDE_FIELD;
4994                 refVerticalLineStrideOffset = CODECHAL_VLINESTRIDEOFFSET_BOT_FIELD;
4995             }
4996             else
4997             {
4998                 refVDirection = CODECHAL_VDIRECTION_TOP_FIELD;
4999                 refVerticalLineStride = CODECHAL_VLINESTRIDE_FIELD;
5000                 refVerticalLineStrideOffset = CODECHAL_VLINESTRIDEOFFSET_TOP_FIELD;
5001             }
5002         }
5003         else // if current picture is frame
5004         {
5005             refVDirection = CODECHAL_VDIRECTION_FRAME;
5006             refVerticalLineStride = CODECHAL_VLINESTRIDE_FRAME;
5007             refVerticalLineStrideOffset = CODECHAL_VLINESTRIDEOFFSET_TOP_FIELD;
5008         }
5009 
5010         (useRefPicList1) ? bUseWeightedSurfaceForL1 = true : bUseWeightedSurfaceForL0 = true;
5011     }
5012     else
5013     {
5014         (useRefPicList1) ? bUseWeightedSurfaceForL1 = false : bUseWeightedSurfaceForL0 = false;
5015         return eStatus;
5016     }
5017 
5018     CodecHalGetResourceInfo(m_osInterface, &refList[picIndex]->sRefBuffer);
5019 
5020     //Add surface states
5021     CODECHAL_ENCODE_AVC_WP_SURFACE_PARAMS wpsurfaceParams;
5022     MOS_ZeroMemory(&wpsurfaceParams, sizeof(wpsurfaceParams));
5023 
5024     wpsurfaceParams.psInputRefBuffer = &refList[picIndex]->sRefBuffer;
5025     if (useRefPicList1) {
5026         wpindex = CODEC_AVC_WP_OUTPUT_L1_START + index;
5027     }
5028     else {
5029         wpindex = CODEC_AVC_WP_OUTPUT_L0_START + index;
5030     }
5031     wpsurfaceParams.psOutputScaledBuffer = &(WeightedPredOutputPicSelectList[wpindex].sBuffer);
5032     wpsurfaceParams.ucVDirection = refVDirection;
5033     wpsurfaceParams.dwVerticalLineStride = refVerticalLineStride;
5034     wpsurfaceParams.dwVerticalLineStrideOffset = refVerticalLineStrideOffset;
5035     wpsurfaceParams.pKernelState = kernelState;
5036 
5037     CODECHAL_ENCODE_CHK_STATUS_RETURN(SendAvcWPSurfaces(&cmdBuffer, &wpsurfaceParams));
5038 
5039     if (m_hwWalker)
5040     {
5041         uint32_t resolutionX = CODECHAL_GET_WIDTH_IN_MACROBLOCKS(m_frameWidth);
5042         uint32_t resolutionY = CODECHAL_GET_HEIGHT_IN_MACROBLOCKS(m_frameFieldHeight);
5043 
5044         CODECHAL_WALKER_CODEC_PARAMS walkerCodecParams;
5045         MOS_ZeroMemory(&walkerCodecParams, sizeof(walkerCodecParams));
5046         walkerCodecParams.WalkerMode = m_walkerMode;
5047         walkerCodecParams.bUseScoreboard = m_useHwScoreboard;
5048         walkerCodecParams.dwResolutionX = resolutionX;
5049         walkerCodecParams.dwResolutionY = resolutionY;
5050         walkerCodecParams.wPictureCodingType = m_pictureCodingType;
5051         walkerCodecParams.bMbaff = m_mbaffEnabled;
5052         walkerCodecParams.dwNumSlices = m_numSlices;
5053         walkerCodecParams.usSliceHeight = m_sliceHeight;
5054         walkerCodecParams.bGroupIdSelectSupported = m_groupIdSelectSupported;
5055         walkerCodecParams.ucGroupId = m_groupId;
5056         walkerCodecParams.bNoDependency = true;     /* Enforce no dependency dispatch order for Scaling kernel,  */
5057 
5058         MHW_WALKER_PARAMS walkerParams;
5059         CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalInitMediaObjectWalkerParams(
5060             m_hwInterface,
5061             &walkerParams,
5062             &walkerCodecParams));
5063 
5064         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_renderEngineInterface->AddMediaObjectWalkerCmd(
5065             &cmdBuffer,
5066             &walkerParams));
5067     }
5068 
5069     CODECHAL_ENCODE_CHK_STATUS_RETURN(EndStatusReport(&cmdBuffer, encFunctionType));
5070 
5071     // Add dump for WP surface state heap here
5072     CODECHAL_DEBUG_TOOL(
5073         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
5074             encFunctionType,
5075             MHW_SSH_TYPE,
5076             kernelState));
5077     )
5078 
5079     CODECHAL_DEBUG_TOOL(CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer(
5080         &cmdBuffer,
5081         encFunctionType,
5082         nullptr)));
5083 
5084     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSubmitBlocks(
5085         m_stateHeapInterface,
5086         kernelState));
5087     if (!m_singleTaskPhaseSupported || m_lastTaskInPhase)
5088     {
5089         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnUpdateGlobalCmdBufId(
5090             m_stateHeapInterface));
5091         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiBatchBufferEnd(&cmdBuffer, nullptr));
5092     }
5093 
5094     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->UpdateSSEuForCmdBuffer(&cmdBuffer, m_singleTaskPhaseSupported, m_lastTaskInPhase));
5095 
5096     m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0);
5097 
5098     if ((!m_singleTaskPhaseSupported || m_lastTaskInPhase))
5099     {
5100         HalOcaInterface::On1stLevelBBEnd(cmdBuffer, *m_osInterface->pOsContext);
5101         m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, m_renderContextUsesNullHw);
5102         m_lastTaskInPhase = false;
5103     }
5104 
5105     currRefList->ucMADBufferIdx = m_currMadBufferIdx;
5106     currRefList->bMADEnabled    = m_madEnabled;
5107 
5108     return eStatus;
5109 }
5110 
SFDKernel()5111 MOS_STATUS CodechalEncodeAvcEnc::SFDKernel()
5112 {
5113     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
5114 
5115     CODECHAL_ENCODE_FUNCTION_ENTER;
5116 
5117     PerfTagSetting perfTag;
5118     perfTag.Value = 0;
5119     perfTag.Mode = (uint16_t)m_mode & CODECHAL_ENCODE_MODE_BIT_MASK;
5120     perfTag.CallType = m_singleTaskPhaseSupported ? CODECHAL_ENCODE_PERFTAG_CALL_SCALING_KERNEL : CODECHAL_ENCODE_PERFTAG_CALL_ME_KERNEL;
5121     perfTag.PictureCodingType = m_pictureCodingType;
5122     m_osInterface->pfnSetPerfTag(m_osInterface, perfTag.Value);
5123 
5124     // set function type and kernel state pointer
5125     auto encFunctionType = CODECHAL_MEDIA_STATE_STATIC_FRAME_DETECTION;
5126     auto kernelState = pSFDKernelState;
5127 
5128     // If Single Task Phase is not enabled, use BT count for the kernel state.
5129     if (m_firstTaskInPhase == true || !m_singleTaskPhaseSupported)
5130     {
5131         uint32_t dwMaxBtCount = m_singleTaskPhaseSupported ?
5132             m_maxBtCount : kernelState->KernelParams.iBTCount;
5133         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnRequestSshSpaceForCmdBuf(
5134             m_stateHeapInterface,
5135             dwMaxBtCount));
5136         m_vmeStatesSize = m_hwInterface->GetKernelLoadCommandSize(dwMaxBtCount);
5137         CODECHAL_ENCODE_CHK_STATUS_RETURN(VerifySpaceAvailable());
5138     }
5139 
5140     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace(
5141         m_stateHeapInterface,
5142         kernelState,
5143         false,
5144         0,
5145         false,
5146         m_storeData));
5147 
5148     MHW_INTERFACE_DESCRIPTOR_PARAMS idParams;
5149     MOS_ZeroMemory(&idParams, sizeof(idParams));
5150     idParams.pKernelState = kernelState;
5151     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetInterfaceDescriptor(
5152         m_stateHeapInterface,
5153         1,
5154         &idParams));
5155 
5156     // set-up SFD Curbe
5157     CODECHAL_ENCODE_AVC_SFD_CURBE_PARAMS sfdcurbeParams;
5158     MOS_ZeroMemory(&sfdcurbeParams, sizeof(sfdcurbeParams));
5159     sfdcurbeParams.pKernelState = kernelState;
5160     CODECHAL_ENCODE_CHK_STATUS_RETURN(SetCurbeAvcSFD(
5161         &sfdcurbeParams));
5162 
5163     // dump DSH/Curbe/ISH
5164     CODECHAL_DEBUG_TOOL(
5165         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
5166             encFunctionType,
5167             MHW_DSH_TYPE,
5168             kernelState));
5169 
5170         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe(
5171             encFunctionType,
5172             kernelState));
5173 
5174         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
5175             encFunctionType,
5176             MHW_ISH_TYPE,
5177             kernelState));
5178     )
5179 
5180     MOS_COMMAND_BUFFER cmdBuffer;
5181     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0));
5182 
5183     SendKernelCmdsParams sendKernelCmdsParams = SendKernelCmdsParams();
5184     sendKernelCmdsParams.EncFunctionType = encFunctionType;
5185     sendKernelCmdsParams.pKernelState = kernelState;
5186     CODECHAL_ENCODE_CHK_STATUS_RETURN(SendGenericKernelCmds(&cmdBuffer, &sendKernelCmdsParams));
5187 
5188     // Add binding table
5189     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetBindingTable(
5190         m_stateHeapInterface,
5191         kernelState));
5192 
5193     // Add surface states
5194     CODECHAL_ENCODE_AVC_SFD_SURFACE_PARAMS sfdsurfaceParams;
5195     MOS_ZeroMemory(&sfdsurfaceParams, sizeof(sfdsurfaceParams));
5196     sfdsurfaceParams.dwDownscaledWidthInMb4x = m_downscaledWidthInMb4x;
5197     sfdsurfaceParams.dwDownscaledHeightInMb4x = m_downscaledFrameFieldHeightInMb4x;
5198     sfdsurfaceParams.psMeMvDataSurface = m_hmeKernel ? m_hmeKernel->GetSurface(CodechalKernelHme::SurfaceId::me4xMvDataBuffer) : &m_4xMeMvDataBuffer;
5199     sfdsurfaceParams.dwMeMvBottomFieldOffset = m_hmeKernel ? m_hmeKernel->Get4xMeMvBottomFieldOffset() : (uint32_t)m_meMvBottomFieldOffset;
5200     sfdsurfaceParams.psMeDistortionSurface = m_hmeKernel ? m_hmeKernel->GetSurface(CodechalKernelHme::SurfaceId::me4xDistortionBuffer) : &m_4xMeDistortionBuffer;
5201     sfdsurfaceParams.dwMeDistortionBottomFieldOffset = m_hmeKernel ? m_hmeKernel->GetDistortionBottomFieldOffset() : (uint32_t)m_meDistortionBottomFieldOffset;
5202     sfdsurfaceParams.presOutputBuffer = &resSFDOutputBuffer[0];
5203     sfdsurfaceParams.pKernelState = kernelState;
5204 
5205     CODECHAL_ENCODE_CHK_STATUS_RETURN(SendAvcSFDSurfaces(
5206         &cmdBuffer,
5207         &sfdsurfaceParams));
5208 
5209     // dump SSH
5210     CODECHAL_DEBUG_TOOL(
5211         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
5212             encFunctionType,
5213             MHW_SSH_TYPE,
5214             kernelState));
5215     )
5216 
5217     MHW_MEDIA_OBJECT_PARAMS mediaObjectParams;
5218     MediaObjectInlineData mediaObjectInlineData;
5219     MOS_ZeroMemory(&mediaObjectParams, sizeof(mediaObjectParams));
5220     MOS_ZeroMemory(&mediaObjectInlineData, sizeof(mediaObjectInlineData));
5221     mediaObjectParams.pInlineData = &mediaObjectInlineData;
5222     mediaObjectParams.dwInlineDataSize = sizeof(mediaObjectInlineData);
5223     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_renderEngineInterface->AddMediaObject(
5224         &cmdBuffer,
5225         nullptr,
5226         &mediaObjectParams));
5227 
5228     CODECHAL_ENCODE_CHK_STATUS_RETURN(EndStatusReport(&cmdBuffer, encFunctionType));
5229 
5230     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSubmitBlocks(
5231         m_stateHeapInterface,
5232         kernelState));
5233     if (!m_singleTaskPhaseSupported || m_lastTaskInPhase)
5234     {
5235         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnUpdateGlobalCmdBufId(
5236             m_stateHeapInterface));
5237         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiBatchBufferEnd(&cmdBuffer, nullptr));
5238     }
5239 
5240     CODECHAL_DEBUG_TOOL(
5241         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer(
5242             &cmdBuffer,
5243             encFunctionType,
5244             nullptr));
5245     )
5246 
5247     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->UpdateSSEuForCmdBuffer(&cmdBuffer, m_singleTaskPhaseSupported, m_lastTaskInPhase));
5248 
5249     m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0);
5250 
5251     if (!m_singleTaskPhaseSupported || m_lastTaskInPhase)
5252     {
5253         HalOcaInterface::On1stLevelBBEnd(cmdBuffer, *m_osInterface->pOsContext);
5254         m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, m_renderContextUsesNullHw);
5255         m_lastTaskInPhase = false;
5256     }
5257 
5258     return eStatus;
5259 }
5260 
SetCurbeAvcSFD(PCODECHAL_ENCODE_AVC_SFD_CURBE_PARAMS params)5261 MOS_STATUS CodechalEncodeAvcEnc::SetCurbeAvcSFD(PCODECHAL_ENCODE_AVC_SFD_CURBE_PARAMS params)
5262 {
5263     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
5264 
5265     CODECHAL_ENCODE_CHK_NULL_RETURN(params);
5266     CODECHAL_ENCODE_CHK_NULL_RETURN(params->pKernelState);
5267 
5268     CODECHAL_ENCODE_AVC_SFD_CURBE_COMMON                curbe;
5269     MOS_ZeroMemory(&curbe, sizeof(curbe));
5270     curbe.DW0.EnableIntraCostScalingForStaticFrame = 1;
5271     curbe.DW0.EnableAdaptiveMvStreamIn = 0;
5272     curbe.DW0.StreamInType = 7;
5273     curbe.DW0.SliceType = (m_pictureCodingType + 1) % 3;
5274     curbe.DW0.BRCModeEnable = (bBrcEnabled != 0);
5275     curbe.DW0.VDEncModeDisable = true;
5276 
5277     curbe.DW1.HMEStreamInRefCost = 5;
5278     curbe.DW1.NumOfRefs = m_avcSliceParams->num_ref_idx_l0_active_minus1;
5279     curbe.DW1.QPValue = m_avcPicParam->QpY + m_avcSliceParams->slice_qp_delta;
5280 
5281     // SFD kernel requires to round-down to 4-MB aligned
5282     curbe.DW2.FrameHeightInMBs = (m_oriFrameHeight / CODECHAL_MACROBLOCK_HEIGHT >> 2) << 2;
5283     curbe.DW2.FrameWidthInMBs = (m_oriFrameWidth / CODECHAL_MACROBLOCK_WIDTH >> 2) << 2;
5284     curbe.DW3.LargeMvThresh = 128;
5285     uint32_t totalMb = curbe.DW2.FrameWidthInMBs * curbe.DW2.FrameHeightInMBs;
5286     curbe.DW4.TotalLargeMvThreshold = totalMb / 100;
5287     curbe.DW5.ZMVThreshold = 4;
5288     curbe.DW6.TotalZMVThreshold = totalMb * m_avcPicParam->dwZMvThreshold / 100;
5289     curbe.DW7.MinDistThreshold = 10;
5290 
5291     if (P_TYPE == m_pictureCodingType)
5292     {
5293         CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(MOS_SecureMemcpy(curbe.CostTable, CODEC_AVC_NUM_QP * sizeof(uint8_t), m_codechalEncodeAvcSfdCostTablePFrame, CODEC_AVC_NUM_QP * sizeof(uint8_t)),
5294             "Failed to copy P-frame SFD cost table");
5295     }
5296     else if (B_TYPE == m_pictureCodingType)
5297     {
5298         CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(MOS_SecureMemcpy(curbe.CostTable, CODEC_AVC_NUM_QP * sizeof(uint8_t), m_codechalEncodeAvcSfdCostTableBFrame, CODEC_AVC_NUM_QP * sizeof(uint8_t)),
5299             "Failed to copy B-frame SFD cost table");
5300     }
5301 
5302     curbe.DW21.ActualHeightInMB = curbe.DW2.FrameHeightInMBs;
5303     curbe.DW21.ActualWidthInMB = curbe.DW2.FrameWidthInMBs;
5304     curbe.DW26.MVDataSurfaceIndex = CODECHAL_ENCODE_AVC_SFD_MV_DATA_SURFACE_COMMON;
5305     curbe.DW27.InterDistortionSurfaceIndex = CODECHAL_ENCODE_AVC_SFD_INTER_DISTORTION_SURFACE_COMMON;
5306     curbe.DW28.OutputDataSurfaceIndex = CODECHAL_ENCODE_AVC_SFD_OUTPUT_DATA_SURFACE_COMMON;
5307 
5308     CODECHAL_ENCODE_CHK_STATUS_RETURN(params->pKernelState->m_dshRegion.AddData(
5309         &curbe,
5310         params->pKernelState->dwCurbeOffset,
5311         sizeof(curbe)));
5312 
5313     return eStatus;
5314 }
5315 
SetSequenceStructs()5316 MOS_STATUS CodechalEncodeAvcEnc::SetSequenceStructs()
5317 {
5318     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
5319 
5320     CODECHAL_ENCODE_FUNCTION_ENTER;
5321 
5322     auto seqParams = m_avcSeqParam;
5323 
5324     if (m_targetUsageOverride)
5325     {
5326         seqParams->TargetUsage = m_targetUsageOverride;
5327     }
5328 
5329     if (m_feiEnable)
5330     {
5331         // FEI kernel is based on normal mode TU = TARGETUSAGE_RT_SPEED(4)
5332         seqParams->TargetUsage = TARGETUSAGE_RT_SPEED;
5333     }
5334 
5335     CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalEncodeAvcBase::SetSequenceStructs());
5336 
5337     // If 16xMe is supported then check if it is supported in the TU settings
5338     if (!m_16xMeUserfeatureControl && m_16xMeSupported)
5339     {
5340         CODECHAL_ENCODE_CHK_STATUS_RETURN(GetHmeSupportedBasedOnTU(HME_LEVEL_16x, &m_16xMeSupported));
5341     }
5342 
5343     // If 32xMe is supported then check if it is supported in the TU settings
5344     if (!m_32xMeUserfeatureControl && m_32xMeSupported)
5345     {
5346         CODECHAL_ENCODE_CHK_STATUS_RETURN(GetHmeSupportedBasedOnTU(HME_LEVEL_32x, &m_32xMeSupported));
5347     }
5348 
5349     if (m_firstFrame)
5350     {
5351         m_oriFrameHeight = seqParams->FrameHeight;
5352         m_oriFrameWidth = seqParams->FrameWidth;
5353     }
5354 
5355     // check if there is a dynamic resolution change
5356     if ((m_oriFrameHeight && (m_oriFrameHeight != seqParams->FrameHeight)) ||
5357         (m_oriFrameWidth && (m_oriFrameWidth != seqParams->FrameWidth)))
5358     {
5359         m_resolutionChanged = true;
5360         m_oriFrameHeight = seqParams->FrameHeight;
5361         m_oriFrameWidth = seqParams->FrameWidth;
5362         // Need to call BRCInit instead of BRCReset for dynamic resolution change
5363         bBrcInit = true;
5364     }
5365     else
5366     {
5367         m_resolutionChanged = false;
5368     }
5369 
5370     usAVBRAccuracy = CODECHAL_ENCODE_AVC_DEFAULT_AVBR_ACCURACY;
5371     usAVBRConvergence = CODECHAL_ENCODE_AVC_DEFAULT_AVBR_CONVERGENCE;
5372 
5373     bBrcEnabled =
5374         CodecHalIsRateControlBrc(seqParams->RateControlMethod, CODECHAL_AVC);
5375 
5376     if (m_osInterface->osCpInterface->IsHMEnabled())
5377     {
5378         // use MbEnc Adv kernel when DSH protection is disabled and Brc is enabled
5379         if (bBrcEnabled)
5380         {
5381             bAdvancedDshInUse = true;
5382             bUseMbEncAdvKernel = true;
5383         }
5384     }
5385 
5386     if (ucMbBrcSupportCaps && bBrcEnabled)
5387     {
5388         // control MBBRC if the user feature key does not exist
5389         if (!bMbBrcUserFeatureKeyControl)
5390         {
5391             if (seqParams->RateControlMethod == RATECONTROL_ICQ || seqParams->RateControlMethod == RATECONTROL_QVBR)
5392             {
5393                 // If the rate control method is ICQ or QVBR then enable MBBRC by default for all TUs and ignore the app input
5394                 bMbBrcEnabled = true;
5395                 CODECHAL_ENCODE_NORMALMESSAGE("MBBRC enabled with rate control = %d", seqParams->RateControlMethod);
5396             }
5397             else if (seqParams->RateControlMethod == RATECONTROL_VCM)
5398             {
5399                 // If the rate control method is VCM then disable MBBRC by default for all TUs and ignore the app input
5400                 bMbBrcEnabled = false;
5401             }
5402             else
5403             {
5404                 switch (seqParams->MBBRC)
5405                 {
5406                 case mbBrcInternal:
5407                     // Enable or disable MBBRC based on TU
5408                     CODECHAL_ENCODE_CHK_STATUS_RETURN(GetMbBrcEnabled(seqParams->TargetUsage, &bMbBrcEnabled));
5409                     break;
5410                 case mbBrcDisabled:
5411                     bMbBrcEnabled = false;
5412                     break;
5413                 case mbBrcEnabled:
5414                     bMbBrcEnabled = true;
5415                     break;
5416                 }
5417             }
5418         }
5419     }
5420 
5421     dwTrellis = seqParams->Trellis;
5422     bROIValueInDeltaQP = seqParams->ROIValueInDeltaQP;
5423 
5424     // Simple check for BRC parameters; if error, disable BRC and continue encoding
5425     if (bBrcEnabled &&
5426         ((((!seqParams->InitVBVBufferFullnessInBit ||
5427             !seqParams->VBVBufferSizeInBit ||
5428             !seqParams->MaxBitRate) &&
5429             (seqParams->RateControlMethod != RATECONTROL_AVBR)) ||
5430             !seqParams->TargetBitRate ||
5431             !seqParams->FramesPer100Sec) &&
5432             seqParams->RateControlMethod != RATECONTROL_ICQ))
5433     {
5434         CODECHAL_ENCODE_ASSERTMESSAGE("Fatal error in AVC Encoding BRC parameters.");
5435         CODECHAL_ENCODE_ASSERTMESSAGE("RateControlMethod = %d, InitVBVBufferFullnessInBit = %d, VBVBufferSizeInBit = %d, MaxBitRate = %d, TargetBitRate = %d, FramesPer100Sec = %d",
5436             seqParams->RateControlMethod, seqParams->InitVBVBufferFullnessInBit, seqParams->VBVBufferSizeInBit, seqParams->MaxBitRate, seqParams->TargetBitRate, seqParams->FramesPer100Sec);
5437         bBrcEnabled = false;
5438     }
5439 
5440     // Mb Qp data is only enabled for CQP
5441     if (bBrcEnabled)
5442     {
5443         bMbQpDataEnabled = false;
5444     }
5445 
5446     // BRC Init or Reset
5447     if (seqParams->bInitBRC)
5448     {
5449         bBrcInit = seqParams->bInitBRC;
5450     }
5451     else
5452     {
5453         bBrcReset = seqParams->bResetBRC;
5454     }
5455 
5456     if (bBrcReset &&
5457         (!bBrcEnabled ||
5458             seqParams->RateControlMethod == RATECONTROL_ICQ ||
5459             !bBrcDistortionBufferSupported))
5460     {
5461         CODECHAL_ENCODE_ASSERTMESSAGE("BRC Reset cannot be trigerred on SNB or in CQP/CBR/ICQ modes - invalid BRC parameters.");
5462         bBrcReset = 0;
5463     }
5464 
5465     if (seqParams->RateControlMethod == RATECONTROL_ICQ)
5466     {
5467         if (seqParams->ICQQualityFactor < CODECHAL_ENCODE_AVC_MIN_ICQ_QUALITYFACTOR ||
5468             seqParams->ICQQualityFactor > CODECHAL_ENCODE_AVC_MAX_ICQ_QUALITYFACTOR)
5469         {
5470             CODECHAL_ENCODE_ASSERTMESSAGE("Invalid ICQ Quality Factor input\n");
5471             eStatus = MOS_STATUS_INVALID_PARAMETER;
5472             return eStatus;
5473         }
5474     }
5475 
5476     if (bBrcEnabled && !bPerMbSFD)
5477     {
5478         bStaticFrameDetectionEnable = false;
5479     }
5480 
5481     // if GOP structure is I-frame only, we use 3 non-ref slots for tracked buffer
5482     m_gopIsIdrFrameOnly = (seqParams->GopPicSize == 1 && seqParams->GopRefDist == 0);
5483 
5484     // Set sliding window size to one second by default, up to 60
5485     if (dwSlidingWindowSize == 0)
5486     {
5487         dwSlidingWindowSize = MOS_MIN((uint32_t)(seqParams->FramesPer100Sec / 100), 60);
5488     }
5489 
5490     m_maxNumSlicesAllowed = CodecHalAvcEncode_GetMaxNumSlicesAllowed(
5491         (CODEC_AVC_PROFILE_IDC)(seqParams->Profile),
5492         (CODEC_AVC_LEVEL_IDC)(seqParams->Level),
5493         seqParams->FramesPer100Sec);
5494 
5495     return eStatus;
5496 }
5497 
SetPictureStructs()5498 MOS_STATUS CodechalEncodeAvcEnc::SetPictureStructs()
5499 {
5500     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
5501 
5502     CODECHAL_ENCODE_FUNCTION_ENTER;
5503 
5504     auto picParams = m_avcPicParam;
5505     auto seqParams = m_avcSeqParam;
5506     auto avcRefList = &m_refList[0];
5507     auto avcPicIdx = &m_picIdx[0];
5508 
5509     uint8_t prevRefIdx = m_currReconstructedPic.FrameIdx;
5510     CODECHAL_ENCODE_CHK_NULL_RETURN(picParams);
5511     uint8_t currRefIdx = picParams->CurrReconstructedPic.FrameIdx;
5512 
5513     int16_t prevFrameNum = m_frameNum;
5514     int16_t currFrameNum = picParams->frame_num;
5515 
5516     if (m_firstFrame)
5517     {
5518         m_oriFieldCodingFlag = picParams->FieldCodingFlag;
5519     }
5520 
5521     if (Mos_ResourceIsNull(&m_reconSurface.OsResource) &&
5522         (!picParams->UserFlags.bUseRawPicForRef || !(m_codecFunction == CODECHAL_FUNCTION_ENC || m_codecFunction == CODECHAL_FUNCTION_FEI_ENC)))
5523     {
5524         return MOS_STATUS_INVALID_PARAMETER;
5525     }
5526 
5527     // Sync initialize
5528     if ((m_firstFrame) ||
5529         (!bBrcEnabled && picParams->UserFlags.bUseRawPicForRef) ||  // No need to wait for previous PAK if reconstructed pic is not used as reference (but RAW pic is used for ref)
5530         (!bBrcEnabled && (picParams->CodingType == I_TYPE)) ||      // No need to wait for I-Frames
5531         (!bBrcEnabled && (currFrameNum == prevFrameNum) &&
5532             CodecHal_PictureIsFrame(picParams->CurrOriginalPic)) ||          // No need to wait if current and previous pics have same frame numbers (Same reference list is used for two pictures with same frame numbers)
5533             (!bBrcEnabled && !avcRefList[prevRefIdx]->bUsedAsRef &&
5534                 CodecHal_PictureIsField(picParams->CurrOriginalPic)))
5535     {
5536         m_waitForPak = false;
5537     }
5538     else
5539     {
5540         m_waitForPak = true;
5541     }
5542 
5543     if ((bBrcEnabled || picParams->RefPicFlag))
5544     {
5545         m_signalEnc = true;
5546     }
5547     else
5548     {
5549         m_signalEnc = false;
5550     }
5551 
5552     CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalEncodeAvcBase::SetPictureStructs());
5553 
5554     // use MbEnc Adv kenrel if rolling I or DirtyROI is enabled
5555     if (picParams->EnableRollingIntraRefresh || (picParams->NumDirtyROI > 0))
5556     {
5557         bAdvancedDshInUse = bBrcEnabled;
5558         bUseMbEncAdvKernel = true;
5559     }
5560 
5561     // Force enable HME if BRC is enabled
5562     m_hmeEnabled = bBrcEnabled ? m_pictureCodingType != I_TYPE : m_hmeEnabled;
5563 
5564     bMbEncIFrameDistEnabled =
5565         bBrcDistortionBufferSupported &&
5566         bBrcEnabled &&
5567         (m_pictureCodingType == I_TYPE);
5568 
5569     m_mfxInterface->SetBrcNumPakPasses(GetNumBrcPakPasses(picParams->BRCPrecision));
5570     if (bBrcEnabled)
5571     {
5572         // For ICQ mode, ignore BRCPrecision sent by the app and set the number of passes internally
5573         if (seqParams->RateControlMethod == RATECONTROL_ICQ)
5574         {
5575             m_numPasses = CODECHAL_ENCODE_AVC_ICQ_NUM_OF_PASSES - 1;  // 1 original plus extra to handle IPCM MBs
5576         }
5577         // If min/max QP control is on, set single PAK pass.
5578         else if (bMinMaxQPControlEnabled)
5579         {
5580             m_numPasses = CODECHAL_ENCODE_BRC_SINGLE_PASS - 1;  // single PAK pass, no IPCM (-1 because of the loop condition)
5581         }
5582         else
5583         {
5584             m_numPasses = (uint8_t)(m_mfxInterface->GetBrcNumPakPasses() - 1);  // 1 original plus extra to handle BRC
5585         }
5586         // Call BrcInitReset kernel for field/frame mode change
5587         if ((m_oriFieldCodingFlag != picParams->FieldCodingFlag) && (!m_firstFrame))
5588         {
5589             bBrcReset = true;
5590             m_oriFieldCodingFlag = picParams->FieldCodingFlag;
5591         }
5592 
5593         // check if BRC ROI feature enabled
5594         bBrcRoiEnabled = (seqParams->RateControlMethod != RATECONTROL_CQP) && picParams->NumROI;
5595 
5596         // allocated resource for MB-level BRC
5597         if ((bMbBrcEnabled = (bMbBrcEnabled || bBrcRoiEnabled)))
5598         {
5599             CODECHAL_ENCODE_CHK_STATUS_RETURN(AllocateResourcesMbBrc());
5600         }
5601     }
5602     else
5603     {
5604         // legacy AVC : 1 original plus extra to handle IPCM MBs
5605         m_numPasses = (CODECHAL_ENCODE_AVC_CQP_NUM_OF_PASSES - 1);
5606 
5607         if (picParams->bEnableQpAdjustment)
5608         {
5609             bMbBrcEnabled = true;
5610             CODECHAL_ENCODE_CHK_STATUS_RETURN(AllocateResourcesMbBrc());
5611         }
5612     }
5613 
5614     //add for multiple Pass Pak
5615     if (CodecHalIsFeiEncode(m_codecFunction))
5616     {
5617         CodecEncodeAvcFeiPicParams *feiPicParams;
5618 
5619         feiPicParams = (CodecEncodeAvcFeiPicParams *)m_encodeParams.pFeiPicParams;
5620         CODECHAL_ENCODE_CHK_NULL_RETURN(feiPicParams);
5621         if (feiPicParams->dwMaxFrameSize != 0)
5622         {
5623             m_numPasses = (uint8_t)feiPicParams->dwNumPasses; //-1+1 for additional one IPCM pass
5624         }
5625     }
5626     else if (CodecHalUsesPakEngine(m_codecFunction) && picParams->dwMaxFrameSize != 0)
5627     {
5628         m_numPasses = (uint8_t)picParams->dwNumPasses; //-1+1 for additional one IPCM pass
5629     }
5630 
5631     if (seqParams->RateControlMethod == RATECONTROL_VCM && m_pictureCodingType == B_TYPE)
5632     {
5633         CODECHAL_ENCODE_ASSERTMESSAGE("VCM BRC mode does not support B-frames\n");
5634         eStatus = MOS_STATUS_INVALID_PARAMETER;
5635         return eStatus;
5636     }
5637 
5638     if (seqParams->RateControlMethod == RATECONTROL_VCM && (picParams->FieldCodingFlag || picParams->FieldFrameCodingFlag))
5639     {
5640         CODECHAL_ENCODE_ASSERTMESSAGE("VCM BRC mode does not support interlaced\n");
5641         eStatus = MOS_STATUS_INVALID_PARAMETER;
5642         return eStatus;
5643     }
5644 
5645     if (bRefPicSelectListSupported && m_encEnabled && m_refList[currRefIdx]->bUsedAsRef)
5646     {
5647         CODECHAL_ENCODE_CHK_STATUS_RETURN(InsertInRefPicSelectList());
5648         avcRefList[currRefIdx]->pRefPicSelectListEntry = &RefPicSelectList[ucCurrRefPicSelectIndex];
5649     }
5650     else
5651     {
5652         avcRefList[currRefIdx]->pRefPicSelectListEntry = nullptr;
5653     }
5654 
5655     // Force RepartitionCheck
5656     CODECHAL_ENCODE_AVC_RPC forceRepartitionCheck;
5657 
5658     if (picParams != nullptr)
5659     {
5660         forceRepartitionCheck = (CODECHAL_ENCODE_AVC_RPC)picParams->ForceRepartitionCheck;
5661     }
5662     else
5663     {
5664         forceRepartitionCheck = CODECHAL_ENCODE_RPC_FOLLOW_DRIVER;
5665     }
5666 
5667     switch (forceRepartitionCheck)
5668     {
5669     case CODECHAL_ENCODE_RPC_FOLLOW_DRIVER:
5670         CODECHAL_ENCODE_CHK_STATUS_RETURN(GetCAFEnabled(&bCAFEnable));
5671         break;
5672 
5673     case CODECHAL_ENCODE_RPC_FORCE_ENABLE:
5674         bCAFEnable = 1;
5675         break;
5676 
5677     case CODECHAL_ENCODE_RPC_FORCE_DISABLE:
5678         bCAFEnable = 0;
5679         break;
5680 
5681     default:
5682         CODECHAL_ENCODE_ASSERTMESSAGE("Invalid ForceRepartitionCheck Flag");
5683         eStatus = MOS_STATUS_INVALID_PARAMETER;
5684         break;
5685     }
5686 
5687     CODECHAL_ENCODE_CHK_STATUS_RETURN(GetATDEnabled());
5688 
5689     // Flatness check is enabled only if scaling will be performed and CAF is enabled. Always enable Flatness for I_type to improve quality.
5690     m_flatnessCheckEnabled = m_flatnessCheckSupported ?
5691         ((bCAFEnable || ((m_pictureCodingType == I_TYPE))) && (m_hmeSupported || bBrcEnabled)) : 0;
5692 
5693     //ATD enabled or BRC enabled for dual pipe AVC on KBL
5694     if (m_adaptiveTransformDecisionEnabled || (bBrcEnabled && m_forceBrcMbStatsEnabled))
5695     {
5696         m_mbStatsEnabled = true;
5697     }
5698     else
5699     {
5700         m_mbStatsEnabled = false;
5701     }
5702 
5703     return eStatus;
5704 }
5705 
SetSliceStructs()5706 MOS_STATUS CodechalEncodeAvcEnc::SetSliceStructs()
5707 {
5708     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
5709 
5710     CODECHAL_ENCODE_FUNCTION_ENTER;
5711 
5712     auto slcParams = m_avcSliceParams;
5713     auto seqParams = m_avcSeqParam;
5714     auto picParams = m_avcPicParam;
5715     if (m_pictureCodingType != I_TYPE)
5716     {
5717         CODECHAL_ENCODE_AVC_VALIDATE_NUM_REFS_PARAMS validateNumRefsParams;
5718         validateNumRefsParams.pSeqParams = seqParams;
5719         validateNumRefsParams.pPicParams = picParams;
5720         validateNumRefsParams.pAvcSliceParams = slcParams;
5721         validateNumRefsParams.wPictureCodingType = m_pictureCodingType;
5722         validateNumRefsParams.wPicHeightInMB = m_picHeightInMb;
5723         validateNumRefsParams.wFrameFieldHeightInMB = m_frameFieldHeightInMb;
5724         validateNumRefsParams.bFirstFieldIPic = m_firstFieldIdrPic;
5725         validateNumRefsParams.bVDEncEnabled = false;
5726         validateNumRefsParams.bPAKonly = (m_codecFunction == CODECHAL_FUNCTION_FEI_PAK) ? true : false;
5727 
5728         CODECHAL_ENCODE_CHK_STATUS_RETURN(ValidateNumReferences(&validateNumRefsParams));
5729     }
5730     else
5731     {
5732         slcParams->num_ref_idx_l0_active_minus1 = 0;
5733         slcParams->num_ref_idx_l1_active_minus1 = 0;
5734     }
5735 
5736     CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalEncodeAvcBase::SetSliceStructs());
5737 
5738     if (eStatus == MOS_STATUS_INVALID_PARAMETER)
5739     {
5740         CODECHAL_ENCODE_ASSERTMESSAGE("Invalid slice parameters.");
5741     }
5742     return eStatus;
5743 }
5744 
SendBrcInitResetSurfaces(PMOS_COMMAND_BUFFER cmdBuffer,PCODECHAL_ENCODE_AVC_BRC_INIT_RESET_SURFACE_PARAMS params)5745 MOS_STATUS CodechalEncodeAvcEnc::SendBrcInitResetSurfaces(PMOS_COMMAND_BUFFER cmdBuffer, PCODECHAL_ENCODE_AVC_BRC_INIT_RESET_SURFACE_PARAMS params)
5746 {
5747     MOS_STATUS                                  eStatus = MOS_STATUS_SUCCESS;
5748 
5749     CODECHAL_ENCODE_CHK_NULL_RETURN(cmdBuffer);
5750     CODECHAL_ENCODE_CHK_NULL_RETURN(params);
5751     CODECHAL_ENCODE_CHK_NULL_RETURN(params->presBrcHistoryBuffer);
5752 
5753     uint32_t kernelIdx =
5754         (bBrcInit) ? CODECHAL_ENCODE_BRC_IDX_INIT : CODECHAL_ENCODE_BRC_IDX_RESET;
5755     auto kernelState = &BrcKernelStates[kernelIdx];
5756 
5757     // BRC history buffer
5758     CODECHAL_SURFACE_CODEC_PARAMS surfaceCodecParams;
5759     uint32_t size = MOS_BYTES_TO_DWORDS(m_brcHistoryBufferSize);
5760     MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
5761     surfaceCodecParams.bIsWritable = true;
5762     surfaceCodecParams.presBuffer = params->presBrcHistoryBuffer;
5763     surfaceCodecParams.dwSize = size;
5764     surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_BRC_HISTORY_ENCODE].Value;
5765     surfaceCodecParams.dwBindingTableOffset = CODECHAL_ENCODE_AVC_BRC_INIT_RESET_HISTORY;
5766     surfaceCodecParams.bIsWritable = true;
5767     surfaceCodecParams.bRenderTarget = true;
5768     CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
5769         m_hwInterface,
5770         cmdBuffer,
5771         &surfaceCodecParams,
5772         kernelState));
5773 
5774     // AVC_ME BRC Distortion data buffer - output
5775     params->psMeBrcDistortionBuffer->dwWidth = MOS_ALIGN_CEIL((params->dwDownscaledWidthInMb4x * 8), 64);
5776     params->psMeBrcDistortionBuffer->dwHeight =
5777         MOS_ALIGN_CEIL((params->dwDownscaledFrameFieldHeightInMb4x * 4), 8);
5778 
5779     MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
5780     surfaceCodecParams.bIs2DSurface = true;
5781     surfaceCodecParams.bMediaBlockRW = true;
5782     surfaceCodecParams.bIsWritable = true;
5783     surfaceCodecParams.psSurface = params->psMeBrcDistortionBuffer;
5784     surfaceCodecParams.dwOffset = params->dwMeBrcDistortionBottomFieldOffset;
5785     surfaceCodecParams.dwSize = size;
5786     surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_BRC_ME_DISTORTION_ENCODE].Value;
5787     surfaceCodecParams.dwBindingTableOffset = CODECHAL_ENCODE_AVC_BRC_INIT_RESET_DISTORTION;
5788     surfaceCodecParams.bIsWritable = true;
5789     surfaceCodecParams.bRenderTarget = true;
5790     CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
5791         m_hwInterface,
5792         cmdBuffer,
5793         &surfaceCodecParams,
5794         kernelState));
5795 
5796     return eStatus;
5797 }
5798 
SendAvcSFDSurfaces(PMOS_COMMAND_BUFFER cmdBuffer,PCODECHAL_ENCODE_AVC_SFD_SURFACE_PARAMS params)5799 MOS_STATUS CodechalEncodeAvcEnc::SendAvcSFDSurfaces(PMOS_COMMAND_BUFFER cmdBuffer, PCODECHAL_ENCODE_AVC_SFD_SURFACE_PARAMS params)
5800 {
5801     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
5802 
5803     CODECHAL_ENCODE_CHK_NULL_RETURN(cmdBuffer);
5804     CODECHAL_ENCODE_CHK_NULL_RETURN(params);
5805 
5806     auto kernelState = params->pKernelState;
5807     CODECHAL_SURFACE_CODEC_PARAMS surfaceCodecParams;
5808     // HME MV Data surface
5809     CODECHAL_ENCODE_CHK_NULL_RETURN(params->psMeMvDataSurface);
5810     MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
5811     surfaceCodecParams.bIs2DSurface = true;
5812     surfaceCodecParams.bMediaBlockRW = true;
5813     surfaceCodecParams.psSurface = params->psMeMvDataSurface;
5814     surfaceCodecParams.dwOffset = params->dwMeMvBottomFieldOffset;
5815     surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_MV_DATA_ENCODE].Value;
5816     surfaceCodecParams.dwBindingTableOffset = CODECHAL_ENCODE_AVC_SFD_MV_DATA_SURFACE_COMMON;
5817     CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
5818         m_hwInterface,
5819         cmdBuffer,
5820         &surfaceCodecParams,
5821         kernelState));
5822 
5823     // HME distortion surface
5824     CODECHAL_ENCODE_CHK_NULL_RETURN(params->psMeDistortionSurface);
5825     MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
5826     surfaceCodecParams.bIs2DSurface = true;
5827     surfaceCodecParams.bMediaBlockRW = true;
5828     surfaceCodecParams.psSurface = params->psMeDistortionSurface;
5829     surfaceCodecParams.dwOffset = params->dwMeDistortionBottomFieldOffset;
5830     surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_ME_DISTORTION_ENCODE].Value;
5831     surfaceCodecParams.dwBindingTableOffset = CODECHAL_ENCODE_AVC_SFD_INTER_DISTORTION_SURFACE_COMMON;
5832     CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
5833         m_hwInterface,
5834         cmdBuffer,
5835         &surfaceCodecParams,
5836         kernelState));
5837 
5838     // output buffer
5839     CODECHAL_ENCODE_CHK_NULL_RETURN(params->presOutputBuffer);
5840     MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
5841     surfaceCodecParams.presBuffer = params->presOutputBuffer;
5842     surfaceCodecParams.dwSize = MOS_BYTES_TO_DWORDS(CODECHAL_ENCODE_AVC_SFD_OUTPUT_BUFFER_SIZE_COMMON);
5843     surfaceCodecParams.dwOffset = 0;
5844     surfaceCodecParams.bRenderTarget = true;
5845     surfaceCodecParams.bIsWritable = true;
5846     surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_ME_DISTORTION_ENCODE].Value;
5847     surfaceCodecParams.dwBindingTableOffset = CODECHAL_ENCODE_AVC_SFD_OUTPUT_DATA_SURFACE_COMMON;
5848     CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
5849         m_hwInterface,
5850         cmdBuffer,
5851         &surfaceCodecParams,
5852         kernelState));
5853 
5854     return eStatus;
5855 }
5856 
InitializePicture(const EncoderParams & params)5857 MOS_STATUS CodechalEncodeAvcEnc::InitializePicture(const EncoderParams& params)
5858 {
5859     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
5860 
5861     CODECHAL_ENCODE_FUNCTION_ENTER;
5862 
5863     auto ppsidx = ((PCODEC_AVC_ENCODE_SLICE_PARAMS)(params.pSliceParams))->pic_parameter_set_id;
5864     auto spsidx = ((PCODEC_AVC_ENCODE_PIC_PARAMS)(params.pPicParams))->seq_parameter_set_id;
5865 
5866     m_madEnabled = params.bMADEnabled;
5867 
5868     m_avcSeqParams[spsidx] = (PCODEC_AVC_ENCODE_SEQUENCE_PARAMS)(params.pSeqParams);
5869     m_avcPicParams[ppsidx] = (PCODEC_AVC_ENCODE_PIC_PARAMS)(params.pPicParams);
5870     m_avcQCParams  = (PCODECHAL_ENCODE_AVC_QUALITY_CTRL_PARAMS)params.pAVCQCParams;
5871     m_avcRoundingParams      = (PCODECHAL_ENCODE_AVC_ROUNDING_PARAMS)params.pAVCRoundingParams;
5872 
5873     m_avcSeqParam = m_avcSeqParams[spsidx];
5874     m_avcPicParam = m_avcPicParams[ppsidx];
5875     m_avcVuiParams = (PCODECHAL_ENCODE_AVC_VUI_PARAMS)params.pVuiParams;
5876     m_avcSliceParams = (PCODEC_AVC_ENCODE_SLICE_PARAMS)params.pSliceParams;
5877     m_avcFeiPicParams = (CodecEncodeAvcFeiPicParams *)params.pFeiPicParams;
5878     m_avcIQMatrixParams = (PCODEC_AVC_IQ_MATRIX_PARAMS)params.pIQMatrixBuffer;
5879     m_avcIQWeightScaleLists = (PCODEC_AVC_ENCODE_IQ_WEIGTHSCALE_LISTS)params.pIQWeightScaleLists;
5880     m_nalUnitParams = params.ppNALUnitParams;
5881     m_sliceStructCaps = params.uiSlcStructCaps;
5882 
5883     m_skipFrameFlag = m_avcPicParam->SkipFrameFlag;
5884 
5885     // Picture and slice header packing flag from DDI caps
5886     bAcceleratorHeaderPackingCaps = params.bAcceleratorHeaderPackingCaps;
5887 
5888     CODECHAL_ENCODE_CHK_NULL_RETURN(m_avcIQMatrixParams);
5889 
5890     // so far this only applies to AVC
5891     // can move to MotionEstimationDisableCheck() if the logic applies to other codecs later
5892     if ((!m_feiEnable) && (m_avcQCParams ))
5893     {
5894         // disable 4x/16x/32 HME if DDI wants to do so, enabling logic is not affected
5895         if (m_avcQCParams ->HMEDisable)
5896         {
5897             m_hmeSupported = false;
5898             m_16xMeSupported = false;
5899             m_32xMeSupported = false;
5900         }
5901         else if (m_avcQCParams ->SuperHMEDisable)
5902         {
5903             m_16xMeSupported = false;
5904             m_32xMeSupported = false;
5905         }
5906         else if (m_avcQCParams ->UltraHMEDisable)
5907         {
5908             m_32xMeSupported = false;
5909         }
5910     }
5911 
5912     // Mb Qp data
5913     bMbQpDataEnabled = params.bMbQpDataEnabled;
5914     if (bMbQpDataEnabled)
5915     {
5916         sMbQpDataSurface = *(params.psMbQpDataSurface);
5917     }
5918 
5919     // Mb Disable Skip Map
5920     bMbDisableSkipMapEnabled = params.bMbDisableSkipMapEnabled;
5921     if (bMbDisableSkipMapEnabled)
5922     {
5923         psMbDisableSkipMapSurface = params.psMbDisableSkipMapSurface;
5924     }
5925 
5926     // Sei for AVC
5927     if (params.pSeiData != nullptr)
5928     {
5929         if (params.pSeiData->dwSEIBufSize > 0) // sei is present
5930         {
5931             if (params.pSeiData->dwSEIBufSize > SeiData.dwSEIBufSize)
5932             {
5933                 // Destroy and re-allocate
5934                 if (SeiData.pSEIBuffer)
5935                 {
5936                     MOS_FreeMemory(SeiData.pSEIBuffer);
5937                     SeiData.pSEIBuffer = nullptr;
5938                 }
5939                 SeiData.dwSEIBufSize = params.pSeiData->dwSEIBufSize;
5940                 SeiData.pSEIBuffer = (uint8_t *)MOS_AllocAndZeroMemory(SeiData.dwSEIBufSize);
5941                 CODECHAL_ENCODE_CHK_NULL_RETURN(SeiData.pSEIBuffer);
5942             }
5943 
5944             pSeiParamBuffer = params.pSeiParamBuffer;
5945             dwSEIDataOffset = params.dwSEIDataOffset;
5946             SeiData.newSEIData = params.pSeiData->newSEIData;
5947             SeiData.dwSEIDataSize = params.pSeiData->dwSEIDataSize;
5948 
5949             eStatus = MOS_SecureMemcpy(SeiData.pSEIBuffer,
5950                 SeiData.dwSEIDataSize,
5951                 (pSeiParamBuffer + dwSEIDataOffset),
5952                 SeiData.dwSEIDataSize);
5953             if (eStatus != MOS_STATUS_SUCCESS)
5954             {
5955                 CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory.");
5956                 return eStatus;
5957             }
5958         }
5959 
5960         m_extraPictureStatesSize = SeiData.dwSEIDataSize;
5961     }
5962 
5963     m_deblockingEnabled = 0;
5964     for (uint32_t i = 0; i < m_numSlices; i++)
5965     {
5966         if (m_avcSliceParams[i].disable_deblocking_filter_idc != 1)
5967         {
5968             m_deblockingEnabled = 1;
5969             break;
5970         }
5971     }
5972 
5973     if (m_newSeq)
5974     {
5975         CODECHAL_ENCODE_CHK_STATUS_RETURN(SetSequenceStructs());
5976     }
5977 
5978     CODECHAL_ENCODE_CHK_STATUS_RETURN(SetPictureStructs());
5979     CODECHAL_ENCODE_CHK_STATUS_RETURN(SetSliceStructs());
5980 
5981     // MB control data
5982     bMbSpecificDataEnabled = false; // Reset this flag at start of each frame encode.
5983     if (params.pMbCtrlBuffer)
5984     {
5985         bMbSpecificDataEnabled = true;
5986 
5987         MOS_LOCK_PARAMS lockFlagsWriteOnly;
5988         MOS_ZeroMemory(&lockFlagsWriteOnly, sizeof(lockFlagsWriteOnly));
5989         lockFlagsWriteOnly.WriteOnly = true;
5990 
5991         PCODECHAL_ENCODE_AVC_MB_SPECIFIC_PARAMS mbSpecificData = nullptr;
5992         CODECHAL_ENCODE_CHK_NULL_RETURN(mbSpecificData = \
5993             (PCODECHAL_ENCODE_AVC_MB_SPECIFIC_PARAMS)m_osInterface->pfnLockResource(
5994                 m_osInterface,
5995                 &resMbSpecificDataBuffer[m_currRecycledBufIdx],
5996                 &lockFlagsWriteOnly));
5997 
5998         uint32_t frameFieldMbNum = m_picWidthInMb * m_frameFieldHeightInMb;
5999         for (unsigned idx = 0; idx < frameFieldMbNum; ++idx)
6000         {
6001             mbSpecificData[idx].DW0.ForceToIntra = params.pMbCtrlBuffer[idx].MBParams.bForceIntra;
6002         }
6003 
6004         m_osInterface->pfnUnlockResource(m_osInterface, &resMbSpecificDataBuffer[m_currRecycledBufIdx]);
6005     }
6006 
6007     // Scaling occurs when either HME or BRC is enabled, and for Interlaced only called on first field
6008     m_scalingEnabled = (m_hmeSupported || bBrcEnabled) && m_firstField;
6009     m_useRawForRef = m_userFlags.bUseRawPicForRef;
6010 
6011     //Allocate and Generate the slice map surface
6012     if (m_arbitraryNumMbsInSlice)
6013     {
6014         /********** Allocate slice map surface **********/
6015 
6016         if (Mos_ResourceIsNull(&m_sliceMapSurface[m_currRecycledBufIdx].OsResource))     // Allocate only if not allocated before
6017         {
6018             for (uint32_t i = 0; i < CODECHAL_ENCODE_RECYCLED_BUFFER_NUM; i++)
6019             {
6020                 MOS_ZeroMemory(&m_sliceMapSurface[i], sizeof(MOS_SURFACE));
6021                 m_sliceMapSurface[i].TileType = MOS_TILE_LINEAR;
6022                 m_sliceMapSurface[i].bArraySpacing = true;
6023                 m_sliceMapSurface[i].Format = Format_Buffer_2D;
6024                 m_sliceMapSurface[i].dwWidth = (m_picWidthInMb + 1) * sizeof(uint32_t);
6025                 m_sliceMapSurface[i].dwHeight = 2 * m_frameFieldHeightInMb;
6026                 m_sliceMapSurface[i].dwPitch = MOS_ALIGN_CEIL(m_sliceMapSurface[i].dwWidth, 64);
6027 
6028                 MOS_ALLOC_GFXRES_PARAMS                     allocParamsForBuffer2D;
6029                 MOS_ZeroMemory(&allocParamsForBuffer2D, sizeof(MOS_ALLOC_GFXRES_PARAMS));
6030                 allocParamsForBuffer2D.Type = MOS_GFXRES_2D;
6031                 allocParamsForBuffer2D.TileType = (MOS_TILE_TYPE)m_sliceMapSurface[i].TileType;
6032                 allocParamsForBuffer2D.Format = m_sliceMapSurface[i].Format;
6033                 allocParamsForBuffer2D.dwWidth = m_sliceMapSurface[i].dwPitch;
6034                 allocParamsForBuffer2D.dwHeight = m_sliceMapSurface[i].dwHeight;
6035                 allocParamsForBuffer2D.pBufName = "Slice Map Surface";
6036 
6037                 eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource(
6038                     m_osInterface,
6039                     &allocParamsForBuffer2D,
6040                     &m_sliceMapSurface[i].OsResource);
6041                 if (eStatus != MOS_STATUS_SUCCESS)
6042                 {
6043                     CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate slice map Surface.");
6044                     return eStatus;
6045                 }
6046             }
6047         }
6048         else    // If sSliceMapSurface was already allocated, reassign width and height, in case there was a dynamic resolution change. Pitch doesn't need to be udpated.
6049         {
6050             m_sliceMapSurface[m_currRecycledBufIdx].dwWidth = (m_picWidthInMb + 1) * sizeof(uint32_t);
6051             m_sliceMapSurface[m_currRecycledBufIdx].dwHeight = 2 * m_frameFieldHeightInMb;
6052         }
6053 
6054         /********** Generate slice map surface **********/
6055         uint8_t*           data = nullptr;
6056         MOS_LOCK_PARAMS lockFlagsWriteOnly;
6057         MOS_ZeroMemory(&lockFlagsWriteOnly, sizeof(lockFlagsWriteOnly));
6058         lockFlagsWriteOnly.WriteOnly = true;
6059 
6060         // lock the internal lockable buffer.
6061         CODECHAL_ENCODE_CHK_NULL_RETURN(data = (uint8_t*)m_osInterface->pfnLockResource(m_osInterface,
6062             &m_sliceMapSurface[m_currRecycledBufIdx].OsResource, &lockFlagsWriteOnly));
6063         CODECHAL_ENCODE_CHK_STATUS_RETURN(EncodeGenerateSliceMap(data, m_avcSliceParams));
6064 
6065         // Unlock the internal lockable buffer
6066         m_osInterface->pfnUnlockResource(m_osInterface, &m_sliceMapSurface[m_currRecycledBufIdx].OsResource);
6067     }
6068 
6069     CODECHAL_DEBUG_TOOL(
6070         m_debugInterface->m_currPic            = m_avcPicParam->CurrOriginalPic;
6071         m_debugInterface->m_bufferDumpFrameNum = m_storeData;
6072         m_debugInterface->m_frameType          = m_pictureCodingType;
6073 
6074         if (m_newSeq) {
6075             CODECHAL_ENCODE_CHK_STATUS_RETURN(DumpSeqParams(
6076                 m_avcSeqParam,
6077                 m_avcIQMatrixParams));
6078 
6079             CODECHAL_ENCODE_CHK_STATUS_RETURN(PopulateConstParam());
6080         }
6081 
6082         if (m_newVuiData) {
6083             CODECHAL_ENCODE_CHK_STATUS_RETURN(DumpVuiParams(
6084                 m_avcVuiParams));
6085         }
6086 
6087         CODECHAL_ENCODE_CHK_STATUS_RETURN(DumpPicParams(
6088             m_avcPicParam,
6089             m_avcIQMatrixParams));
6090 
6091         if (m_feiEnable) {
6092             CODECHAL_ENCODE_CHK_STATUS_RETURN(DumpFeiPicParams(
6093                 m_avcFeiPicParams));
6094         }
6095 
6096         for (uint32_t i = 0; i < m_numSlices; i++) {
6097             CODECHAL_ENCODE_CHK_STATUS_RETURN(DumpSliceParams(
6098                 &m_avcSliceParams[i],
6099                 m_avcPicParam));
6100 
6101             CODECHAL_ENCODE_CHK_STATUS_RETURN(PopulateDdiParam(
6102                  m_avcSeqParam,
6103                  m_avcPicParam,
6104                  &m_avcSliceParams[i]));
6105         })
6106 
6107     ulRefPicSelectBottomFieldOffset = 0;
6108     BrcBuffers.dwMeBrcDistortionBottomFieldOffset = 0;
6109     BrcBuffers.dwBrcMbQpBottomFieldOffset = 0;
6110 
6111     if (CodecHal_PictureIsField(m_currOriginalPic))
6112     {
6113         if (CodecHal_PictureIsBottomField(m_currOriginalPic))
6114         {
6115             if (bVMEKernelDump)
6116             {
6117                 ulVMEKernelDumpBottomFieldOffset =
6118                     m_frameFieldHeightInMb * m_picWidthInMb * 64;
6119             }
6120 
6121             ulRefPicSelectBottomFieldOffset =
6122                 MOS_ALIGN_CEIL((m_picWidthInMb * 8), 64) *
6123                 m_frameFieldHeightInMb;
6124             BrcBuffers.dwMeBrcDistortionBottomFieldOffset =
6125                 BrcBuffers.sMeBrcDistortionBuffer.dwPitch *
6126                 MOS_ALIGN_CEIL((m_downscaledFrameFieldHeightInMb4x * 4), 8);
6127             BrcBuffers.dwBrcMbQpBottomFieldOffset =
6128                 MOS_ALIGN_CEIL((m_downscaledWidthInMb4x * 4), 64) *
6129                 MOS_ALIGN_CEIL((m_downscaledFrameFieldHeightInMb4x * 4), 8);
6130         }
6131     }
6132 
6133     // Set min/max QP values in AVC State based on frame type if atleast one of them is non-zero
6134     if (m_avcPicParam->ucMinimumQP || m_avcPicParam->ucMaximumQP)
6135     {
6136         bMinMaxQPControlEnabled = true;
6137         if (m_avcPicParam->CodingType == I_TYPE)
6138         {
6139             ucIMaxQP = MOS_MIN(MOS_MAX(m_avcPicParam->ucMaximumQP, 1), 51);   // Clamp to the max QP to [1, 51] . Zero is not used by our Kernel.
6140             ucIMinQP = MOS_MIN(MOS_MAX(m_avcPicParam->ucMinimumQP, 1), ucIMaxQP);    // Clamp the min QP to [1, maxQP] to make sure minQP <= maxQP
6141             if (!bPFrameMinMaxQPControl)
6142             {
6143                 ucPMinQP = ucIMinQP;
6144                 ucPMaxQP = ucIMaxQP;
6145             }
6146             if (!bBFrameMinMaxQPControl)
6147             {
6148                 ucBMinQP = ucIMinQP;
6149                 ucBMaxQP = ucIMaxQP;
6150             }
6151         }
6152         else if (m_avcPicParam->CodingType == P_TYPE)
6153         {
6154             bPFrameMinMaxQPControl = true;
6155             ucPMaxQP = MOS_MIN(MOS_MAX(m_avcPicParam->ucMaximumQP, 1), 51);   // Clamp to the max QP to [1, 51]. Zero is not used by our Kernel.
6156             ucPMinQP = MOS_MIN(MOS_MAX(m_avcPicParam->ucMinimumQP, 1), ucPMaxQP);    // Clamp the min QP to [1, maxQP] to make sure minQP <= maxQP
6157             if (!bBFrameMinMaxQPControl)
6158             {
6159                 ucBMinQP = ucPMinQP;
6160                 ucBMaxQP = ucPMaxQP;
6161             }
6162         }
6163         else    // B_TYPE
6164         {
6165             bBFrameMinMaxQPControl = true;
6166             ucBMaxQP = MOS_MIN(MOS_MAX(m_avcPicParam->ucMaximumQP, 1), 51);   // Clamp to the max QP to [1, 51] . Zero is not used by our Kernel.
6167             ucBMinQP = MOS_MIN(MOS_MAX(m_avcPicParam->ucMinimumQP, 1), ucBMaxQP);    // Clamp the min QP to [1, maxQP] to make sure minQP <= maxQP
6168         }
6169         // Zero out the QP values, so we don't update the AVCState settings until new values are sent in MiscParamsRC
6170         m_avcPicParam->ucMinimumQP = 0;
6171         m_avcPicParam->ucMaximumQP = 0;
6172     }
6173 
6174     if (!(m_codecFunction == CODECHAL_FUNCTION_ENC || m_codecFunction == CODECHAL_FUNCTION_FEI_ENC)
6175         && !m_userFlags.bDisableAcceleratorHeaderPacking
6176         && bAcceleratorHeaderPackingCaps)
6177     {
6178         CODECHAL_ENCODE_AVC_PACK_PIC_HEADER_PARAMS  packPicHeaderParams;
6179         packPicHeaderParams.pBsBuffer = &m_bsBuffer;
6180         packPicHeaderParams.pPicParams = m_avcPicParam;
6181         packPicHeaderParams.pSeqParams = m_avcSeqParam;
6182         packPicHeaderParams.pAvcVuiParams = m_avcVuiParams;
6183         packPicHeaderParams.pAvcIQMatrixParams = m_avcIQMatrixParams;
6184         packPicHeaderParams.ppNALUnitParams = m_nalUnitParams;
6185         packPicHeaderParams.pSeiData = &SeiData;
6186         packPicHeaderParams.dwFrameHeight = m_frameHeight;
6187         packPicHeaderParams.dwOriFrameHeight = m_oriFrameHeight;
6188         packPicHeaderParams.wPictureCodingType = m_avcPicParam->CodingType;
6189         packPicHeaderParams.bNewSeq = m_newSeq;
6190         packPicHeaderParams.pbNewPPSHeader = &m_newPpsHeader;
6191         packPicHeaderParams.pbNewSeqHeader = &m_newSeqHeader;
6192 
6193         CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalAvcEncode_PackPictureHeader(&packPicHeaderParams));
6194     }
6195 
6196     CODECHAL_ENCODE_CHK_STATUS_RETURN(SetStatusReportParams(m_refList[m_currReconstructedPic.FrameIdx]));
6197 
6198     m_bitstreamUpperBound = m_encodeParams.dwBitstreamSize;
6199     uint8_t sliceQP = m_avcPicParam->pic_init_qp_minus26 + 26 + m_avcSliceParams->slice_qp_delta;
6200 
6201     CODECHAL_ENCODE_CHK_STATUS_RETURN(GetSkipBiasAdjustment(sliceQP, m_avcSeqParam->GopRefDist,
6202         &m_skipBiasAdjustmentEnable));
6203 
6204     // Determine if Trellis Quantization should be enabled
6205     MOS_ZeroMemory(&m_trellisQuantParams, sizeof(m_trellisQuantParams));
6206     // Trellis must remain switched off if it is explicitly disabled or picture is encoded with CAVLC
6207     if (!(dwTrellis & trellisDisabled) && m_avcPicParam->entropy_coding_mode_flag)
6208     {
6209         if (dwTrellis == trellisInternal)
6210         {
6211             CODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS         tqInputParams;
6212             tqInputParams.ucQP = sliceQP;
6213             tqInputParams.ucTargetUsage = m_avcSeqParam->TargetUsage;
6214             tqInputParams.wPictureCodingType = m_pictureCodingType;
6215             tqInputParams.bBrcEnabled = bBrcEnabled;
6216             tqInputParams.bVdEncEnabled = false;
6217 
6218             CODECHAL_ENCODE_CHK_STATUS_RETURN(GetTrellisQuantization(
6219                 &tqInputParams,
6220                 &m_trellisQuantParams));
6221         }
6222         else if ((m_pictureCodingType == I_TYPE && (dwTrellis & trellisEnabledI)) ||
6223             (m_pictureCodingType == P_TYPE && (dwTrellis & trellisEnabledP)) ||
6224             (m_pictureCodingType == B_TYPE && (dwTrellis & trellisEnabledB)))
6225         {
6226             m_trellisQuantParams.dwTqEnabled = true;
6227             m_trellisQuantParams.dwTqRounding = CODECHAL_ENCODE_AVC_DEFAULT_TRELLIS_QUANT_ROUNDING;
6228         }
6229     }
6230 
6231     InitMfe();
6232 
6233     return eStatus;
6234 }
6235 
ExecuteKernelFunctions()6236 MOS_STATUS CodechalEncodeAvcEnc::ExecuteKernelFunctions()
6237 {
6238     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
6239 
6240     CODECHAL_ENCODE_FUNCTION_ENTER;
6241     auto slcParams = m_avcSliceParams;
6242     auto sliceType = Slice_Type[slcParams->slice_type];
6243 
6244     CODECHAL_DEBUG_TOOL(
6245         //CodecHal_DbgMapSurfaceFormatToDumpFormat(m_rawSurfaceToEnc->Format, &u32DumpType);
6246         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpYUVSurface(
6247             m_rawSurfaceToEnc,
6248             CodechalDbgAttr::attrEncodeRawInputSurface,
6249             "SrcSurf"));
6250     )
6251     CODECHAL_ENCODE_CHK_NULL_RETURN(m_cscDsState);
6252     // Scaling, BRC Init/Reset and HME are included in the same task phase
6253     m_lastEncPhase = false;
6254     m_firstTaskInPhase = true;
6255 
6256     // BRC init/reset needs to be called before HME since it will reset the Brc Distortion surface
6257     if (bBrcEnabled && (bBrcInit || bBrcReset))
6258     {
6259         bool cscEnabled = m_cscDsState->RequireCsc() && m_firstField;
6260         m_lastTaskInPhase = !(cscEnabled || m_scalingEnabled || m_16xMeSupported || m_hmeEnabled);
6261         CODECHAL_ENCODE_CHK_STATUS_RETURN(BrcInitResetKernel());
6262     }
6263 
6264     UpdateSSDSliceCount();
6265 
6266     if (m_firstField)
6267     {
6268         // Csc, Downscaling, and/or 10-bit to 8-bit conversion
6269         CodechalEncodeCscDs::KernelParams cscScalingKernelParams;
6270         MOS_ZeroMemory(&cscScalingKernelParams, sizeof(cscScalingKernelParams));
6271         cscScalingKernelParams.bLastTaskInPhaseCSC =
6272             cscScalingKernelParams.bLastTaskInPhase4xDS = !(m_16xMeSupported || m_hmeEnabled);
6273         cscScalingKernelParams.bLastTaskInPhase16xDS = !(m_32xMeSupported || m_hmeEnabled);
6274         cscScalingKernelParams.bLastTaskInPhase32xDS = !m_hmeEnabled;
6275         cscScalingKernelParams.inputColorSpace = m_avcSeqParam->InputColorSpace;
6276         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_cscDsState->KernelFunctions(&cscScalingKernelParams));
6277     }
6278 
6279     // SFD should be called only when HME enabled
6280     auto staticFrameDetectionInUse = bStaticFrameDetectionEnable && m_hmeEnabled;
6281 
6282     staticFrameDetectionInUse = !bPerMbSFD && staticFrameDetectionInUse;
6283 
6284     if (m_hmeEnabled)
6285     {
6286         if (m_16xMeEnabled)
6287         {
6288             m_lastTaskInPhase = false;
6289             if (m_32xMeEnabled)
6290             {
6291                 CODECHAL_ENCODE_CHK_STATUS_RETURN(GenericEncodeMeKernel(&BrcBuffers, HME_LEVEL_32x));
6292             }
6293             CODECHAL_ENCODE_CHK_STATUS_RETURN(GenericEncodeMeKernel(&BrcBuffers, HME_LEVEL_16x));
6294         }
6295         m_lastTaskInPhase = !staticFrameDetectionInUse;
6296         CODECHAL_ENCODE_CHK_STATUS_RETURN(GenericEncodeMeKernel(&BrcBuffers, HME_LEVEL_4x));
6297     }
6298 
6299     // call SFD kernel after HME in same command buffer
6300     if (staticFrameDetectionInUse)
6301     {
6302         m_lastTaskInPhase = true;
6303         CODECHAL_ENCODE_CHK_STATUS_RETURN(SFDKernel());
6304     }
6305 
6306     // Scaling and HME are not dependent on the output from PAK
6307     if (m_waitForPak && m_semaphoreObjCount && !Mos_ResourceIsNull(&m_resSyncObjectVideoContextInUse))
6308     {
6309         // Wait on PAK
6310         auto syncParams = g_cInitSyncParams;
6311         syncParams.GpuContext = m_renderContext;
6312         syncParams.presSyncResource = &m_resSyncObjectVideoContextInUse;
6313         syncParams.uiSemaphoreCount = m_semaphoreObjCount;
6314 
6315         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineWait(m_osInterface, &syncParams));
6316         m_semaphoreObjCount = 0; //reset
6317     }
6318 
6319     // Dump BrcDist 4X_ME buffer here because it will be overwritten in BrcFrameUpdateKernel
6320     CODECHAL_DEBUG_TOOL(
6321         if (m_hmeEnabled && bBrcDistortionBufferSupported)
6322         {
6323             CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
6324                 &BrcBuffers.sMeBrcDistortionBuffer.OsResource,
6325                 CodechalDbgAttr::attrOutput,
6326                 "BrcDist",
6327                 BrcBuffers.sMeBrcDistortionBuffer.dwPitch * BrcBuffers.sMeBrcDistortionBuffer.dwHeight,
6328                 BrcBuffers.dwMeBrcDistortionBottomFieldOffset,
6329                 CODECHAL_MEDIA_STATE_4X_ME));
6330         })
6331 
6332     // BRC and MbEnc are included in the same task phase
6333     m_lastEncPhase = true;
6334     m_firstTaskInPhase = true;
6335 
6336     if (bBrcEnabled)
6337     {
6338         if (bMbEncIFrameDistEnabled)
6339         {
6340             CODECHAL_ENCODE_CHK_STATUS_RETURN(MbEncKernel(true));
6341         }
6342 
6343         // Separate the MBEnc kernel and BrcUpdate Kernel
6344         if (IsMfeMbEncEnabled(false))
6345         {
6346             m_lastTaskInPhase = true;
6347         }
6348         CODECHAL_ENCODE_CHK_STATUS_RETURN(BrcFrameUpdateKernel());
6349         if (bBrcSplitEnable && bMbBrcEnabled)
6350         {
6351             CODECHAL_ENCODE_CHK_STATUS_RETURN(BrcMbUpdateKernel());
6352         }
6353 
6354         // Reset buffer ID used for BRC kernel performance reports
6355         m_osInterface->pfnResetPerfBufferID(m_osInterface);
6356     }
6357 
6358     bUseWeightedSurfaceForL0 = false;
6359     bUseWeightedSurfaceForL1 = false;
6360 
6361     if (bWeightedPredictionSupported &&
6362         ((((sliceType == SLICE_P) || (sliceType == SLICE_SP)) && (m_avcPicParam->weighted_pred_flag)) ||
6363         (((sliceType == SLICE_B)) && (m_avcPicParam->weighted_bipred_idc == EXPLICIT_WEIGHTED_INTER_PRED_MODE)))
6364         )
6365     {
6366         uint8_t i;
6367         // Weighted Prediction to be applied for L0
6368         for (i=0; i<(slcParams->num_ref_idx_l0_active_minus1+1); i++)
6369         {
6370             if((slcParams->luma_weight_flag[LIST_0] & (1 << i)) && (i < CODEC_AVC_MAX_FORWARD_WP_FRAME))
6371             {
6372                 //Weighted Prediction for ith forward reference frame
6373                 CODECHAL_ENCODE_CHK_STATUS_RETURN(WPKernel(false, i));
6374             }
6375         }
6376 
6377         if (((sliceType == SLICE_B)) &&
6378             (m_avcPicParam->weighted_bipred_idc == EXPLICIT_WEIGHTED_INTER_PRED_MODE))
6379         {
6380             for (i=0; i<(m_avcPicParam->num_ref_idx_l1_active_minus1+1); i++)
6381             {
6382                 // Weighted Pred to be applied for L1
6383                 if((slcParams->luma_weight_flag[LIST_1] & 1 << i) && (i < CODEC_AVC_MAX_BACKWARD_WP_FRAME))
6384                 {
6385                     //Weighted Prediction for ith backward reference frame
6386                     CODECHAL_ENCODE_CHK_STATUS_RETURN(WPKernel(true, i));
6387                 }
6388             }
6389         }
6390     }
6391 
6392 #if (_DEBUG || _RELEASE_INTERNAL)
6393 
6394     MOS_USER_FEATURE_VALUE_WRITE_DATA   userFeatureWriteData;
6395 
6396     // Weighted prediction for L0 Reporting
6397     userFeatureWriteData = __NULL_USER_FEATURE_VALUE_WRITE_DATA__;
6398     userFeatureWriteData.Value.i32Data = bUseWeightedSurfaceForL0;
6399     userFeatureWriteData.ValueID = __MEDIA_USER_FEATURE_VALUE_WEIGHTED_PREDICTION_L0_IN_USE_ID;
6400     MOS_UserFeature_WriteValues_ID(nullptr, &userFeatureWriteData, 1);
6401 
6402     // Weighted prediction for L1 Reporting
6403     userFeatureWriteData = __NULL_USER_FEATURE_VALUE_WRITE_DATA__;
6404     userFeatureWriteData.Value.i32Data = bUseWeightedSurfaceForL1;
6405     userFeatureWriteData.ValueID = __MEDIA_USER_FEATURE_VALUE_WEIGHTED_PREDICTION_L1_IN_USE_ID;
6406     MOS_UserFeature_WriteValues_ID(nullptr, &userFeatureWriteData, 1);
6407 
6408 #endif // _DEBUG || _RELEASE_INTERNAL
6409 
6410     m_lastTaskInPhase = true;
6411 
6412     if (IsMfeMbEncEnabled(false))
6413     {
6414         // Submit MBEnc kernel in the last stream
6415         if (m_mfeLastStream)
6416         {
6417             m_lastEncPhase = true;
6418             m_firstTaskInPhase = true;
6419             m_lastTaskInPhase = true;
6420         }
6421         else
6422         {
6423             m_firstTaskInPhase = false;
6424             m_lastTaskInPhase = false;
6425         }
6426     }
6427 
6428     CODECHAL_ENCODE_CHK_STATUS_RETURN(MbEncKernel(false));
6429 
6430     // Reset buffer ID used for MbEnc kernel performance reports
6431     m_osInterface->pfnResetPerfBufferID(m_osInterface);
6432 
6433     if (!Mos_ResourceIsNull(&m_resSyncObjectRenderContextInUse))
6434     {
6435         auto syncParams = g_cInitSyncParams;
6436         syncParams.GpuContext = m_renderContext;
6437         syncParams.presSyncResource = &m_resSyncObjectRenderContextInUse;
6438 
6439         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineSignal(m_osInterface, &syncParams));
6440     }
6441 
6442     if (m_madEnabled)
6443     {
6444         m_currMadBufferIdx = (m_currMadBufferIdx + 1) % CODECHAL_ENCODE_MAX_NUM_MAD_BUFFERS;
6445     }
6446 
6447     // Reset after BRC Init has been processed
6448     bBrcInit = false;
6449 
6450     m_setRequestedEUSlices = false;
6451 
6452     CODECHAL_DEBUG_TOOL(DumpEncodeKernelOutput());
6453 
6454     if (bBrcEnabled)
6455     {
6456         bMbEncCurbeSetInBrcUpdate = false;
6457     }
6458 
6459     return eStatus;
6460 }
6461 
DumpEncodeKernelOutput()6462 MOS_STATUS CodechalEncodeAvcEnc::DumpEncodeKernelOutput()
6463 {
6464     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
6465 
6466     CODECHAL_ENCODE_FUNCTION_ENTER;
6467 
6468     auto staticFrameDetectionInUse = bStaticFrameDetectionEnable && m_hmeEnabled;
6469     staticFrameDetectionInUse = !bPerMbSFD && staticFrameDetectionInUse;
6470     CODECHAL_DEBUG_TOOL(
6471         if (m_hmeEnabled)
6472         {
6473             CODECHAL_ME_OUTPUT_PARAMS meOutputParams;
6474             MOS_ZeroMemory(&meOutputParams, sizeof(meOutputParams));
6475             meOutputParams.psMeMvBuffer = m_hmeKernel ? m_hmeKernel->GetSurface(CodechalKernelHme::SurfaceId::me4xMvDataBuffer) : &m_4xMeMvDataBuffer;
6476             meOutputParams.psMeDistortionBuffer =
6477                 m_4xMeDistortionBufferSupported ?
6478                 (m_hmeKernel ? m_hmeKernel->GetSurface(CodechalKernelHme::SurfaceId::me4xDistortionBuffer) : &m_4xMeDistortionBuffer) : nullptr;
6479             CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
6480                 &meOutputParams.psMeMvBuffer->OsResource,
6481                 CodechalDbgAttr::attrOutput,
6482                 "MvData",
6483                 meOutputParams.psMeMvBuffer->dwHeight *meOutputParams.psMeMvBuffer->dwPitch,
6484                 CodecHal_PictureIsBottomField(m_currOriginalPic) ? MOS_ALIGN_CEIL((m_downscaledWidthInMb4x * 32), 64) * (m_downscaledFrameFieldHeightInMb4x * 4) : 0,
6485                 CODECHAL_MEDIA_STATE_4X_ME));
6486 
6487             if (meOutputParams.psMeDistortionBuffer)
6488             {
6489                 CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
6490                     &meOutputParams.psMeDistortionBuffer->OsResource,
6491                     CodechalDbgAttr::attrOutput,
6492                     "MeDist",
6493                     meOutputParams.psMeDistortionBuffer->dwHeight *meOutputParams.psMeDistortionBuffer->dwPitch,
6494                     m_hmeKernel ? m_hmeKernel->GetDistortionBottomFieldOffset() : (uint32_t)m_meDistortionBottomFieldOffset,
6495                     CODECHAL_MEDIA_STATE_4X_ME));
6496             }
6497 
6498             if (m_16xMeEnabled)
6499             {
6500                 meOutputParams.psMeMvBuffer = m_hmeKernel ? m_hmeKernel->GetSurface(CodechalKernelHme::SurfaceId::me16xMvDataBuffer) : &m_16xMeMvDataBuffer;
6501                 CODECHAL_ENCODE_CHK_STATUS_RETURN(
6502                     m_debugInterface->DumpBuffer(
6503                         &meOutputParams.psMeMvBuffer->OsResource,
6504                         CodechalDbgAttr::attrOutput,
6505                         "MvData",
6506                         meOutputParams.psMeMvBuffer->dwHeight *meOutputParams.psMeMvBuffer->dwPitch,
6507                         CodecHal_PictureIsBottomField(m_currOriginalPic) ? MOS_ALIGN_CEIL((m_downscaledWidthInMb16x * 32), 64) * (m_downscaledFrameFieldHeightInMb16x * 4) : 0,
6508                         CODECHAL_MEDIA_STATE_16X_ME));
6509 
6510                 if (m_32xMeEnabled)
6511                 {
6512                     meOutputParams.psMeMvBuffer = m_hmeKernel ? m_hmeKernel->GetSurface(CodechalKernelHme::SurfaceId::me32xMvDataBuffer) : &m_32xMeMvDataBuffer;
6513                     CODECHAL_ENCODE_CHK_STATUS_RETURN(
6514                         m_debugInterface->DumpBuffer(
6515                             &meOutputParams.psMeMvBuffer->OsResource,
6516                             CodechalDbgAttr::attrOutput,
6517                             "MvData",
6518                             meOutputParams.psMeMvBuffer->dwHeight *meOutputParams.psMeMvBuffer->dwPitch,
6519                             CodecHal_PictureIsBottomField(m_currOriginalPic) ? MOS_ALIGN_CEIL((m_downscaledWidthInMb32x * 32), 64) * (m_downscaledFrameFieldHeightInMb32x * 4) : 0,
6520                             CODECHAL_MEDIA_STATE_32X_ME));
6521                 }
6522             }
6523         }
6524     if (staticFrameDetectionInUse)
6525     {
6526          CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
6527               &resSFDOutputBuffer[0],
6528               CodechalDbgAttr::attrOutput,
6529               "Out",
6530               CODECHAL_ENCODE_AVC_SFD_OUTPUT_BUFFER_SIZE_COMMON,
6531               0,
6532               CODECHAL_MEDIA_STATE_STATIC_FRAME_DETECTION));
6533     }
6534 
6535     if (bBrcEnabled)
6536     {
6537         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
6538             &BrcBuffers.resBrcImageStatesWriteBuffer,
6539             CodechalDbgAttr::attrOutput,
6540             "ImgStateWrite",
6541             BRC_IMG_STATE_SIZE_PER_PASS * m_hwInterface->GetMfxInterface()->GetBrcNumPakPasses(),
6542             0,
6543             CODECHAL_MEDIA_STATE_BRC_UPDATE));
6544 
6545         if (!Mos_ResourceIsNull(&BrcBuffers.sBrcMbQpBuffer.OsResource))
6546         {
6547             CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
6548                 &BrcBuffers.sBrcMbQpBuffer.OsResource,
6549                 CodechalDbgAttr::attrOutput,
6550                 "MbQp",
6551                 BrcBuffers.sBrcMbQpBuffer.dwPitch*BrcBuffers.sBrcMbQpBuffer.dwHeight,
6552                 BrcBuffers.dwBrcMbQpBottomFieldOffset,
6553                 CODECHAL_MEDIA_STATE_MB_BRC_UPDATE));
6554         }
6555         if (bMbBrcEnabled)
6556         {
6557             CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
6558                 &BrcBuffers.resBrcHistoryBuffer,
6559                 CodechalDbgAttr::attrOutput,
6560                 "HistoryWrite",
6561                 m_brcHistoryBufferSize,
6562                 0,
6563                 CODECHAL_MEDIA_STATE_MB_BRC_UPDATE));
6564         }
6565         if (BrcBuffers.pMbEncKernelStateInUse)
6566         {
6567             CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe(
6568                 CODECHAL_MEDIA_STATE_BRC_UPDATE,
6569                 BrcBuffers.pMbEncKernelStateInUse));
6570         }
6571         if (m_mbencBrcBufferSize > 0)
6572         {
6573             CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
6574                 &BrcBuffers.resMbEncBrcBuffer,
6575                 CodechalDbgAttr::attrOutput,
6576                 "MbEncBRCWrite",
6577                 m_mbencBrcBufferSize,
6578                 0,
6579                 CODECHAL_MEDIA_STATE_BRC_UPDATE));
6580         }
6581     }
6582 
6583     if (m_mbStatsSupported)
6584     {
6585         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
6586             &m_resMbStatsBuffer,
6587             CodechalDbgAttr::attrOutput,
6588             "MBStatsSurf",
6589             m_picWidthInMb * m_frameFieldHeightInMb * 16 * sizeof(uint32_t),
6590             CodecHal_PictureIsBottomField(m_currOriginalPic) ? m_mbStatsBottomFieldOffset : 0,
6591             CODECHAL_MEDIA_STATE_4X_SCALING));
6592     }
6593 
6594      else if (m_flatnessCheckEnabled)
6595      {
6596          CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
6597              &m_flatnessCheckSurface.OsResource,
6598              CodechalDbgAttr::attrOutput,
6599              "FlatnessChkSurf",
6600              ((CodecHal_PictureIsField(m_currOriginalPic)) ? m_flatnessCheckSurface.dwHeight/2 : m_flatnessCheckSurface.dwHeight) * m_flatnessCheckSurface.dwPitch,
6601              CodecHal_PictureIsBottomField(m_currOriginalPic)?(m_flatnessCheckSurface.dwPitch * m_flatnessCheckSurface.dwHeight >> 1):0,
6602              CODECHAL_MEDIA_STATE_4X_SCALING));
6603      }
6604 
6605     if (bMbQpDataEnabled)
6606     {
6607         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
6608             &resMbSpecificDataBuffer[m_currRecycledBufIdx],
6609             CodechalDbgAttr::attrInput,
6610             "MbSpecificData",
6611             m_picWidthInMb*m_frameFieldHeightInMb*16,
6612             0,
6613             CODECHAL_MEDIA_STATE_ENC_QUALITY));
6614     }
6615 
6616     uint8_t           index;
6617     CODEC_PICTURE   refPic;
6618     if (bUseWeightedSurfaceForL0)
6619     {
6620         refPic = m_avcSliceParams->RefPicList[LIST_0][0];
6621         index = m_picIdx[refPic.FrameIdx].ucPicIdx;
6622 
6623         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpYUVSurface(
6624             &m_refList[index]->sRefBuffer,
6625             CodechalDbgAttr::attrReferenceSurfaces,
6626             "WP_In_L0"));
6627 
6628         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpYUVSurface(
6629             &WeightedPredOutputPicSelectList[CODEC_WP_OUTPUT_L0_START + 0].sBuffer,
6630             CodechalDbgAttr::attrReferenceSurfaces,
6631             "WP_Out_L0"));
6632     }
6633     if (bUseWeightedSurfaceForL1)
6634     {
6635 
6636         refPic = m_avcSliceParams->RefPicList[LIST_1][0];
6637         index = m_picIdx[refPic.FrameIdx].ucPicIdx;
6638 
6639         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpYUVSurface(
6640             &m_refList[index]->sRefBuffer,
6641             CodechalDbgAttr::attrReferenceSurfaces,
6642             "WP_In_L1"));
6643 
6644         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpYUVSurface(
6645             &WeightedPredOutputPicSelectList[CODEC_WP_OUTPUT_L1_START + 0].sBuffer,
6646             CodechalDbgAttr::attrReferenceSurfaces,
6647             "WP_In_L1"));
6648     }
6649 
6650     if (m_feiEnable)
6651      {
6652          if(m_avcFeiPicParams->bMBQp){
6653              CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
6654                  &m_avcFeiPicParams->resMBQp,
6655                  CodechalDbgAttr::attrInput,
6656                  "MbQp",
6657                  m_picWidthInMb * m_frameFieldHeightInMb + 3,
6658                  0,
6659                  CODECHAL_MEDIA_STATE_ENC_QUALITY));
6660 
6661          }
6662          if (m_avcFeiPicParams->MVPredictorEnable){
6663              CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
6664                  &m_avcFeiPicParams->resMVPredictor,
6665                  CodechalDbgAttr::attrInput,
6666                  "MvPredictor",
6667                  m_picWidthInMb * m_frameFieldHeightInMb *40,
6668                  0,
6669                  CODECHAL_MEDIA_STATE_ENC_QUALITY));
6670          }
6671      }
6672 
6673     if (m_arbitraryNumMbsInSlice)
6674      {
6675          CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
6676             &m_sliceMapSurface[m_currRecycledBufIdx].OsResource,
6677             CodechalDbgAttr::attrInput,
6678             "SliceMapSurf",
6679             m_sliceMapSurface[m_currRecycledBufIdx].dwPitch * m_frameFieldHeightInMb,
6680             0,
6681             CODECHAL_MEDIA_STATE_ENC_QUALITY));
6682      }
6683 
6684     auto refList = &m_refList[0];
6685     auto currRefList = m_refList[m_currReconstructedPic.FrameIdx];
6686     // Dump MBEnc output buffer "MbCodebuffer"
6687     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
6688         &currRefList->resRefMbCodeBuffer,
6689         CodechalDbgAttr::attrOutput,
6690         "EncMbCode",
6691         m_picWidthInMb * m_frameFieldHeightInMb * 64,
6692         CodecHal_PictureIsBottomField(currRefList->RefPic) ? m_frameFieldHeightInMb * m_picWidthInMb * 64 : 0,
6693         CODECHAL_MEDIA_STATE_ENC_NORMAL));
6694 
6695     // Dump MBEnc output buffer "MVdatabuffer"
6696     if (m_mvDataSize)
6697     {
6698         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
6699             &currRefList->resRefMvDataBuffer,
6700             CodechalDbgAttr::attrOutput,
6701             "MbData",
6702             m_picWidthInMb * m_frameFieldHeightInMb * (32 * 4),
6703             CodecHal_PictureIsBottomField(currRefList->RefPic) ? MOS_ALIGN_CEIL(m_frameFieldHeightInMb * m_picWidthInMb * (32 * 4), 0x1000) : 0,
6704             CODECHAL_MEDIA_STATE_ENC_NORMAL));
6705     }
6706      )
6707     return eStatus;
6708 }
6709 
ExecutePictureLevel()6710 MOS_STATUS CodechalEncodeAvcEnc::ExecutePictureLevel()
6711 {
6712     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
6713 
6714     CODECHAL_ENCODE_FUNCTION_ENTER;
6715 
6716     CODECHAL_ENCODE_CHK_NULL_RETURN(m_avcPicParam);
6717     CODECHAL_ENCODE_CHK_NULL_RETURN(m_avcSliceParams);
6718 
6719     MHW_BATCH_BUFFER batchBuffer;
6720     MOS_ZeroMemory(&batchBuffer, sizeof(batchBuffer));
6721     batchBuffer.OsResource = BrcBuffers.resBrcImageStatesWriteBuffer;
6722     batchBuffer.dwOffset = m_currPass * BRC_IMG_STATE_SIZE_PER_PASS;
6723     batchBuffer.bSecondLevel = true;
6724 
6725     CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS    encodePictureLevelParams;
6726     MOS_ZeroMemory(&encodePictureLevelParams, sizeof(encodePictureLevelParams));
6727     encodePictureLevelParams.psPreDeblockSurface = &m_reconSurface;
6728     encodePictureLevelParams.psPostDeblockSurface = &m_reconSurface;
6729     encodePictureLevelParams.bBrcEnabled = bBrcEnabled;
6730     encodePictureLevelParams.pImgStateBatchBuffer = &batchBuffer;
6731     encodePictureLevelParams.presBrcHistoryBuffer = &BrcBuffers.resBrcHistoryBuffer;
6732 
6733     bool deblockingEnabled = m_deblockingEnabled;
6734     bool suppressReconPic =
6735         ((!m_refList[m_currReconstructedPic.FrameIdx]->bUsedAsRef) && m_suppressReconPicSupported);
6736     encodePictureLevelParams.bDeblockerStreamOutEnable = 0;
6737     encodePictureLevelParams.bPreDeblockOutEnable = !deblockingEnabled && !suppressReconPic;
6738     encodePictureLevelParams.bPostDeblockOutEnable = deblockingEnabled && !suppressReconPic;
6739 
6740     CODECHAL_ENCODE_CHK_STATUS_RETURN(GenericEncodePictureLevel(&encodePictureLevelParams));
6741 
6742     return eStatus;
6743 }
6744 
ExecuteSliceLevel()6745 MOS_STATUS CodechalEncodeAvcEnc::ExecuteSliceLevel()
6746 {
6747     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
6748 
6749     CODECHAL_ENCODE_FUNCTION_ENTER;
6750 
6751     CODECHAL_ENCODE_CHK_NULL_RETURN(m_osInterface->osCpInterface);
6752 
6753     auto cpInterface = m_hwInterface->GetCpInterface();
6754     auto avcSlcParams = m_avcSliceParams;
6755     auto avcPicParams = m_avcPicParams[avcSlcParams->pic_parameter_set_id];
6756     auto avcSeqParams = m_avcSeqParams[avcPicParams->seq_parameter_set_id];
6757     auto slcData = m_slcData;
6758 
6759     // For use with the single task phase implementation
6760     if (m_sliceStructCaps != CODECHAL_SLICE_STRUCT_ARBITRARYMBSLICE)
6761     {
6762         uint32_t numSlc = (m_frameFieldHeightInMb + m_sliceHeight - 1) / m_sliceHeight;
6763 
6764         if (numSlc != m_numSlices)
6765         {
6766             return MOS_STATUS_INVALID_PARAMETER;
6767         }
6768     }
6769 
6770     bool useBatchBufferForPakSlices = false;
6771     if (m_singleTaskPhaseSupported  && m_singleTaskPhaseSupportedInPak)
6772     {
6773         if (m_currPass == 0)
6774         {
6775             // The same buffer is used for all slices for all passes.
6776             uint32_t batchBufferForPakSlicesSize =
6777                 (m_numPasses + 1) * m_numSlices * m_pakSliceSize;
6778             if (batchBufferForPakSlicesSize >
6779                 (uint32_t)m_batchBufferForPakSlices[m_currRecycledBufIdx].iSize)
6780             {
6781                 if (m_batchBufferForPakSlices[m_currRecycledBufIdx].iSize)
6782                 {
6783                     CODECHAL_ENCODE_CHK_STATUS_RETURN(ReleaseBatchBufferForPakSlices(m_currRecycledBufIdx));
6784                 }
6785 
6786                 CODECHAL_ENCODE_CHK_STATUS_RETURN(AllocateBatchBufferForPakSlices(
6787                     m_numSlices,
6788                     m_numPasses,
6789                     m_currRecycledBufIdx));
6790             }
6791         }
6792         CODECHAL_ENCODE_CHK_STATUS_RETURN(Mhw_LockBb(
6793             m_osInterface,
6794             &m_batchBufferForPakSlices[m_currRecycledBufIdx]));
6795         useBatchBufferForPakSlices = true;
6796     }
6797 
6798     MOS_COMMAND_BUFFER cmdBuffer;
6799     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0));
6800 
6801     if (m_osInterface->osCpInterface->IsCpEnabled())
6802     {
6803         MHW_CP_SLICE_INFO_PARAMS sliceInfoParam;
6804         sliceInfoParam.bLastPass = (m_currPass == m_numPasses) ? true : false;
6805         CODECHAL_ENCODE_CHK_STATUS_RETURN(cpInterface->SetMfxProtectionState(false, &cmdBuffer, nullptr, &sliceInfoParam));
6806         CODECHAL_ENCODE_CHK_STATUS_RETURN(cpInterface->UpdateParams(false));
6807     }
6808 
6809     avcSlcParams = m_avcSliceParams;
6810 
6811     CODECHAL_ENCODE_AVC_PACK_SLC_HEADER_PARAMS  packSlcHeaderParams;
6812     packSlcHeaderParams.pBsBuffer = &m_bsBuffer;
6813     packSlcHeaderParams.pPicParams = avcPicParams;
6814     packSlcHeaderParams.pSeqParams = m_avcSeqParam;
6815     packSlcHeaderParams.ppRefList = &(m_refList[0]);
6816     packSlcHeaderParams.CurrPic = m_currOriginalPic;
6817     packSlcHeaderParams.CurrReconPic = m_currReconstructedPic;
6818     packSlcHeaderParams.UserFlags = m_userFlags;
6819     packSlcHeaderParams.NalUnitType = m_nalUnitType;
6820     packSlcHeaderParams.wPictureCodingType = m_pictureCodingType;
6821     packSlcHeaderParams.bVdencEnabled = false;
6822 
6823     MHW_VDBOX_AVC_SLICE_STATE sliceState;
6824     MOS_ZeroMemory(&sliceState, sizeof(sliceState));
6825     sliceState.presDataBuffer = &m_resMbCodeSurface;
6826     sliceState.pAvcPicIdx = &(m_picIdx[0]);
6827     sliceState.pEncodeAvcSeqParams = m_avcSeqParam;
6828     sliceState.pEncodeAvcPicParams = avcPicParams;
6829     sliceState.pBsBuffer = &m_bsBuffer;
6830     sliceState.ppNalUnitParams = m_nalUnitParams;
6831     sliceState.bBrcEnabled = bBrcEnabled;
6832     // Disable Panic mode when min/max QP control is on. kernel may disable it, but disable in driver also.
6833     if (avcSeqParams->bForcePanicModeControl == 1) {
6834        sliceState.bRCPanicEnable = (!avcSeqParams->bPanicModeDisable) && (!bMinMaxQPControlEnabled);
6835     } else {
6836         sliceState.bRCPanicEnable = m_panicEnable && (!bMinMaxQPControlEnabled);
6837     }
6838     sliceState.bAcceleratorHeaderPackingCaps = m_encodeParams.bAcceleratorHeaderPackingCaps;
6839     sliceState.wFrameFieldHeightInMB = m_frameFieldHeightInMb;
6840 
6841     MHW_VDBOX_VD_PIPE_FLUSH_PARAMS vdPipelineFlushParams;
6842     for (uint16_t slcCount = 0; slcCount < m_numSlices; slcCount++)
6843     {
6844         if (m_currPass == 0)
6845         {
6846             packSlcHeaderParams.pAvcSliceParams = &avcSlcParams[slcCount];
6847             if (bAcceleratorHeaderPackingCaps)
6848             {
6849                 slcData[slcCount].SliceOffset = m_bsBuffer.SliceOffset;
6850                 CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalAvcEncode_PackSliceHeader(&packSlcHeaderParams));
6851                 slcData[slcCount].BitSize = m_bsBuffer.BitSize;
6852             }
6853             if (m_sliceStructCaps != CODECHAL_SLICE_STRUCT_ARBITRARYMBSLICE)
6854             {
6855                 slcData[slcCount].CmdOffset = slcCount * m_sliceHeight * m_picWidthInMb * 16 * 4;
6856             }
6857             else
6858             {
6859                 slcData[slcCount].CmdOffset = packSlcHeaderParams.pAvcSliceParams->first_mb_in_slice * 16 * 4;
6860             }
6861         }
6862 
6863         sliceState.pEncodeAvcSliceParams = &avcSlcParams[slcCount];
6864         sliceState.dwDataBufferOffset =
6865             m_slcData[slcCount].CmdOffset + m_mbcodeBottomFieldOffset;
6866         sliceState.dwOffset = slcData[slcCount].SliceOffset;
6867         sliceState.dwLength = slcData[slcCount].BitSize;
6868         sliceState.uiSkipEmulationCheckCount = slcData[slcCount].SkipEmulationByteCount;
6869         sliceState.dwSliceIndex = (uint32_t)slcCount;
6870         sliceState.bFirstPass = (m_currPass == 0);
6871         sliceState.bLastPass = (m_currPass == m_numPasses);
6872         sliceState.bInsertBeforeSliceHeaders = (slcCount == 0);
6873         sliceState.bVdencInUse = false;
6874         // App handles tail insertion for VDEnc dynamic slice in non-cp case
6875         sliceState.bVdencNoTailInsertion = false;
6876 
6877         uint32_t batchBufferForPakSlicesStartOffset =
6878             (uint32_t)m_batchBufferForPakSlices[m_currRecycledBufIdx].iCurrent;
6879 
6880         if (useBatchBufferForPakSlices)
6881         {
6882             sliceState.pBatchBufferForPakSlices =
6883                 &m_batchBufferForPakSlices[m_currRecycledBufIdx];
6884             sliceState.bSingleTaskPhaseSupported = true;
6885             sliceState.dwBatchBufferForPakSlicesStartOffset = batchBufferForPakSlicesStartOffset;
6886         }
6887 
6888         if (m_avcRoundingParams != nullptr && m_avcRoundingParams->bEnableCustomRoudingIntra)
6889         {
6890             sliceState.dwRoundingIntraValue         = m_avcRoundingParams->dwRoundingIntra;
6891         }
6892         else
6893         {
6894             sliceState.dwRoundingIntraValue         = 5;
6895         }
6896         if (m_avcRoundingParams != nullptr && m_avcRoundingParams->bEnableCustomRoudingInter)
6897         {
6898             sliceState.bRoundingInterEnable         = true;
6899             sliceState.dwRoundingValue              = m_avcRoundingParams->dwRoundingInter;
6900         }
6901         else
6902         {
6903             sliceState.bRoundingInterEnable         = bRoundingInterEnable;
6904             CODECHAL_ENCODE_CHK_STATUS_RETURN(GetInterRounding(&sliceState));
6905         }
6906 
6907         CODECHAL_ENCODE_CHK_STATUS_RETURN(SendSlice(&cmdBuffer, &sliceState));
6908 
6909         // Add dumps for 2nd level batch buffer
6910         if (sliceState.bSingleTaskPhaseSupported)
6911         {
6912             CODECHAL_ENCODE_CHK_NULL_RETURN(sliceState.pBatchBufferForPakSlices);
6913 
6914             CODECHAL_DEBUG_TOOL(
6915                 CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->Dump2ndLvlBatch(
6916                     sliceState.pBatchBufferForPakSlices,
6917                     CODECHAL_MEDIA_STATE_ENC_NORMAL,
6918                     nullptr));
6919             )
6920         }
6921     }
6922 
6923     if (useBatchBufferForPakSlices)
6924     {
6925         CODECHAL_ENCODE_CHK_STATUS_RETURN(Mhw_UnlockBb(
6926             m_osInterface,
6927             &m_batchBufferForPakSlices[m_currRecycledBufIdx],
6928             m_lastTaskInPhase));
6929     }
6930 
6931     // Insert end of sequence/stream if set
6932     if (m_lastPicInStream || m_lastPicInSeq)
6933     {
6934         MHW_VDBOX_PAK_INSERT_PARAMS pakInsertObjectParams;
6935         MOS_ZeroMemory(&pakInsertObjectParams, sizeof(pakInsertObjectParams));
6936         pakInsertObjectParams.bLastPicInSeq = m_lastPicInSeq;
6937         pakInsertObjectParams.bLastPicInStream = m_lastPicInStream;
6938         pakInsertObjectParams.dwBitSize = 32;   // use dwBitSize for SrcDataEndingBitInclusion
6939         if (m_lastPicInSeq)
6940         {
6941             pakInsertObjectParams.dwLastPicInSeqData = (uint32_t)((1 << 16) | CODECHAL_ENCODE_AVC_NAL_UT_EOSEQ << 24);
6942         }
6943         if (m_lastPicInStream)
6944         {
6945             pakInsertObjectParams.dwLastPicInStreamData = (uint32_t)((1 << 16) | CODECHAL_ENCODE_AVC_NAL_UT_EOSTREAM << 24);
6946         }
6947         pakInsertObjectParams.bHeaderLengthExcludeFrmSize = true;
6948         if (pakInsertObjectParams.bEmulationByteBitsInsert)
6949         {
6950             //Does not matter here, but keeping for consistency
6951             CODECHAL_ENCODE_ASSERTMESSAGE("The emulation prevention bytes are not inserted by the app and are requested to be inserted by HW.");
6952         }
6953         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxPakInsertObject(&cmdBuffer, nullptr, &pakInsertObjectParams));
6954     }
6955 
6956     CODECHAL_ENCODE_CHK_STATUS_RETURN(ReadMfcStatus(&cmdBuffer));
6957 
6958     // BRC PAK statistics different for each pass
6959     if (bBrcEnabled)
6960     {
6961         uint32_t offset =
6962             (m_encodeStatusBuf.wCurrIndex * m_encodeStatusBuf.dwReportSize) +
6963             m_encodeStatusBuf.dwNumPassesOffset +   // Num passes offset
6964             sizeof(uint32_t) * 2;                                                                  // pEncodeStatus is offset by 2 DWs in the resource
6965 
6966         EncodeReadBrcPakStatsParams   readBrcPakStatsParams;
6967         readBrcPakStatsParams.pHwInterface = m_hwInterface;
6968         readBrcPakStatsParams.presBrcPakStatisticBuffer = &BrcBuffers.resBrcPakStatisticBuffer[0];
6969         readBrcPakStatsParams.presStatusBuffer = &m_encodeStatusBuf.resStatusBuffer;
6970         readBrcPakStatsParams.dwStatusBufNumPassesOffset = offset;
6971         readBrcPakStatsParams.ucPass = m_currPass;
6972         readBrcPakStatsParams.VideoContext = m_videoContext;
6973 
6974         CODECHAL_ENCODE_CHK_STATUS_RETURN(ReadBrcPakStatistics(&cmdBuffer, &readBrcPakStatsParams));
6975     }
6976 
6977     CODECHAL_ENCODE_CHK_STATUS_RETURN(EndStatusReport(&cmdBuffer, CODECHAL_NUM_MEDIA_STATES));
6978 
6979     if (!m_singleTaskPhaseSupported || m_lastTaskInPhase)
6980     {
6981         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiBatchBufferEnd(&cmdBuffer, nullptr));
6982     }
6983 
6984     std::string pakPassName = "PAK_PASS" + std::to_string(static_cast<uint32_t>(m_currPass));
6985     CODECHAL_DEBUG_TOOL(
6986         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer(
6987             &cmdBuffer,
6988             CODECHAL_NUM_MEDIA_STATES,
6989             pakPassName.data()));
6990         //CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHal_DbgReplaceAllCommands(
6991         //    m_debugInterface,
6992         //    &cmdBuffer));
6993     )
6994 
6995     m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0);
6996 
6997     // For VDEnc SHME and CSC need to wait workload finish on render engine
6998     if ((m_currPass == 0) && !Mos_ResourceIsNull(&m_resSyncObjectRenderContextInUse))
6999     {
7000         auto syncParams = g_cInitSyncParams;
7001         syncParams.GpuContext = m_videoContext;
7002         syncParams.presSyncResource = &m_resSyncObjectRenderContextInUse;
7003 
7004         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineWait(m_osInterface, &syncParams));
7005     }
7006 
7007     bool renderingFlags = m_videoContextUsesNullHw;
7008 
7009     if (!m_singleTaskPhaseSupported || m_lastTaskInPhase)
7010     {
7011         CODECHAL_ENCODE_CHK_STATUS_RETURN(SubmitCommandBuffer(&cmdBuffer, renderingFlags));
7012 
7013         CODECHAL_DEBUG_TOOL(
7014             if (!m_mmcUserFeatureUpdated) {
7015                 CODECHAL_UPDATE_ENCODE_MMC_USER_FEATURE(m_reconSurface);
7016                 m_mmcUserFeatureUpdated = true;
7017             })
7018 
7019         if (m_sliceSizeStreamoutSupported)
7020         {
7021             CODECHAL_DEBUG_TOOL(CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
7022                 &m_pakSliceSizeStreamoutBuffer,
7023                 CodechalDbgAttr::attrOutput,
7024                 "SliceSizeStreamout",
7025                 CODECHAL_ENCODE_SLICESIZE_BUF_SIZE,
7026                 0,
7027                 CODECHAL_NUM_MEDIA_STATES)));
7028         }
7029 
7030         if ((m_currPass == m_numPasses) &&
7031             m_signalEnc &&
7032             !Mos_ResourceIsNull(&m_resSyncObjectVideoContextInUse))
7033         {
7034             // Check if the signal obj count exceeds max value
7035             if (m_semaphoreObjCount == MOS_MIN(m_semaphoreMaxCount, MOS_MAX_OBJECT_SIGNALED))
7036             {
7037                 auto syncParams = g_cInitSyncParams;
7038                 syncParams.GpuContext = m_renderContext;
7039                 syncParams.presSyncResource = &m_resSyncObjectVideoContextInUse;
7040 
7041                 CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineWait(m_osInterface, &syncParams));
7042                 m_semaphoreObjCount--;
7043             }
7044 
7045             // signal semaphore
7046             auto syncParams = g_cInitSyncParams;
7047             syncParams.GpuContext = m_videoContext;
7048             syncParams.presSyncResource = &m_resSyncObjectVideoContextInUse;
7049 
7050             CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineSignal(m_osInterface, &syncParams));
7051             m_semaphoreObjCount++;
7052         }
7053     }
7054 
7055     // Reset parameters for next PAK execution
7056     if (m_currPass == m_numPasses)
7057     {
7058         if (!m_singleTaskPhaseSupported)
7059         {
7060             m_osInterface->pfnResetPerfBufferID(m_osInterface);
7061         }
7062 
7063         m_newPpsHeader = 0;
7064         m_newSeqHeader = 0;
7065     }
7066 
7067     CODECHAL_DEBUG_TOOL(
7068         CODECHAL_ENCODE_CHK_STATUS_RETURN(PopulateSliceStateParam(
7069             bAdaptiveRoundingInterEnable,
7070             &sliceState));
7071 
7072         CODECHAL_ENCODE_CHK_STATUS_RETURN(DumpFrameParFile());
7073     )
7074 
7075     return eStatus;
7076 }
7077 
UserFeatureKeyReport()7078 MOS_STATUS CodechalEncodeAvcEnc::UserFeatureKeyReport()
7079 {
7080     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
7081 
7082     CODECHAL_ENCODE_FUNCTION_ENTER;
7083 
7084     CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalEncodeAvcBase::UserFeatureKeyReport());
7085 
7086     CODECHAL_ENCODE_CHK_NULL_RETURN(m_avcSeqParam);
7087 
7088     // AVC Encode BRC Reporting
7089     CodecHalEncode_WriteKey(__MEDIA_USER_FEATURE_VALUE_AVC_BRC_ENABLE_ID, bBrcEnabled);
7090 
7091     // AVC HME Reporting
7092     CodecHalEncode_WriteKey(__MEDIA_USER_FEATURE_VALUE_ENCODE_ME_IN_USE_ID, m_hmeSupported);
7093 
7094     // AVC SuperHME Reporting
7095     CodecHalEncode_WriteKey(__MEDIA_USER_FEATURE_VALUE_ENCODE_16xME_IN_USE_ID, m_16xMeSupported);
7096 
7097     // AVC UltraHME Reporting
7098     CodecHalEncode_WriteKey(__MEDIA_USER_FEATURE_VALUE_ENCODE_32xME_IN_USE_ID, m_32xMeSupported);
7099 
7100     // AVC RateControl Method Reporting
7101     CodecHalEncode_WriteKey(__MEDIA_USER_FEATURE_VALUE_ENCODE_RATECONTROL_METHOD_ID, m_avcSeqParam->RateControlMethod);
7102 
7103     // AVC Adaptive Transform Decision Enable Reporting
7104     CodecHalEncode_WriteKey(__MEDIA_USER_FEATURE_VALUE_ADAPTIVE_TRANSFORM_DECISION_ENABLE_ID, m_adaptiveTransformDecisionEnabled);
7105 
7106     // FBR Bypass Enable Reporting
7107     CodecHalEncode_WriteKey(__MEDIA_USER_FEATURE_VALUE_FBR_BYPASS_ENABLE_ID, bFBRBypassEnable);
7108 
7109     // Static frame detection Enable Reporting
7110     CodecHalEncode_WriteKey(__MEDIA_USER_FEATURE_VALUE_STATIC_FRAME_DETECTION_ENABLE_ID, bStaticFrameDetectionEnable);
7111 
7112     // Adaptive Search Windows Enable Reporting
7113     CodecHalEncode_WriteKey(__MEDIA_USER_FEATURE_VALUE_AVC_ADAPTIVE_SEARCH_WINDOW_ENABLE_ID, bApdatvieSearchWindowEnable);
7114 
7115     // AVC FTQ Reporting
7116 #if (_DEBUG || _RELEASE_INTERNAL)
7117     CodecHalEncode_WriteKey(__MEDIA_USER_FEATURE_VALUE_AVC_FTQ_IN_USE_ID, bFTQEnable);
7118 
7119     // AVC CAF Reporting
7120     CodecHalEncode_WriteKey(__MEDIA_USER_FEATURE_VALUE_AVC_CAF_IN_USE_ID, bCAFEnable);
7121 
7122 #endif // _DEBUG || _RELEASE_INTERNAL
7123 
7124     return eStatus;
7125 }
7126 
EncodeGenerateSliceMap(uint8_t * data,PCODEC_AVC_ENCODE_SLICE_PARAMS avcSliceParams)7127 MOS_STATUS CodechalEncodeAvcEnc::EncodeGenerateSliceMap(uint8_t* data, PCODEC_AVC_ENCODE_SLICE_PARAMS avcSliceParams)
7128 {
7129     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
7130 
7131     CODECHAL_ENCODE_CHK_NULL_RETURN(data);
7132     CODECHAL_ENCODE_CHK_NULL_RETURN(avcSliceParams);
7133 
7134     auto sliceMapRow = (uint32_t*)(data + m_sliceMapBottomFieldOffset);
7135     auto sliceMap = sliceMapRow;
7136     uint32_t sliceMapPitch = m_sliceMapSurface[m_currRecycledBufIdx].dwPitch / sizeof(uint32_t);
7137     uint32_t count = 0;
7138 
7139     for (uint32_t j = 0; j < m_numSlices; j++)
7140     {
7141         for (uint32_t i = 0; i < avcSliceParams->NumMbsForSlice; i++)
7142         {
7143             *sliceMap++ = j;
7144             if ((count > 0) && ((count % m_picWidthInMb == 0)))
7145             {
7146                 sliceMapRow += sliceMapPitch;
7147                 sliceMap = sliceMapRow;
7148                 *sliceMap++ = j;
7149             }
7150             count++;
7151         }
7152         avcSliceParams++;
7153     }
7154     *sliceMap++ = 0xFFFFFFFF;        // Set last uint32_t to -1.
7155 
7156     return eStatus;
7157 }
7158 
AllocateResources()7159 MOS_STATUS CodechalEncodeAvcEnc::AllocateResources()
7160 {
7161     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
7162 
7163     CODECHAL_ENCODE_FUNCTION_ENTER;
7164 
7165     CodechalEncodeAvcBase::AllocateResources();
7166 
7167     uint32_t fieldNumMBs = m_picWidthInMb * ((m_picHeightInMb + 1) >> 1);
7168     // Field/frame info not ready here, need to round up to even Height for field mode
7169     uint32_t picWidthHeightInMB = fieldNumMBs * 2;
7170     uint32_t fieldHeightInMB =
7171         CODECHAL_GET_HEIGHT_IN_MACROBLOCKS(((m_frameHeight + 1) >> 1));
7172 
7173     // initiate allocation parameters and lock flags
7174     MOS_ALLOC_GFXRES_PARAMS allocParamsForBufferLinear;
7175     MOS_ZeroMemory(&allocParamsForBufferLinear, sizeof(MOS_ALLOC_GFXRES_PARAMS));
7176     allocParamsForBufferLinear.Type = MOS_GFXRES_BUFFER;
7177     allocParamsForBufferLinear.TileType = MOS_TILE_LINEAR;
7178     allocParamsForBufferLinear.Format = Format_Buffer;
7179 
7180     MOS_ALLOC_GFXRES_PARAMS allocParamsForBuffer2D;
7181     MOS_ZeroMemory(&allocParamsForBuffer2D, sizeof(MOS_ALLOC_GFXRES_PARAMS));
7182     allocParamsForBuffer2D.Type = MOS_GFXRES_2D;
7183     allocParamsForBuffer2D.TileType = MOS_TILE_LINEAR;
7184     allocParamsForBuffer2D.Format = Format_Buffer_2D;
7185 
7186     MOS_LOCK_PARAMS lockFlagsWriteOnly;
7187     MOS_ZeroMemory(&lockFlagsWriteOnly, sizeof(MOS_LOCK_PARAMS));
7188     lockFlagsWriteOnly.WriteOnly = 1;
7189 
7190     if (m_pakEnabled)
7191     {
7192         // Allocate skip frame copy buffer
7193         allocParamsForBufferLinear.dwBytes = dwSkipFrameBufferSize = CODECHAL_PAGE_SIZE;
7194         allocParamsForBufferLinear.pBufName = "Skip Frame Copy Buffer";
7195 
7196         CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(m_osInterface->pfnAllocateResource(
7197             m_osInterface,
7198             &allocParamsForBufferLinear,
7199             &resSkipFrameBuffer), "Failed to allocate Skip Frame Copy Buffer\n");
7200     }
7201 
7202     // Allocate SEI buffer
7203     SeiData.pSEIBuffer = (uint8_t *)MOS_AllocAndZeroMemory(CODECHAL_ENCODE_AVC_SEI_BUFFER_SIZE);
7204     if (SeiData.pSEIBuffer == nullptr)
7205     {
7206         CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate SEI Buffer.");
7207         eStatus = MOS_STATUS_UNKNOWN;
7208         return eStatus;
7209     }
7210     SeiData.dwSEIBufSize = CODECHAL_ENCODE_AVC_SEI_BUFFER_SIZE;
7211 
7212     // Resources required by legacy AVC ENC
7213     if (m_encEnabled)
7214     {
7215         CODECHAL_ENCODE_CHK_STATUS_RETURN(AllocateResourcesBrc());
7216 
7217         bVMEScratchBuffer =
7218             (MbEncBindingTable.dwAvcMBEncDebugScratch != CODECHAL_INVALID_BINDING_TABLE_IDX);
7219 
7220         if (bVMEScratchBuffer)
7221         {
7222             // VME Scratch buffer (HSW), 256 bytes (8 GRFs) per MB
7223             uint32_t size = m_picWidthInMb * m_picHeightInMb * 256;
7224             allocParamsForBufferLinear.dwBytes = size;
7225             allocParamsForBufferLinear.pBufName = "VME Scratch Buffer";
7226 
7227             eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource(
7228                 m_osInterface,
7229                 &allocParamsForBufferLinear,
7230                 &resVMEScratchBuffer);
7231 
7232             if (eStatus != MOS_STATUS_SUCCESS)
7233             {
7234                 CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate VME Scratch Buffer.");
7235                 return eStatus;
7236             }
7237 
7238             uint8_t* data = (uint8_t*)m_osInterface->pfnLockResource(
7239                 m_osInterface,
7240                 &(resVMEScratchBuffer),
7241                 &lockFlagsWriteOnly);
7242             MOS_ZeroMemory(data, size);
7243             m_osInterface->pfnUnlockResource(
7244                 m_osInterface,
7245                 &resVMEScratchBuffer);
7246         }
7247 
7248         // allocate VME Kernel Dump buffer
7249         if (bVMEKernelDump)
7250         {
7251             allocParamsForBufferLinear.dwBytes = picWidthHeightInMB;
7252             allocParamsForBufferLinear.pBufName = "VME Kernel Dump Buffer";
7253 
7254             eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource(
7255                 m_osInterface,
7256                 &allocParamsForBufferLinear,
7257                 &resVmeKernelDumpBuffer);
7258 
7259             if (eStatus != MOS_STATUS_SUCCESS)
7260             {
7261                 CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate VME Kernel Dump Buffer.");
7262                 return eStatus;
7263             }
7264         }
7265 
7266         if (bRefPicSelectListSupported)
7267         {
7268             auto refPicSelect = RefPicSelectList;
7269             for (uint32_t i = 0; i < CODECHAL_ENCODE_AVC_REF_PIC_SELECT_ENTRIES; i++, refPicSelect++)
7270             {
7271                 MOS_ZeroMemory(&refPicSelect->sBuffer, sizeof(MOS_SURFACE));
7272                 refPicSelect->FrameIdx = CODECHAL_ENCODE_AVC_INVALID_PIC_ID;
7273                 refPicSelect->sBuffer.TileType = MOS_TILE_LINEAR;
7274                 refPicSelect->sBuffer.bArraySpacing = true;
7275                 refPicSelect->sBuffer.Format = Format_Buffer_2D;
7276                 refPicSelect->sBuffer.dwWidth = MOS_ALIGN_CEIL((m_picWidthInMb * 8), 64);
7277                 refPicSelect->sBuffer.dwHeight = MOS_ALIGN_CEIL(2 * fieldHeightInMB, 8);
7278                 refPicSelect->sBuffer.dwPitch = MOS_ALIGN_CEIL((m_picWidthInMb * 8), 64);
7279 
7280                 allocParamsForBuffer2D.dwWidth = refPicSelect->sBuffer.dwWidth;
7281                 allocParamsForBuffer2D.dwHeight = refPicSelect->sBuffer.dwHeight;
7282                 allocParamsForBuffer2D.pBufName = "RefPicSelectList Buffer";
7283 
7284                 eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource(
7285                     m_osInterface,
7286                     &allocParamsForBuffer2D,
7287                     &refPicSelect->sBuffer.OsResource);
7288 
7289                 if (eStatus != MOS_STATUS_SUCCESS)
7290                 {
7291                     CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate RefPicSelectList Buffer.");
7292                     return eStatus;
7293                 }
7294             }
7295         }
7296     }
7297 
7298     if (bStaticFrameDetectionEnable)
7299     {
7300         // SFD output buffer
7301         allocParamsForBufferLinear.dwBytes = MOS_ALIGN_CEIL(CODECHAL_ENCODE_AVC_SFD_OUTPUT_BUFFER_SIZE_COMMON, CODECHAL_CACHELINE_SIZE);
7302         allocParamsForBufferLinear.pBufName = "Static frame detection output buffer";
7303 
7304         CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(m_osInterface->pfnAllocateResource(
7305             m_osInterface,
7306             &allocParamsForBufferLinear,
7307             &resSFDOutputBuffer[0]), "Failed to allocate static frame detection output buffer\n");
7308 
7309         // SFD P-frame cost table buffer
7310         allocParamsForBufferLinear.dwBytes = MOS_ALIGN_CEIL(CODECHAL_ENCODE_AVC_SFD_COST_TABLE_BUFFER_SIZE_COMMON, CODECHAL_CACHELINE_SIZE);
7311         allocParamsForBufferLinear.pBufName = "SFD P-frame cost table buffer";
7312 
7313         CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(m_osInterface->pfnAllocateResource(
7314             m_osInterface,
7315             &allocParamsForBufferLinear,
7316             &resSFDCostTablePFrameBuffer), "Failed to allocate SFD P-frame cost table buffer\n");
7317 
7318         CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(m_osInterface->pfnAllocateResource(
7319             m_osInterface,
7320             &allocParamsForBufferLinear,
7321             &resSFDCostTableBFrameBuffer), "Failed to allocate SFD B-frame cost table buffer\n");
7322 
7323         // copy SFD P-frame cost table
7324         uint8_t* data;
7325         if (nullptr == (data = (uint8_t*)m_osInterface->pfnLockResource(
7326             m_osInterface,
7327             &resSFDCostTablePFrameBuffer,
7328             &lockFlagsWriteOnly)))
7329         {
7330             CODECHAL_ENCODE_ASSERTMESSAGE("Failed to Lock SFD P-frame cost table Buffer.");
7331             eStatus = MOS_STATUS_UNKNOWN;
7332             return eStatus;
7333         }
7334         CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(MOS_SecureMemcpy(data,
7335                                                       CODECHAL_ENCODE_AVC_SFD_COST_TABLE_BUFFER_SIZE_COMMON * sizeof(uint8_t),
7336                                                       m_codechalEncodeAvcSfdCostTablePFrame,
7337                                                       CODECHAL_ENCODE_AVC_SFD_COST_TABLE_BUFFER_SIZE_COMMON * sizeof(uint8_t)),
7338             "Failed to copy SFD P-frame cost table");
7339         m_osInterface->pfnUnlockResource(m_osInterface, &resSFDCostTablePFrameBuffer);
7340 
7341         // copy SFD B-frame cost table
7342         if (nullptr == (data = (uint8_t*)m_osInterface->pfnLockResource(
7343             m_osInterface,
7344             &resSFDCostTableBFrameBuffer,
7345             &lockFlagsWriteOnly)))
7346         {
7347             CODECHAL_ENCODE_ASSERTMESSAGE("Failed to Lock SFD B-frame cost table Buffer.");
7348             eStatus = MOS_STATUS_UNKNOWN;
7349             return eStatus;
7350         }
7351         CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(MOS_SecureMemcpy(data,
7352                                                       CODECHAL_ENCODE_AVC_SFD_COST_TABLE_BUFFER_SIZE_COMMON * sizeof(uint8_t),
7353                                                       m_codechalEncodeAvcSfdCostTableBFrame,
7354                                                       CODECHAL_ENCODE_AVC_SFD_COST_TABLE_BUFFER_SIZE_COMMON * sizeof(uint8_t)),
7355             "Failed to copy SFD B-frame cost table");
7356         m_osInterface->pfnUnlockResource(m_osInterface, &resSFDCostTableBFrameBuffer);
7357     }
7358 
7359     // allocate MB specific data buffer
7360     allocParamsForBufferLinear.dwBytes = picWidthHeightInMB * sizeof(CODECHAL_ENCODE_AVC_MB_SPECIFIC_PARAMS);
7361     allocParamsForBufferLinear.pBufName = "MB Specific Data Buffer";
7362 
7363     for (uint32_t i = 0; i < CODECHAL_ENCODE_RECYCLED_BUFFER_NUM; i++)
7364     {
7365         eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource(
7366             m_osInterface,
7367             &allocParamsForBufferLinear,
7368             &resMbSpecificDataBuffer[i]);
7369 
7370         if (eStatus != MOS_STATUS_SUCCESS)
7371         {
7372             CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate MB Specific Data Buffer.");
7373             return eStatus;
7374         }
7375     }
7376 
7377     return eStatus;
7378 }
7379 
AllocateResourcesBrc()7380 MOS_STATUS CodechalEncodeAvcEnc::AllocateResourcesBrc()
7381 {
7382     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
7383 
7384     CODECHAL_ENCODE_FUNCTION_ENTER;
7385 
7386     // initiate allocation parameters and lock flags
7387     MOS_ALLOC_GFXRES_PARAMS allocParamsForBufferLinear;
7388     MOS_ZeroMemory(&allocParamsForBufferLinear, sizeof(MOS_ALLOC_GFXRES_PARAMS));
7389     allocParamsForBufferLinear.Type = MOS_GFXRES_BUFFER;
7390     allocParamsForBufferLinear.TileType = MOS_TILE_LINEAR;
7391     allocParamsForBufferLinear.Format = Format_Buffer;
7392 
7393     MOS_ALLOC_GFXRES_PARAMS allocParamsForBuffer2D;
7394     MOS_ZeroMemory(&allocParamsForBuffer2D, sizeof(MOS_ALLOC_GFXRES_PARAMS));
7395     allocParamsForBuffer2D.Type = MOS_GFXRES_2D;
7396     allocParamsForBuffer2D.TileType = MOS_TILE_LINEAR;
7397     allocParamsForBuffer2D.Format = Format_Buffer_2D;
7398 
7399     MOS_LOCK_PARAMS lockFlagsWriteOnly;
7400     MOS_ZeroMemory(&lockFlagsWriteOnly, sizeof(MOS_LOCK_PARAMS));
7401     lockFlagsWriteOnly.WriteOnly = 1;
7402 
7403     // BRC history buffer
7404     uint32_t size = m_brcHistoryBufferSize;
7405     allocParamsForBufferLinear.dwBytes = size;
7406     allocParamsForBufferLinear.pBufName = "BRC History Buffer";
7407 
7408     eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource(
7409         m_osInterface,
7410         &allocParamsForBufferLinear,
7411         &BrcBuffers.resBrcHistoryBuffer);
7412 
7413     if (eStatus != MOS_STATUS_SUCCESS)
7414     {
7415         CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate BRC History Buffer.");
7416         return eStatus;
7417     }
7418 
7419     uint8_t* pData = (uint8_t*)m_osInterface->pfnLockResource(
7420         m_osInterface,
7421         &(BrcBuffers.resBrcHistoryBuffer),
7422         &lockFlagsWriteOnly);
7423 
7424     if (pData == nullptr)
7425     {
7426         CODECHAL_ENCODE_ASSERTMESSAGE("Failed to Lock BRC History Buffer.");
7427         eStatus = MOS_STATUS_UNKNOWN;
7428         return eStatus;
7429     }
7430 
7431     MOS_ZeroMemory(pData, size);
7432     m_osInterface->pfnUnlockResource(m_osInterface, &BrcBuffers.resBrcHistoryBuffer);
7433 
7434     // PAK Statistics buffer
7435     size = m_brcPakStatisticsSize;
7436     allocParamsForBufferLinear.dwBytes = size;
7437     allocParamsForBufferLinear.pBufName = "BRC PAK Statistics Buffer";
7438 
7439     eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource(
7440         m_osInterface,
7441         &allocParamsForBufferLinear,
7442         &BrcBuffers.resBrcPakStatisticBuffer[0]);
7443 
7444     if (eStatus != MOS_STATUS_SUCCESS)
7445     {
7446         CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate BRC PAK Statistics Buffer.");
7447         return eStatus;
7448     }
7449 
7450     pData = (uint8_t*)m_osInterface->pfnLockResource(
7451         m_osInterface,
7452         &(BrcBuffers.resBrcPakStatisticBuffer[0]),
7453         &lockFlagsWriteOnly);
7454 
7455     if (pData == nullptr)
7456     {
7457         CODECHAL_ENCODE_ASSERTMESSAGE("Failed to Lock BRC PAK Statistics Buffer.");
7458         eStatus = MOS_STATUS_UNKNOWN;
7459         return eStatus;
7460     }
7461 
7462     MOS_ZeroMemory(pData, size);
7463     m_osInterface->pfnUnlockResource(m_osInterface, &BrcBuffers.resBrcPakStatisticBuffer[0]);
7464 
7465     // PAK IMG_STATEs buffer
7466     // Use BRC_MAXIMUM_NUM_PASSES here since actual number of passes is determined later using PicParams.BRCPrecision
7467     size = BRC_IMG_STATE_SIZE_PER_PASS * CODECHAL_ENCODE_BRC_MAXIMUM_NUM_PASSES;
7468     allocParamsForBufferLinear.dwBytes = size;
7469     allocParamsForBufferLinear.pBufName = "PAK IMG State Read Buffer";
7470 
7471     for (uint32_t i = 0; i < CODECHAL_ENCODE_RECYCLED_BUFFER_NUM; i++)
7472     {
7473         eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource(
7474             m_osInterface,
7475             &allocParamsForBufferLinear,
7476             &BrcBuffers.resBrcImageStatesReadBuffer[i]);
7477 
7478         if (eStatus != MOS_STATUS_SUCCESS)
7479         {
7480             CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate BRC IMG State Read Buffer.");
7481             return eStatus;
7482         }
7483 
7484         pData = (uint8_t*)m_osInterface->pfnLockResource(
7485             m_osInterface,
7486             &(BrcBuffers.resBrcImageStatesReadBuffer[i]),
7487             &lockFlagsWriteOnly);
7488 
7489         if (pData == nullptr)
7490         {
7491             CODECHAL_ENCODE_ASSERTMESSAGE("Failed to Lock BRC IMG State Read Buffer.");
7492             eStatus = MOS_STATUS_UNKNOWN;
7493             return eStatus;
7494         }
7495 
7496         MOS_ZeroMemory(pData, size);
7497         m_osInterface->pfnUnlockResource(m_osInterface, &BrcBuffers.resBrcImageStatesReadBuffer[i]);
7498     }
7499 
7500     allocParamsForBufferLinear.pBufName = "PAK IMG State Write Buffer";
7501     eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource(
7502         m_osInterface,
7503         &allocParamsForBufferLinear,
7504         &BrcBuffers.resBrcImageStatesWriteBuffer);
7505 
7506     if (eStatus != MOS_STATUS_SUCCESS)
7507     {
7508         CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate BRC IMG State Write Buffer.");
7509         return eStatus;
7510     }
7511 
7512     pData = (uint8_t*)m_osInterface->pfnLockResource(
7513         m_osInterface,
7514         &(BrcBuffers.resBrcImageStatesWriteBuffer),
7515         &lockFlagsWriteOnly);
7516 
7517     if (pData == nullptr)
7518     {
7519         CODECHAL_ENCODE_ASSERTMESSAGE("Failed to Lock BRC IMG State Write Buffer.");
7520         eStatus = MOS_STATUS_UNKNOWN;
7521         return eStatus;
7522     }
7523 
7524     MOS_ZeroMemory(pData, size);
7525     m_osInterface->pfnUnlockResource(m_osInterface, &BrcBuffers.resBrcImageStatesWriteBuffer);
7526 
7527     // Check if the constant data surface is present
7528     for (uint32_t i = 0; i < CODECHAL_ENCODE_RECYCLED_BUFFER_NUM; i++)
7529     {
7530         //BRC Constant Data Surfaces
7531         MOS_ZeroMemory(&BrcBuffers.sBrcConstantDataBuffer[i], sizeof(MOS_SURFACE));
7532         BrcBuffers.sBrcConstantDataBuffer[i].TileType = MOS_TILE_LINEAR;
7533         BrcBuffers.sBrcConstantDataBuffer[i].bArraySpacing = true;
7534         BrcBuffers.sBrcConstantDataBuffer[i].Format = Format_Buffer_2D;
7535         BrcBuffers.sBrcConstantDataBuffer[i].dwWidth =
7536             dwBrcConstantSurfaceWidth;
7537         BrcBuffers.sBrcConstantDataBuffer[i].dwHeight =
7538             dwBrcConstantSurfaceHeight;
7539         BrcBuffers.sBrcConstantDataBuffer[i].dwPitch =
7540             dwBrcConstantSurfaceWidth;
7541 
7542         allocParamsForBuffer2D.dwWidth = MOS_ALIGN_CEIL(dwBrcConstantSurfaceWidth, 64);
7543         allocParamsForBuffer2D.dwHeight = dwBrcConstantSurfaceHeight;
7544         allocParamsForBuffer2D.pBufName = "BRC Constant Data Buffer";
7545 
7546         eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource(
7547             m_osInterface,
7548             &allocParamsForBuffer2D,
7549             &BrcBuffers.sBrcConstantDataBuffer[i].OsResource);
7550 
7551         if (eStatus != MOS_STATUS_SUCCESS)
7552         {
7553             CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate BRC Constant Data Buffer.");
7554             return eStatus;
7555         }
7556     }
7557 
7558     uint32_t width, height, downscaledFieldHeightInMB4x;
7559     if (bBrcDistortionBufferSupported)
7560     {
7561         // BRC Distortion Surface
7562         downscaledFieldHeightInMB4x = CODECHAL_GET_HEIGHT_IN_MACROBLOCKS((m_frameHeight + 1) >> 3);
7563         width = MOS_ALIGN_CEIL((m_downscaledWidthInMb4x << 3), 64);
7564         height = MOS_ALIGN_CEIL((downscaledFieldHeightInMB4x << 2), 8) << 1;
7565 
7566         allocParamsForBuffer2D.dwWidth = width;
7567         allocParamsForBuffer2D.dwHeight = height;
7568         allocParamsForBuffer2D.pBufName = "BRC Distortion Surface Buffer";
7569 
7570         eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource(
7571             m_osInterface,
7572             &allocParamsForBuffer2D,
7573             &BrcBuffers.sMeBrcDistortionBuffer.OsResource);
7574 
7575         if (eStatus != MOS_STATUS_SUCCESS)
7576         {
7577             CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate  ME BRC Distortion Buffer.");
7578             return eStatus;
7579         }
7580 
7581         BrcBuffers.sMeBrcDistortionBuffer.TileType = MOS_TILE_LINEAR;
7582         BrcBuffers.sMeBrcDistortionBuffer.bArraySpacing = true;
7583         BrcBuffers.sMeBrcDistortionBuffer.Format = Format_Buffer_2D;
7584         BrcBuffers.sMeBrcDistortionBuffer.dwWidth = width;
7585         BrcBuffers.sMeBrcDistortionBuffer.dwHeight = height;
7586         BrcBuffers.sMeBrcDistortionBuffer.dwPitch = (uint32_t)BrcBuffers.sMeBrcDistortionBuffer.OsResource.pGmmResInfo->GetRenderPitch();
7587 
7588         pData = (uint8_t*)m_osInterface->pfnLockResource(
7589             m_osInterface,
7590             &(BrcBuffers.sMeBrcDistortionBuffer.OsResource),
7591             &lockFlagsWriteOnly);
7592 
7593         if (pData == nullptr)
7594         {
7595             CODECHAL_ENCODE_ASSERTMESSAGE("Failed to Lock ME BRC Distortion Buffer.");
7596             eStatus = MOS_STATUS_UNKNOWN;
7597             return eStatus;
7598         }
7599 
7600         size = BrcBuffers.sMeBrcDistortionBuffer.dwPitch * BrcBuffers.sMeBrcDistortionBuffer.dwHeight;
7601         MOS_ZeroMemory(pData, size);
7602         m_osInterface->pfnUnlockResource(
7603             m_osInterface, &BrcBuffers.sMeBrcDistortionBuffer.OsResource);
7604     }
7605 
7606     // MbBrcConstDataBuffer
7607     // 16 DWs per QP value
7608     size = 16 * (CODEC_AVC_NUM_QP) * sizeof(uint32_t);
7609     allocParamsForBufferLinear.dwBytes = size;
7610     allocParamsForBufferLinear.pBufName = "MB BRC Constant Data Buffer";
7611 
7612     for (uint32_t i = 0; i < CODECHAL_ENCODE_RECYCLED_BUFFER_NUM; i++)
7613     {
7614         eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource(
7615             m_osInterface,
7616             &allocParamsForBufferLinear,
7617             &BrcBuffers.resMbBrcConstDataBuffer[i]);
7618 
7619         if (eStatus != MOS_STATUS_SUCCESS)
7620         {
7621             CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate MB BRC Constant Data Buffer.");
7622             return eStatus;
7623         }
7624         pData = (uint8_t*)m_osInterface->pfnLockResource(
7625             m_osInterface,
7626             &(BrcBuffers.resMbBrcConstDataBuffer[i]),
7627             &lockFlagsWriteOnly);
7628         MOS_ZeroMemory(pData, size);
7629         m_osInterface->pfnUnlockResource(
7630             m_osInterface,
7631             &BrcBuffers.resMbBrcConstDataBuffer[i]);
7632     }
7633 
7634     // Use a separate surface MbEnc DSH data
7635     if(!CodecHalIsFeiEncode(m_codecFunction))
7636     {
7637     size =
7638         m_renderEngineInterface->m_stateHeapInterface->pStateHeapInterface->GetSizeofCmdInterfaceDescriptorData() +
7639         MOS_ALIGN_CEIL(pMbEncKernelStates->KernelParams.iCurbeLength,
7640             m_renderEngineInterface->m_stateHeapInterface->pStateHeapInterface->GetCurbeAlignment());
7641     allocParamsForBufferLinear.dwBytes = size;
7642     allocParamsForBufferLinear.pBufName = "MbEnc Curbe Buffer";
7643 
7644     eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource(
7645         m_osInterface,
7646         &allocParamsForBufferLinear,
7647         &BrcBuffers.resMbEncAdvancedDsh);
7648 
7649     if (eStatus != MOS_STATUS_SUCCESS)
7650     {
7651         CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate MbEnc Curbe Buffer.");
7652         return eStatus;
7653     }
7654 
7655     pData = (uint8_t*)m_osInterface->pfnLockResource(
7656         m_osInterface,
7657         &BrcBuffers.resMbEncAdvancedDsh,
7658         &lockFlagsWriteOnly);
7659 
7660     if (pData == nullptr)
7661     {
7662         CODECHAL_ENCODE_ASSERTMESSAGE("Failed to Lock MbEnc Curbe Buffer.");
7663         eStatus = MOS_STATUS_UNKNOWN;
7664         return eStatus;
7665     }
7666 
7667     MOS_ZeroMemory(pData, size);
7668     m_osInterface->pfnUnlockResource(
7669         m_osInterface,
7670         &BrcBuffers.resMbEncAdvancedDsh);
7671     }
7672     // MbEnc BRC buffer - buffer written by BRC and used by MbEnc
7673     if (bDecoupleMbEncCurbeFromBRC)
7674     {
7675         size = m_mbencBrcBufferSize;
7676         allocParamsForBufferLinear.dwBytes = size;
7677         allocParamsForBufferLinear.pBufName = "MbEnc BRC buffer";
7678 
7679         eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource(
7680             m_osInterface,
7681             &allocParamsForBufferLinear,
7682             &BrcBuffers.resMbEncBrcBuffer);
7683 
7684         if (eStatus != MOS_STATUS_SUCCESS)
7685         {
7686             CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate MbEnc BRC buffer.");
7687             return eStatus;
7688         }
7689 
7690         pData = (uint8_t*)m_osInterface->pfnLockResource(
7691             m_osInterface,
7692             &(BrcBuffers.resMbEncBrcBuffer),
7693             &lockFlagsWriteOnly);
7694 
7695         if (pData == nullptr)
7696         {
7697             CODECHAL_ENCODE_ASSERTMESSAGE("Failed to Lock MbEnc BRC buffer.");
7698             eStatus = MOS_STATUS_UNKNOWN;
7699             return eStatus;
7700         }
7701 
7702         MOS_ZeroMemory(pData, size);
7703         m_osInterface->pfnUnlockResource(m_osInterface, &BrcBuffers.resMbEncBrcBuffer);
7704     }
7705 
7706     return eStatus;
7707 }
7708 
AllocateResourcesMbBrc()7709 MOS_STATUS CodechalEncodeAvcEnc::AllocateResourcesMbBrc()
7710 {
7711     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
7712 
7713     CODECHAL_ENCODE_FUNCTION_ENTER;
7714 
7715     // initiate allocation paramters and lock flags
7716     MOS_ALLOC_GFXRES_PARAMS allocParamsForBuffer2D;
7717     MOS_ZeroMemory(&allocParamsForBuffer2D, sizeof(MOS_ALLOC_GFXRES_PARAMS));
7718     allocParamsForBuffer2D.Type = MOS_GFXRES_2D;
7719     allocParamsForBuffer2D.TileType = MOS_TILE_LINEAR;
7720     allocParamsForBuffer2D.Format = Format_Buffer_2D;
7721 
7722     MOS_LOCK_PARAMS lockFlagsWriteOnly;
7723     MOS_ZeroMemory(&lockFlagsWriteOnly, sizeof(MOS_LOCK_PARAMS));
7724     lockFlagsWriteOnly.WriteOnly = 1;
7725 
7726     uint32_t downscaledFieldHeightInMB4x = CODECHAL_GET_HEIGHT_IN_MACROBLOCKS((m_frameHeight + 1) >> 3);
7727 
7728     // Mb QP Surface
7729     if (Mos_ResourceIsNull(&BrcBuffers.sBrcMbQpBuffer.OsResource))
7730     {
7731         uint32_t width = MOS_ALIGN_CEIL((m_downscaledWidthInMb4x << 2), 64);
7732         uint32_t height = MOS_ALIGN_CEIL((downscaledFieldHeightInMB4x << 2), 8) << 1;
7733         uint32_t size = width * height;
7734 
7735         MOS_ZeroMemory(&BrcBuffers.sBrcMbQpBuffer, sizeof(MOS_SURFACE));
7736         BrcBuffers.sBrcMbQpBuffer.TileType = MOS_TILE_LINEAR;
7737         BrcBuffers.sBrcMbQpBuffer.bArraySpacing = true;
7738         BrcBuffers.sBrcMbQpBuffer.Format = Format_Buffer_2D;
7739         BrcBuffers.sBrcMbQpBuffer.dwWidth = allocParamsForBuffer2D.dwWidth = width;
7740         BrcBuffers.sBrcMbQpBuffer.dwHeight = allocParamsForBuffer2D.dwHeight = height;
7741         BrcBuffers.sBrcMbQpBuffer.dwPitch = width;
7742         allocParamsForBuffer2D.pBufName = "BRC MB QP Buffer";
7743 
7744         CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(m_osInterface->pfnAllocateResource(
7745             m_osInterface,
7746             &allocParamsForBuffer2D,
7747             &BrcBuffers.sBrcMbQpBuffer.OsResource), "Failed to allocate BRC MB QP surface.");
7748 
7749         uint8_t* pData = (uint8_t*)m_osInterface->pfnLockResource(
7750             m_osInterface,
7751             &(BrcBuffers.sBrcMbQpBuffer.OsResource),
7752             &lockFlagsWriteOnly);
7753 
7754         if (pData == nullptr)
7755         {
7756             CODECHAL_ENCODE_ASSERTMESSAGE("Failed to Lock BRC MB QP Buffer.");
7757             eStatus = MOS_STATUS_UNKNOWN;
7758             return eStatus;
7759         }
7760 
7761         MOS_ZeroMemory(pData, size);
7762         m_osInterface->pfnUnlockResource(
7763             m_osInterface,
7764             &BrcBuffers.sBrcMbQpBuffer.OsResource);
7765     }
7766 
7767     // BRC ROI Surface
7768     if (Mos_ResourceIsNull(&BrcBuffers.sBrcRoiSurface.OsResource) && bBrcRoiEnabled)
7769     {
7770         uint32_t width = MOS_ALIGN_CEIL((m_downscaledWidthInMb4x << 4), 64);
7771         uint32_t height = MOS_ALIGN_CEIL((downscaledFieldHeightInMB4x << 2), 8) << 1;
7772 
7773         MOS_ZeroMemory(&BrcBuffers.sBrcRoiSurface, sizeof(MOS_SURFACE));
7774         allocParamsForBuffer2D.dwWidth = width;
7775         allocParamsForBuffer2D.dwHeight = height;
7776         allocParamsForBuffer2D.pBufName = "BRC ROI Surface";
7777 
7778         CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(m_osInterface->pfnAllocateResource(
7779             m_osInterface,
7780             &allocParamsForBuffer2D,
7781             &BrcBuffers.sBrcRoiSurface.OsResource), "Failed to allocate BRC ROI surface.");
7782 
7783         BrcBuffers.sBrcRoiSurface.TileType = MOS_TILE_LINEAR;
7784         BrcBuffers.sBrcRoiSurface.bArraySpacing = true;
7785         BrcBuffers.sBrcRoiSurface.Format = Format_Buffer_2D;
7786         BrcBuffers.sBrcRoiSurface.dwWidth = width;
7787         BrcBuffers.sBrcRoiSurface.dwHeight = height;
7788         BrcBuffers.sBrcRoiSurface.dwPitch = (uint32_t)BrcBuffers.sBrcRoiSurface.OsResource.pGmmResInfo->GetRenderPitch();
7789 
7790         uint8_t* pData = (uint8_t*)m_osInterface->pfnLockResource(
7791             m_osInterface,
7792             &(BrcBuffers.sBrcRoiSurface.OsResource),
7793             &lockFlagsWriteOnly);
7794 
7795         if (pData == nullptr)
7796         {
7797             CODECHAL_ENCODE_ASSERTMESSAGE("Failed to Lock BRC ROI surface.");
7798             eStatus = MOS_STATUS_UNKNOWN;
7799             return eStatus;
7800         }
7801 
7802         uint32_t size = BrcBuffers.sBrcRoiSurface.dwPitch * BrcBuffers.sBrcRoiSurface.dwHeight;
7803         MOS_ZeroMemory(pData, size);
7804         m_osInterface->pfnUnlockResource(
7805             m_osInterface,
7806             &BrcBuffers.sBrcRoiSurface.OsResource);
7807     }
7808 
7809     return eStatus;
7810 }
7811 
ReleaseResourcesBrc()7812 MOS_STATUS CodechalEncodeAvcEnc::ReleaseResourcesBrc()
7813 {
7814     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
7815 
7816     CODECHAL_ENCODE_FUNCTION_ENTER;
7817 
7818     m_osInterface->pfnFreeResource(
7819         m_osInterface,
7820         &BrcBuffers.resBrcHistoryBuffer);
7821 
7822     m_osInterface->pfnFreeResource(
7823         m_osInterface,
7824         &BrcBuffers.resBrcPakStatisticBuffer[0]);
7825 
7826     for (int i = 0; i < CODECHAL_ENCODE_RECYCLED_BUFFER_NUM; i++)
7827     {
7828         m_osInterface->pfnFreeResource(
7829             m_osInterface,
7830             &BrcBuffers.resBrcImageStatesReadBuffer[i]);
7831 
7832         m_osInterface->pfnFreeResource(
7833             m_osInterface,
7834             &BrcBuffers.sBrcConstantDataBuffer[i].OsResource);
7835 
7836         m_osInterface->pfnFreeResource(
7837             m_osInterface,
7838             &BrcBuffers.resMbBrcConstDataBuffer[i]);
7839     }
7840 
7841     m_osInterface->pfnFreeResource(
7842         m_osInterface,
7843         &BrcBuffers.resBrcImageStatesWriteBuffer);
7844 
7845     m_osInterface->pfnFreeResource(
7846         m_osInterface,
7847         &BrcBuffers.sMeBrcDistortionBuffer.OsResource);
7848 
7849     m_osInterface->pfnFreeResource(m_osInterface, &BrcBuffers.resMbEncAdvancedDsh);
7850 
7851     m_osInterface->pfnFreeResource(
7852         m_osInterface,
7853         &BrcBuffers.resMbEncBrcBuffer);
7854 
7855     return eStatus;
7856 }
7857 
ReleaseResourcesMbBrc()7858 MOS_STATUS CodechalEncodeAvcEnc::ReleaseResourcesMbBrc()
7859 {
7860     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
7861 
7862     CODECHAL_ENCODE_FUNCTION_ENTER;
7863 
7864     m_osInterface->pfnFreeResource(
7865         m_osInterface,
7866         &BrcBuffers.sBrcMbQpBuffer.OsResource);
7867 
7868     m_osInterface->pfnFreeResource(
7869         m_osInterface,
7870         &BrcBuffers.sBrcRoiSurface.OsResource);
7871 
7872     return eStatus;
7873 }
7874 
GenericEncodeMeKernel(EncodeBrcBuffers * brcBuffers,HmeLevel hmeLevel)7875 MOS_STATUS CodechalEncodeAvcEnc::GenericEncodeMeKernel(EncodeBrcBuffers* brcBuffers, HmeLevel hmeLevel)
7876 {
7877     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
7878 
7879     CODECHAL_ENCODE_FUNCTION_ENTER;
7880 
7881     PerfTagSetting perfTag;
7882     perfTag.Value = 0;
7883     perfTag.Mode = (uint16_t)m_mode & CODECHAL_ENCODE_MODE_BIT_MASK;
7884     perfTag.CallType = m_singleTaskPhaseSupported ? CODECHAL_ENCODE_PERFTAG_CALL_SCALING_KERNEL : CODECHAL_ENCODE_PERFTAG_CALL_ME_KERNEL;
7885     perfTag.PictureCodingType = m_pictureCodingType;
7886     m_osInterface->pfnSetPerfTag(m_osInterface, perfTag.Value);
7887     // Each ME kernel buffer counts as a separate perf task
7888     m_osInterface->pfnResetPerfBufferID(m_osInterface);
7889 
7890     CODECHAL_MEDIA_STATE_TYPE EncFunctionType = (hmeLevel == HME_LEVEL_32x) ? CODECHAL_MEDIA_STATE_32X_ME :
7891         (hmeLevel == HME_LEVEL_16x) ? CODECHAL_MEDIA_STATE_16X_ME : CODECHAL_MEDIA_STATE_4X_ME;
7892 
7893     uint32_t krnStateIdx = ((m_pictureCodingType == P_TYPE) ? CODECHAL_ENCODE_ME_IDX_P : CODECHAL_ENCODE_ME_IDX_B);
7894     auto kernelState = &m_meKernelStates[krnStateIdx];
7895 
7896     // If Single Task Phase is not enabled, use BT count for the kernel state.
7897     if (m_firstTaskInPhase == true || !m_singleTaskPhaseSupported)
7898     {
7899         uint32_t dwMaxBtCount = m_singleTaskPhaseSupported ?
7900             m_maxBtCount : kernelState->KernelParams.iBTCount;
7901         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnRequestSshSpaceForCmdBuf(
7902             m_stateHeapInterface,
7903             dwMaxBtCount));
7904         m_vmeStatesSize = m_hwInterface->GetKernelLoadCommandSize(dwMaxBtCount);
7905         CODECHAL_ENCODE_CHK_STATUS_RETURN(VerifySpaceAvailable());
7906     }
7907 
7908     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace(
7909         m_stateHeapInterface,
7910         kernelState,
7911         false,
7912         0,
7913         false,
7914         m_storeData));
7915 
7916     MHW_INTERFACE_DESCRIPTOR_PARAMS idParams;
7917     MOS_ZeroMemory(&idParams, sizeof(idParams));
7918     idParams.pKernelState = kernelState;
7919     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetInterfaceDescriptor(
7920         m_stateHeapInterface,
7921         1,
7922         &idParams));
7923 
7924     // Setup AVC Curbe
7925     MeCurbeParams meParams;
7926     MOS_ZeroMemory(&meParams, sizeof(meParams));
7927     meParams.hmeLvl = hmeLevel;
7928     meParams.pKernelState = kernelState;
7929 
7930     if (!m_useCommonKernel)
7931     {
7932         CODECHAL_ENCODE_CHK_STATUS_RETURN(SetCurbeMe(
7933             &meParams));
7934     }
7935 
7936     CODECHAL_DEBUG_TOOL(
7937         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
7938             EncFunctionType,
7939             MHW_DSH_TYPE,
7940             kernelState));
7941 
7942         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe(
7943             EncFunctionType,
7944             kernelState));
7945 
7946         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
7947             EncFunctionType,
7948             MHW_ISH_TYPE,
7949             kernelState));
7950     )
7951 
7952     MOS_COMMAND_BUFFER cmdBuffer;
7953     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0));
7954 
7955     SendKernelCmdsParams sendKernelCmdsParams = SendKernelCmdsParams();
7956     sendKernelCmdsParams.EncFunctionType = EncFunctionType;
7957     sendKernelCmdsParams.pKernelState = kernelState;
7958 
7959     CODECHAL_ENCODE_CHK_STATUS_RETURN(SendGenericKernelCmds(&cmdBuffer, &sendKernelCmdsParams));
7960 
7961     // Add binding table
7962     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetBindingTable(
7963         m_stateHeapInterface,
7964         kernelState));
7965 
7966     //Add surface states
7967     MeSurfaceParams meSurfaceParams;
7968     MOS_ZeroMemory(&meSurfaceParams, sizeof(meSurfaceParams));
7969     meSurfaceParams.dwNumRefIdxL0ActiveMinus1 = m_avcSliceParams->num_ref_idx_l0_active_minus1;
7970     meSurfaceParams.dwNumRefIdxL1ActiveMinus1 = m_avcSliceParams->num_ref_idx_l1_active_minus1;
7971     meSurfaceParams.pL0RefFrameList = &(m_avcSliceParams->RefPicList[LIST_0][0]);
7972     meSurfaceParams.pL1RefFrameList = &(m_avcSliceParams->RefPicList[LIST_1][0]);
7973     meSurfaceParams.ppRefList = &m_refList[0];
7974     meSurfaceParams.pPicIdx = &m_picIdx[0];
7975     meSurfaceParams.pCurrOriginalPic = &m_currOriginalPic;
7976     meSurfaceParams.ps4xMeMvDataBuffer = &m_4xMeMvDataBuffer;
7977     meSurfaceParams.dw4xMeMvBottomFieldOffset = (uint32_t)m_meMvBottomFieldOffset;
7978     meSurfaceParams.ps16xMeMvDataBuffer = &m_16xMeMvDataBuffer;
7979     meSurfaceParams.dw16xMeMvBottomFieldOffset = (uint32_t)m_meMv16xBottomFieldOffset;
7980     meSurfaceParams.ps32xMeMvDataBuffer = &m_32xMeMvDataBuffer;
7981     meSurfaceParams.dw32xMeMvBottomFieldOffset = (uint32_t)m_meMv32xBottomFieldOffset;
7982     meSurfaceParams.dw4xScaledBottomFieldOffset = (uint32_t)m_scaledBottomFieldOffset;
7983     meSurfaceParams.dw16xScaledBottomFieldOffset = (uint32_t)m_scaled16xBottomFieldOffset;
7984     meSurfaceParams.dw32xScaledBottomFieldOffset = (uint32_t)m_scaled32xBottomFieldOffset;
7985     meSurfaceParams.psMeDistortionBuffer = &m_4xMeDistortionBuffer;
7986     meSurfaceParams.dwMeDistortionBottomFieldOffset = (uint32_t)m_meDistortionBottomFieldOffset;
7987     meSurfaceParams.psMeBrcDistortionBuffer = &brcBuffers->sMeBrcDistortionBuffer;
7988     meSurfaceParams.dwMeBrcDistortionBottomFieldOffset = brcBuffers->dwMeBrcDistortionBottomFieldOffset;
7989     meSurfaceParams.dwDownscaledWidthInMb = (hmeLevel == HME_LEVEL_32x) ? m_downscaledWidthInMb32x :
7990         (hmeLevel == HME_LEVEL_16x) ? m_downscaledWidthInMb16x : m_downscaledWidthInMb4x;
7991     meSurfaceParams.dwDownscaledHeightInMb = (hmeLevel == HME_LEVEL_32x) ? m_downscaledFrameFieldHeightInMb32x :
7992         (hmeLevel == HME_LEVEL_16x) ? m_downscaledFrameFieldHeightInMb16x : m_downscaledFrameFieldHeightInMb4x;
7993     meSurfaceParams.dwVerticalLineStride = m_verticalLineStride;
7994     meSurfaceParams.dwVerticalLineStrideOffset = m_verticalLineStrideOffset;
7995     meSurfaceParams.b32xMeInUse = (hmeLevel == HME_LEVEL_32x) ? true : false;
7996     meSurfaceParams.b16xMeInUse = (hmeLevel == HME_LEVEL_16x) ? true : false;
7997     meSurfaceParams.b32xMeEnabled = m_32xMeEnabled;
7998     meSurfaceParams.b16xMeEnabled = m_16xMeEnabled;
7999     meSurfaceParams.pMeBindingTable = &m_meBindingTable;
8000     meSurfaceParams.pKernelState = kernelState;
8001 
8002     if (!m_useCommonKernel)
8003     {
8004         CODECHAL_ENCODE_CHK_STATUS_RETURN(SendMeSurfaces(&cmdBuffer, &meSurfaceParams));
8005     }
8006 
8007     // Dump SSH for ME kernel
8008     CODECHAL_DEBUG_TOOL(
8009         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
8010             EncFunctionType,
8011             MHW_SSH_TYPE,
8012             kernelState)));
8013 
8014     /* zero out the mv data memory and me distortion buffer for the driver ULT
8015     kernel only writes out this data used for current frame, in some cases the the data used for
8016     previous frames would be left in the buffer (for example, the L1 mv for B frame would still show
8017     in the P frame mv data buffer */
8018 
8019     /* Zeroing out the buffers has perf impact, so zero it out only when dumps are actually enabled */
8020 
8021     CODECHAL_DEBUG_TOOL(
8022         CODECHAL_ENCODE_CHK_NULL_RETURN(m_debugInterface);
8023         uint8_t*   data;
8024         uint32_t   size;
8025         bool    driverMeDumpEnabled;
8026 
8027         driverMeDumpEnabled = m_debugInterface->DumpIsEnabled(CodechalDbgKernel::kernel4xMe)||
8028             m_debugInterface->DumpIsEnabled(CodechalDbgKernel::kernel16xMe)||
8029             m_debugInterface->DumpIsEnabled(CodechalDbgKernel::kernel32xMe);
8030 
8031         if (driverMeDumpEnabled)
8032         {
8033             MOS_LOCK_PARAMS lockFlags;
8034             MOS_ZeroMemory(&lockFlags, sizeof(MOS_LOCK_PARAMS));
8035             lockFlags.WriteOnly = 1;
8036 
8037             switch (hmeLevel)
8038             {
8039             case HME_LEVEL_32x:
8040                 data = (uint8_t*)m_osInterface->pfnLockResource(
8041                     m_osInterface,
8042                     &m_32xMeMvDataBuffer.OsResource,
8043                     &lockFlags);
8044                 CODECHAL_ENCODE_CHK_NULL_RETURN(data);
8045                 size = MOS_ALIGN_CEIL((m_downscaledWidthInMb32x * 32), 64) *
8046                     (m_downscaledHeightInMb32x * 2 * 4 * CODECHAL_ENCODE_ME_DATA_SIZE_MULTIPLIER);
8047                 MOS_ZeroMemory(data, size);
8048                 m_osInterface->pfnUnlockResource(
8049                     m_osInterface,
8050                     &m_32xMeMvDataBuffer.OsResource);
8051                 break;
8052             case HME_LEVEL_16x:
8053                 data = (uint8_t*)m_osInterface->pfnLockResource(
8054                     m_osInterface,
8055                     &m_16xMeMvDataBuffer.OsResource,
8056                     &lockFlags);
8057                 CODECHAL_ENCODE_CHK_NULL_RETURN(data);
8058                 size = MOS_ALIGN_CEIL((m_downscaledWidthInMb16x * 32), 64) *
8059                     (m_downscaledHeightInMb16x * 2 * 4 * CODECHAL_ENCODE_ME_DATA_SIZE_MULTIPLIER);
8060                 MOS_ZeroMemory(data, size);
8061                 m_osInterface->pfnUnlockResource(
8062                     m_osInterface,
8063                     &m_16xMeMvDataBuffer.OsResource);
8064                 break;
8065             case HME_LEVEL_4x:
8066                 data = (uint8_t*)m_osInterface->pfnLockResource(
8067                     m_osInterface,
8068                     &m_4xMeMvDataBuffer.OsResource,
8069                     &lockFlags);
8070                 CODECHAL_ENCODE_CHK_NULL_RETURN(data);
8071                 size = MOS_ALIGN_CEIL((m_downscaledWidthInMb4x * 32), 64) *
8072                     (m_downscaledHeightInMb4x * 2 * 4 * CODECHAL_ENCODE_ME_DATA_SIZE_MULTIPLIER);
8073                 MOS_ZeroMemory(data, size);
8074                 m_osInterface->pfnUnlockResource(
8075                     m_osInterface,
8076                     &m_4xMeMvDataBuffer.OsResource);
8077                 break;
8078             default:
8079                 eStatus = MOS_STATUS_INVALID_PARAMETER;
8080                 return eStatus;
8081             }
8082 
8083             // zeroing out ME dist buffer
8084             if (m_4xMeDistortionBufferSupported)
8085             {
8086                 data = (uint8_t*)m_osInterface->pfnLockResource(
8087                     m_osInterface, &m_4xMeDistortionBuffer.OsResource, &lockFlags);
8088                 CODECHAL_ENCODE_CHK_NULL_RETURN(data);
8089                 size = m_4xMeDistortionBuffer.dwHeight * m_4xMeDistortionBuffer.dwPitch;
8090                 MOS_ZeroMemory(data, size);
8091                 m_osInterface->pfnUnlockResource(
8092                     m_osInterface,
8093                     &m_4xMeDistortionBuffer.OsResource);
8094             }
8095         }
8096     );
8097 
8098     uint32_t uiScalingFactor = (hmeLevel == HME_LEVEL_32x) ? SCALE_FACTOR_32x :
8099         (hmeLevel == HME_LEVEL_16x) ? SCALE_FACTOR_16x : SCALE_FACTOR_4x;
8100 
8101     uint32_t resolutionX = CODECHAL_GET_WIDTH_IN_MACROBLOCKS(m_frameWidth / uiScalingFactor);
8102     uint32_t resolutionY = CODECHAL_GET_HEIGHT_IN_MACROBLOCKS(m_frameFieldHeight / uiScalingFactor);
8103 
8104     CODECHAL_WALKER_CODEC_PARAMS walkerCodecParams;
8105     MOS_ZeroMemory(&walkerCodecParams, sizeof(walkerCodecParams));
8106     walkerCodecParams.WalkerMode = m_walkerMode;
8107     walkerCodecParams.dwResolutionX = resolutionX;
8108     walkerCodecParams.dwResolutionY = resolutionY;
8109     walkerCodecParams.bNoDependency = true;
8110     walkerCodecParams.bMbaff = m_mbaffEnabled;
8111     walkerCodecParams.bGroupIdSelectSupported = m_groupIdSelectSupported;
8112     walkerCodecParams.ucGroupId = m_groupId;
8113 
8114     MHW_WALKER_PARAMS walkerParams;
8115     CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalInitMediaObjectWalkerParams(
8116         m_hwInterface,
8117         &walkerParams,
8118         &walkerCodecParams));
8119 
8120     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_renderEngineInterface->AddMediaObjectWalkerCmd(
8121         &cmdBuffer,
8122         &walkerParams));
8123 
8124     CODECHAL_ENCODE_CHK_STATUS_RETURN(EndStatusReport(&cmdBuffer, EncFunctionType));
8125 
8126     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSubmitBlocks(
8127         m_stateHeapInterface,
8128         kernelState));
8129     if (!m_singleTaskPhaseSupported || m_lastTaskInPhase)
8130     {
8131         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnUpdateGlobalCmdBufId(
8132             m_stateHeapInterface));
8133         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiBatchBufferEnd(&cmdBuffer, nullptr));
8134     }
8135 
8136     CODECHAL_DEBUG_TOOL(CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer(
8137         & cmdBuffer,
8138         EncFunctionType,
8139         nullptr)));
8140 
8141     m_hwInterface->UpdateSSEuForCmdBuffer(&cmdBuffer, m_singleTaskPhaseSupported, m_lastTaskInPhase);
8142 
8143     m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0);
8144 
8145     if (!m_singleTaskPhaseSupported || m_lastTaskInPhase)
8146     {
8147         HalOcaInterface::On1stLevelBBEnd(cmdBuffer, *m_osInterface->pOsContext);
8148         m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, m_renderContextUsesNullHw);
8149         m_lastTaskInPhase = false;
8150     }
8151 
8152     return eStatus;
8153 }
8154 
InitKernelStateMe()8155 MOS_STATUS CodechalEncodeAvcEnc::InitKernelStateMe()
8156 {
8157     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
8158 
8159     CODECHAL_ENCODE_FUNCTION_ENTER;
8160 
8161     uint8_t* kernelBinary;
8162     uint32_t kernelSize;
8163 
8164     uint32_t kuid = m_useCommonKernel ? m_kuidCommon : m_kuid;
8165     CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalGetKernelBinaryAndSize(m_kernelBase, kuid, &kernelBinary, &kernelSize));
8166 
8167     for (auto krnStateIdx = 0; krnStateIdx < 2; krnStateIdx++)
8168     {
8169         CODECHAL_KERNEL_HEADER              currKrnHeader;
8170         auto kernelStatePtr = &m_meKernelStates[krnStateIdx];
8171 
8172         auto encOperation = ENC_ME;
8173         CODECHAL_ENCODE_CHK_STATUS_RETURN(this->pfnGetKernelHeaderAndSize(
8174             kernelBinary,
8175             encOperation,
8176             krnStateIdx,
8177             &currKrnHeader,
8178             (uint32_t*)&kernelSize));
8179 
8180         kernelStatePtr->KernelParams.iBTCount = CODECHAL_ENCODE_AVC_ME_NUM_SURFACES_CM;
8181         kernelStatePtr->KernelParams.iThreadCount = m_renderEngineInterface->GetHwCaps()->dwMaxThreads;
8182         kernelStatePtr->KernelParams.iCurbeLength = sizeof(CODECHAL_ENCODE_AVC_ME_CURBE);
8183         kernelStatePtr->KernelParams.iBlockWidth = CODECHAL_MACROBLOCK_WIDTH;
8184         kernelStatePtr->KernelParams.iBlockHeight = CODECHAL_MACROBLOCK_HEIGHT;
8185         kernelStatePtr->KernelParams.iIdCount = 1;
8186 
8187         kernelStatePtr->dwCurbeOffset = m_stateHeapInterface->pStateHeapInterface->GetSizeofCmdInterfaceDescriptorData();
8188         kernelStatePtr->KernelParams.pBinary = kernelBinary + (currKrnHeader.KernelStartPointer << MHW_KERNEL_OFFSET_SHIFT);
8189         kernelStatePtr->KernelParams.iSize = kernelSize;
8190         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnCalculateSshAndBtSizesRequested(
8191             m_stateHeapInterface,
8192             kernelStatePtr->KernelParams.iBTCount,
8193             &kernelStatePtr->dwSshSize,
8194             &kernelStatePtr->dwBindingTableSize));
8195 
8196         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->MhwInitISH(m_stateHeapInterface, kernelStatePtr));
8197 
8198         if (m_noMeKernelForPFrame)
8199         {
8200             m_meKernelStates[1] = m_meKernelStates[0];
8201             break;
8202         }
8203     }
8204 
8205     // Until a better way can be found, maintain old binding table structures
8206     auto bindingTable = &m_meBindingTable;
8207     bindingTable->dwMEMVDataSurface = CODECHAL_ENCODE_AVC_ME_MV_DATA_SURFACE_CM;
8208     bindingTable->dw16xMEMVDataSurface = CODECHAL_ENCODE_AVC_16xME_MV_DATA_SURFACE_CM;
8209     bindingTable->dw32xMEMVDataSurface = CODECHAL_ENCODE_AVC_32xME_MV_DATA_SURFACE_CM;
8210     bindingTable->dwMEDist = CODECHAL_ENCODE_AVC_ME_DISTORTION_SURFACE_CM;
8211     bindingTable->dwMEBRCDist = CODECHAL_ENCODE_AVC_ME_BRC_DISTORTION_CM;
8212     bindingTable->dwMECurrForFwdRef = CODECHAL_ENCODE_AVC_ME_CURR_FOR_FWD_REF_CM;
8213     bindingTable->dwMEFwdRefPicIdx[0] = CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX0_CM;
8214     bindingTable->dwMEFwdRefPicIdx[1] = CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX1_CM;
8215     bindingTable->dwMEFwdRefPicIdx[2] = CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX2_CM;
8216     bindingTable->dwMEFwdRefPicIdx[3] = CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX3_CM;
8217     bindingTable->dwMEFwdRefPicIdx[4] = CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX4_CM;
8218     bindingTable->dwMEFwdRefPicIdx[5] = CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX5_CM;
8219     bindingTable->dwMEFwdRefPicIdx[6] = CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX6_CM;
8220     bindingTable->dwMEFwdRefPicIdx[7] = CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX7_CM;
8221     bindingTable->dwMECurrForBwdRef = CODECHAL_ENCODE_AVC_ME_CURR_FOR_BWD_REF_CM;
8222     bindingTable->dwMEBwdRefPicIdx[0] = CODECHAL_ENCODE_AVC_ME_BWD_REF_IDX0_CM;
8223     bindingTable->dwMEBwdRefPicIdx[1] = CODECHAL_ENCODE_AVC_ME_BWD_REF_IDX1_CM;
8224 
8225     return eStatus;
8226 }
8227 
SetCurbeMe(MeCurbeParams * params)8228 MOS_STATUS CodechalEncodeAvcEnc::SetCurbeMe(MeCurbeParams* params)
8229 {
8230     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
8231 
8232     CODECHAL_ENCODE_FUNCTION_ENTER;
8233     CODECHAL_ENCODE_ASSERT(m_avcSeqParam->TargetUsage <= NUM_TARGET_USAGE_MODES);
8234 
8235     auto slcParams = m_avcSliceParams;
8236     auto framePicture = CodecHal_PictureIsFrame(m_avcPicParam->CurrOriginalPic);
8237     auto qpPrimeY =
8238         (m_avcPicParam->pic_init_qp_minus26 + 26) +
8239         m_avcSliceParams->slice_qp_delta;
8240 
8241     auto mvShiftFactor = 0;
8242     auto prevMvReadPosFactor = 0;
8243     bool useMvFromPrevStep, writeDistortions;
8244     uint32_t scaleFactor;
8245 
8246     switch (params->hmeLvl)
8247     {
8248     case HME_LEVEL_32x:
8249         useMvFromPrevStep = CODECHAL_ENCODE_AVC_HME_FIRST_STEP;
8250         writeDistortions = false;
8251         scaleFactor = SCALE_FACTOR_32x;
8252         mvShiftFactor = CODECHAL_ENCODE_AVC_MV_SHIFT_FACTOR_32x;
8253         break;
8254     case HME_LEVEL_16x:
8255         useMvFromPrevStep = (m_32xMeEnabled) ? CODECHAL_ENCODE_AVC_HME_FOLLOWING_STEP : CODECHAL_ENCODE_AVC_HME_FIRST_STEP;
8256         writeDistortions = false;
8257         scaleFactor = SCALE_FACTOR_16x;
8258         mvShiftFactor = CODECHAL_ENCODE_AVC_MV_SHIFT_FACTOR_16x;
8259         prevMvReadPosFactor = CODECHAL_ENCODE_AVC_PREV_MV_READ_POSITION_16x;
8260         break;
8261     case HME_LEVEL_4x:
8262         useMvFromPrevStep = (m_16xMeEnabled) ? CODECHAL_ENCODE_AVC_HME_FOLLOWING_STEP : CODECHAL_ENCODE_AVC_HME_FIRST_STEP;
8263         writeDistortions = true;
8264         scaleFactor = SCALE_FACTOR_4x;
8265         mvShiftFactor = CODECHAL_ENCODE_AVC_MV_SHIFT_FACTOR_4x;
8266         prevMvReadPosFactor = CODECHAL_ENCODE_AVC_PREV_MV_READ_POSITION_4x;
8267         break;
8268     default:
8269         eStatus = MOS_STATUS_INVALID_PARAMETER;
8270         return eStatus;
8271         break;
8272     }
8273 
8274     CODECHAL_ENCODE_AVC_ME_CURBE cmd;
8275     CODECHAL_ENCODE_CHK_STATUS_RETURN(MOS_SecureMemcpy(
8276         &cmd,
8277         sizeof(CODECHAL_ENCODE_AVC_ME_CURBE),
8278         g_cInit_CODECHAL_ENCODE_AVC_ME_CURBE,
8279         sizeof(CODECHAL_ENCODE_AVC_ME_CURBE)));
8280 
8281     if (m_avcPicParam->bEnableSubPelMode)
8282     {
8283         cmd.DW3.SubPelMode = m_avcPicParam->SubPelMode;
8284     }
8285     else
8286     {
8287         cmd.DW3.SubPelMode = 3;
8288     }
8289 
8290     if (m_fieldScalingOutputInterleaved)
8291     {
8292         cmd.DW3.SrcAccess =
8293             cmd.DW3.RefAccess = CodecHal_PictureIsField(m_avcPicParam->CurrOriginalPic) ? 1 : 0;
8294         cmd.DW7.SrcFieldPolarity = CodecHal_PictureIsBottomField(m_avcPicParam->CurrOriginalPic) ? 1 : 0;
8295     }
8296 
8297     cmd.DW4.PictureHeightMinus1 = CODECHAL_GET_HEIGHT_IN_MACROBLOCKS(m_frameFieldHeight / scaleFactor) - 1;
8298     cmd.DW4.PictureWidth = CODECHAL_GET_HEIGHT_IN_MACROBLOCKS(m_frameWidth / scaleFactor);
8299     cmd.DW5.QpPrimeY = qpPrimeY;
8300     cmd.DW6.WriteDistortions = writeDistortions;
8301     cmd.DW6.UseMvFromPrevStep = useMvFromPrevStep;
8302 
8303     cmd.DW6.SuperCombineDist = m_superCombineDistGeneric[m_avcSeqParam->TargetUsage];
8304     cmd.DW6.MaxVmvR = (framePicture) ?
8305         CodecHalAvcEncode_GetMaxMvLen(m_avcSeqParam->Level) * 4 :
8306         (CodecHalAvcEncode_GetMaxMvLen(m_avcSeqParam->Level) >> 1) * 4;
8307 
8308     if (m_pictureCodingType == B_TYPE)
8309     {
8310         // This field is irrelevant since we are not using the bi-direct search.
8311         // set it to 32
8312         cmd.DW1.BiWeight = 32;
8313         cmd.DW13.NumRefIdxL1MinusOne =
8314             m_avcSliceParams->num_ref_idx_l1_active_minus1;
8315     }
8316 
8317     if (m_pictureCodingType == P_TYPE ||
8318         m_pictureCodingType == B_TYPE)
8319     {
8320         cmd.DW13.NumRefIdxL0MinusOne =
8321             m_avcSliceParams->num_ref_idx_l0_active_minus1;
8322     }
8323 
8324     cmd.DW13.RefStreaminCost = 5;
8325     // This flag is to indicate the ROI source type instead of indicating ROI is enabled or not
8326     cmd.DW13.ROIEnable = 0;
8327 
8328     if (!framePicture)
8329     {
8330         if (m_pictureCodingType != I_TYPE)
8331         {
8332             cmd.DW14.List0RefID0FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_0, CODECHAL_ENCODE_REF_ID_0);
8333             cmd.DW14.List0RefID1FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_0, CODECHAL_ENCODE_REF_ID_1);
8334             cmd.DW14.List0RefID2FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_0, CODECHAL_ENCODE_REF_ID_2);
8335             cmd.DW14.List0RefID3FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_0, CODECHAL_ENCODE_REF_ID_3);
8336             cmd.DW14.List0RefID4FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_0, CODECHAL_ENCODE_REF_ID_4);
8337             cmd.DW14.List0RefID5FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_0, CODECHAL_ENCODE_REF_ID_5);
8338             cmd.DW14.List0RefID6FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_0, CODECHAL_ENCODE_REF_ID_6);
8339             cmd.DW14.List0RefID7FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_0, CODECHAL_ENCODE_REF_ID_7);
8340         }
8341         if (m_pictureCodingType == B_TYPE)
8342         {
8343             cmd.DW14.List1RefID0FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_1, CODECHAL_ENCODE_REF_ID_0);
8344             cmd.DW14.List1RefID1FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_1, CODECHAL_ENCODE_REF_ID_1);
8345         }
8346     }
8347 
8348     cmd.DW15.MvShiftFactor = mvShiftFactor;
8349     cmd.DW15.PrevMvReadPosFactor = prevMvReadPosFactor;
8350 
8351     // r3 & r4
8352     uint8_t                                   meMethod, tableIdx, tu = 0;
8353     tu = m_avcSeqParam->TargetUsage;
8354     if (m_pictureCodingType == B_TYPE)
8355     {
8356         meMethod = m_bmeMethodTable ?  // use the ME table dependent on prototype or codec standard
8357                        m_bmeMethodTable[tu]
8358                                     : m_bMeMethodGeneric[tu];
8359     }
8360     else
8361     {
8362         meMethod = m_meMethodTable ?  // use the ME table dependent on prototype or codec standard
8363                        m_meMethodTable[tu]
8364                                    : m_meMethodGeneric[tu];
8365     }
8366 
8367     tableIdx = (m_pictureCodingType == B_TYPE) ? 1 : 0;
8368     eStatus = MOS_SecureMemcpy(&(cmd.SPDelta), 14 * sizeof(uint32_t), m_encodeSearchPath[tableIdx][meMethod], 14 * sizeof(uint32_t));
8369     if (eStatus != MOS_STATUS_SUCCESS)
8370     {
8371         CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory.");
8372         return eStatus;
8373     }
8374 
8375     // r5
8376     cmd.DW32._4xMeMvOutputDataSurfIndex = CODECHAL_ENCODE_AVC_ME_MV_DATA_SURFACE_CM;
8377     cmd.DW33._16xOr32xMeMvInputDataSurfIndex = (params->hmeLvl == HME_LEVEL_32x) ?
8378         CODECHAL_ENCODE_AVC_32xME_MV_DATA_SURFACE_CM : CODECHAL_ENCODE_AVC_16xME_MV_DATA_SURFACE_CM;
8379     cmd.DW34._4xMeOutputDistSurfIndex = CODECHAL_ENCODE_AVC_ME_DISTORTION_SURFACE_CM;
8380     cmd.DW35._4xMeOutputBrcDistSurfIndex = CODECHAL_ENCODE_AVC_ME_BRC_DISTORTION_CM;
8381     cmd.DW36.VMEFwdInterPredictionSurfIndex = CODECHAL_ENCODE_AVC_ME_CURR_FOR_FWD_REF_CM;
8382     cmd.DW37.VMEBwdInterPredictionSurfIndex = CODECHAL_ENCODE_AVC_ME_CURR_FOR_BWD_REF_CM;
8383 
8384     CODECHAL_ENCODE_CHK_STATUS_RETURN(params->pKernelState->m_dshRegion.AddData(
8385         &cmd,
8386         params->pKernelState->dwCurbeOffset,
8387         sizeof(cmd)));
8388 
8389     CODECHAL_DEBUG_TOOL(
8390         CODECHAL_ENCODE_CHK_STATUS_RETURN(PopulateHmeParam(
8391             m_16xMeEnabled,
8392             m_32xMeEnabled,
8393             meMethod,
8394             &cmd));
8395     )
8396 
8397     return eStatus;
8398 }
8399 
SendMeSurfaces(PMOS_COMMAND_BUFFER cmdBuffer,MeSurfaceParams * params)8400 MOS_STATUS CodechalEncodeAvcEnc::SendMeSurfaces(PMOS_COMMAND_BUFFER cmdBuffer, MeSurfaceParams* params)
8401 {
8402     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
8403 
8404     CODECHAL_ENCODE_CHK_NULL_RETURN(cmdBuffer);
8405     CODECHAL_ENCODE_CHK_NULL_RETURN(params);
8406     CODECHAL_ENCODE_CHK_NULL_RETURN(params->pKernelState);
8407     CODECHAL_ENCODE_CHK_NULL_RETURN(params->pCurrOriginalPic);
8408     CODECHAL_ENCODE_CHK_NULL_RETURN(params->ps4xMeMvDataBuffer);
8409     CODECHAL_ENCODE_CHK_NULL_RETURN(params->psMeDistortionBuffer);
8410     CODECHAL_ENCODE_CHK_NULL_RETURN(params->psMeBrcDistortionBuffer);
8411 
8412     CODECHAL_MEDIA_STATE_TYPE       encMediaStateType;
8413     encMediaStateType = (params->b32xMeInUse) ? CODECHAL_MEDIA_STATE_32X_ME :
8414         params->b16xMeInUse ? CODECHAL_MEDIA_STATE_16X_ME : CODECHAL_MEDIA_STATE_4X_ME;
8415 
8416     CODECHAL_ENCODE_CHK_NULL_RETURN(params->pMeBindingTable);
8417     auto meBindingTable = params->pMeBindingTable;
8418 
8419     auto currFieldPicture = CodecHal_PictureIsField(*(params->pCurrOriginalPic)) ? 1 : 0;
8420     auto currBottomField = CodecHal_PictureIsBottomField(*(params->pCurrOriginalPic)) ? 1 : 0;
8421     uint8_t ucCurrVDirection = (!currFieldPicture) ? CODECHAL_VDIRECTION_FRAME :
8422         ((currBottomField) ? CODECHAL_VDIRECTION_BOT_FIELD : CODECHAL_VDIRECTION_TOP_FIELD);
8423 
8424     PMOS_SURFACE                    currScaledSurface = nullptr, meMvDataBuffer = nullptr;
8425     uint32_t                           meMvBottomFieldOffset = 0, currScaledBottomFieldOffset = 0, refScaledBottomFieldOffset = 0;
8426     if (params->b32xMeInUse)
8427     {
8428         CODECHAL_ENCODE_CHK_NULL_RETURN(params->ps32xMeMvDataBuffer);
8429         currScaledSurface = m_trackedBuf->Get32xDsSurface(CODEC_CURR_TRACKED_BUFFER);
8430         meMvDataBuffer = params->ps32xMeMvDataBuffer;
8431         meMvBottomFieldOffset = params->dw32xMeMvBottomFieldOffset;
8432         currScaledBottomFieldOffset = params->dw32xScaledBottomFieldOffset;
8433     }
8434     else if (params->b16xMeInUse)
8435     {
8436         CODECHAL_ENCODE_CHK_NULL_RETURN(params->ps16xMeMvDataBuffer);
8437         currScaledSurface = m_trackedBuf->Get16xDsSurface(CODEC_CURR_TRACKED_BUFFER);
8438         meMvDataBuffer = params->ps16xMeMvDataBuffer;
8439         meMvBottomFieldOffset = params->dw16xMeMvBottomFieldOffset;
8440         currScaledBottomFieldOffset = params->dw16xScaledBottomFieldOffset;
8441     }
8442     else
8443     {
8444         currScaledSurface = m_trackedBuf->Get4xDsSurface(CODEC_CURR_TRACKED_BUFFER);
8445         meMvDataBuffer = params->ps4xMeMvDataBuffer;
8446         meMvBottomFieldOffset = params->dw4xMeMvBottomFieldOffset;
8447         currScaledBottomFieldOffset = params->dw4xScaledBottomFieldOffset;
8448     }
8449 
8450     // Reference height and width information should be taken from the current scaled surface rather
8451     // than from the reference scaled surface in the case of PAFF.
8452     auto refScaledSurface = *currScaledSurface;
8453 
8454     auto width = MOS_ALIGN_CEIL(params->dwDownscaledWidthInMb * 32, 64);
8455     auto height = params->dwDownscaledHeightInMb * 4 * CODECHAL_ENCODE_ME_DATA_SIZE_MULTIPLIER;
8456 
8457     // Force the values
8458     meMvDataBuffer->dwWidth = width;
8459     meMvDataBuffer->dwHeight = height;
8460     meMvDataBuffer->dwPitch = width;
8461 
8462     CODECHAL_SURFACE_CODEC_PARAMS   surfaceParams;
8463     MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams));
8464     surfaceParams.bIs2DSurface = true;
8465     surfaceParams.bMediaBlockRW = true;
8466     surfaceParams.psSurface = meMvDataBuffer;
8467     surfaceParams.dwOffset = meMvBottomFieldOffset;
8468     surfaceParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_MV_DATA_ENCODE].Value;
8469     surfaceParams.dwBindingTableOffset = meBindingTable->dwMEMVDataSurface;
8470     surfaceParams.bIsWritable = true;
8471     surfaceParams.bRenderTarget = true;
8472     CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
8473         m_hwInterface,
8474         cmdBuffer,
8475         &surfaceParams,
8476         params->pKernelState));
8477 
8478     if (params->b16xMeInUse && params->b32xMeEnabled)
8479     {
8480         // Pass 32x MV to 16x ME operation
8481         MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams));
8482         surfaceParams.bIs2DSurface = true;
8483         surfaceParams.bMediaBlockRW = true;
8484         surfaceParams.psSurface = params->ps32xMeMvDataBuffer;
8485         surfaceParams.dwOffset =
8486             currBottomField ? params->dw32xMeMvBottomFieldOffset : 0;
8487         surfaceParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_MV_DATA_ENCODE].Value;
8488         surfaceParams.dwBindingTableOffset = meBindingTable->dw32xMEMVDataSurface;
8489         CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
8490             m_hwInterface,
8491             cmdBuffer,
8492             &surfaceParams,
8493             params->pKernelState));
8494     }
8495     else if (!params->b32xMeInUse && params->b16xMeEnabled)
8496     {
8497         // Pass 16x MV to 4x ME operation
8498         MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams));
8499         surfaceParams.bIs2DSurface = true;
8500         surfaceParams.bMediaBlockRW = true;
8501         surfaceParams.psSurface = params->ps16xMeMvDataBuffer;
8502         surfaceParams.dwOffset =
8503             currBottomField ? params->dw16xMeMvBottomFieldOffset : 0;
8504         surfaceParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_MV_DATA_ENCODE].Value;
8505         surfaceParams.dwBindingTableOffset = meBindingTable->dw16xMEMVDataSurface;
8506         CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
8507             m_hwInterface,
8508             cmdBuffer,
8509             &surfaceParams,
8510             params->pKernelState));
8511     }
8512 
8513     // Insert Distortion buffers only for 4xMe case
8514     if (!params->b32xMeInUse && !params->b16xMeInUse)
8515     {
8516         MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams));
8517         surfaceParams.bIs2DSurface = true;
8518         surfaceParams.bMediaBlockRW = true;
8519         surfaceParams.psSurface = params->psMeBrcDistortionBuffer;
8520         surfaceParams.dwOffset = params->dwMeBrcDistortionBottomFieldOffset;
8521         surfaceParams.dwBindingTableOffset = meBindingTable->dwMEBRCDist;
8522         surfaceParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_BRC_ME_DISTORTION_ENCODE].Value;
8523         surfaceParams.bIsWritable = true;
8524         surfaceParams.bRenderTarget = true;
8525         CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
8526             m_hwInterface,
8527             cmdBuffer,
8528             &surfaceParams,
8529             params->pKernelState));
8530 
8531         MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams));
8532         surfaceParams.bIs2DSurface = true;
8533         surfaceParams.bMediaBlockRW = true;
8534         surfaceParams.psSurface = params->psMeDistortionBuffer;
8535         surfaceParams.dwOffset = params->dwMeDistortionBottomFieldOffset;
8536         surfaceParams.dwBindingTableOffset = meBindingTable->dwMEDist;
8537         surfaceParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_ME_DISTORTION_ENCODE].Value;
8538         surfaceParams.bIsWritable = true;
8539         surfaceParams.bRenderTarget = true;
8540         CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
8541             m_hwInterface,
8542             cmdBuffer,
8543             &surfaceParams,
8544             params->pKernelState));
8545     }
8546 
8547     // Setup references 1...n
8548     // LIST 0 references
8549     uint8_t                           refPicIdx, refIdx;
8550     CODEC_PICTURE                   refPic;
8551     bool                            refFieldPicture, refBottomField;
8552     for (refIdx = 0; refIdx <= params->dwNumRefIdxL0ActiveMinus1; refIdx++)
8553     {
8554         refPic = params->pL0RefFrameList[refIdx];
8555 
8556         if (!CodecHal_PictureIsInvalid(refPic) && params->pPicIdx[refPic.FrameIdx].bValid)
8557         {
8558             if (refIdx == 0)
8559             {
8560                 // Current Picture Y - VME
8561                 MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams));
8562                 surfaceParams.bUseAdvState = true;
8563                 surfaceParams.psSurface = currScaledSurface;
8564                 surfaceParams.dwOffset = currBottomField ? currScaledBottomFieldOffset : 0;
8565                 surfaceParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_HME_DOWNSAMPLED_ENCODE].Value;
8566                 surfaceParams.dwBindingTableOffset = meBindingTable->dwMECurrForFwdRef;
8567                 surfaceParams.ucVDirection = ucCurrVDirection;
8568                 CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
8569                     m_hwInterface,
8570                     cmdBuffer,
8571                     &surfaceParams,
8572                     params->pKernelState));
8573             }
8574 
8575             refFieldPicture = CodecHal_PictureIsField(refPic) ? 1 : 0;
8576             refBottomField = (CodecHal_PictureIsBottomField(refPic)) ? 1 : 0;
8577             refPicIdx = params->pPicIdx[refPic.FrameIdx].ucPicIdx;
8578             uint8_t scaledIdx = params->ppRefList[refPicIdx]->ucScalingIdx;
8579             MOS_SURFACE* surface;
8580             if (params->b32xMeInUse)
8581             {
8582                 surface = m_trackedBuf->Get32xDsSurface(scaledIdx);
8583             }
8584             else if (params->b16xMeInUse)
8585             {
8586                 surface = m_trackedBuf->Get16xDsSurface(scaledIdx);
8587             }
8588             else
8589             {
8590                 surface = m_trackedBuf->Get4xDsSurface(scaledIdx);
8591             }
8592             CODECHAL_ENCODE_CHK_NULL_RETURN(surface);
8593             refScaledSurface.OsResource = surface->OsResource;
8594             refScaledBottomFieldOffset = refBottomField ? currScaledBottomFieldOffset : 0;
8595             // L0 Reference Picture Y - VME
8596             MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams));
8597             surfaceParams.bUseAdvState = true;
8598             surfaceParams.psSurface = &refScaledSurface;
8599             surfaceParams.dwOffset = refBottomField ? refScaledBottomFieldOffset : 0;
8600             surfaceParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_HME_DOWNSAMPLED_ENCODE].Value;
8601             surfaceParams.dwBindingTableOffset = meBindingTable->dwMEFwdRefPicIdx[refIdx];
8602             surfaceParams.ucVDirection = !currFieldPicture ? CODECHAL_VDIRECTION_FRAME :
8603                 ((refBottomField) ? CODECHAL_VDIRECTION_BOT_FIELD : CODECHAL_VDIRECTION_TOP_FIELD);
8604             CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
8605                 m_hwInterface,
8606                 cmdBuffer,
8607                 &surfaceParams,
8608                 params->pKernelState));
8609         }
8610     }
8611 
8612     // Setup references 1...n
8613     // LIST 1 references
8614     for (refIdx = 0; refIdx <= params->dwNumRefIdxL1ActiveMinus1; refIdx++)
8615     {
8616         refPic = params->pL1RefFrameList[refIdx];
8617 
8618         if (!CodecHal_PictureIsInvalid(refPic) && params->pPicIdx[refPic.FrameIdx].bValid)
8619         {
8620             if (refIdx == 0)
8621             {
8622                 // Current Picture Y - VME
8623                 MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams));
8624                 surfaceParams.bUseAdvState = true;
8625                 surfaceParams.psSurface = currScaledSurface;
8626                 surfaceParams.dwOffset = currBottomField ? currScaledBottomFieldOffset : 0;
8627                 surfaceParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_HME_DOWNSAMPLED_ENCODE].Value;
8628                 surfaceParams.dwBindingTableOffset = meBindingTable->dwMECurrForBwdRef;
8629                 surfaceParams.ucVDirection = ucCurrVDirection;
8630                 CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
8631                     m_hwInterface,
8632                     cmdBuffer,
8633                     &surfaceParams,
8634                     params->pKernelState));
8635             }
8636 
8637             refFieldPicture = CodecHal_PictureIsField(refPic) ? 1 : 0;
8638             refBottomField = (CodecHal_PictureIsBottomField(refPic)) ? 1 : 0;
8639             refPicIdx = params->pPicIdx[refPic.FrameIdx].ucPicIdx;
8640             uint8_t scaledIdx = params->ppRefList[refPicIdx]->ucScalingIdx;
8641             MOS_SURFACE* surface;
8642             if (params->b32xMeInUse)
8643             {
8644                 surface = m_trackedBuf->Get32xDsSurface(scaledIdx);
8645             }
8646             else if (params->b16xMeInUse)
8647             {
8648                 surface = m_trackedBuf->Get16xDsSurface(scaledIdx);
8649             }
8650             else
8651             {
8652                 surface = m_trackedBuf->Get4xDsSurface(scaledIdx);
8653             }
8654             CODECHAL_ENCODE_CHK_NULL_RETURN(surface);
8655             refScaledSurface.OsResource = surface->OsResource;
8656             refScaledBottomFieldOffset = refBottomField ? currScaledBottomFieldOffset : 0;
8657             // L1 Reference Picture Y - VME
8658             MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams));
8659             surfaceParams.bUseAdvState = true;
8660             surfaceParams.psSurface = &refScaledSurface;
8661             surfaceParams.dwOffset = refBottomField ? refScaledBottomFieldOffset : 0;
8662             surfaceParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_HME_DOWNSAMPLED_ENCODE].Value;
8663             surfaceParams.dwBindingTableOffset = meBindingTable->dwMEBwdRefPicIdx[refIdx];
8664             surfaceParams.ucVDirection = (!currFieldPicture) ? CODECHAL_VDIRECTION_FRAME :
8665                 ((refBottomField) ? CODECHAL_VDIRECTION_BOT_FIELD : CODECHAL_VDIRECTION_TOP_FIELD);
8666             CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
8667                 m_hwInterface,
8668                 cmdBuffer,
8669                 &surfaceParams,
8670                 params->pKernelState));
8671         }
8672     }
8673 
8674     return eStatus;
8675 }
8676 
GenericEncodePictureLevel(PCODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS params)8677 MOS_STATUS CodechalEncodeAvcEnc::GenericEncodePictureLevel(PCODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS params)
8678 {
8679     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
8680 
8681     CODECHAL_ENCODE_FUNCTION_ENTER;
8682 
8683     auto trellisQuantParams = &m_trellisQuantParams;
8684 
8685     PerfTagSetting perfTag;
8686     perfTag.Value = 0;
8687     perfTag.Mode = (uint16_t)m_mode & CODECHAL_ENCODE_MODE_BIT_MASK;
8688     perfTag.CallType = CODECHAL_ENCODE_PERFTAG_CALL_PAK_ENGINE;
8689     perfTag.PictureCodingType = m_pictureCodingType;
8690     m_osInterface->pfnSetPerfTag(m_osInterface, perfTag.Value);
8691 
8692     MOS_COMMAND_BUFFER cmdBuffer;
8693     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0));
8694 
8695     // set MFX_PIPE_MODE_SELECT values
8696     MHW_VDBOX_PIPE_MODE_SELECT_PARAMS pipeModeSelectParams;
8697     pipeModeSelectParams.Mode = m_mode;
8698     pipeModeSelectParams.bStreamOutEnabled = (m_currPass != m_numPasses);// Disable Stream Out for final pass; its important for multiple passes, because , next pass will take the qp from stream out
8699 
8700     pipeModeSelectParams.bDeblockerStreamOutEnable = params->bDeblockerStreamOutEnable;
8701     pipeModeSelectParams.bPostDeblockOutEnable = params->bPostDeblockOutEnable;
8702     pipeModeSelectParams.bPreDeblockOutEnable = params->bPreDeblockOutEnable;
8703     pipeModeSelectParams.bDynamicSliceEnable = m_avcSeqParam->EnableSliceLevelRateCtrl;
8704 
8705     // set MFX_PIPE_BUF_ADDR_STATE values
8706     MHW_VDBOX_PIPE_BUF_ADDR_PARAMS pipeBufAddrParams;
8707     pipeBufAddrParams.Mode = m_mode;
8708     pipeBufAddrParams.psPreDeblockSurface = params->psPreDeblockSurface;
8709     pipeBufAddrParams.psPostDeblockSurface = params->psPostDeblockSurface;
8710 
8711     CODECHAL_ENCODE_CHK_NULL_RETURN(m_mmcState);
8712     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mmcState->SetPipeBufAddr(&pipeBufAddrParams));
8713 
8714     pipeBufAddrParams.psRawSurface = m_rawSurfaceToPak;
8715     pipeBufAddrParams.presStreamOutBuffer = &m_resStreamOutBuffer[m_currRecycledBufIdx];
8716     pipeBufAddrParams.presMfdDeblockingFilterRowStoreScratchBuffer = &m_resDeblockingFilterRowStoreScratchBuffer;
8717     pipeBufAddrParams.presMfdIntraRowStoreScratchBuffer = &m_intraRowStoreScratchBuffer;
8718     pipeBufAddrParams.presMacroblockIldbStreamOutBuffer1 = params->presMacroblockIldbStreamOutBuffer1;
8719     pipeBufAddrParams.presMacroblockIldbStreamOutBuffer2 = params->presMacroblockIldbStreamOutBuffer2;
8720 
8721     CODECHAL_DEBUG_TOOL(
8722         // PAK Input Raw Surface
8723         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpYUVSurface(
8724             m_rawSurfaceToPak,
8725             CodechalDbgAttr::attrEncodeRawInputSurface,
8726             "PAK_Input_SrcSurf"));
8727     )
8728 
8729     auto firstValidFrame = &m_reconSurface.OsResource;
8730 
8731     // Setting invalid entries to nullptr
8732     for (uint32_t i = 0; i < CODEC_AVC_MAX_NUM_REF_FRAME; i++)
8733     {
8734         pipeBufAddrParams.presReferences[i] = nullptr;
8735     }
8736 
8737     uint8_t firstValidFrameId = CODEC_AVC_MAX_NUM_REF_FRAME;
8738 
8739     for (uint32_t i = 0; i < CODEC_AVC_MAX_NUM_REF_FRAME; i++)
8740     {
8741         if (m_picIdx[i].bValid)
8742         {
8743             uint8_t picIdx = m_picIdx[i].ucPicIdx;
8744             uint8_t frameStoreId = m_refList[picIdx]->ucFrameId;
8745 
8746             CodecHalGetResourceInfo(
8747                 m_osInterface,
8748                 &(m_refList[picIdx]->sRefReconBuffer));
8749             pipeBufAddrParams.presReferences[frameStoreId] =
8750                 &(m_refList[picIdx]->sRefReconBuffer.OsResource);
8751 
8752             if (picIdx < firstValidFrameId)
8753             {
8754                 firstValidFrameId = picIdx;
8755                 firstValidFrame = pipeBufAddrParams.presReferences[picIdx];
8756             }
8757 
8758             CODECHAL_DEBUG_TOOL(
8759                 CODECHAL_ENCODE_CHK_NULL_RETURN(m_debugInterface);
8760                 MOS_SURFACE refSurface;
8761 
8762                 MOS_ZeroMemory(&refSurface, sizeof(refSurface));
8763                 refSurface.Format     = Format_NV12;
8764                 refSurface.OsResource = *(pipeBufAddrParams.presReferences[frameStoreId]);
8765                 CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalGetResourceInfo(
8766                     m_osInterface,
8767                     &refSurface));
8768 
8769                 m_debugInterface->m_refIndex = frameStoreId;
8770                 std::string refSurfName      = "RefSurf[" + std::to_string(static_cast<uint32_t>(m_debugInterface->m_refIndex)) + "]";
8771                 CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpYUVSurface(
8772                     &refSurface,
8773                     CodechalDbgAttr::attrReferenceSurfaces,
8774                     refSurfName.c_str()));)
8775         }
8776     }
8777 
8778     for (uint32_t i = 0; i < CODEC_AVC_MAX_NUM_REF_FRAME; i++)
8779     {
8780         // error concealment for the unset reference addresses
8781         if (!pipeBufAddrParams.presReferences[i])
8782         {
8783             pipeBufAddrParams.presReferences[i] = firstValidFrame;
8784         }
8785     }
8786 
8787     if (m_sliceSizeStreamoutSupported)
8788     {
8789         pipeBufAddrParams.presSliceSizeStreamOutBuffer = &m_pakSliceSizeStreamoutBuffer;
8790     }
8791 
8792     // set MFX_IND_OBJ_BASE_ADDR_STATE values
8793     MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS indObjBaseAddrParams;
8794     MOS_ZeroMemory(&indObjBaseAddrParams, sizeof(indObjBaseAddrParams));
8795     indObjBaseAddrParams.Mode = CODECHAL_ENCODE_MODE_AVC;
8796 
8797     indObjBaseAddrParams.presMvObjectBuffer = &m_resMvDataSurface;
8798     indObjBaseAddrParams.dwMvObjectOffset = m_mvBottomFieldOffset;
8799     indObjBaseAddrParams.dwMvObjectSize = m_mvDataSize;
8800     indObjBaseAddrParams.presPakBaseObjectBuffer = &m_resBitstreamBuffer;
8801     indObjBaseAddrParams.dwPakBaseObjectSize = m_bitstreamUpperBound;
8802 
8803     // set MFX_BSP_BUF_BASE_ADDR_STATE values
8804     MHW_VDBOX_BSP_BUF_BASE_ADDR_PARAMS bspBufBaseAddrParams;
8805     MOS_ZeroMemory(&bspBufBaseAddrParams, sizeof(bspBufBaseAddrParams));
8806     bspBufBaseAddrParams.presBsdMpcRowStoreScratchBuffer = &m_resMPCRowStoreScratchBuffer;
8807 
8808     MHW_VDBOX_QM_PARAMS qmParams;
8809     qmParams.Standard = CODECHAL_AVC;
8810     qmParams.pAvcIqMatrix = (PMHW_VDBOX_AVC_QM_PARAMS)m_avcIQWeightScaleLists;
8811 
8812     MHW_VDBOX_QM_PARAMS fqmParams;
8813     fqmParams.Standard = CODECHAL_AVC;
8814     fqmParams.pAvcIqMatrix = (PMHW_VDBOX_AVC_QM_PARAMS)m_avcIQWeightScaleLists;
8815 
8816     // Add AVC Direct Mode command
8817     MHW_VDBOX_AVC_DIRECTMODE_PARAMS directmodeParams;
8818     MOS_ZeroMemory(&directmodeParams, sizeof(directmodeParams));
8819     directmodeParams.CurrPic = m_avcPicParam->CurrReconstructedPic;
8820     directmodeParams.isEncode = true;
8821     directmodeParams.uiUsedForReferenceFlags = 0xFFFFFFFF;
8822     directmodeParams.pAvcPicIdx = &(m_picIdx[0]);
8823     directmodeParams.avcRefList = (void**)m_refList;
8824     directmodeParams.bPicIdRemappingInUse = false;
8825     directmodeParams.bDisableDmvBuffers = true;
8826 
8827     // PAK cmd buffer header insertion for 1) non STF 2) STF (except VDEnc BRC case inserted in HuC cmd buffer)
8828     if (!m_singleTaskPhaseSupported || m_firstTaskInPhase)
8829     {
8830         bool requestFrameTracking = false;
8831 
8832         m_hwInterface->m_numRequestedEuSlices = ((m_frameHeight * m_frameWidth) >= m_ssdResolutionThreshold &&
8833             m_targetUsage <= m_ssdTargetUsageThreshold) ?
8834             m_sliceShutdownRequestState : m_sliceShutdownDefaultState;
8835 
8836         // Send command buffer header at the beginning (OS dependent)
8837         // frame tracking tag is only added in the last command buffer header
8838         requestFrameTracking = m_singleTaskPhaseSupported ? m_firstTaskInPhase : m_lastTaskInPhase;
8839         CODECHAL_ENCODE_CHK_STATUS_RETURN(SendPrologWithFrameTracking(&cmdBuffer, requestFrameTracking));
8840 
8841         m_hwInterface->m_numRequestedEuSlices = CODECHAL_SLICE_SHUTDOWN_DEFAULT;
8842     }
8843 
8844     if (m_currPass == 0 && params->bBrcEnabled)
8845     {
8846         CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS    encodePictureLevelParam;
8847         MOS_ZeroMemory(&encodePictureLevelParam, sizeof(encodePictureLevelParam));
8848         encodePictureLevelParam.presBrcHistoryBuffer = params->presBrcHistoryBuffer;
8849         CODECHAL_ENCODE_CHK_STATUS_RETURN(SceneChangeReport(&cmdBuffer, &encodePictureLevelParam));
8850     }
8851 
8852     if (m_currPass)
8853     {
8854         MHW_MI_CONDITIONAL_BATCH_BUFFER_END_PARAMS miConditionalBatchBufferEndParams;
8855         // Insert conditional batch buffer end
8856         MOS_ZeroMemory(
8857             &miConditionalBatchBufferEndParams,
8858             sizeof(MHW_MI_CONDITIONAL_BATCH_BUFFER_END_PARAMS));
8859 
8860         miConditionalBatchBufferEndParams.presSemaphoreBuffer =
8861             &m_encodeStatusBuf.resStatusBuffer;
8862         miConditionalBatchBufferEndParams.dwOffset =
8863             (m_encodeStatusBuf.wCurrIndex * m_encodeStatusBuf.dwReportSize) +
8864             m_encodeStatusBuf.dwImageStatusMaskOffset +
8865             (sizeof(uint32_t) * 2);
8866 
8867         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiConditionalBatchBufferEndCmd(
8868             &cmdBuffer,
8869             &miConditionalBatchBufferEndParams));
8870     }
8871 
8872     if (!m_currPass && m_osInterface->bTagResourceSync)
8873     {
8874         // This is a short term solution to solve the sync tag issue: the sync tag write for PAK is inserted at the end of 2nd pass PAK BB
8875         // which may be skipped in multi-pass PAK enabled case. The idea here is to insert the previous frame's tag at the beginning
8876         // of the BB and keep the current frame's tag at the end of the BB. There will be a delay for tag update but it should be fine
8877         // as long as Dec/VP/Enc won't depend on this PAK so soon.
8878         MHW_MI_STORE_DATA_PARAMS                        params;
8879         MOS_RESOURCE                                    globalGpuContextSyncTagBuffer;
8880         uint32_t                                           value;
8881 
8882         CODECHAL_HW_CHK_STATUS_RETURN(m_osInterface->pfnGetGpuStatusBufferResource(
8883             m_osInterface,
8884             &globalGpuContextSyncTagBuffer));
8885 
8886         value = m_osInterface->pfnGetGpuStatusTag(m_osInterface, m_osInterface->CurrentGpuContextOrdinal);
8887         params.pOsResource = &globalGpuContextSyncTagBuffer;
8888         params.dwResourceOffset = m_osInterface->pfnGetGpuStatusTagOffset(m_osInterface, m_osInterface->CurrentGpuContextOrdinal);
8889         params.dwValue = (value > 0) ? (value - 1) : 0;
8890         CODECHAL_HW_CHK_STATUS_RETURN(m_miInterface->AddMiStoreDataImmCmd(&cmdBuffer, &params));
8891     }
8892 
8893     CODECHAL_ENCODE_CHK_STATUS_RETURN(StartStatusReport(&cmdBuffer, CODECHAL_NUM_MEDIA_STATES));
8894 
8895     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxPipeModeSelectCmd(&cmdBuffer, &pipeModeSelectParams));
8896 
8897     // set MFX_SURFACE_STATE values
8898     // Ref surface
8899     MHW_VDBOX_SURFACE_PARAMS reconSurfaceParams;
8900     MOS_ZeroMemory(&reconSurfaceParams, sizeof(reconSurfaceParams));
8901     reconSurfaceParams.Mode = m_mode;
8902     reconSurfaceParams.ucSurfaceStateId = CODECHAL_MFX_REF_SURFACE_ID;
8903     reconSurfaceParams.psSurface = &m_reconSurface;
8904     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxSurfaceCmd(&cmdBuffer, &reconSurfaceParams));
8905 
8906     // Src surface
8907     MHW_VDBOX_SURFACE_PARAMS surfaceParams;
8908     MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams));
8909     surfaceParams.Mode = m_mode;
8910     surfaceParams.ucSurfaceStateId = CODECHAL_MFX_SRC_SURFACE_ID;
8911     surfaceParams.psSurface = m_rawSurfaceToPak;
8912     surfaceParams.bDisplayFormatSwizzle = m_avcPicParam->bDisplayFormatSwizzle;
8913     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxSurfaceCmd(&cmdBuffer, &surfaceParams));
8914 
8915     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxPipeBufAddrCmd(&cmdBuffer, &pipeBufAddrParams));
8916 
8917     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxIndObjBaseAddrCmd(&cmdBuffer, &indObjBaseAddrParams));
8918 
8919     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxBspBufBaseAddrCmd(&cmdBuffer, &bspBufBaseAddrParams));
8920 
8921     if (params->bBrcEnabled && m_avcSeqParam->RateControlMethod != RATECONTROL_ICQ)
8922     {
8923         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiBatchBufferStartCmd(
8924             &cmdBuffer,
8925             params->pImgStateBatchBuffer));
8926     }
8927     else
8928     {
8929         //Set MFX_AVC_IMG_STATE command
8930         MHW_VDBOX_AVC_IMG_PARAMS imageStateParams;
8931         imageStateParams.ucCurrPass = m_currPass;
8932         imageStateParams.pEncodeAvcPicParams = m_avcPicParam;
8933         imageStateParams.pEncodeAvcSeqParams = m_avcSeqParam;
8934         imageStateParams.pEncodeAvcSliceParams = m_avcSliceParams;
8935         if (CodecHalIsFeiEncode(m_codecFunction) && m_avcFeiPicParams && m_avcFeiPicParams->dwMaxFrameSize)
8936         {
8937             imageStateParams.pDeltaQp = m_avcFeiPicParams->pDeltaQp;
8938             imageStateParams.dwMaxFrameSize = m_avcFeiPicParams->dwMaxFrameSize;
8939         }
8940         else if (CodecHalUsesPakEngine(m_codecFunction) && m_avcPicParam->dwMaxFrameSize)
8941         {
8942             imageStateParams.pDeltaQp = m_avcPicParam->pDeltaQp;
8943             imageStateParams.dwMaxFrameSize = m_avcPicParam->dwMaxFrameSize;
8944         }
8945         imageStateParams.wPicWidthInMb = m_picWidthInMb;
8946         imageStateParams.wPicHeightInMb = m_picHeightInMb;
8947         imageStateParams.ppRefList = &(m_refList[0]);
8948         imageStateParams.dwTqEnabled = trellisQuantParams->dwTqEnabled;
8949         imageStateParams.dwTqRounding = trellisQuantParams->dwTqRounding;
8950         imageStateParams.ucKernelMode = m_kernelMode;
8951         imageStateParams.wSlcHeightInMb = m_sliceHeight;
8952         imageStateParams.dwMaxVmvR = CodecHalAvcEncode_GetMaxVmvR(m_avcSeqParam->Level);
8953         imageStateParams.bSliceSizeStreamOutEnabled = m_sliceSizeStreamoutSupported;
8954 
8955         if (m_currPass && m_currPass == m_numPasses)
8956         {
8957             // Enable IPCM pass, excluding VDENC BRC case
8958             imageStateParams.bIPCMPass = true;
8959         }
8960 
8961         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxAvcImgCmd(&cmdBuffer, nullptr, &imageStateParams));
8962 
8963         CODECHAL_DEBUG_TOOL(
8964             CODECHAL_ENCODE_CHK_STATUS_RETURN(PopulatePakParam(
8965                 &cmdBuffer,
8966                 nullptr));
8967         )
8968     }
8969 
8970     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxQmCmd(&cmdBuffer, &qmParams));
8971 
8972     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxFqmCmd(&cmdBuffer, &fqmParams));
8973 
8974     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxAvcDirectmodeCmd(&cmdBuffer, &directmodeParams));
8975 
8976     m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0);
8977 
8978     return eStatus;
8979 }
8980 
SendPrologWithFrameTracking(PMOS_COMMAND_BUFFER cmdBuffer,bool frameTracking,MHW_MI_MMIOREGISTERS * mmioRegister)8981 MOS_STATUS CodechalEncodeAvcEnc::SendPrologWithFrameTracking(
8982     PMOS_COMMAND_BUFFER         cmdBuffer,
8983     bool                        frameTracking,
8984     MHW_MI_MMIOREGISTERS       *mmioRegister)
8985 {
8986     return CodechalEncoderState::SendPrologWithFrameTracking(cmdBuffer, frameTracking, mmioRegister);
8987 }
8988 
ExecutePreEnc(EncoderParams * encodeParams)8989 MOS_STATUS CodechalEncodeAvcEnc::ExecutePreEnc(EncoderParams* encodeParams)
8990 {
8991     MOS_SYNC_PARAMS                     syncParams;
8992 
8993     CODECHAL_ENCODE_FUNCTION_ENTER;
8994 
8995     CODECHAL_ENCODE_CHK_NULL_RETURN(encodeParams->pPreEncParams);
8996     FeiPreEncParams *preEncParams = (FeiPreEncParams *)encodeParams->pPreEncParams;
8997 
8998     m_encodeParams           = *encodeParams;
8999     m_newSeqHeader           = encodeParams->newSeqHeader;
9000     m_newPpsHeader           = encodeParams->newPpsHeader;
9001     m_arbitraryNumMbsInSlice = encodeParams->arbitraryNumMbsInSlice;
9002 
9003     if (preEncParams->bDisableMVOutput && preEncParams->bDisableStatisticsOutput)
9004     {
9005         m_disableStatusReport = true;
9006     }
9007 
9008     m_osInterface->pfnIncPerfFrameID(m_osInterface);
9009 
9010     CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(InitializePicture(m_encodeParams),
9011         "Encoding initialization failed.");
9012 
9013     // Check if source surface needs to be synchronized and should wait for decode or VPP or any other context
9014     if (m_firstField)
9015     {
9016         syncParams = g_cInitSyncParams;
9017         syncParams.GpuContext = m_renderContext;
9018         syncParams.presSyncResource = &m_rawSurface.OsResource;
9019         syncParams.bReadOnly = true;
9020 
9021         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnResourceWait(m_osInterface, &syncParams));
9022 
9023         // Update the resource tag (s/w tag) for On-Demand Sync
9024         // set the tag on render context for ENC case only, else set it on video context for ENC+PAK case
9025         m_osInterface->pfnSetResourceSyncTag(m_osInterface, &syncParams);
9026     }
9027 
9028     // set render engine context
9029     m_osInterface->pfnSetGpuContext(m_osInterface, m_renderContext);
9030     m_osInterface->pfnResetOsStates(m_osInterface);
9031 
9032     // set all status reports to completed state
9033     InitStatusReport();
9034 
9035     // Call ENC Kernels
9036     CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(ExecuteKernelFunctions(),
9037         "ENC failed.");
9038 
9039 #ifndef FEI_ENABLE_CMRT
9040     // Flush encode eStatus buffer
9041     CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(ResetStatusReport(),
9042         "ResetStatusReprot failed.");
9043 #else
9044     // if(GFX_IS_RENDERCORE(m_hwInterface->GetPlatform(), IGFX_GEN8_CORE)) //WA for G8
9045     // {
9046     //     eStatus = pEncoder->pfnResetStatusReport(pEncoder);
9047     // }
9048     CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(ResetStatusReport(),
9049         "ResetStatusReprot failed.");
9050 #endif
9051     m_disableStatusReport = false;
9052 
9053     if (m_firstFrame == false && m_firstTwoFrames == true)
9054     {
9055         m_firstTwoFrames = false;
9056     }
9057 
9058     m_firstFrame = false;
9059     return MOS_STATUS_SUCCESS;
9060 }
9061 
9062 #if USE_CODECHAL_DEBUG_TOOL
PopulateHmeParam(bool is16xMeEnabled,bool is32xMeEnabled,uint8_t meMethod,void * cmd)9063 MOS_STATUS CodechalEncodeAvcEnc::PopulateHmeParam(
9064     bool    is16xMeEnabled,
9065     bool    is32xMeEnabled,
9066     uint8_t meMethod,
9067     void    *cmd)
9068 {
9069     CODECHAL_DEBUG_FUNCTION_ENTER;
9070 
9071     CODECHAL_DEBUG_CHK_NULL(m_debugInterface);
9072 
9073     if (!m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrDumpEncodePar))
9074     {
9075         return MOS_STATUS_SUCCESS;
9076     }
9077 
9078     CODECHAL_ENCODE_AVC_ME_CURBE *curbe = (CODECHAL_ENCODE_AVC_ME_CURBE *)cmd;
9079 
9080     if (m_pictureCodingType == P_TYPE)
9081     {
9082         m_avcPar->SuperHME         = is16xMeEnabled;
9083         m_avcPar->UltraHME         = is32xMeEnabled;
9084         m_avcPar->SuperCombineDist = curbe->DW6.SuperCombineDist;
9085     }
9086 
9087     return MOS_STATUS_SUCCESS;
9088 }
9089 
DumpFrameParFile()9090 MOS_STATUS CodechalEncodeAvcEnc::DumpFrameParFile()
9091 {
9092     CODECHAL_DEBUG_FUNCTION_ENTER;
9093 
9094     CODECHAL_DEBUG_CHK_NULL(m_debugInterface);
9095 
9096     if (!m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrDumpEncodePar))
9097     {
9098         return MOS_STATUS_SUCCESS;
9099     }
9100 
9101     std::ostringstream oss;
9102     oss.setf(std::ios::showbase | std::ios::uppercase);
9103 
9104     if (m_pictureCodingType == I_TYPE)
9105     {
9106         // I Slice Parameters
9107         // DDI Params
9108         oss << "ProfileIDC = " << std::dec << +m_avcPar->ProfileIDC << std::endl;
9109         oss << "LevelIDC = " << std::dec << +m_avcPar->LevelIDC << std::endl;
9110         oss << "DisableVUIHeader = " << std::dec << +m_avcPar->DisableVUIHeader << std::endl;
9111         oss << "ChromaFormatIDC = " << std::dec << +m_avcPar->ChromaFormatIDC << std::endl;
9112         oss << "ChromaQpOffset = " << std::dec << +m_avcPar->ChromaQpOffset << std::endl;
9113         oss << "SecondChromaQpOffset = " << std::dec << +m_avcPar->SecondChromaQpOffset << std::endl;
9114         oss << "PictureCodingType = " << std::dec << +m_avcPar->PictureCodingType << std::endl;
9115         oss << "NumP = " << std::dec << +m_avcPar->NumP << std::endl;
9116         oss << "NumB = " << std::dec << +m_avcPar->NumB << std::endl;
9117         oss << "NumSlices = " << std::dec << +m_avcPar->NumSlices << std::endl;
9118         oss << "ISliceQP = " << std::dec << +m_avcPar->ISliceQP << std::endl;
9119         oss << "FrameRateM = " << std::dec << +m_avcPar->FrameRateM << std::endl;
9120         oss << "FrameRateD = " << std::dec << +m_avcPar->FrameRateD << std::endl;
9121         oss << "BRCMethod = " << std::dec << +m_avcPar->BRCMethod << std::endl;
9122         oss << "BRCType = " << std::dec << +m_avcPar->BRCType << std::endl;
9123         oss << "DeblockingIDC = " << std::dec << +m_avcPar->DeblockingIDC << std::endl;
9124         oss << "DeblockingFilterAlpha = " << std::dec << +m_avcPar->DeblockingFilterAlpha << std::endl;
9125         oss << "DeblockingFilterBeta = " << std::dec << +m_avcPar->DeblockingFilterBeta << std::endl;
9126         oss << "EntropyCodingMode = " << std::dec << +m_avcPar->EntropyCodingMode << std::endl;
9127         oss << "DirectInference = " << std::dec << +m_avcPar->DirectInference << std::endl;
9128         oss << "Transform8x8Mode = " << std::dec << +m_avcPar->Transform8x8Mode << std::endl;
9129         oss << "CRFQualityFactor = " << std::dec << +m_avcPar->CRFQualityFactor << std::endl;
9130         oss << "ConstrainedIntraPred = " << std::dec << +m_avcPar->ConstrainedIntraPred << std::endl;
9131         if (m_avcPar->NumP == 0)  // There's no P frame
9132         {
9133             oss << "MaxRefIdxL0 = " << std::dec << +m_avcPar->MaxRefIdxL0 << std::endl;
9134             oss << "MaxRefIdxL1 = " << std::dec << +m_avcPar->MaxRefIdxL1 << std::endl;
9135         }
9136 
9137         // DS Params
9138         oss << "MBFlatnessThreshold = " << std::dec << +m_encodeParState->m_commonPar->mbFlatnessThreshold << std::endl;
9139 
9140         // BRC init Params
9141         oss << "MBBRCEnable = " << std::dec << +m_avcPar->MBBRCEnable << std::endl;
9142         oss << "MBRC = " << std::dec << +m_avcPar->MBRC << std::endl;
9143         oss << "BitRate = " << std::dec << +m_avcPar->BitRate << std::endl;
9144         oss << "InitVbvFullnessInBit = " << std::dec << +m_avcPar->InitVbvFullnessInBit << std::endl;
9145         oss << "MaxBitRate = " << std::dec << +m_avcPar->MaxBitRate << std::endl;
9146         oss << "VbvSzInBit = " << std::dec << +m_avcPar->VbvSzInBit << std::endl;
9147         oss << "AvbrAccuracy = " << std::dec << +m_avcPar->AvbrAccuracy << std::endl;
9148         oss << "AvbrConvergence = " << std::dec << +m_avcPar->AvbrConvergence << std::endl;
9149         oss << "Window_Size = " << std::dec << +m_avcPar->SlidingWindowSize << std::endl;
9150         oss << "LongTermReferenceInterval = " << std::dec << +m_avcPar->LongTermInterval << std::endl;
9151 
9152         // BRC frame update Params
9153         oss << "EnableMultipass = " << std::dec << +m_avcPar->EnableMultipass << std::endl;
9154         oss << "MaxNumPakPasses = " << std::dec << +m_avcPar->MaxNumPakPasses << std::endl;
9155         oss << "Sliding_Window_Enable = " << std::dec << +m_avcPar->SlidingWindowEnable << std::endl;
9156         oss << "UserMaxFrame = " << std::dec << +m_avcPar->UserMaxFrame << std::endl;
9157         oss << "FrameSkip_enable = " << std::dec << +m_avcPar->FrameSkipEnable << std::endl;
9158 
9159         // Enc Params
9160         oss << "BlockBasedSkip = " << std::dec << +m_avcPar->BlockBasedSkip << std::endl;
9161         oss << "DisableExtendedMvCostRange = " << std::dec << +m_avcPar->DisableExtendedMvCostRange << std::endl;
9162         oss << "EnableAdaptiveSearch = " << std::dec << +m_avcPar->EnableAdaptiveSearch << std::endl;
9163         oss << "EnableFBRBypass = " << std::dec << +m_avcPar->EnableFBRBypass << std::endl;
9164         oss << "MRDisableQPCheck = " << std::dec << +m_avcPar->MRDisableQPCheck << std::endl;
9165         oss << "MADEnableFlag = " << std::dec << +m_avcPar->MADEnableFlag << std::endl;
9166         oss << "EnableMBFlatnessCheckOptimization = " << std::dec << +m_avcPar->EnableMBFlatnessCheckOptimization << std::endl;
9167         oss << "EnableArbitrarySliceSize = " << std::dec << +m_avcPar->EnableArbitrarySliceSize << std::endl;
9168         oss << "RefThresh = " << std::dec << +m_avcPar->RefThresh << std::endl;
9169         oss << "EnableWavefrontOptimization = " << std::dec << +m_avcPar->EnableWavefrontOptimization << std::endl;
9170         oss << "AllFractional = " << std::dec << +m_avcPar->AllFractional << std::endl;
9171         oss << "DisableAllFractionalCheckForHighRes = " << std::dec << +m_avcPar->DisableAllFractionalCheckForHighRes << std::endl;
9172         oss << "MaxLenSP = " << std::dec << +m_avcPar->MaxLenSP << std::endl;
9173 
9174         // PAK Params
9175         oss << "TrellisQuantizationEnable = " << std::dec << +m_avcPar->TrellisQuantizationEnable << std::endl;
9176         oss << "RoundingIntraEnabled = " << std::dec << +m_avcPar->RoundingIntraEnabled << std::endl;
9177         oss << "RoundingIntra = " << std::dec << +m_avcPar->RoundingIntra << std::endl;
9178         oss << "EnableAdaptiveTrellisQuantization = " << std::dec << +m_avcPar->EnableAdaptiveTrellisQuantization << std::endl;
9179         oss << "TrellisQuantizationRounding = " << std::dec << +m_avcPar->TrellisQuantizationRounding << std::endl;
9180         oss << "TrellisQuantizationChromaDisable = " << std::dec << +m_avcPar->TrellisQuantizationChromaDisable << std::endl;
9181         oss << "ExtendedRhoDomainEn = " << std::dec << +m_avcPar->ExtendedRhoDomainEn << std::endl;
9182         oss << "EnableSEI = " << std::dec << +m_avcPar->EnableSEI << std::endl;
9183         if (m_avcPar->NumP == 0)  // There's no P frame
9184         {
9185             oss << "FrmHdrEncodingFrequency = " << std::dec << +m_avcPar->FrmHdrEncodingFrequency << std::endl;
9186         }
9187     }
9188     else if (m_pictureCodingType == P_TYPE)
9189     {
9190         // P Slice Parameters
9191         // DDI Params
9192         oss << "PSliceQP = " << std::dec << +m_avcPar->PSliceQP << std::endl;
9193         oss << "CabacInitIDC = " << std::dec << +m_avcPar->CabacInitIDC << std::endl;
9194         oss << "MaxRefIdxL0 = " << std::dec << +m_avcPar->MaxRefIdxL0 << std::endl;
9195         oss << "MaxRefIdxL1 = " << std::dec << +m_avcPar->MaxRefIdxL1 << std::endl;
9196         if (m_avcPar->NumB == 0)  // There's no B frame
9197         {
9198             oss << "EnableWeightPredictionDetection = " << std::dec << +m_avcPar->EnableWeightPredictionDetection << std::endl;
9199         }
9200         oss << "WeightedPred = " << std::dec << +m_avcPar->WeightedPred << std::endl;
9201         oss << "UseOrigAsRef = " << std::dec << +m_avcPar->UseOrigAsRef << std::endl;
9202         oss << "BiSubMbPartMask = " << std::dec << +m_avcPar->BiSubMbPartMask << std::endl;
9203 
9204         // HME Params
9205         oss << "SuperHME = " << std::dec << +(m_useCommonKernel ? m_encodeParState->m_commonPar->superHME : m_avcPar->SuperHME) << std::endl;
9206         oss << "UltraHME = " << std::dec << +(m_useCommonKernel ? m_encodeParState->m_commonPar->ultraHME : m_avcPar->UltraHME) << std::endl;
9207         oss << "SuperCombineDist = " << std::dec << +(m_useCommonKernel ? m_encodeParState->m_commonPar->superCombineDist : m_avcPar->SuperCombineDist) << std::endl;
9208 
9209         // Enc Params
9210         oss << "SubPelMode = " << std::dec << +m_avcPar->SubPelMode << std::endl;
9211         oss << "FTQBasedSkip = " << std::dec << +m_avcPar->FTQBasedSkip << std::endl;
9212         oss << "BiMixDisable = " << std::dec << +m_avcPar->BiMixDisable << std::endl;
9213         oss << "SurvivedSkipCost = " << std::dec << +m_avcPar->SurvivedSkipCost << std::endl;
9214         oss << "UniMixDisable = " << std::dec << +m_avcPar->UniMixDisable << std::endl;
9215         oss << "EnableIntraCostScalingForStaticFrame = " << std::dec << +m_avcPar->EnableIntraCostScalingForStaticFrame << std::endl;
9216         if (m_avcPar->EnableIntraCostScalingForStaticFrame)
9217         {
9218             oss << "IntraCostUpdateMethod = 3" << std::endl;
9219         }
9220         oss << "StaticFrameIntraCostScalingRatioP = " << std::dec << +m_avcPar->StaticFrameIntraCostScalingRatioP << std::endl;
9221         oss << "MEMethod = " << std::dec << +m_avcPar->MEMethod << std::endl;
9222         oss << "HMECombineLen = " << std::dec << +m_avcPar->HMECombineLen << std::endl;
9223         oss << "HMECombineOverlap = " << std::dec << +m_avcPar->HMECombineOverlap << std::endl;
9224         oss << "SearchX = " << std::dec << +m_avcPar->SearchX << std::endl;
9225         oss << "SearchY = " << std::dec << +m_avcPar->SearchY << std::endl;
9226         oss << "SearchControl = " << std::dec << +m_avcPar->SearchControl << std::endl;
9227         oss << "MultiplePred = " << std::dec << +m_avcPar->MultiplePred << std::endl;
9228         oss << "EnableAdaptiveTxDecision = " << std::dec << +m_avcPar->EnableAdaptiveTxDecision << std::endl;
9229         oss << "MBTextureThreshold = " << std::dec << +m_avcPar->MBTextureThreshold << std::endl;
9230         oss << "TxDecisionThr = " << std::dec << +m_avcPar->TxDecisionThr << std::endl;
9231         oss << "EnablePerMBStaticCheck = " << std::dec << +m_avcPar->EnablePerMBStaticCheck << std::endl;
9232         oss << "EnableAdaptiveSearchWindowSize = " << std::dec << +m_avcPar->EnableAdaptiveSearchWindowSize << std::endl;
9233         oss << "EnableAdaptiveIntraScaling = " << std::dec << +m_avcPar->EnableAdaptiveIntraScaling << std::endl;
9234 
9235         // BRC Frame Update
9236         oss << "UserMaxFrame_P = " << std::dec << +m_avcPar->UserMaxFrameP << std::endl;
9237 
9238         // PAK Params
9239         oss << "RoundingInterEnabled = " << std::dec << +m_avcPar->RoundingInterEnabled << std::endl;
9240         oss << "RoundingInter = " << std::dec << +m_avcPar->RoundingInter << std::endl;
9241         oss << "FrmHdrEncodingFrequency = " << std::dec << +m_avcPar->FrmHdrEncodingFrequency << std::endl;
9242         oss << "EnableAdaptiveRounding = " << std::dec << +m_avcPar->EnableAdaptiveRounding << std::endl;
9243     }
9244     else if (m_pictureCodingType == B_TYPE)
9245     {
9246         // B Slice Parameters
9247         // DDI Params
9248         oss << "BSliceQP = " << std::dec << +m_avcPar->BSliceQP << std::endl;
9249         oss << "MaxBRefIdxL0 = " << std::dec << +m_avcPar->MaxBRefIdxL0 << std::endl;
9250         oss << "EnableWeightPredictionDetection = " << std::dec << +m_avcPar->EnableWeightPredictionDetection << std::endl;
9251         oss << "WeightedBiPred = " << std::dec << +m_avcPar->WeightedBiPred << std::endl;
9252 
9253         // Enc Params
9254         oss << "BMEMethod = " << std::dec << +m_avcPar->BMEMethod << std::endl;
9255         oss << "HMEBCombineLen = " << std::dec << +m_avcPar->HMEBCombineLen << std::endl;
9256         oss << "BSearchX = " << std::dec << +m_avcPar->BSearchX << std::endl;
9257         oss << "BSearchY = " << std::dec << +m_avcPar->BSearchY << std::endl;
9258         oss << "BSearchControl = " << std::dec << +m_avcPar->BSearchControl << std::endl;
9259         oss << "BSkipType = " << std::dec << +m_avcPar->BSkipType << std::endl;
9260         oss << "DirectMode = " << std::dec << +m_avcPar->DirectMode << std::endl;
9261         oss << "BiWeight = " << std::dec << +m_avcPar->BiWeight << std::endl;
9262         oss << "StaticFrameIntraCostScalingRatioB = " << std::dec << +m_avcPar->StaticFrameIntraCostScalingRatioB << std::endl;
9263 
9264         // PAK Params
9265         oss << "RoundingInterB = " << std::dec << +m_avcPar->RoundingInterB << std::endl;
9266     }
9267 
9268     // Dump per frame par file
9269     const char *fileName = m_debugInterface->CreateFileName(
9270         "EncodeFrame",
9271         "EncodePar",
9272         CodechalDbgExtType::par);
9273 
9274     std::ofstream ofs(fileName, std::ios::out);
9275     ofs << oss.str();
9276     ofs.close();
9277 
9278     return MOS_STATUS_SUCCESS;
9279 }
9280 
DumpSeqParFile()9281 MOS_STATUS CodechalEncodeAvcEnc::DumpSeqParFile()
9282 {
9283     CODECHAL_DEBUG_FUNCTION_ENTER;
9284 
9285     CODECHAL_DEBUG_CHK_NULL(m_debugInterface);
9286 
9287     if (!m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrDumpEncodePar))
9288     {
9289         return MOS_STATUS_SUCCESS;
9290     }
9291 
9292     std::ostringstream oss;
9293     oss.setf(std::ios::showbase | std::ios::uppercase);
9294 
9295     // I Slice Parameters
9296     // DDI Params
9297     oss << "ProfileIDC = " << std::dec << +m_avcPar->ProfileIDC << std::endl;
9298     oss << "LevelIDC = " << std::dec << +m_avcPar->LevelIDC << std::endl;
9299     oss << "DisableVUIHeader = " << std::dec << +m_avcPar->DisableVUIHeader << std::endl;
9300     oss << "ChromaFormatIDC = " << std::dec << +m_avcPar->ChromaFormatIDC << std::endl;
9301     oss << "ChromaQpOffset = " << std::dec << +m_avcPar->ChromaQpOffset << std::endl;
9302     oss << "SecondChromaQpOffset = " << std::dec << +m_avcPar->SecondChromaQpOffset << std::endl;
9303     oss << "PictureCodingType = " << std::dec << +m_avcPar->PictureCodingType << std::endl;
9304     oss << "NumP = " << std::dec << +m_avcPar->NumP << std::endl;
9305     oss << "NumB = " << std::dec << +m_avcPar->NumB << std::endl;
9306     oss << "NumSlices = " << std::dec << +m_avcPar->NumSlices << std::endl;
9307     oss << "ISliceQP = " << std::dec << +m_avcPar->ISliceQP << std::endl;
9308     oss << "FrameRateM = " << std::dec << +m_avcPar->FrameRateM << std::endl;
9309     oss << "FrameRateD = " << std::dec << +m_avcPar->FrameRateD << std::endl;
9310     oss << "BRCMethod = " << std::dec << +m_avcPar->BRCMethod << std::endl;
9311     oss << "BRCType = " << std::dec << +m_avcPar->BRCType << std::endl;
9312     oss << "DeblockingIDC = " << std::dec << +m_avcPar->DeblockingIDC << std::endl;
9313     oss << "DeblockingFilterAlpha = " << std::dec << +m_avcPar->DeblockingFilterAlpha << std::endl;
9314     oss << "DeblockingFilterBeta = " << std::dec << +m_avcPar->DeblockingFilterBeta << std::endl;
9315     oss << "EntropyCodingMode = " << std::dec << +m_avcPar->EntropyCodingMode << std::endl;
9316     oss << "DirectInference = " << std::dec << +m_avcPar->DirectInference << std::endl;
9317     oss << "Transform8x8Mode = " << std::dec << +m_avcPar->Transform8x8Mode << std::endl;
9318     oss << "CRFQualityFactor = " << std::dec << +m_avcPar->CRFQualityFactor << std::endl;
9319     oss << "ConstrainedIntraPred = " << std::dec << +m_avcPar->ConstrainedIntraPred << std::endl;
9320     if (m_avcPar->NumP == 0)  // There's no P frame
9321     {
9322         oss << "MaxRefIdxL0 = " << std::dec << +m_avcPar->MaxRefIdxL0 << std::endl;
9323         oss << "MaxRefIdxL1 = " << std::dec << +m_avcPar->MaxRefIdxL1 << std::endl;
9324     }
9325 
9326     // DS Params
9327     oss << "MBFlatnessThreshold = " << std::dec << +m_encodeParState->m_commonPar->mbFlatnessThreshold << std::endl;
9328 
9329     // BRC init Params
9330     oss << "MBBRCEnable = " << std::dec << +m_avcPar->MBBRCEnable << std::endl;
9331     oss << "MBRC = " << std::dec << +m_avcPar->MBRC << std::endl;
9332     oss << "BitRate = " << std::dec << +m_avcPar->BitRate << std::endl;
9333     oss << "InitVbvFullnessInBit = " << std::dec << +m_avcPar->InitVbvFullnessInBit << std::endl;
9334     oss << "MaxBitRate = " << std::dec << +m_avcPar->MaxBitRate << std::endl;
9335     oss << "VbvSzInBit = " << std::dec << +m_avcPar->VbvSzInBit << std::endl;
9336     oss << "AvbrAccuracy = " << std::dec << +m_avcPar->AvbrAccuracy << std::endl;
9337     oss << "AvbrConvergence = " << std::dec << +m_avcPar->AvbrConvergence << std::endl;
9338     oss << "Window_Size = " << std::dec << +m_avcPar->SlidingWindowSize << std::endl;
9339     oss << "LongTermReferenceInterval = " << std::dec << +m_avcPar->LongTermInterval << std::endl;
9340 
9341     // BRC frame update Params
9342     oss << "EnableMultipass = " << std::dec << +m_avcPar->EnableMultipass << std::endl;
9343     oss << "MaxNumPakPasses = " << std::dec << +m_avcPar->MaxNumPakPasses << std::endl;
9344     oss << "Sliding_Window_Enable = " << std::dec << +m_avcPar->SlidingWindowEnable << std::endl;
9345     oss << "UserMaxFrame = " << std::dec << +m_avcPar->UserMaxFrame << std::endl;
9346     oss << "FrameSkip_enable = " << std::dec << +m_avcPar->FrameSkipEnable << std::endl;
9347 
9348     // Enc Params
9349     oss << "BlockBasedSkip = " << std::dec << +m_avcPar->BlockBasedSkip << std::endl;
9350     oss << "DisableExtendedMvCostRange = " << std::dec << +m_avcPar->DisableExtendedMvCostRange << std::endl;
9351     oss << "EnableAdaptiveSearch = " << std::dec << +m_avcPar->EnableAdaptiveSearch << std::endl;
9352     oss << "EnableFBRBypass = " << std::dec << +m_avcPar->EnableFBRBypass << std::endl;
9353     oss << "MRDisableQPCheck = " << std::dec << +m_avcPar->MRDisableQPCheck << std::endl;
9354     oss << "MADEnableFlag = " << std::dec << +m_avcPar->MADEnableFlag << std::endl;
9355     oss << "EnableMBFlatnessCheckOptimization = " << std::dec << +m_avcPar->EnableMBFlatnessCheckOptimization << std::endl;
9356     oss << "EnableArbitrarySliceSize = " << std::dec << +m_avcPar->EnableArbitrarySliceSize << std::endl;
9357     oss << "RefThresh = " << std::dec << +m_avcPar->RefThresh << std::endl;
9358     oss << "EnableWavefrontOptimization = " << std::dec << +m_avcPar->EnableWavefrontOptimization << std::endl;
9359     oss << "AllFractional = " << std::dec << +m_avcPar->AllFractional << std::endl;
9360     oss << "DisableAllFractionalCheckForHighRes = " << std::dec << +m_avcPar->DisableAllFractionalCheckForHighRes << std::endl;
9361     oss << "MaxLenSP = " << std::dec << +m_avcPar->MaxLenSP << std::endl;
9362 
9363     // PAK Params
9364     oss << "TrellisQuantizationEnable = " << std::dec << +m_avcPar->TrellisQuantizationEnable << std::endl;
9365     oss << "RoundingIntraEnabled = " << std::dec << +m_avcPar->RoundingIntraEnabled << std::endl;
9366     oss << "RoundingIntra = " << std::dec << +m_avcPar->RoundingIntra << std::endl;
9367     oss << "EnableAdaptiveTrellisQuantization = " << std::dec << +m_avcPar->EnableAdaptiveTrellisQuantization << std::endl;
9368     oss << "TrellisQuantizationRounding = " << std::dec << +m_avcPar->TrellisQuantizationRounding << std::endl;
9369     oss << "TrellisQuantizationChromaDisable = " << std::dec << +m_avcPar->TrellisQuantizationChromaDisable << std::endl;
9370     oss << "ExtendedRhoDomainEn = " << std::dec << +m_avcPar->ExtendedRhoDomainEn << std::endl;
9371     oss << "EnableSEI = " << std::dec << +m_avcPar->EnableSEI << std::endl;
9372     if (m_avcPar->NumP == 0)  // There's no P frame
9373     {
9374         oss << "FrmHdrEncodingFrequency = " << std::dec << +m_avcPar->FrmHdrEncodingFrequency << std::endl;
9375     }
9376 
9377     if (m_avcPar->NumP > 0)
9378     {
9379         // P Slice Parameters
9380         // DDI Params
9381         oss << "PSliceQP = " << std::dec << +m_avcPar->PSliceQP << std::endl;
9382         oss << "CabacInitIDC = " << std::dec << +m_avcPar->CabacInitIDC << std::endl;
9383         oss << "MaxRefIdxL0 = " << std::dec << +m_avcPar->MaxRefIdxL0 << std::endl;
9384         oss << "MaxRefIdxL1 = " << std::dec << +m_avcPar->MaxRefIdxL1 << std::endl;
9385         if (m_avcPar->NumB == 0)  // There's no B frame
9386         {
9387             oss << "EnableWeightPredictionDetection = " << std::dec << +m_avcPar->EnableWeightPredictionDetection << std::endl;
9388         }
9389         oss << "WeightedPred = " << std::dec << +m_avcPar->WeightedPred << std::endl;
9390         oss << "UseOrigAsRef = " << std::dec << +m_avcPar->UseOrigAsRef << std::endl;
9391         oss << "BiSubMbPartMask = " << std::dec << +m_avcPar->BiSubMbPartMask << std::endl;
9392 
9393         // HME Params
9394         oss << "SuperHME = " << std::dec << +(m_useCommonKernel ? m_encodeParState->m_commonPar->superHME : m_avcPar->SuperHME) << std::endl;
9395         oss << "UltraHME = " << std::dec << +(m_useCommonKernel ? m_encodeParState->m_commonPar->ultraHME : m_avcPar->UltraHME) << std::endl;
9396         oss << "SuperCombineDist = " << std::dec << +(m_useCommonKernel ? m_encodeParState->m_commonPar->superCombineDist : m_avcPar->SuperCombineDist) << std::endl;
9397 
9398         // Enc Params
9399         oss << "SubPelMode = " << std::dec << +m_avcPar->SubPelMode << std::endl;
9400         oss << "FTQBasedSkip = " << std::dec << +m_avcPar->FTQBasedSkip << std::endl;
9401         oss << "BiMixDisable = " << std::dec << +m_avcPar->BiMixDisable << std::endl;
9402         oss << "SurvivedSkipCost = " << std::dec << +m_avcPar->SurvivedSkipCost << std::endl;
9403         oss << "UniMixDisable = " << std::dec << +m_avcPar->UniMixDisable << std::endl;
9404         oss << "EnableIntraCostScalingForStaticFrame = " << std::dec << +m_avcPar->EnableIntraCostScalingForStaticFrame << std::endl;
9405         if (m_avcPar->EnableIntraCostScalingForStaticFrame)
9406         {
9407             oss << "IntraCostUpdateMethod = 3" << std::endl;
9408         }
9409         oss << "StaticFrameIntraCostScalingRatioP = " << std::dec << +m_avcPar->StaticFrameIntraCostScalingRatioP << std::endl;
9410         oss << "MEMethod = " << std::dec << +m_avcPar->MEMethod << std::endl;
9411         oss << "HMECombineLen = " << std::dec << +m_avcPar->HMECombineLen << std::endl;
9412         oss << "HMECombineOverlap = " << std::dec << +m_avcPar->HMECombineOverlap << std::endl;
9413         oss << "SearchX = " << std::dec << +m_avcPar->SearchX << std::endl;
9414         oss << "SearchY = " << std::dec << +m_avcPar->SearchY << std::endl;
9415         oss << "SearchControl = " << std::dec << +m_avcPar->SearchControl << std::endl;
9416         oss << "MultiplePred = " << std::dec << +m_avcPar->MultiplePred << std::endl;
9417         oss << "EnableAdaptiveTxDecision = " << std::dec << +m_avcPar->EnableAdaptiveTxDecision << std::endl;
9418         oss << "MBTextureThreshold = " << std::dec << +m_avcPar->MBTextureThreshold << std::endl;
9419         oss << "TxDecisionThr = " << std::dec << +m_avcPar->TxDecisionThr << std::endl;
9420         oss << "EnablePerMBStaticCheck = " << std::dec << +m_avcPar->EnablePerMBStaticCheck << std::endl;
9421         oss << "EnableAdaptiveSearchWindowSize = " << std::dec << +m_avcPar->EnableAdaptiveSearchWindowSize << std::endl;
9422         oss << "EnableAdaptiveIntraScaling = " << std::dec << +m_avcPar->EnableAdaptiveIntraScaling << std::endl;
9423 
9424         // BRC Frame Update
9425         oss << "UserMaxFrame_P = " << std::dec << +m_avcPar->UserMaxFrameP << std::endl;
9426 
9427         // PAK Params
9428         oss << "RoundingInterEnabled = " << std::dec << +m_avcPar->RoundingInterEnabled << std::endl;
9429         oss << "RoundingInter = " << std::dec << +m_avcPar->RoundingInter << std::endl;
9430         oss << "FrmHdrEncodingFrequency = " << std::dec << +m_avcPar->FrmHdrEncodingFrequency << std::endl;
9431         oss << "EnableAdaptiveRounding = " << std::dec << +m_avcPar->EnableAdaptiveRounding << std::endl;
9432     }
9433 
9434     if (m_avcPar->NumB > 0)
9435     {
9436         // B Slice Parameters
9437         // DDI Params
9438         oss << "BSliceQP = " << std::dec << +m_avcPar->BSliceQP << std::endl;
9439         oss << "MaxBRefIdxL0 = " << std::dec << +m_avcPar->MaxBRefIdxL0 << std::endl;
9440         oss << "EnableWeightPredictionDetection = " << std::dec << +m_avcPar->EnableWeightPredictionDetection << std::endl;
9441         oss << "WeightedBiPred = " << std::dec << +m_avcPar->WeightedBiPred << std::endl;
9442 
9443         // Enc Params
9444         oss << "BMEMethod = " << std::dec << +m_avcPar->BMEMethod << std::endl;
9445         oss << "HMEBCombineLen = " << std::dec << +m_avcPar->HMEBCombineLen << std::endl;
9446         oss << "BSearchX = " << std::dec << +m_avcPar->BSearchX << std::endl;
9447         oss << "BSearchY = " << std::dec << +m_avcPar->BSearchY << std::endl;
9448         oss << "BSearchControl = " << std::dec << +m_avcPar->BSearchControl << std::endl;
9449         oss << "BSkipType = " << std::dec << +m_avcPar->BSkipType << std::endl;
9450         oss << "DirectMode = " << std::dec << +m_avcPar->DirectMode << std::endl;
9451         oss << "BiWeight = " << std::dec << +m_avcPar->BiWeight << std::endl;
9452         oss << "StaticFrameIntraCostScalingRatioB = " << std::dec << +m_avcPar->StaticFrameIntraCostScalingRatioB << std::endl;
9453 
9454         // PAK Params
9455         oss << "RoundingInterB = " << std::dec << +m_avcPar->RoundingInterB << std::endl;
9456     }
9457 
9458     const char *fileName = m_debugInterface->CreateFileName(
9459         "EncodeSequence",
9460         "EncodePar",
9461         CodechalDbgExtType::par);
9462 
9463     std::ofstream ofs(fileName, std::ios::app);
9464     ofs << oss.str();
9465     ofs.close();
9466 
9467     return MOS_STATUS_SUCCESS;
9468 }
9469 #endif
9470