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