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