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