1 /*
2 * Copyright © 2014 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
6 * "Software"), to deal in the Software without restriction, including
7 * without limitation the rights to use, copy, modify, merge, publish,
8 * distribute, sub license, and/or sell copies of the Software, and to
9 * permit persons to whom the Software is furnished to do so, subject to
10 * the following conditions:
11 *
12 * The above copyright notice and this permission notice (including the
13 * next paragraph) shall be included in all copies or substantial portions
14 * of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
20 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 *
24 * Authors:
25 * Midhunchandra Kodiyath <midhunchandra.kodiyath@intel.com>
26 *
27 */
28
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <stdbool.h>
32 #include <string.h>
33 #include <va/va.h>
34 #include <va/va_enc_h264.h>
35 #include <va/va_enc_vp8.h>
36 #include <va/va_backend.h>
37 #include "media_drv_defines.h"
38 #include "media_drv_init.h"
39 #include "media_drv_util.h"
40 #include "media_drv_gpe_utils.h"
41 #include "media_drv_encoder.h"
42 #include "media_drv_surface.h"
43 #include "media_drv_hw.h"
44 #include "media_drv_hwcmds.h"
45 #include "media_drv_hw_g75.h"
46 #include "media_drv_driver.h"
47 #include "media_drv_encoder_vp8.h"
48
49 VOID
media_free_resource_me(ME_CONTEXT * me_context)50 media_free_resource_me (ME_CONTEXT * me_context)
51 {
52
53 dri_bo_unreference (me_context->mv_distortion_surface_4x_me.bo);
54 me_context->mv_distortion_surface_4x_me.bo = NULL;
55
56 dri_bo_unreference (me_context->mv_data_surface_16x_me.bo);
57 me_context->mv_data_surface_16x_me.bo = NULL;
58
59 dri_bo_unreference (me_context->mv_data_surface_4x_me.bo);
60 me_context->mv_data_surface_4x_me.bo = NULL;
61 }
62
63 VOID
media_free_resource_mbenc(MBENC_CONTEXT * mbenc_context)64 media_free_resource_mbenc (MBENC_CONTEXT * mbenc_context)
65 {
66 dri_bo_unreference (mbenc_context->mb_mode_cost_luma_buffer.bo);
67 mbenc_context->mb_mode_cost_luma_buffer.bo = NULL;
68
69 dri_bo_unreference (mbenc_context->block_mode_cost_buffer.bo);
70 mbenc_context->block_mode_cost_buffer.bo = NULL;
71
72 dri_bo_unreference (mbenc_context->chroma_reconst_buffer.bo);
73 mbenc_context->chroma_reconst_buffer.bo = NULL;
74
75 dri_bo_unreference (mbenc_context->histogram_buffer.bo);
76 mbenc_context->histogram_buffer.bo = NULL;
77
78 dri_bo_unreference (mbenc_context->kernel_dump_buffer.bo);
79 mbenc_context->kernel_dump_buffer.bo = NULL;
80
81 dri_bo_unreference (mbenc_context->ref_frm_count_surface.bo);
82 mbenc_context->ref_frm_count_surface.bo = NULL;
83
84 dri_bo_unreference (mbenc_context->pred_mv_data_surface.bo);
85 mbenc_context->pred_mv_data_surface.bo = NULL;
86
87 dri_bo_unreference (mbenc_context->mode_cost_update_surface.bo);
88 mbenc_context->mode_cost_update_surface.bo = NULL;
89
90 dri_bo_unreference (mbenc_context->pred_mb_quant_data_surface.bo);
91 mbenc_context->pred_mb_quant_data_surface.bo = NULL;
92 }
93
94 VOID
media_free_resource_mbpak(MBPAK_CONTEXT * mbpak_context)95 media_free_resource_mbpak (MBPAK_CONTEXT * mbpak_context)
96 {
97
98 dri_bo_unreference (mbpak_context->row_buffer_y.bo);
99 mbpak_context->row_buffer_y.bo = NULL;
100
101 dri_bo_unreference (mbpak_context->row_buffer_uv.bo);
102 mbpak_context->row_buffer_uv.bo = NULL;
103
104 dri_bo_unreference (mbpak_context->column_buffer_y.bo);
105 mbpak_context->column_buffer_y.bo = NULL;
106
107 dri_bo_unreference (mbpak_context->column_buffer_uv.bo);
108 mbpak_context->column_buffer_uv.bo = NULL;
109
110 dri_bo_unreference (mbpak_context->kernel_dump_buffer.bo);
111 mbpak_context->kernel_dump_buffer.bo = NULL;
112
113 }
114
115 VOID
media_mbpak_context_destroy(MEDIA_ENCODER_CTX * encoder_context)116 media_mbpak_context_destroy (MEDIA_ENCODER_CTX * encoder_context)
117 {
118 MBPAK_CONTEXT *mbpak_ctx = &encoder_context->mbpak_context;
119 MEDIA_GPE_CTX *mbpak_gpe_ctx = &mbpak_ctx->gpe_context;
120 media_free_resource_mbpak (mbpak_ctx);
121 media_gpe_context_destroy (mbpak_gpe_ctx);
122 mbpak_gpe_ctx = &mbpak_ctx->gpe_context2;
123 media_gpe_context_destroy (mbpak_gpe_ctx);
124 }
125
126 VOID
media_mbenc_context_destroy(MEDIA_ENCODER_CTX * encoder_context)127 media_mbenc_context_destroy (MEDIA_ENCODER_CTX * encoder_context)
128 {
129 MBENC_CONTEXT *mbenc_ctx = &encoder_context->mbenc_context;
130 MEDIA_GPE_CTX *mbenc_gpe_ctx = &mbenc_ctx->gpe_context;
131 media_free_resource_mbenc (mbenc_ctx);
132 media_gpe_context_destroy (mbenc_gpe_ctx);
133 }
134
135 VOID
media_me_context_destroy(MEDIA_ENCODER_CTX * encoder_context)136 media_me_context_destroy (MEDIA_ENCODER_CTX * encoder_context)
137 {
138 ME_CONTEXT *me_ctx = &encoder_context->me_context;
139 MEDIA_GPE_CTX *me_gpe_ctx = &me_ctx->gpe_context;
140 media_free_resource_me (me_ctx);
141 media_gpe_context_destroy (me_gpe_ctx);
142 }
143
144 VOID
media_free_resource_scaling(SCALING_CONTEXT * scaling_context)145 media_free_resource_scaling (SCALING_CONTEXT * scaling_context)
146 {
147
148 dri_bo_unreference (scaling_context->scaled_4x_surface.bo);
149 scaling_context->scaled_4x_surface.bo = NULL;
150
151 dri_bo_unreference (scaling_context->scaled_16x_surface.bo);
152 scaling_context->scaled_16x_surface.bo = NULL;
153
154 dri_bo_unreference (scaling_context->scaled_32x_surface.bo);
155 scaling_context->scaled_32x_surface.bo = NULL;
156 }
157
158 VOID
media_scaling_context_destroy(MEDIA_ENCODER_CTX * encoder_context)159 media_scaling_context_destroy (MEDIA_ENCODER_CTX * encoder_context)
160 {
161 SCALING_CONTEXT *scaling_ctx = &encoder_context->scaling_context;
162 MEDIA_GPE_CTX *scaling_gpe_ctx = &scaling_ctx->gpe_context;
163 media_free_resource_scaling (scaling_ctx);
164 media_gpe_context_destroy (scaling_gpe_ctx);
165 }
166
167 VOID
media_free_resource_brc_init_reset(BRC_INIT_RESET_CONTEXT * context)168 media_free_resource_brc_init_reset (BRC_INIT_RESET_CONTEXT * context)
169 {
170 int i;
171
172 dri_bo_unreference (context->brc_history.bo);
173 context->brc_history.bo = NULL;
174
175 dri_bo_unreference (context->brc_distortion.bo);
176 context->brc_distortion.bo = NULL;
177
178 dri_bo_unreference (context->brc_pak_qp_input_table.bo);
179 context->brc_pak_qp_input_table.bo = NULL;
180
181 dri_bo_unreference (context->brc_constant_data.bo);
182 context->brc_constant_data.bo = NULL;
183
184 for (i = 0; i < NUM_BRC_CONSTANT_DATA_BUFFERS; i++) {
185 dri_bo_unreference(context->brc_constant_buffer[i].bo);
186 context->brc_constant_buffer[i].bo = NULL;
187 }
188 }
189
190 VOID
media_brc_init_reset_context_destroy(MEDIA_ENCODER_CTX * encoder_context)191 media_brc_init_reset_context_destroy (MEDIA_ENCODER_CTX * encoder_context)
192 {
193 BRC_INIT_RESET_CONTEXT *ctx = &encoder_context->brc_init_reset_context;
194 MEDIA_GPE_CTX *gpe_ctx = &ctx->gpe_context;
195 media_free_resource_brc_init_reset (ctx);
196 media_gpe_context_destroy (gpe_ctx);
197 }
198
199 VOID
media_free_resource_brc_update(BRC_UPDATE_CONTEXT * context)200 media_free_resource_brc_update (BRC_UPDATE_CONTEXT *context)
201 {
202 }
203
204 VOID
media_brc_update_context_destroy(MEDIA_ENCODER_CTX * encoder_context)205 media_brc_update_context_destroy (MEDIA_ENCODER_CTX *encoder_context)
206 {
207 BRC_UPDATE_CONTEXT *ctx = &encoder_context->brc_update_context;
208 MEDIA_GPE_CTX *gpe_ctx = &ctx->gpe_context;
209
210 media_free_resource_brc_update (ctx);
211 media_gpe_context_destroy (gpe_ctx);
212 }
213
214 static VOID
media_encoder_context_destroy(VOID * hw_context)215 media_encoder_context_destroy (VOID * hw_context)
216 {
217 MEDIA_ENCODER_CTX *encoder_context = (MEDIA_ENCODER_CTX *) hw_context;
218 media_scaling_context_destroy (encoder_context);
219 media_me_context_destroy (encoder_context);
220 media_mbenc_context_destroy (encoder_context);
221 media_mbpak_context_destroy (encoder_context);
222 media_brc_init_reset_context_destroy(encoder_context);
223 media_brc_update_context_destroy(encoder_context);
224 media_drv_free_memory (encoder_context);
225 }
226
227 VOID
gpe_context_vfe_scoreboardinit_pak_p1(MEDIA_ENCODER_CTX * encoder_context,MEDIA_GPE_CTX * gpe_context)228 gpe_context_vfe_scoreboardinit_pak_p1 (MEDIA_ENCODER_CTX * encoder_context,MEDIA_GPE_CTX * gpe_context)
229 {
230 gpe_context->vfe_state.vfe_desc5.scoreboard0.mask = 0xFF;
231 gpe_context->vfe_state.vfe_desc5.scoreboard0.type = SCOREBOARD_NON_STALLING;
232 gpe_context->vfe_state.vfe_desc5.scoreboard0.enable = 1;
233
234 gpe_context->vfe_state.vfe_desc6.scoreboard1.delta_x0 = 0xF;
235 gpe_context->vfe_state.vfe_desc6.scoreboard1.delta_y0 = 0;
236 gpe_context->vfe_state.vfe_desc6.scoreboard1.delta_x1 = 0;
237 gpe_context->vfe_state.vfe_desc6.scoreboard1.delta_y1 = 0xF;
238 gpe_context->vfe_state.vfe_desc6.scoreboard1.delta_x2 = 1;
239 gpe_context->vfe_state.vfe_desc6.scoreboard1.delta_y2 = 0xF;
240 gpe_context->vfe_state.vfe_desc6.scoreboard1.delta_x3 = 0xF;
241 gpe_context->vfe_state.vfe_desc6.scoreboard1.delta_y3 = 0xF;
242
243 gpe_context->vfe_state.vfe_desc7.scoreboard2.delta_x4 = 0xF;
244 gpe_context->vfe_state.vfe_desc7.scoreboard2.delta_y4 = 1;
245 gpe_context->vfe_state.vfe_desc7.scoreboard2.delta_x5 = 0;
246 gpe_context->vfe_state.vfe_desc7.scoreboard2.delta_y5 = 0xE;
247 gpe_context->vfe_state.vfe_desc7.scoreboard2.delta_x6 = 1;
248 gpe_context->vfe_state.vfe_desc7.scoreboard2.delta_y6 = 0xE;
249 gpe_context->vfe_state.vfe_desc7.scoreboard2.delta_x7 = 0xF;
250 gpe_context->vfe_state.vfe_desc7.scoreboard2.delta_y7 = 0xE;
251 }
252
253 VOID
gpe_context_vfe_scoreboardinit_pak_p2(MEDIA_ENCODER_CTX * encoder_context,MEDIA_GPE_CTX * gpe_context)254 gpe_context_vfe_scoreboardinit_pak_p2 (MEDIA_ENCODER_CTX * encoder_context,MEDIA_GPE_CTX * gpe_context)
255 {
256 gpe_context->vfe_state.vfe_desc5.scoreboard0.mask = 0x07;
257 gpe_context->vfe_state.vfe_desc5.scoreboard0.type = SCOREBOARD_NON_STALLING;
258 gpe_context->vfe_state.vfe_desc5.scoreboard0.enable = 1;
259
260 gpe_context->vfe_state.vfe_desc6.scoreboard1.delta_x0 = 0xF;
261 gpe_context->vfe_state.vfe_desc6.scoreboard1.delta_y0 = 0;
262 gpe_context->vfe_state.vfe_desc6.scoreboard1.delta_x1 = 0;
263 gpe_context->vfe_state.vfe_desc6.scoreboard1.delta_y1 = 0xF;
264 gpe_context->vfe_state.vfe_desc6.scoreboard1.delta_x2 = 1;
265 gpe_context->vfe_state.vfe_desc6.scoreboard1.delta_y2 = 0xE;
266 gpe_context->vfe_state.vfe_desc6.scoreboard1.delta_x3 = 0x0;
267 gpe_context->vfe_state.vfe_desc6.scoreboard1.delta_y3 = 0x0;
268
269 gpe_context->vfe_state.vfe_desc7.scoreboard2.delta_x4 = 0x0;
270 gpe_context->vfe_state.vfe_desc7.scoreboard2.delta_y4 = 0;
271 gpe_context->vfe_state.vfe_desc7.scoreboard2.delta_x5 = 0;
272 gpe_context->vfe_state.vfe_desc7.scoreboard2.delta_y5 = 0;
273 gpe_context->vfe_state.vfe_desc7.scoreboard2.delta_x6 = 0;
274 gpe_context->vfe_state.vfe_desc7.scoreboard2.delta_y6 = 0;
275 gpe_context->vfe_state.vfe_desc7.scoreboard2.delta_x7 = 0;
276 gpe_context->vfe_state.vfe_desc7.scoreboard2.delta_y7 = 0;
277 }
278 BOOL
media_encoder_init(VADriverContextP ctx,MEDIA_ENCODER_CTX * encoder_context)279 media_encoder_init (VADriverContextP ctx, MEDIA_ENCODER_CTX * encoder_context)
280 {
281 media_hw_context_init(ctx);
282
283 switch (encoder_context->codec)
284 {
285 case CODEC_VP8:
286 media_encoder_init_vp8 (ctx, encoder_context);
287 break;
288 default:
289 /* never get here */
290 MEDIA_DRV_ASSERT (0);
291 break;
292 }
293 return SUCCESS;
294 }
295
296 struct hw_context *
media_enc_context_init(VADriverContextP ctx,struct object_config * obj_config,INT picture_width,INT picture_height)297 media_enc_context_init (VADriverContextP ctx,
298 struct object_config *obj_config, INT picture_width,
299 INT picture_height)
300 {
301 INT i;
302 MEDIA_ENCODER_CTX *encoder_context =
303 (MEDIA_ENCODER_CTX *) media_drv_alloc_memory (sizeof (MEDIA_ENCODER_CTX));
304
305 encoder_context->base.destroy = media_encoder_context_destroy;
306 encoder_context->input_yuv_surface = VA_INVALID_SURFACE;
307 encoder_context->is_tmp_id = 0;
308 encoder_context->rate_control_mode = VA_RC_NONE;
309 encoder_context->internal_rate_mode = HB_BRC_NONE;
310 switch (obj_config->profile)
311 {
312 case VAProfileVP8Version0_3:
313 encoder_context->codec = CODEC_VP8;
314 break;
315 default:
316 /* Never get here */
317 MEDIA_DRV_ASSERT (0);
318 break;
319
320 }
321 for (i = 0; i < obj_config->num_attribs; i++)
322 {
323 if (obj_config->attrib_list[i].type == VAConfigAttribRateControl)
324 {
325 encoder_context->rate_control_mode =
326 obj_config->attrib_list[i].value;
327
328 switch (encoder_context->rate_control_mode) {
329 case VA_RC_CQP:
330 encoder_context->internal_rate_mode = HB_BRC_CQP;
331 break;
332
333 case VA_RC_CBR:
334 encoder_context->internal_rate_mode = HB_BRC_CBR;
335 break;
336
337 case VA_RC_VBR:
338 encoder_context->internal_rate_mode = HB_BRC_VBR;
339 break;
340
341 default:
342 encoder_context->internal_rate_mode = HB_BRC_NONE;
343 break;
344 }
345 }
346 }
347 encoder_context->picture_width = picture_width;
348 encoder_context->picture_height = picture_height;
349 media_encoder_init (ctx, encoder_context);
350
351 return (struct hw_context *) encoder_context;
352 }
353
354 VOID
media_drv_status_report(VADriverContextP ctx,MEDIA_BATCH_BUFFER * batch,MEDIA_GPE_CTX * gpe_context)355 media_drv_status_report (VADriverContextP ctx, MEDIA_BATCH_BUFFER * batch,
356 MEDIA_GPE_CTX * gpe_context)
357 {
358 PIPE_CONTROL_PARAMS pipe_ctrl_params = { {NULL, 0, 0} };
359 pipe_ctrl_params.status_buffer.bo = gpe_context->status_buffer.res.bo;
360 pipe_ctrl_params.immediate_data = 1;
361 pipe_ctrl_params.flush_mode = FLUSH_NONE;
362 mediadrv_gen_pipe_ctrl_cmd (batch, &pipe_ctrl_params);
363 }
364
365 VOID
media_drv_generic_kernel_cmds(VADriverContextP ctx,MEDIA_ENCODER_CTX * encoder_context,MEDIA_BATCH_BUFFER * batch,MEDIA_GPE_CTX * gpe_context,GENERIC_KERNEL_PARAMS * params)366 media_drv_generic_kernel_cmds (VADriverContextP ctx,
367 MEDIA_ENCODER_CTX * encoder_context,
368 MEDIA_BATCH_BUFFER * batch,
369 MEDIA_GPE_CTX * gpe_context,
370 GENERIC_KERNEL_PARAMS * params)
371 {
372 PIPE_CONTROL_PARAMS pipe_ctrl_params = { {NULL, 0, 0} };
373 STATE_BASE_ADDR_PARAMS state_base_addr_params;
374 VFE_STATE_PARAMS vfe_state_params;
375 CURBE_LOAD_PARAMS curbe_load_params;
376 ID_LOAD_PARAMS id_load_params;
377
378 pipe_ctrl_params.flush_mode = FLUSH_WRITE_CACHE;
379 mediadrv_gen_pipe_ctrl_cmd (batch, &pipe_ctrl_params);
380 pipe_ctrl_params.immediate_data = encoder_context->frame_num;
381 pipe_ctrl_params.flush_mode = FLUSH_READ_CACHE;
382 mediadrv_gen_pipe_ctrl_cmd (batch, &pipe_ctrl_params);
383
384 #if 0
385 #ifdef STATUS_REPORT
386 media_drv_status_report (ctx, batch, gpe_context);
387 #endif
388 #endif
389 mediadrv_gen_pipeline_select_cmd (batch);
390
391 state_base_addr_params.surface_state.bo =
392 /*batch->buffer; */ gpe_context->surface_state_binding_table.res.bo;
393 state_base_addr_params.dynamic_state.bo = gpe_context->dynamic_state.res.bo;
394 state_base_addr_params.indirect_object.bo = NULL;
395 state_base_addr_params.instruction_buffer.bo =
396 gpe_context->instruction_state.buff_obj.bo;
397
398 encoder_context->mediadrv_gen_state_base_address_cmd (batch, &state_base_addr_params);
399 vfe_state_params.gpgpu_mode = gpe_context->vfe_state.gpgpu_mode;
400 vfe_state_params.max_num_threads = gpe_context->vfe_state.max_num_threads;
401 vfe_state_params.num_urb_entries = gpe_context->vfe_state.num_urb_entries;
402 vfe_state_params.urb_entry_size = gpe_context->vfe_state.urb_entry_size;
403 vfe_state_params.curbe_allocation_size =
404 gpe_context->vfe_state.curbe_allocation_size;
405 vfe_state_params.scoreboard_enable = 1;
406 vfe_state_params.scoreboard_type = 0;
407 vfe_state_params.scoreboard_mask = 0;
408 vfe_state_params.scoreboardDW5 = gpe_context->vfe_state.vfe_desc5.dword;
409 vfe_state_params.scoreboardDW6 = gpe_context->vfe_state.vfe_desc6.dword;
410 vfe_state_params.scoreboardDW7 = gpe_context->vfe_state.vfe_desc7.dword;
411 encoder_context->mediadrv_gen_media_vfe_state_cmd (batch, &vfe_state_params);
412
413 curbe_load_params.curbe_size = gpe_context->curbe_size;
414 curbe_load_params.curbe_offset = gpe_context->curbe_offset;
415 mediadrv_gen_media_curbe_load_cmd (batch, &curbe_load_params);
416 id_load_params.idrt_size = gpe_context->idrt_size;
417 id_load_params.idrt_offset =
418 (gpe_context->idrt_offset +
419 (params->idrt_kernel_offset * gpe_context->idrt_size));
420 mediadrv_gen_media_id_load_cmd (batch, &id_load_params);
421 }
422
423 VOID
media_drv_add_predicate_media_obj_wallker_cmd(VADriverContextP ctx,MEDIA_BATCH_BUFFER * batch,MEDIA_OBJ_WALKER_PARAMS * walker_params)424 media_drv_add_predicate_media_obj_wallker_cmd (VADriverContextP ctx,
425 MEDIA_BATCH_BUFFER * batch,
426 MEDIA_OBJ_WALKER_PARAMS *
427 walker_params)
428 {
429 MI_SET_PREDICATE_PARAMS mi_set_predicate_params;
430 MEDIA_OBJ_WALKER_PARAMS media_obj_walker_params = *walker_params;
431
432 mi_set_predicate_params.predicate_en = MI_SET_PREDICATE_ENABLE_ON_CLEAR;
433 mediadrv_media_mi_set_predicate_cmd (batch, &mi_set_predicate_params);
434
435 media_object_walker_cmd (batch, &media_obj_walker_params);
436
437 mi_set_predicate_params.predicate_en = MI_SET_PREDICATE_ENABLE_ON_SET;
438 mediadrv_media_mi_set_predicate_cmd (batch, &mi_set_predicate_params);
439
440 if (walker_params->walker_mode == QUAD_MODE)
441 media_obj_walker_params.walker_mode = DUAL_MODE;
442
443 media_object_walker_cmd (batch, &media_obj_walker_params);
444
445 mi_set_predicate_params.predicate_en = MI_SET_PREDICATE_DISABLE;
446 mediadrv_media_mi_set_predicate_cmd (batch, &mi_set_predicate_params);
447 }
448
449 VOID
media_drv_end_status_report(VADriverContextP ctx,MEDIA_BATCH_BUFFER * batch,MEDIA_GPE_CTX * gpe_context)450 media_drv_end_status_report (VADriverContextP ctx, MEDIA_BATCH_BUFFER * batch,
451 MEDIA_GPE_CTX * gpe_context)
452 {
453 PIPE_CONTROL_PARAMS pipe_ctrl_params;
454 MI_STORE_DATA_IMM_PARAMS mi_store_data_imm_params;
455
456 pipe_ctrl_params.status_buffer.bo = gpe_context->status_buffer.res.bo;
457 pipe_ctrl_params.immediate_data = 0;
458 pipe_ctrl_params.flush_mode = FLUSH_WRITE_CACHE;
459 mediadrv_gen_pipe_ctrl_cmd (batch, &pipe_ctrl_params);
460 mi_store_data_imm_params.status_buffer.bo =
461 gpe_context->status_buffer.res.bo;
462 mi_store_data_imm_params.value = STATUS_QUERY_END_FLAG;
463 mediadrv_mi_store_data_imm_cmd (batch, &mi_store_data_imm_params);
464
465 }
466
467 VOID
mediadrv_gen_encode_scaling(VADriverContextP ctx,MEDIA_ENCODER_CTX * encoder_context,struct encode_state * encode_state,SCALING_KERNEL_PARAMS * params,BOOL phase_16x)468 mediadrv_gen_encode_scaling (VADriverContextP ctx,
469 MEDIA_ENCODER_CTX * encoder_context,
470 struct encode_state *encode_state,
471 SCALING_KERNEL_PARAMS * params, BOOL phase_16x)
472 {
473 UINT pic_coding_type, down_scaled_width_mb, down_scaled_height_mb;
474 SCALING_CURBE_PARAMS scaling_curbe_params;
475 MEDIA_DRV_CONTEXT *drv_ctx = ctx->pDriverData;
476 SCALING_CONTEXT *scaling_ctx = &encoder_context->scaling_context;
477 MEDIA_RESOURCE *scaling_input_surface, *scaling_output_surface, surface_2d, surface_2d_out;
478 struct object_surface *obj_surface;
479 MEDIA_BATCH_BUFFER *batch;
480 UINT input_width, input_height, output_width, output_height;
481 MEDIA_GPE_CTX *scaling_gpe_ctx = &scaling_ctx->gpe_context;
482 MEDIA_OBJ_WALKER_PARAMS walker_params;
483 SCALING_SURFACE_PARAMS scaling_sutface_params;
484 GENERIC_KERNEL_PARAMS kernel_params;
485 VAEncSequenceParameterBufferVP8 *seq_param =
486 (VAEncSequenceParameterBufferVP8 *) encode_state->seq_param_ext->buffer;
487 MEDIA_ENCODER_VP8_SURFACE *vp8_surface;
488 pic_coding_type = encoder_context->pic_coding_type;
489 if (!phase_16x)
490 scaling_gpe_ctx->surface_state_binding_table =
491 scaling_ctx->surface_state_binding_table_scaling;
492 else
493 scaling_gpe_ctx->surface_state_binding_table =
494 scaling_ctx->surface_state_binding_table_scaling_16x;
495 if (params->scaling_16x_en)
496 {
497 down_scaled_width_mb = encoder_context->down_scaled_width_mb16x;
498 down_scaled_height_mb = encoder_context->down_scaled_height_mb16x;
499 scaling_curbe_params.input_pic_width =
500 ALIGN ((seq_param->frame_width / SCALE_FACTOR_4x), 16);
501 scaling_curbe_params.input_pic_height =
502 ALIGN ((seq_param->frame_height / SCALE_FACTOR_4x), 16);
503 vp8_surface = encode_state->reconstructed_object->private_data;
504 obj_surface = vp8_surface->scaled_4x_surface_obj;
505 OBJECT_SURFACE_TO_MEDIA_RESOURCE_STRUCT (surface_2d, obj_surface);
506 scaling_input_surface = &surface_2d;
507 vp8_surface = encode_state->reconstructed_object->private_data;
508 obj_surface = vp8_surface->scaled_16x_surface_obj;
509 OBJECT_SURFACE_TO_MEDIA_RESOURCE_STRUCT (surface_2d_out, obj_surface);
510 scaling_output_surface = &surface_2d_out;
511 input_width = encoder_context->down_scaled_width_mb4x;
512 input_height = encoder_context->down_scaled_height_mb4x;
513 output_width = encoder_context->down_scaled_width_mb16x;
514 output_height = encoder_context->down_scaled_height_mb16x;
515 }
516 else
517 {
518 down_scaled_width_mb = encoder_context->down_scaled_width_mb4x;
519 down_scaled_height_mb = encoder_context->down_scaled_height_mb4x;
520 scaling_curbe_params.input_pic_width = seq_param->frame_width;
521 scaling_curbe_params.input_pic_height = seq_param->frame_height;
522 obj_surface = encode_state->input_yuv_object;
523 OBJECT_SURFACE_TO_MEDIA_RESOURCE_STRUCT (surface_2d, obj_surface);
524 scaling_input_surface = &surface_2d;
525 vp8_surface = encode_state->reconstructed_object->private_data;
526 obj_surface = vp8_surface->scaled_4x_surface_obj;
527 OBJECT_SURFACE_TO_MEDIA_RESOURCE_STRUCT (surface_2d_out, obj_surface);
528 scaling_output_surface = &surface_2d_out;
529 input_width = seq_param->frame_width;
530 input_height = seq_param->frame_height;
531 output_width = encoder_context->down_scaled_width_mb4x;
532 output_height = encoder_context->down_scaled_height_mb4x;
533 }
534
535 encoder_context->set_curbe_scaling (scaling_gpe_ctx, &scaling_curbe_params);
536
537 scaling_sutface_params.scaling_input_surface = *scaling_input_surface;
538 scaling_sutface_params.input_width = input_width;
539 scaling_sutface_params.input_height = input_height;
540 scaling_sutface_params.scaling_output_surface = *scaling_output_surface;
541 scaling_sutface_params.output_width = output_width;
542 scaling_sutface_params.output_height = output_height;
543
544 encoder_context->media_add_binding_table (scaling_gpe_ctx);
545 encoder_context->surface_state_scaling (encoder_context, &scaling_sutface_params);
546
547 batch = media_batchbuffer_new (&drv_ctx->drv_data, I915_EXEC_RENDER, 0);
548 //media_batchbuffer_start_atomic(batch, 0x4000);
549 kernel_params.idrt_kernel_offset = 0;
550 media_drv_generic_kernel_cmds (ctx, encoder_context, batch, scaling_gpe_ctx,
551 &kernel_params);
552
553 walker_params.walker_mode = encoder_context->walker_mode;
554 walker_params.frm_w_in_mb = down_scaled_width_mb * 2; /* looping for Walker is needed at 8x8 block level */
555 walker_params.frmfield_h_in_mb = down_scaled_height_mb * 2;
556 walker_params.pic_coding_type = pic_coding_type;
557 walker_params.use_scoreboard = 0; //encoder_context->use_hw_scoreboard;//setting this to zero because walker_params.me_in_use == TRUE
558 walker_params.me_in_use = TRUE; //no dependency dispatch order for Scaling kernel
559
560 encoder_context->media_object_walker_cmd (batch, &walker_params);
561 #if 0
562 #ifdef STATUS_REPORT
563 media_drv_end_status_report (ctx, batch, scaling_gpe_ctx);
564 #endif
565 #endif
566 media_batchbuffer_submit (batch);
567
568 }
569
570 VOID
mediadrv_gen_encode_mbpak(VADriverContextP ctx,MEDIA_ENCODER_CTX * encoder_context,struct encode_state * encode_state,UINT pak_phase_type)571 mediadrv_gen_encode_mbpak (VADriverContextP ctx,
572 MEDIA_ENCODER_CTX * encoder_context,
573 struct encode_state *encode_state,
574 UINT pak_phase_type)
575 {
576 MEDIA_DRV_CONTEXT *drv_ctx = ctx->pDriverData;
577 MBPAK_CONTEXT *mbpak_ctx = &encoder_context->mbpak_context;
578 MEDIA_GPE_CTX *mbpak_gpe_ctx;
579 MEDIA_BATCH_BUFFER *batch;
580 MEDIA_MBPAK_CURBE_PARAMS_VP8 curbe_params;
581 MBPAK_SURFACE_PARAMS_VP8 sutface_params;
582 MEDIA_OBJ_WALKER_PARAMS media_obj_walker_params;
583 GENERIC_KERNEL_PARAMS kernel_params;
584 /*UINT phase; */
585 if (pak_phase_type == MBPAK_HYBRID_STATE_P1)
586 {
587 mbpak_gpe_ctx = &mbpak_ctx->gpe_context;
588 mbpak_gpe_ctx->surface_state_binding_table =
589 mbpak_ctx->surface_state_binding_table_mbpak_p1;
590 kernel_params.idrt_kernel_offset = MBPAK_PHASE1_OFFSET;
591 encoder_context->gpe_context_vfe_scoreboardinit_pak_p1 (encoder_context,mbpak_gpe_ctx);
592 #ifdef DEBUG
593 //phase = 1;
594 #endif
595 }
596 else
597 {
598 mbpak_gpe_ctx = &mbpak_ctx->gpe_context2;
599 mbpak_gpe_ctx->surface_state_binding_table =
600 mbpak_ctx->surface_state_binding_table_mbpak_p2;
601 kernel_params.idrt_kernel_offset = MBPAK_PHASE2_OFFSET;
602 //FIXME:Need to find a better way to handle this..!
603 encoder_context->gpe_context_vfe_scoreboardinit_pak_p2 (encoder_context,mbpak_gpe_ctx);
604 #ifdef DEBUG
605 //phase = 2;
606 #endif
607 }
608
609 if (!encoder_context->mbpak_curbe_set_brc_update) {
610 curbe_params.curbe_cmd_buff =
611 media_map_buffer_obj (mbpak_gpe_ctx->dynamic_state.res.bo);
612 curbe_params.updated = encoder_context->mbpak_curbe_set_brc_update;
613 curbe_params.pak_phase_type = pak_phase_type;
614 encoder_context->set_curbe_vp8_mbpak (encode_state, &curbe_params);
615 media_unmap_buffer_obj (mbpak_gpe_ctx->dynamic_state.res.bo);
616 }
617
618 media_drv_memset (&sutface_params, sizeof (sutface_params));
619 sutface_params.orig_frame_width = encoder_context->picture_width;
620 sutface_params.orig_frame_height = encoder_context->picture_height;
621 sutface_params.mbpak_phase_type = pak_phase_type;
622 sutface_params.kernel_dump = encoder_context->kernel_dump_enable;
623 sutface_params.kernel_dump_buffer = mbpak_ctx->kernel_dump_buffer;
624 sutface_params.kernel_dump = 1;
625 sutface_params.cacheability_control = CACHEABILITY_TYPE_LLC;
626 encoder_context->media_add_binding_table (mbpak_gpe_ctx);
627 encoder_context->surface_state_vp8_mbpak (encoder_context, encode_state,
628 &sutface_params);
629
630 batch = media_batchbuffer_new (&drv_ctx->drv_data, I915_EXEC_RENDER, 0);
631 //kernel_params.idrt_kernel_offset=0;
632 media_drv_generic_kernel_cmds (ctx, encoder_context, batch, mbpak_gpe_ctx,
633 &kernel_params);
634 encoder_context->media_object_walker_pak_init(pak_phase_type,encoder_context,&media_obj_walker_params);
635 encoder_context->media_object_walker_cmd (batch, &media_obj_walker_params);
636 #if 0
637 #ifdef STATUS_REPORT
638 media_drv_end_status_report (ctx, batch, mbpak_gpe_ctx);
639 #endif
640 #endif
641 media_batchbuffer_submit (batch);
642 }
643
644 VOID
mediadrv_gen_encode_mbenc(VADriverContextP ctx,MEDIA_ENCODER_CTX * encoder_context,struct encode_state * encode_state,BOOL mbenc_phase_2,BOOL mbenc_i_frame_dist_in_use)645 mediadrv_gen_encode_mbenc (VADriverContextP ctx,
646 MEDIA_ENCODER_CTX * encoder_context,
647 struct encode_state *encode_state,
648 BOOL mbenc_phase_2, BOOL mbenc_i_frame_dist_in_use)
649 {
650 //VAStatus status = VA_STATUS_SUCCESS;
651 MEDIA_DRV_CONTEXT *drv_ctx = ctx->pDriverData;
652 MBENC_CONTEXT *mbenc_ctx = &encoder_context->mbenc_context;
653 MEDIA_GPE_CTX *mbenc_gpe_ctx = &mbenc_ctx->gpe_context;
654 VAEncPictureParameterBufferVP8 *pic_param =
655 (VAEncPictureParameterBufferVP8 *) encode_state->pic_param_ext->buffer;
656 MEDIA_BATCH_BUFFER *batch;
657 VOID *buf = NULL;
658 MBENC_CONSTANT_BUFFER_PARAMS_VP8 const_buff_params;
659 MEDIA_MBENC_CURBE_PARAMS_VP8 curbe_params;
660 MBENC_SURFACE_PARAMS_VP8 mbenc_sutface_params;
661 MEDIA_OBJ_WALKER_PARAMS media_obj_walker_params;
662 GENERIC_KERNEL_PARAMS kernel_params;
663
664 UINT /*phase, */ ref_frame_flag_final, ref_frame_flag;
665
666 if (mbenc_i_frame_dist_in_use) {
667 mbenc_gpe_ctx->surface_state_binding_table =
668 mbenc_ctx->surface_state_binding_table_mbenc_iframe_dist;
669 kernel_params.idrt_kernel_offset = MBENC_IFRAME_DIST_OFFSET;
670 } else
671 if (mbenc_phase_2 == FALSE)
672 {
673 mbenc_gpe_ctx->surface_state_binding_table =
674 mbenc_ctx->surface_state_binding_table_mbenc_p1;
675 if (encoder_context->pic_coding_type == FRAME_TYPE_I)
676 kernel_params.idrt_kernel_offset = MBENC_ILUMA_START_OFFSET;
677 else
678 kernel_params.idrt_kernel_offset = MBENC_P_START_OFFSET;
679 #ifdef DEBUG
680 //phase = 2;
681 #endif
682 }
683 else
684 {
685 mbenc_gpe_ctx->surface_state_binding_table =
686 mbenc_ctx->surface_state_binding_table_mbenc_p2;
687 kernel_params.idrt_kernel_offset = MBENC_ICHROMA_START_OFFSET;
688 #ifdef DEBUG
689 //phase = 1;
690 #endif
691 }
692
693 if (mbenc_phase_2 == FALSE) {
694 if (!encoder_context->mbenc_curbe_set_brc_update) {
695 curbe_params.kernel_mode = encoder_context->kernel_mode;
696 curbe_params.mb_enc_iframe_dist_in_use = mbenc_i_frame_dist_in_use;
697 curbe_params.updated = encoder_context->mbenc_curbe_set_brc_update;
698 curbe_params.hme_enabled = encode_state->hme_enabled;
699 //curbe_params.ref_frame_ctrl = encoder_context->ref_frame_ctrl;
700 curbe_params.brc_enabled = encoder_context->brc_enabled;
701
702 if (encoder_context->pic_coding_type == FRAME_TYPE_P)
703 {
704 ref_frame_flag = 0x07;
705 if (pic_param->ref_last_frame == pic_param->ref_gf_frame)
706 {
707 ref_frame_flag &= ~GOLDEN_REF_FLAG_VP8;
708 }
709 if (pic_param->ref_last_frame == pic_param->ref_arf_frame)
710 {
711 ref_frame_flag &= ~ALT_REF_FLAG_VP8;
712 }
713 if (pic_param->ref_gf_frame == pic_param->ref_arf_frame)
714 {
715 ref_frame_flag &= ~ALT_REF_FLAG_VP8;
716 }
717 }
718 else
719 {
720 ref_frame_flag = 1;
721 }
722
723 switch (encoder_context->ref_frame_ctrl)
724 {
725 case 0:
726 ref_frame_flag_final = 0;
727 break;
728 case 1:
729 ref_frame_flag_final = 1; //Last Ref only
730 break;
731 case 2:
732 ref_frame_flag_final = 2; //Gold Ref only
733 break;
734 case 4:
735 ref_frame_flag_final = 4; //Alt Ref only
736 break;
737 default:
738 ref_frame_flag_final =
739 (ref_frame_flag & encoder_context->ref_frame_ctrl)
740 ? (ref_frame_flag & encoder_context->ref_frame_ctrl) : 0x1;
741 }
742 encoder_context->ref_frame_ctrl = ref_frame_flag_final;
743 curbe_params.ref_frame_ctrl = encoder_context->ref_frame_ctrl;
744 curbe_params.frame_update = &encoder_context->frame_update;
745
746 if (encoder_context->pic_coding_type == FRAME_TYPE_I)
747 {
748 buf = media_map_buffer_obj (mbenc_gpe_ctx->dynamic_state.res.bo);
749 curbe_params.curbe_cmd_buff = buf;
750 encoder_context->set_curbe_i_vp8_mbenc (encode_state,
751 &curbe_params);
752 media_unmap_buffer_obj (mbenc_gpe_ctx->dynamic_state.res.bo);
753 }
754 else if (encoder_context->pic_coding_type == FRAME_TYPE_P)
755 {
756
757 buf = media_map_buffer_obj (mbenc_gpe_ctx->dynamic_state.res.bo);
758 curbe_params.curbe_cmd_buff = buf;
759 encoder_context->set_curbe_p_vp8_mbenc (encode_state,
760 &curbe_params);
761 media_unmap_buffer_obj (mbenc_gpe_ctx->dynamic_state.res.bo);
762 }
763 }
764
765 if (encoder_context->pic_coding_type == FRAME_TYPE_I) {
766 const_buff_params.mb_mode_cost_luma_buffer =
767 &mbenc_ctx->mb_mode_cost_luma_buffer;
768 const_buff_params.block_mode_cost_buffer =
769 &mbenc_ctx->block_mode_cost_buffer;
770 const_buff_params.mode_cost_update_surface =
771 &mbenc_ctx->mode_cost_update_surface;
772 media_encode_init_mbenc_constant_buffer_vp8_g75
773 (&const_buff_params);
774 }
775
776 if (encoder_context->init_brc_distortion_buffer &&
777 mbenc_i_frame_dist_in_use) {
778 encoder_context->initialize_brc_distortion_buffer(encoder_context);
779 }
780 }
781
782 media_drv_memset (&mbenc_sutface_params, sizeof (mbenc_sutface_params));
783 mbenc_sutface_params.pic_coding = encoder_context->pic_coding_type;
784 mbenc_sutface_params.orig_frame_width = encoder_context->picture_width;
785 mbenc_sutface_params.orig_frame_height = encoder_context->picture_height;
786 mbenc_sutface_params.iframe_dist_in_use = mbenc_i_frame_dist_in_use;
787 mbenc_sutface_params.cacheability_control = CACHEABILITY_TYPE_LLC;
788 mbenc_sutface_params.kernel_dump = 1;
789 mbenc_sutface_params.hme_enabled = encode_state->hme_enabled;
790 encoder_context->media_add_binding_table (&mbenc_ctx->gpe_context);
791
792 encoder_context->surface_state_vp8_mbenc (encoder_context, encode_state,
793 &mbenc_sutface_params);
794 batch = media_batchbuffer_new (&drv_ctx->drv_data, I915_EXEC_RENDER, 0);
795 media_drv_generic_kernel_cmds (ctx, encoder_context, batch, mbenc_gpe_ctx,
796 &kernel_params);
797 encoder_context->media_object_walker_mbenc_init(mbenc_i_frame_dist_in_use,mbenc_phase_2,encoder_context,&media_obj_walker_params);
798 encoder_context->media_object_walker_cmd (batch, &media_obj_walker_params);
799 #if 0
800 #ifdef STATUS_REPORT
801 media_drv_end_status_report (ctx, batch, mbenc_gpe_ctx);
802 #endif
803 #endif
804 media_batchbuffer_submit (batch);
805 }
806
807 VOID
mediadrv_gen_encode_me(VADriverContextP ctx,MEDIA_ENCODER_CTX * encoder_context,struct encode_state * encode_state,BOOL me_phase)808 mediadrv_gen_encode_me (VADriverContextP ctx,
809 MEDIA_ENCODER_CTX * encoder_context,
810 struct encode_state *encode_state, BOOL me_phase)
811 {
812 MEDIA_DRV_CONTEXT *drv_ctx = ctx->pDriverData;
813 VP8_ME_CURBE_PARAMS me_curbe_params;
814 ME_SURFACE_PARAMS_VP8 me_sutface_params;
815 BOOL me_16x = encode_state->me_16x_enabled && !encode_state->me_16x_done;
816 VOID *buf = NULL;
817 MEDIA_OBJ_WALKER_PARAMS media_obj_walker_params;
818 MEDIA_BATCH_BUFFER *batch;
819 ME_CONTEXT *me_ctx = &encoder_context->me_context;
820 MEDIA_GPE_CTX *me_gpe_ctx = &me_ctx->gpe_context;
821 VAEncSequenceParameterBufferVP8 *seq_param =
822 (VAEncSequenceParameterBufferVP8 *) encode_state->seq_param_ext->buffer;
823 UINT pic_coding_type = encoder_context->pic_coding_type;
824 GENERIC_KERNEL_PARAMS kernel_params;
825 if (me_phase)
826 {
827 me_gpe_ctx->surface_state_binding_table =
828 me_ctx->surface_state_binding_table_4x_me;
829 }
830 else
831 {
832 me_gpe_ctx->surface_state_binding_table =
833 me_ctx->surface_state_binding_table_16x_me;
834 }
835 me_curbe_params.frame_width = seq_param->frame_width;
836 me_curbe_params.frame_field_height = seq_param->frame_height;
837 me_curbe_params.picture_coding_type = pic_coding_type;
838 me_curbe_params.me_16x = me_16x;
839 me_curbe_params.me_16x_enabled = encode_state->me_16x_enabled;
840 me_curbe_params.kernel_mode = encoder_context->kernel_mode;
841 buf = media_map_buffer_obj (me_gpe_ctx->dynamic_state.res.bo);
842 me_curbe_params.curbe_cmd_buff = buf;
843 encoder_context->set_curbe_vp8_me (&me_curbe_params);
844 media_unmap_buffer_obj (me_gpe_ctx->dynamic_state.res.bo);
845 //batch = media_batchbuffer_new (&drv_ctx->drv_data, I915_EXEC_RENDER, 0);
846 //_(ctx, batch, me_gpe_ctx);
847
848 me_sutface_params.me_16x_in_use = me_16x;
849 me_sutface_params.me_16x_enabled = encode_state->me_16x_enabled;
850 me_sutface_params.me_surface_state_binding_table =
851 &me_gpe_ctx->surface_state_binding_table;
852
853 //media_alloc_binding_surface_state(drv_ctx,&me_gpe_ctx->context->surface_state_binding_table);
854 encoder_context->media_add_binding_table (me_gpe_ctx);
855 encoder_context->surface_state_vp8_me (encoder_context, encode_state, &me_sutface_params);
856
857
858 batch = media_batchbuffer_new (&drv_ctx->drv_data, I915_EXEC_RENDER, 0);
859 kernel_params.idrt_kernel_offset = 0;
860 media_drv_generic_kernel_cmds (ctx, encoder_context, batch, me_gpe_ctx,
861 &kernel_params);
862
863
864 media_drv_memset (&media_obj_walker_params,
865 sizeof (media_obj_walker_params));
866 media_obj_walker_params.use_scoreboard = 0;
867 media_obj_walker_params.walker_mode = encoder_context->walker_mode;
868 media_obj_walker_params.pic_coding_type = pic_coding_type;
869 //media_obj_walker_params.direct_spatial_mv_pred;
870 media_obj_walker_params.me_in_use = TRUE;
871 //media_obj_walker_params.mb_enc_iframe_dist_en;
872 //media_obj_walker_params.force_26_degree;
873 media_obj_walker_params.frmfield_h_in_mb =
874 me_16x ? encoder_context->down_scaled_frame_field_height_mb16x :
875 encoder_context->down_scaled_frame_field_height_mb4x;
876 media_obj_walker_params.frm_w_in_mb =
877 (me_16x) ? encoder_context->down_scaled_width_mb16x : encoder_context->
878 down_scaled_width_mb4x;
879 encoder_context->media_object_walker_cmd (batch, &media_obj_walker_params);
880 media_batchbuffer_submit (batch);
881
882 if (me_16x) {
883 encode_state->me_16x_done = TRUE;
884 }
885 }
886
887 VOID
mediadrv_gen_encode_brc_init_reset(VADriverContextP ctx,MEDIA_ENCODER_CTX * encoder_context,struct encode_state * encode_state)888 mediadrv_gen_encode_brc_init_reset(VADriverContextP ctx,
889 MEDIA_ENCODER_CTX * encoder_context,
890 struct encode_state *encode_state)
891 {
892 MEDIA_DRV_CONTEXT *drv_ctx = ctx->pDriverData;
893 MEDIA_BRC_INIT_RESET_PARAMS_VP8 curbe_params;
894 BRC_INIT_RESET_CONTEXT *brc_init_reset_context = &encoder_context->brc_init_reset_context;
895 MEDIA_GPE_CTX *gpe_ctx = &brc_init_reset_context->gpe_context;
896 BRC_INIT_RESET_SURFACE_PARAMS_VP8 surface_params;
897 GENERIC_KERNEL_PARAMS kernel_params;
898 MEDIA_BATCH_BUFFER *batch;
899 MEDIA_OBJECT_PARAMS media_object_params;
900
901 /* kernel id */
902 if (!encoder_context->brc_initted)
903 kernel_params.idrt_kernel_offset = BRC_INIT_OFFSET;
904 else
905 kernel_params.idrt_kernel_offset = BRC_RESET_OFFSET;
906
907 /* binding table */
908 gpe_ctx->surface_state_binding_table =
909 brc_init_reset_context->surface_state_binding_table_brc_init_reset;
910
911 /* curbe */
912 curbe_params.frame_width = encoder_context->frame_width;
913 curbe_params.frame_height = encoder_context->frame_height;
914 curbe_params.avbr_accuracy = encoder_context->avbr_accuracy;
915 curbe_params.avbr_convergence = encoder_context->avbr_convergence;
916 curbe_params.brc_initted = encoder_context->brc_initted;
917 curbe_params.brc_mb_enabled = encoder_context->brc_mb_enabled;
918 curbe_params.frame_rate = encoder_context->frame_rate;
919 curbe_params.rate_control_mode = encoder_context->internal_rate_mode;
920 curbe_params.target_bit_rate = encoder_context->target_bit_rate;
921 curbe_params.max_bit_rate = encoder_context->max_bit_rate;
922 curbe_params.min_bit_rate = encoder_context->min_bit_rate;
923 curbe_params.init_vbv_buffer_fullness_in_bit = encoder_context->init_vbv_buffer_fullness_in_bit;
924 curbe_params.vbv_buffer_size_in_bit = encoder_context->vbv_buffer_size_in_bit;
925 curbe_params.gop_pic_size = encoder_context->gop_pic_size;
926 curbe_params.brc_init_current_target_buf_full_in_bits =
927 &encoder_context->brc_init_current_target_buf_full_in_bits;
928 curbe_params.brc_init_reset_buf_size_in_bits =
929 &encoder_context->brc_init_reset_buf_size_in_bits;
930 curbe_params.brc_init_reset_input_bits_per_frame =
931 &encoder_context->brc_init_reset_input_bits_per_frame;
932
933 curbe_params.curbe_cmd_buff =
934 media_map_buffer_obj (gpe_ctx->dynamic_state.res.bo);
935 encoder_context->set_curbe_vp8_brc_init_reset(encode_state, &curbe_params);
936 media_unmap_buffer_obj (gpe_ctx->dynamic_state.res.bo);
937
938 /* surface & binding table */
939 media_drv_memset (&surface_params, sizeof (surface_params));
940 surface_params.cacheability_control = CACHEABILITY_TYPE_LLC;
941 encoder_context->media_add_binding_table (gpe_ctx);
942 encoder_context->surface_state_vp8_brc_init_reset (encoder_context,
943 encode_state,
944 &surface_params);
945
946 /* kernels */
947 batch = media_batchbuffer_new (&drv_ctx->drv_data, I915_EXEC_RENDER, 0);
948 media_drv_generic_kernel_cmds (ctx,
949 encoder_context,
950 batch,
951 gpe_ctx,
952 &kernel_params);
953
954 /* object command */
955 media_object_params.interface_offset = 0;
956 media_object_params.use_scoreboard = 0;
957 media_object_cmd(batch, &media_object_params);
958
959 media_batchbuffer_submit (batch);
960 }
961
962 VOID
mediadrv_gen_encode_brc_update(VADriverContextP ctx,MEDIA_ENCODER_CTX * encoder_context,struct encode_state * encode_state)963 mediadrv_gen_encode_brc_update(VADriverContextP ctx,
964 MEDIA_ENCODER_CTX * encoder_context,
965 struct encode_state *encode_state)
966 {
967 MEDIA_DRV_CONTEXT *drv_ctx = ctx->pDriverData;
968 MEDIA_BRC_UPDATE_PARAMS_VP8 curbe_params;
969 BRC_UPDATE_CONTEXT *brc_update_context = &encoder_context->brc_update_context;
970 MEDIA_GPE_CTX *gpe_ctx = &brc_update_context->gpe_context;
971 BRC_UPDATE_SURFACE_PARAMS_VP8 surface_params;
972 GENERIC_KERNEL_PARAMS kernel_params;
973 MEDIA_BATCH_BUFFER *batch;
974 MEDIA_OBJECT_PARAMS media_object_params;
975 VAEncPictureParameterBufferVP8 *pic_param =
976 (VAEncPictureParameterBufferVP8 *) encode_state->pic_param_ext->buffer;
977 MEDIA_MBENC_CURBE_PARAMS_VP8 mbenc_curbe_params;
978 MBENC_CONTEXT *mbenc_ctx = &encoder_context->mbenc_context;
979 MEDIA_GPE_CTX *mbenc_gpe_ctx = &mbenc_ctx->gpe_context;
980 MEDIA_MBPAK_CURBE_PARAMS_VP8 mbpak_curbe_params;
981 MBPAK_CONTEXT *mbpak_ctx = &encoder_context->mbpak_context;
982 MEDIA_GPE_CTX *mbpak_gpe_ctx;
983 BRC_INIT_RESET_CONTEXT *brc_init_reset_context = &encoder_context->brc_init_reset_context;
984 BRC_UPDATE_CONSTANT_DATA_PARAMS_VP8 constant_data_params;
985
986 VOID *buf = NULL;
987 UINT ref_frame_flag_final, ref_frame_flag;
988
989 /* setup mbenc curbe ??? */
990 mbenc_curbe_params.kernel_mode = encoder_context->kernel_mode;
991 mbenc_curbe_params.mb_enc_iframe_dist_in_use = FALSE;
992 mbenc_curbe_params.updated = 0; // encoder_context->mbenc_curbe_set_brc_update;
993 mbenc_curbe_params.hme_enabled = encode_state->hme_enabled;
994 mbenc_curbe_params.brc_enabled = encoder_context->brc_enabled;
995 mbenc_curbe_params.frame_update = &encoder_context->frame_update;
996
997 if (encoder_context->pic_coding_type == FRAME_TYPE_P) {
998 ref_frame_flag = 0x07;
999
1000 if (pic_param->ref_last_frame == pic_param->ref_gf_frame) {
1001 ref_frame_flag &= ~GOLDEN_REF_FLAG_VP8;
1002 }
1003
1004 if (pic_param->ref_last_frame == pic_param->ref_arf_frame) {
1005 ref_frame_flag &= ~ALT_REF_FLAG_VP8;
1006 }
1007
1008 if (pic_param->ref_gf_frame == pic_param->ref_arf_frame) {
1009 ref_frame_flag &= ~ALT_REF_FLAG_VP8;
1010 }
1011 } else {
1012 ref_frame_flag = 1;
1013 }
1014
1015 switch (encoder_context->ref_frame_ctrl) {
1016 case 0:
1017 ref_frame_flag_final = 0;
1018 break;
1019
1020 case 1:
1021 ref_frame_flag_final = 1; //Last Ref only
1022 break;
1023
1024 case 2:
1025 ref_frame_flag_final = 2; //Gold Ref only
1026 break;
1027
1028 case 4:
1029 ref_frame_flag_final = 4; //Alt Ref only
1030 break;
1031
1032 default:
1033 ref_frame_flag_final =
1034 (ref_frame_flag & encoder_context->ref_frame_ctrl) ?
1035 (ref_frame_flag & encoder_context->ref_frame_ctrl) : 0x1;
1036 }
1037
1038 encoder_context->ref_frame_ctrl = ref_frame_flag_final;
1039 mbenc_curbe_params.ref_frame_ctrl = encoder_context->ref_frame_ctrl;
1040
1041 buf = media_map_buffer_obj (mbenc_gpe_ctx->dynamic_state.res.bo);
1042 mbenc_curbe_params.curbe_cmd_buff = buf;
1043
1044 if (encoder_context->pic_coding_type == FRAME_TYPE_I) {
1045 encoder_context->set_curbe_i_vp8_mbenc (encode_state, &mbenc_curbe_params);
1046 } else if (encoder_context->pic_coding_type == FRAME_TYPE_P) {
1047 encoder_context->set_curbe_p_vp8_mbenc (encode_state, &mbenc_curbe_params);
1048 }
1049
1050 media_unmap_buffer_obj (mbenc_gpe_ctx->dynamic_state.res.bo);
1051
1052 encoder_context->mbenc_curbe_set_brc_update = TRUE;
1053
1054 /* setup mbpak curbe ??? */
1055 mbpak_gpe_ctx = &mbpak_ctx->gpe_context;
1056 mbpak_curbe_params.curbe_cmd_buff =
1057 media_map_buffer_obj (mbpak_gpe_ctx->dynamic_state.res.bo);
1058 mbpak_curbe_params.updated = 0;
1059 mbpak_curbe_params.pak_phase_type = MBPAK_HYBRID_STATE_P1;
1060 encoder_context->set_curbe_vp8_mbpak (encode_state, &mbpak_curbe_params);
1061 media_unmap_buffer_obj (mbpak_gpe_ctx->dynamic_state.res.bo);
1062
1063 mbpak_gpe_ctx = &mbpak_ctx->gpe_context2;
1064 mbpak_curbe_params.curbe_cmd_buff =
1065 media_map_buffer_obj (mbpak_gpe_ctx->dynamic_state.res.bo);
1066 mbpak_curbe_params.updated = 0;
1067 mbpak_curbe_params.pak_phase_type = MBPAK_HYBRID_STATE_P2;
1068 encoder_context->set_curbe_vp8_mbpak (encode_state, &mbpak_curbe_params);
1069 media_unmap_buffer_obj (mbpak_gpe_ctx->dynamic_state.res.bo);
1070
1071 encoder_context->mbpak_curbe_set_brc_update = TRUE;
1072
1073 /* kernel id */
1074 kernel_params.idrt_kernel_offset = BRC_UPDATE_OFFSET;
1075
1076 /* binding table */
1077 gpe_ctx->surface_state_binding_table =
1078 brc_update_context->surface_state_binding_table_brc_update;
1079
1080 /* brc update curbe */
1081 curbe_params.frame_width_in_mbs = encoder_context->picture_width_in_mbs;
1082 curbe_params.frame_height_in_mbs = encoder_context->picture_height_in_mbs;
1083 curbe_params.avbr_accuracy = encoder_context->avbr_accuracy;
1084 curbe_params.avbr_convergence = encoder_context->avbr_convergence;
1085 curbe_params.hme_enabled = encode_state->hme_enabled;
1086 curbe_params.brc_initted = encoder_context->brc_initted;
1087 curbe_params.kernel_mode = encoder_context->kernel_mode;
1088 curbe_params.pic_coding_type = encoder_context->pic_coding_type;
1089 curbe_params.frame_number = encoder_context->frame_num;
1090 curbe_params.brc_init_current_target_buf_full_in_bits =
1091 &encoder_context->brc_init_current_target_buf_full_in_bits;
1092 curbe_params.brc_init_reset_buf_size_in_bits =
1093 encoder_context->brc_init_reset_buf_size_in_bits;
1094 curbe_params.brc_init_reset_input_bits_per_frame =
1095 encoder_context->brc_init_reset_input_bits_per_frame;
1096 curbe_params.frame_update = &encoder_context->frame_update;
1097
1098 curbe_params.curbe_cmd_buff =
1099 media_map_buffer_obj (gpe_ctx->dynamic_state.res.bo);
1100 encoder_context->set_curbe_vp8_brc_update(encode_state, &curbe_params);
1101 media_unmap_buffer_obj (gpe_ctx->dynamic_state.res.bo);
1102
1103 /* init constant data surface */
1104 constant_data_params.brc_update_constant_data = &brc_init_reset_context->brc_constant_data;
1105 encoder_context->init_brc_update_constant_data_vp8(&constant_data_params);
1106
1107 /* surface & binding table */
1108 media_drv_memset (&surface_params, sizeof (surface_params));
1109 surface_params.cacheability_control = CACHEABILITY_TYPE_LLC;
1110 encoder_context->media_add_binding_table (gpe_ctx);
1111 encoder_context->surface_state_vp8_brc_update (encoder_context,
1112 encode_state,
1113 &surface_params);
1114
1115 /* kernels */
1116 batch = media_batchbuffer_new (&drv_ctx->drv_data, I915_EXEC_RENDER, 0);
1117 media_drv_generic_kernel_cmds (ctx,
1118 encoder_context,
1119 batch,
1120 gpe_ctx,
1121 &kernel_params);
1122
1123 /* object command */
1124 media_object_params.interface_offset = 0;
1125 media_object_params.use_scoreboard = 0;
1126 media_object_cmd(batch, &media_object_params);
1127 media_batchbuffer_submit (batch);
1128 }
1129
1130 VAStatus
media_encode_kernel_functions(VADriverContextP ctx,VAProfile profile,struct encode_state * encode_state,MEDIA_ENCODER_CTX * encoder_context)1131 media_encode_kernel_functions (VADriverContextP ctx,
1132 VAProfile profile,
1133 struct encode_state *encode_state,
1134 MEDIA_ENCODER_CTX * encoder_context)
1135 {
1136 VAStatus status = VA_STATUS_SUCCESS;
1137 SCALING_KERNEL_PARAMS scaling_params;
1138
1139 encoder_context->mbenc_curbe_set_brc_update = FALSE;
1140 encoder_context->mbpak_curbe_set_brc_update = FALSE;
1141
1142 if (encoder_context->brc_enabled) {
1143 if (!encoder_context->brc_initted ||
1144 encoder_context->brc_need_reset) {
1145 mediadrv_gen_encode_brc_init_reset(ctx, encoder_context, encode_state);
1146 }
1147 }
1148
1149 if (encoder_context->scaling_enabled == 1)
1150 {
1151 scaling_params.scaling_16x_en = 0;
1152 scaling_params.scaling_32x_en = 0;
1153
1154 mediadrv_gen_encode_scaling (ctx, encoder_context, encode_state,
1155 &scaling_params, FALSE);
1156 if (encoder_context->me_16x_supported == 1)
1157 {
1158 scaling_params.scaling_16x_en = 1;
1159 mediadrv_gen_encode_scaling (ctx, encoder_context, encode_state,
1160 &scaling_params, TRUE);
1161 }
1162 }
1163
1164 if (encode_state->hme_enabled)
1165 {
1166 if (encode_state->me_16x_enabled)
1167 {
1168 mediadrv_gen_encode_me (ctx, encoder_context, encode_state, FALSE);
1169 }
1170 mediadrv_gen_encode_me (ctx, encoder_context, encode_state, TRUE);
1171 }
1172
1173 if (encoder_context->brc_enabled) {
1174 if (encoder_context->brc_distortion_buffer_supported &&
1175 encoder_context->pic_coding_type == FRAME_TYPE_I) {
1176 mediadrv_gen_encode_mbenc (ctx, encoder_context, encode_state, FALSE,
1177 TRUE);
1178 }
1179
1180 mediadrv_gen_encode_brc_update(ctx, encoder_context, encode_state);
1181 }
1182
1183 encoder_context->brc_initted = 1;
1184
1185 mediadrv_gen_encode_mbenc (ctx, encoder_context, encode_state, FALSE,
1186 FALSE);
1187
1188 if ((encoder_context->pic_coding_type == FRAME_TYPE_I)
1189 && (encoder_context->mbenc_chroma_kernel == TRUE))
1190 {
1191 //phase2
1192 mediadrv_gen_encode_mbenc (ctx, encoder_context, encode_state, TRUE,
1193 FALSE);
1194 }
1195
1196 //PAK
1197 if (encoder_context->pic_coding_type == FRAME_TYPE_P)
1198 {
1199 mediadrv_gen_encode_mbpak (ctx, encoder_context, encode_state,
1200 MBPAK_HYBRID_STATE_P1);
1201 }
1202 mediadrv_gen_encode_mbpak (ctx, encoder_context, encode_state,
1203 MBPAK_HYBRID_STATE_P2);
1204
1205 if (encoder_context->brc_enabled) {
1206 encoder_context->mbenc_curbe_set_brc_update = FALSE;
1207 encoder_context->mbpak_curbe_set_brc_update = FALSE;
1208 }
1209
1210 return status;
1211 }
1212
1213 VOID
media_encode_mb_layout_vp8(MEDIA_ENCODER_CTX * encoder_context,VOID * data,UINT * data_size)1214 media_encode_mb_layout_vp8 (MEDIA_ENCODER_CTX * encoder_context, VOID * data,
1215 UINT * data_size)
1216 {
1217
1218 VAEncMbDataLayout *mb_layout = (VAEncMbDataLayout *) data;
1219
1220 mb_layout->MbCodeSize = MB_CODE_SIZE_VP8;
1221 mb_layout->MbCodeStride = MB_CODE_SIZE_VP8 * sizeof (UINT);
1222 mb_layout->MvNumber = 16;
1223 mb_layout->MvStride = 16 * sizeof (UINT);
1224
1225 mb_layout->MvOffset = encoder_context->mv_offset;
1226 mb_layout->MbCodeOffset = encoder_context->mb_data_offset;
1227
1228 *data_size = sizeof (VAEncMbDataLayout);
1229 }
1230
1231 VOID
media_verify_input_params(struct encode_state * encode_state)1232 media_verify_input_params (struct encode_state *encode_state)
1233 {
1234 #if 0
1235 VAEncPictureParameterBufferVP8 *pic_param =
1236 (VAEncPictureParameterBufferVP8 *) encode_state->pic_param_ext->buffer;
1237 VAEncSequenceParameterBufferVP8 *seq_param =
1238 (VAEncSequenceParameterBufferVP8 *) encode_state->seq_param_ext->buffer;
1239 VAQMatrixBufferVP8 *quant_params =
1240 (VAQMatrixBufferVP8 *) encode_state->q_matrix->buffer;
1241 INT i;
1242
1243 printf ("media_drv_encoder_initialize seq_param->frame_width=%d\n",
1244 seq_param->frame_width);
1245 printf ("media_drv_encoder_initialize seq_param->frame_height=%d\n",
1246 seq_param->frame_height);
1247 printf ("media_drv_encoder_initialize seq_param->frame_width_scale=%d\n",
1248 seq_param->frame_width_scale);
1249 printf ("media_drv_encoder_initialize seq_param->frame_height_scale=%d\n",
1250 seq_param->frame_height_scale);
1251 printf ("media_drv_encoder_initialize seq_param->error_resilient=%d\n",
1252 seq_param->error_resilient);
1253 printf ("media_drv_encoder_initialize seq_param->kf_auto=%d\n",
1254 seq_param->kf_auto);
1255 printf ("media_drv_encoder_initialize seq_param->kf_min_dist=%d\n",
1256 seq_param->kf_min_dist);
1257 printf ("media_drv_encoder_initialize seq_param->kf_max_dist=%d\n",
1258 seq_param->kf_max_dist);
1259 printf ("media_drv_encoder_initialize seq_param->bits_per_second=%d\n",
1260 seq_param->bits_per_second);
1261 printf ("media_drv_encoder_initialize seq_param->intra_period=%d\n",
1262 seq_param->intra_period);
1263 printf ("media_drv_encoder_initialize:pic_param->reconstructed_frame=%x\n",
1264 pic_param->reconstructed_frame);
1265 printf ("media_drv_encoder_initialize:pic_param->ref_last_frame=%x\n",
1266 pic_param->ref_last_frame);
1267 printf ("media_drv_encoder_initialize:pic_param->ref_gf_frame=%x\n",
1268 pic_param->ref_gf_frame);
1269 printf ("media_drv_encoder_initialize:pic_param->ref_arf_frame=%x\n",
1270 pic_param->ref_arf_frame);
1271 printf ("media_drv_encoder_initialize:pic_param->coded_buf=%x\n",
1272 pic_param->coded_buf);
1273 #endif
1274 }
1275
1276 VOID
media_get_seq_params_vp8_encode(VADriverContextP ctx,MEDIA_ENCODER_CTX * encoder_context,struct encode_state * encode_state)1277 media_get_seq_params_vp8_encode (VADriverContextP ctx,
1278 MEDIA_ENCODER_CTX * encoder_context,
1279 struct encode_state *encode_state)
1280 {
1281 VAEncSequenceParameterBufferVP8 *seq_param =
1282 (VAEncSequenceParameterBufferVP8 *) encode_state->seq_param_ext->buffer;
1283 /*if frame width and height is know at context init time can we move this to context init*/
1284 /*is it required to update frame width and height for each frame*/
1285 encoder_context->picture_width_in_mbs =
1286 (UINT) WIDTH_IN_MACROBLOCKS (seq_param->frame_width);
1287 encoder_context->picture_height_in_mbs =
1288 (UINT) HEIGHT_IN_MACROBLOCKS (seq_param->frame_height);
1289
1290 encoder_context->frame_width = encoder_context->picture_width_in_mbs * 16;
1291 encoder_context->frame_height = encoder_context->picture_height_in_mbs * 16;
1292
1293 encoder_context->down_scaled_width_mb4x =
1294 WIDTH_IN_MACROBLOCKS (encoder_context->frame_width / SCALE_FACTOR_4x);
1295 encoder_context->down_scaled_height_mb4x =
1296 HEIGHT_IN_MACROBLOCKS (encoder_context->frame_height / SCALE_FACTOR_4x);
1297 encoder_context->down_scaled_frame_field_height_mb4x =
1298 encoder_context->down_scaled_height_mb4x;
1299 encoder_context->down_scaled_frame_field_width_mb4x =
1300 encoder_context->down_scaled_width_mb4x;
1301
1302 encoder_context->down_scaled_width_mb16x =
1303 WIDTH_IN_MACROBLOCKS (encoder_context->frame_width / SCALE_FACTOR_16x);
1304 encoder_context->down_scaled_height_mb16x =
1305 HEIGHT_IN_MACROBLOCKS (encoder_context->frame_height / SCALE_FACTOR_16x);
1306 encoder_context->down_scaled_frame_field_height_mb16x =
1307 encoder_context->down_scaled_height_mb16x;
1308 encoder_context->down_scaled_frame_field_width_mb16x =
1309 encoder_context->down_scaled_width_mb16x;
1310
1311
1312 encoder_context->down_scaled_width_mb32x =
1313 WIDTH_IN_MACROBLOCKS (encoder_context->frame_width / SCALE_FACTOR_32x);
1314 encoder_context->down_scaled_height_mb32x =
1315 HEIGHT_IN_MACROBLOCKS (encoder_context->frame_height / SCALE_FACTOR_32x);
1316 encoder_context->down_scaled_frame_field_height_mb32x =
1317 encoder_context->down_scaled_height_mb32x;
1318 encoder_context->down_scaled_frame_field_width_mb32x =
1319 encoder_context->down_scaled_width_mb32x;
1320
1321 encoder_context->gop_pic_size = seq_param->intra_period;
1322 encoder_context->target_bit_rate = seq_param->bits_per_second;
1323 if (encoder_context->rate_control_mode == VA_RC_VBR &&
1324 encoder_context->max_bit_rate == 0)
1325 encoder_context->max_bit_rate = encoder_context->target_bit_rate;
1326 }
1327
1328 static VAStatus
media_get_pic_params_vp8_encode(VADriverContextP ctx,MEDIA_ENCODER_CTX * encoder_context,struct encode_state * encode_state)1329 media_get_pic_params_vp8_encode (VADriverContextP ctx,
1330 MEDIA_ENCODER_CTX * encoder_context,
1331 struct encode_state *encode_state)
1332 {
1333 MEDIA_DRV_CONTEXT *drv_ctx = ctx->pDriverData;
1334
1335 VAEncPictureParameterBufferVP8 *pic_param =
1336 (VAEncPictureParameterBufferVP8 *) encode_state->pic_param_ext->buffer;
1337 INT picture_coding_type;
1338 struct object_surface *obj_surface;
1339 CHAR *coded_buf;
1340
1341 encoder_context->pic_coding_type =
1342 pic_param->pic_flags.bits.frame_type ? FRAME_TYPE_P : FRAME_TYPE_I;
1343 picture_coding_type = encoder_context->pic_coding_type;
1344 encode_state->hme_enabled = encoder_context->hme_supported
1345 && picture_coding_type != FRAME_TYPE_I;
1346 encode_state->me_16x_enabled = encoder_context->me_16x_supported
1347 && picture_coding_type != FRAME_TYPE_I;
1348 if (encode_state->me_16x_enabled)
1349 {
1350 encode_state->me_16x_done = FALSE;
1351 }
1352 if (encode_state->hme_enabled)
1353 {
1354 encode_state->hme_done = FALSE;
1355 }
1356 if (picture_coding_type == FRAME_TYPE_I)
1357 {
1358 encoder_context->ref_frame_ctrl = 0;
1359 }
1360 else
1361 {
1362 if (encoder_context->disable_multi_ref == 0)
1363 {
1364 encoder_context->ref_frame_ctrl =
1365 (!pic_param->ref_flags.bits.
1366 no_ref_last) | ((!pic_param->ref_flags.bits.
1367 no_ref_gf) << 1) | ((!pic_param->ref_flags.bits.
1368 no_ref_arf) << 2);
1369 }
1370 else
1371 {
1372 //FIXME:multired ref frame is not enabled for BYT now.
1373 encoder_context->ref_frame_ctrl = 1;
1374 }
1375 }
1376 //hybrid
1377 obj_surface = SURFACE (pic_param->coded_buf);
1378 MEDIA_DRV_ASSERT (obj_surface && obj_surface->bo);
1379 if (!obj_surface || !obj_surface->bo)
1380 return VA_STATUS_ERROR_INVALID_PARAMETER;
1381
1382 encode_state->coded_buf_surface = obj_surface;
1383 coded_buf =
1384 (CHAR *) media_map_buffer_obj (encode_state->coded_buf_surface->bo);
1385 media_drv_memset (coded_buf, encode_state->coded_buf_surface->bo->size);
1386 media_unmap_buffer_obj (encode_state->coded_buf_surface->bo);
1387
1388 //ref frame
1389 if (pic_param->ref_last_frame != VA_INVALID_SURFACE)
1390 {
1391 obj_surface = SURFACE (pic_param->ref_last_frame);
1392
1393 if (obj_surface->bo)
1394 encode_state->ref_last_frame = obj_surface;
1395 else
1396 encode_state->ref_last_frame = NULL;
1397 }
1398 else
1399 {
1400 encode_state->ref_last_frame = NULL;
1401 //return VA_STATUS_ERROR_INVALID_PARAMETER;
1402 }
1403
1404 if (pic_param->ref_gf_frame != VA_INVALID_SURFACE)
1405 {
1406 obj_surface = SURFACE (pic_param->ref_gf_frame);
1407 if (obj_surface->bo)
1408 encode_state->ref_gf_frame = obj_surface;
1409 else
1410 encode_state->ref_gf_frame = NULL;
1411 }
1412 else
1413 {
1414 encode_state->ref_gf_frame = NULL;
1415 //return VA_STATUS_ERROR_INVALID_PARAMETER;
1416 }
1417
1418 if (pic_param->ref_arf_frame != VA_INVALID_SURFACE)
1419 {
1420 obj_surface = SURFACE (pic_param->ref_arf_frame);
1421 if (obj_surface->bo)
1422 encode_state->ref_arf_frame = obj_surface;
1423 else
1424 encode_state->ref_arf_frame = NULL;
1425 }
1426 else
1427 {
1428 encode_state->ref_arf_frame = NULL;
1429 //return VA_STATUS_ERROR_INVALID_PARAMETER;
1430 }
1431 if (pic_param->reconstructed_frame != VA_INVALID_SURFACE)
1432 {
1433 obj_surface = SURFACE (pic_param->reconstructed_frame);
1434 if (obj_surface->bo)
1435 encode_state->reconstructed_object = obj_surface;
1436 else
1437 encode_state->reconstructed_object = NULL;
1438 }
1439 else
1440 {
1441 encode_state->reconstructed_object = NULL;
1442 //return VA_STATUS_ERROR_INVALID_PARAMETER;
1443 }
1444 return VA_STATUS_SUCCESS;
1445 }
1446
1447 VOID
1448 media_get_frame_update_params_vp8_encode (VADriverContextP ctx,
1449 MEDIA_ENCODER_CTX *encoder_context,
1450 VAEncMiscParameterVP8HybridFrameUpdate *misc);
1451 static VOID
media_get_frame_update_vp8_encode(VADriverContextP ctx,MEDIA_ENCODER_CTX * encoder_context,struct encode_state * encode_state)1452 media_get_frame_update_vp8_encode (VADriverContextP ctx,
1453 MEDIA_ENCODER_CTX * encoder_context,
1454 struct encode_state *encode_state)
1455 {
1456 VAEncMiscParameterVP8HybridFrameUpdate *frame_update;
1457
1458 if (!encode_state->frame_update_param || !encode_state->frame_update_param->buffer)
1459 return;
1460
1461 frame_update = (VAEncMiscParameterVP8HybridFrameUpdate *) encode_state->frame_update_param->buffer;
1462
1463 media_get_frame_update_params_vp8_encode (ctx, encoder_context, frame_update);
1464 }
1465
1466 VOID
media_get_hrd_params_vp8_encode(VADriverContextP ctx,MEDIA_ENCODER_CTX * encoder_context,VAEncMiscParameterHRD * misc)1467 media_get_hrd_params_vp8_encode (VADriverContextP ctx,
1468 MEDIA_ENCODER_CTX *encoder_context,
1469 VAEncMiscParameterHRD *misc)
1470 {
1471 encoder_context->internal_rate_mode = HB_BRC_CBR;
1472 encoder_context->vbv_buffer_size_in_bit = misc->buffer_size;
1473 encoder_context->init_vbv_buffer_fullness_in_bit = misc->initial_buffer_fullness;
1474 }
1475
1476 VOID
media_get_frame_rate_params_vp8_encode(VADriverContextP ctx,MEDIA_ENCODER_CTX * encoder_context,VAEncMiscParameterFrameRate * misc)1477 media_get_frame_rate_params_vp8_encode (VADriverContextP ctx,
1478 MEDIA_ENCODER_CTX *encoder_context,
1479 VAEncMiscParameterFrameRate *misc)
1480 {
1481 encoder_context->frame_rate = misc->framerate / 100; /* misc->framerate is multiple of 100 */
1482 }
1483
1484 VOID
media_get_rate_control_params_vp8_encode(VADriverContextP ctx,MEDIA_ENCODER_CTX * encoder_context,VAEncMiscParameterRateControl * misc)1485 media_get_rate_control_params_vp8_encode (VADriverContextP ctx,
1486 MEDIA_ENCODER_CTX *encoder_context,
1487 VAEncMiscParameterRateControl *misc)
1488 {
1489 UINT max_bit_rate, target_bit_rate;
1490
1491 max_bit_rate = encoder_context->max_bit_rate;
1492 target_bit_rate = encoder_context->target_bit_rate;
1493 encoder_context->max_bit_rate = misc->bits_per_second;
1494
1495 if (encoder_context->rate_control_mode == VA_RC_CBR) {
1496 encoder_context->internal_rate_mode = HB_BRC_CBR;
1497 encoder_context->min_bit_rate = encoder_context->max_bit_rate;
1498 if(encoder_context->prev_target_bit_rate!=encoder_context->target_bit_rate){
1499 encoder_context->brc_need_reset = 1;
1500 encoder_context->prev_target_bit_rate=encoder_context->target_bit_rate;
1501 }
1502 } else if (encoder_context->rate_control_mode == VA_RC_VBR) {
1503 encoder_context->internal_rate_mode = HB_BRC_VBR;
1504 encoder_context->min_bit_rate = encoder_context->max_bit_rate * (2 * misc->target_percentage - 100) / 100;
1505 encoder_context->target_bit_rate = encoder_context->max_bit_rate * misc->target_percentage / 100;
1506
1507 if ((target_bit_rate != encoder_context->target_bit_rate) ||
1508 (max_bit_rate != encoder_context->max_bit_rate))
1509 encoder_context->brc_need_reset = 1;
1510 }
1511 }
1512
1513 VOID
media_get_private_params_vp8_encode(VADriverContextP ctx,MEDIA_ENCODER_CTX * encoder_context,VOID * misc)1514 media_get_private_params_vp8_encode (VADriverContextP ctx,
1515 MEDIA_ENCODER_CTX *encoder_context,
1516 VOID *misc)
1517 {
1518 // do nothing
1519 }
1520
1521 VOID
media_get_frame_update_params_vp8_encode(VADriverContextP ctx,MEDIA_ENCODER_CTX * encoder_context,VAEncMiscParameterVP8HybridFrameUpdate * misc)1522 media_get_frame_update_params_vp8_encode (VADriverContextP ctx,
1523 MEDIA_ENCODER_CTX *encoder_context,
1524 VAEncMiscParameterVP8HybridFrameUpdate *misc)
1525 {
1526 memcpy(&encoder_context->frame_update, misc, sizeof(MEDIA_FRAME_UPDATE));
1527 }
1528
1529
1530 static VAStatus
media_get_misc_params_vp8_encode(VADriverContextP ctx,MEDIA_ENCODER_CTX * encoder_context,struct encode_state * encode_state)1531 media_get_misc_params_vp8_encode (VADriverContextP ctx,
1532 MEDIA_ENCODER_CTX * encoder_context,
1533 struct encode_state *encode_state)
1534 {
1535 int i;
1536 VAEncMiscParameterType type;
1537 VAEncMiscParameterBuffer *misc_param;
1538
1539 for (i = 0; i < ARRAY_ELEMS(encode_state->misc_param); i++) {
1540 if (!encode_state->misc_param[i])
1541 continue;
1542
1543 type = media_drv_index_to_va_misc_type(i);
1544
1545 if (type == (VAEncMiscParameterType)(-1000))
1546 return VA_STATUS_ERROR_UNKNOWN;
1547
1548 misc_param = (VAEncMiscParameterBuffer *)encode_state->misc_param[i]->buffer;
1549 assert (misc_param->type == type);
1550
1551 switch ((INT)type) {
1552 case VAEncMiscParameterTypeHRD:
1553 media_get_hrd_params_vp8_encode(ctx,
1554 encoder_context,
1555 (VAEncMiscParameterHRD *)misc_param->data);
1556 break;
1557
1558 case VAEncMiscParameterTypeFrameRate:
1559 media_get_frame_rate_params_vp8_encode(ctx,
1560 encoder_context,
1561 (VAEncMiscParameterFrameRate *)misc_param->data);
1562 break;
1563
1564 case VAEncMiscParameterTypeRateControl:
1565 media_get_rate_control_params_vp8_encode(ctx,
1566 encoder_context,
1567 (VAEncMiscParameterRateControl *)misc_param->data);
1568 break;
1569
1570 case VAEncMiscParameterTypePrivate:
1571 media_get_private_params_vp8_encode(ctx,
1572 encoder_context,
1573 misc_param->data);
1574 break;
1575
1576 case VAEncMiscParameterTypeVP8HybridFrameUpdate:
1577 media_get_frame_update_params_vp8_encode(ctx,
1578 encoder_context,
1579 (VAEncMiscParameterVP8HybridFrameUpdate *)misc_param->data);
1580 break;
1581
1582 default:
1583 break;
1584 }
1585 }
1586
1587 return VA_STATUS_SUCCESS;
1588 }
1589
1590 static VAStatus
media_encoder_get_yuv_surface(VADriverContextP ctx,VAProfile profile,struct encode_state * encode_state,MEDIA_ENCODER_CTX * encoder_context)1591 media_encoder_get_yuv_surface (VADriverContextP ctx,
1592 VAProfile profile,
1593 struct encode_state *encode_state,
1594 MEDIA_ENCODER_CTX * encoder_context)
1595 {
1596 MEDIA_DRV_CONTEXT *drv_ctx = ctx->pDriverData;
1597 struct object_surface *obj_surface;
1598 /* releae the temporary surface */
1599 if (encoder_context->is_tmp_id)
1600 {
1601 media_DestroySurfaces (ctx, &encoder_context->input_yuv_surface, 1);
1602 encode_state->input_yuv_object = NULL;
1603 }
1604
1605 encoder_context->is_tmp_id = 0;
1606 obj_surface = SURFACE (encode_state->current_render_target);
1607 assert (obj_surface && obj_surface->bo);
1608
1609 if (!obj_surface || !obj_surface->bo)
1610 return VA_STATUS_ERROR_INVALID_PARAMETER;
1611
1612 if (obj_surface->fourcc == VA_FOURCC ('N', 'V', '1', '2'))
1613 {
1614 UINT tiling = 0, swizzle = 0;
1615 dri_bo_get_tiling (obj_surface->bo, &tiling, &swizzle);
1616
1617 if (tiling == I915_TILING_Y)
1618 {
1619 encoder_context->input_yuv_surface =
1620 encode_state->current_render_target;
1621 encode_state->input_yuv_object = obj_surface;
1622 return VA_STATUS_SUCCESS;
1623 }
1624 }
1625 else
1626 {
1627 /*FIXME:handle this later..!!returining error for now.! */
1628 return VA_STATUS_ERROR_INVALID_PARAMETER;
1629 }
1630 return VA_STATUS_SUCCESS;
1631 }
1632
1633 static VOID
media_encoder_free_priv_surface(void ** data)1634 media_encoder_free_priv_surface(void **data)
1635 {
1636 MEDIA_ENCODER_VP8_SURFACE *vp8_surface;
1637
1638 if (!data || *data)
1639 return;
1640
1641 vp8_surface = *data;
1642
1643 if (vp8_surface->scaled_4x_surface_obj) {
1644 MEDIA_DRV_ASSERT(vp8_surface->scaled_4x_surface_id != VA_INVALID_SURFACE);
1645 media_DestroySurfaces(vp8_surface->ctx, &vp8_surface->scaled_4x_surface_id, 1);
1646 vp8_surface->scaled_4x_surface_id = VA_INVALID_SURFACE;
1647 vp8_surface->scaled_4x_surface_obj = NULL;
1648 }
1649
1650 if (vp8_surface->scaled_16x_surface_obj) {
1651 MEDIA_DRV_ASSERT(vp8_surface->scaled_16x_surface_id != VA_INVALID_SURFACE);
1652 media_DestroySurfaces(vp8_surface->ctx, &vp8_surface->scaled_16x_surface_id, 1);
1653 vp8_surface->scaled_16x_surface_id = VA_INVALID_SURFACE;
1654 vp8_surface->scaled_16x_surface_obj = NULL;
1655 }
1656 }
1657
1658 static VOID
media_encoder_init_priv_surfaces(VADriverContextP ctx,MEDIA_ENCODER_CTX * encoder_context,struct object_surface * obj_surface)1659 media_encoder_init_priv_surfaces(VADriverContextP ctx,
1660 MEDIA_ENCODER_CTX * encoder_context,
1661 struct object_surface *obj_surface)
1662 {
1663 MEDIA_DRV_CONTEXT *drv_ctx = ctx->pDriverData;
1664 MEDIA_ENCODER_VP8_SURFACE *vp8_surface;
1665 int down_scaled_width4x, down_scaled_height4x;
1666 int down_scaled_width16x, down_scaled_height16x;
1667
1668 if (!obj_surface || obj_surface->private_data)
1669 return;
1670
1671 vp8_surface = media_drv_alloc_memory(sizeof(MEDIA_ENCODER_VP8_SURFACE));
1672 vp8_surface->ctx = ctx;
1673
1674 if (encoder_context->scaling_enabled) {
1675 down_scaled_width4x = encoder_context->down_scaled_width_mb4x * 16;
1676 down_scaled_height4x = encoder_context->down_scaled_height_mb4x * 16;
1677 media_CreateSurfaces (ctx,
1678 down_scaled_width4x, down_scaled_height4x,
1679 VA_FOURCC ('N', 'V', '1', '2'), 1,
1680 &vp8_surface->scaled_4x_surface_id);
1681 vp8_surface->scaled_4x_surface_obj = SURFACE(vp8_surface->scaled_4x_surface_id);
1682 MEDIA_DRV_ASSERT(vp8_surface->scaled_4x_surface_obj &&
1683 vp8_surface->scaled_4x_surface_obj->bo);
1684
1685 down_scaled_width16x = encoder_context->down_scaled_width_mb16x * 16;
1686 down_scaled_height16x = encoder_context->down_scaled_height_mb16x * 16;
1687 media_CreateSurfaces (ctx,
1688 down_scaled_width16x, down_scaled_height16x,
1689 VA_FOURCC ('N', 'V', '1', '2'), 1,
1690 &vp8_surface->scaled_16x_surface_id);
1691 vp8_surface->scaled_16x_surface_obj = SURFACE(vp8_surface->scaled_16x_surface_id);
1692 MEDIA_DRV_ASSERT(vp8_surface->scaled_16x_surface_obj &&
1693 vp8_surface->scaled_16x_surface_obj->bo);
1694 }
1695
1696 obj_surface->private_data = vp8_surface;
1697 obj_surface->free_private_data = media_encoder_free_priv_surface;
1698 }
1699
1700 VOID
media_alloc_binding_surface_state(MEDIA_DRV_CONTEXT * drv_ctx,SURFACE_STATE_BINDING_TABLE * surface_state_binding_table)1701 media_alloc_binding_surface_state (MEDIA_DRV_CONTEXT * drv_ctx,
1702 SURFACE_STATE_BINDING_TABLE *
1703 surface_state_binding_table)
1704 {
1705 surface_state_binding_table->res.bo_size =
1706 (SURFACE_STATE_PADDED_SIZE + sizeof (UINT)) * MAX_MEDIA_SURFACES_GEN6;
1707 //surface_state_binding_table->table_name = "binding table me";
1708 media_allocate_resource (&surface_state_binding_table->res,
1709 drv_ctx->drv_data.bufmgr,
1710 /*"surface state & binding table" */
1711 (const BYTE *) surface_state_binding_table->
1712 table_name,
1713 surface_state_binding_table->res.bo_size, 4096);
1714 MEDIA_DRV_ASSERT (surface_state_binding_table->res.bo);
1715 }
1716
1717 VOID
media_free_binding_surface_state(SURFACE_STATE_BINDING_TABLE * surface_state_binding_table)1718 media_free_binding_surface_state (SURFACE_STATE_BINDING_TABLE *
1719 surface_state_binding_table)
1720 {
1721 dri_bo_unreference (surface_state_binding_table->res.bo);
1722 surface_state_binding_table->res.bo = NULL;
1723 }
1724
1725 VOID
media_mbpak_kernel_pic_resource_dinit(MEDIA_ENCODER_CTX * encoder_context)1726 media_mbpak_kernel_pic_resource_dinit (MEDIA_ENCODER_CTX * encoder_context)
1727 {
1728 MBPAK_CONTEXT *mbpak_ctx = &encoder_context->mbpak_context;
1729 MEDIA_GPE_CTX *mbpak_gpe_ctx = &mbpak_ctx->gpe_context;
1730 media_free_binding_surface_state
1731 (&mbpak_ctx->surface_state_binding_table_mbpak_p1);
1732 media_free_binding_surface_state
1733 (&mbpak_ctx->surface_state_binding_table_mbpak_p2);
1734 mbpak_gpe_ctx->surface_state_binding_table.res.bo = NULL;
1735
1736 mbpak_gpe_ctx = &mbpak_ctx->gpe_context2;
1737 mbpak_gpe_ctx->surface_state_binding_table.res.bo = NULL;
1738 }
1739
1740 VOID
media_mbenc_kernel_pic_resource_dinit(MEDIA_ENCODER_CTX * encoder_context)1741 media_mbenc_kernel_pic_resource_dinit (MEDIA_ENCODER_CTX * encoder_context)
1742 {
1743 MBENC_CONTEXT *mbenc_ctx = &encoder_context->mbenc_context;
1744 MEDIA_GPE_CTX *mbenc_gpe_ctx = &mbenc_ctx->gpe_context;
1745 media_free_binding_surface_state
1746 (&mbenc_ctx->surface_state_binding_table_mbenc_p1);
1747 media_free_binding_surface_state
1748 (&mbenc_ctx->surface_state_binding_table_mbenc_p2);
1749 media_free_binding_surface_state
1750 (&mbenc_ctx->surface_state_binding_table_mbenc_iframe_dist);
1751 mbenc_gpe_ctx->surface_state_binding_table.res.bo = NULL;
1752 }
1753
1754 VOID
media_me_kernel_pic_resource_dinit(MEDIA_ENCODER_CTX * encoder_context)1755 media_me_kernel_pic_resource_dinit (MEDIA_ENCODER_CTX * encoder_context)
1756 {
1757 ME_CONTEXT *me_ctx = &encoder_context->me_context;
1758 MEDIA_GPE_CTX *me_gpe_ctx = &me_ctx->gpe_context;
1759 media_free_binding_surface_state
1760 (&me_ctx->surface_state_binding_table_4x_me);
1761 media_free_binding_surface_state
1762 (&me_ctx->surface_state_binding_table_16x_me);
1763 me_gpe_ctx->surface_state_binding_table.res.bo = NULL;
1764 }
1765
1766 VOID
media_scaling_kernel_pic_resource_dinit(MEDIA_ENCODER_CTX * encoder_context)1767 media_scaling_kernel_pic_resource_dinit (MEDIA_ENCODER_CTX * encoder_context)
1768 {
1769 SCALING_CONTEXT *scaling_ctx = &encoder_context->scaling_context;
1770 MEDIA_GPE_CTX *scaling_gpe_ctx = &scaling_ctx->gpe_context;
1771 media_free_binding_surface_state
1772 (&scaling_ctx->surface_state_binding_table_scaling);
1773 media_free_binding_surface_state
1774 (&scaling_ctx->surface_state_binding_table_scaling_16x);
1775 scaling_gpe_ctx->surface_state_binding_table.res.bo = NULL;
1776 }
1777
1778 VOID
media_brc_init_reset_kernel_pic_resource_dinit(MEDIA_ENCODER_CTX * encoder_context)1779 media_brc_init_reset_kernel_pic_resource_dinit (MEDIA_ENCODER_CTX * encoder_context)
1780 {
1781 BRC_INIT_RESET_CONTEXT *brc_init_reset_context = &encoder_context->brc_init_reset_context;
1782 MEDIA_GPE_CTX *gpe_context = &brc_init_reset_context->gpe_context;
1783
1784 media_free_binding_surface_state
1785 (&brc_init_reset_context->surface_state_binding_table_brc_init_reset);
1786 gpe_context->surface_state_binding_table.res.bo = NULL;
1787 }
1788
1789 VOID
media_brc_update_kernel_pic_resource_dinit(MEDIA_ENCODER_CTX * encoder_context)1790 media_brc_update_kernel_pic_resource_dinit (MEDIA_ENCODER_CTX * encoder_context)
1791 {
1792 BRC_UPDATE_CONTEXT *brc_update_context = &encoder_context->brc_update_context;
1793 MEDIA_GPE_CTX *gpe_context = &brc_update_context->gpe_context;
1794
1795 media_free_binding_surface_state
1796 (&brc_update_context->surface_state_binding_table_brc_update);
1797 gpe_context->surface_state_binding_table.res.bo = NULL;
1798 }
1799
1800 static VAStatus
media_kernel_dinit(VADriverContextP ctx,MEDIA_ENCODER_CTX * encoder_context,struct encode_state * encode_state)1801 media_kernel_dinit (VADriverContextP ctx,
1802 MEDIA_ENCODER_CTX * encoder_context,
1803 struct encode_state *encode_state)
1804 {
1805 VAStatus status = VA_STATUS_SUCCESS;
1806 media_scaling_kernel_pic_resource_dinit (encoder_context);
1807 media_me_kernel_pic_resource_dinit (encoder_context);
1808 media_mbenc_kernel_pic_resource_dinit (encoder_context);
1809 media_mbpak_kernel_pic_resource_dinit (encoder_context);
1810 media_brc_init_reset_kernel_pic_resource_dinit (encoder_context);
1811 media_brc_update_kernel_pic_resource_dinit (encoder_context);
1812 return status;
1813 }
1814
1815 VOID
media_mbpak_kernel_pic_resource_init(VADriverContextP ctx,MEDIA_ENCODER_CTX * encoder_context,struct encode_state * encode_state)1816 media_mbpak_kernel_pic_resource_init (VADriverContextP ctx,
1817 MEDIA_ENCODER_CTX * encoder_context,
1818 struct encode_state * encode_state)
1819 {
1820 MEDIA_DRV_CONTEXT *drv_ctx = (MEDIA_DRV_CONTEXT *) (ctx->pDriverData);
1821 MBPAK_CONTEXT *mbpak_ctx = &encoder_context->mbpak_context;
1822 mbpak_ctx->surface_state_binding_table_mbpak_p1.table_name =
1823 "surface state binding table mbpak p1";
1824 media_alloc_binding_surface_state (drv_ctx,
1825 &mbpak_ctx->surface_state_binding_table_mbpak_p1);
1826 mbpak_ctx->surface_state_binding_table_mbpak_p2.table_name =
1827 "surface state binding table mbpak p2";
1828 media_alloc_binding_surface_state (drv_ctx,
1829 &mbpak_ctx->surface_state_binding_table_mbpak_p2);
1830 }
1831
1832 VOID
media_mbenc_kernel_pic_resource_init(VADriverContextP ctx,MEDIA_ENCODER_CTX * encoder_context,struct encode_state * encode_state)1833 media_mbenc_kernel_pic_resource_init (VADriverContextP ctx,
1834 MEDIA_ENCODER_CTX * encoder_context,
1835 struct encode_state *encode_state)
1836 {
1837 MEDIA_DRV_CONTEXT *drv_ctx = (MEDIA_DRV_CONTEXT *) (ctx->pDriverData);
1838 MBENC_CONTEXT *mbenc_ctx = &encoder_context->mbenc_context;
1839 mbenc_ctx->surface_state_binding_table_mbenc_p1.table_name =
1840 "surface state binding table mbenc p1";
1841 media_alloc_binding_surface_state (drv_ctx,
1842 &mbenc_ctx->surface_state_binding_table_mbenc_p1);
1843 mbenc_ctx->surface_state_binding_table_mbenc_p2.table_name =
1844 "surface state binding table mbenc p2";
1845 media_alloc_binding_surface_state (drv_ctx,
1846 &mbenc_ctx->surface_state_binding_table_mbenc_p2);
1847
1848 mbenc_ctx->surface_state_binding_table_mbenc_iframe_dist.table_name =
1849 "surface state binding table mbenc iframe dist";
1850 media_alloc_binding_surface_state (drv_ctx,
1851 &mbenc_ctx->
1852 surface_state_binding_table_mbenc_iframe_dist);
1853 }
1854
1855 VOID
media_me_kernel_pic_resource_init(VADriverContextP ctx,MEDIA_ENCODER_CTX * encoder_context,struct encode_state * encode_state)1856 media_me_kernel_pic_resource_init (VADriverContextP ctx,
1857 MEDIA_ENCODER_CTX * encoder_context,
1858 struct encode_state *encode_state)
1859 {
1860 MEDIA_DRV_CONTEXT *drv_ctx = (MEDIA_DRV_CONTEXT *) (ctx->pDriverData);
1861 ME_CONTEXT *me_ctx = &encoder_context->me_context;
1862 me_ctx->surface_state_binding_table_4x_me.table_name =
1863 "surface state binding table 4x me";
1864 media_alloc_binding_surface_state (drv_ctx,
1865 &me_ctx->surface_state_binding_table_4x_me);
1866 me_ctx->surface_state_binding_table_16x_me.table_name =
1867 "surface state binding table 16x me";
1868 media_alloc_binding_surface_state (drv_ctx,
1869 &me_ctx->surface_state_binding_table_16x_me);
1870 }
1871
1872 VOID
media_scaling_kernel_pic_resource_init(VADriverContextP ctx,MEDIA_ENCODER_CTX * encoder_context,struct encode_state * encode_state)1873 media_scaling_kernel_pic_resource_init (VADriverContextP ctx,
1874 MEDIA_ENCODER_CTX * encoder_context,
1875 struct encode_state *encode_state)
1876 {
1877 MEDIA_DRV_CONTEXT *drv_ctx = (MEDIA_DRV_CONTEXT *) (ctx->pDriverData);
1878 SCALING_CONTEXT *scaling_ctx = &encoder_context->scaling_context;
1879 scaling_ctx->surface_state_binding_table_scaling.table_name =
1880 "surface state binding table scaling";
1881 media_alloc_binding_surface_state (drv_ctx,
1882 &scaling_ctx->surface_state_binding_table_scaling);
1883 scaling_ctx->surface_state_binding_table_scaling_16x.table_name =
1884 "surface state binding table scaling 16x";
1885 media_alloc_binding_surface_state (drv_ctx,
1886 &scaling_ctx->surface_state_binding_table_scaling_16x);
1887 }
1888
1889 VOID
media_brc_init_reset_kernel_pic_resource_init(VADriverContextP ctx,MEDIA_ENCODER_CTX * encoder_context,struct encode_state * encode_state)1890 media_brc_init_reset_kernel_pic_resource_init (VADriverContextP ctx,
1891 MEDIA_ENCODER_CTX * encoder_context,
1892 struct encode_state *encode_state)
1893 {
1894 MEDIA_DRV_CONTEXT *drv_ctx = (MEDIA_DRV_CONTEXT *) (ctx->pDriverData);
1895 BRC_INIT_RESET_CONTEXT *brc_init_reset_context = &encoder_context->brc_init_reset_context;
1896
1897 brc_init_reset_context->surface_state_binding_table_brc_init_reset.table_name =
1898 "surface state binding table brc init reset";
1899 media_alloc_binding_surface_state (drv_ctx,
1900 &brc_init_reset_context->surface_state_binding_table_brc_init_reset);
1901 }
1902
1903 VOID
media_brc_update_kernel_pic_resource_init(VADriverContextP ctx,MEDIA_ENCODER_CTX * encoder_context,struct encode_state * encode_state)1904 media_brc_update_kernel_pic_resource_init (VADriverContextP ctx,
1905 MEDIA_ENCODER_CTX * encoder_context,
1906 struct encode_state *encode_state)
1907 {
1908 MEDIA_DRV_CONTEXT *drv_ctx = (MEDIA_DRV_CONTEXT *) (ctx->pDriverData);
1909 BRC_UPDATE_CONTEXT *brc_update_context = &encoder_context->brc_update_context;
1910
1911 brc_update_context->surface_state_binding_table_brc_update.table_name =
1912 "surface state binding table brc distortion";
1913 media_alloc_binding_surface_state (drv_ctx,
1914 &brc_update_context->surface_state_binding_table_brc_update);
1915 }
1916
1917 static VAStatus
media_kernel_init(VADriverContextP ctx,MEDIA_ENCODER_CTX * encoder_context,struct encode_state * encode_state)1918 media_kernel_init (VADriverContextP ctx,
1919 MEDIA_ENCODER_CTX * encoder_context,
1920 struct encode_state *encode_state)
1921 {
1922 VAStatus status = VA_STATUS_SUCCESS;
1923 media_scaling_kernel_pic_resource_init (ctx, encoder_context, encode_state);
1924 media_me_kernel_pic_resource_init (ctx, encoder_context, encode_state);
1925 media_mbenc_kernel_pic_resource_init (ctx, encoder_context, encode_state);
1926 media_mbpak_kernel_pic_resource_init (ctx, encoder_context, encode_state);
1927 media_brc_init_reset_kernel_pic_resource_init(ctx, encoder_context, encode_state);
1928 media_brc_update_kernel_pic_resource_init(ctx, encoder_context, encode_state);
1929 return status;
1930 }
1931
1932 static VAStatus
media_encoder_picture_init(VADriverContextP ctx,VAProfile profile,MEDIA_ENCODER_CTX * encoder_context,struct encode_state * encode_state)1933 media_encoder_picture_init (VADriverContextP ctx, VAProfile profile,
1934 MEDIA_ENCODER_CTX * encoder_context,
1935 struct encode_state *encode_state)
1936 {
1937 VAStatus status = VA_STATUS_SUCCESS;
1938 MEDIA_ENCODER_VP8_SURFACE *vp8_surface;
1939 VAQMatrixBufferVP8 *quant_params =
1940 (VAQMatrixBufferVP8 *) encode_state->q_matrix->buffer;
1941
1942 #ifdef DEBUG
1943 media_verify_input_params (encode_state);
1944 #endif
1945 status =
1946 media_get_pic_params_vp8_encode (ctx, encoder_context, encode_state);
1947 if (status != VA_STATUS_SUCCESS)
1948 return status;
1949 media_get_seq_params_vp8_encode (ctx, encoder_context, encode_state);
1950
1951 media_get_frame_update_vp8_encode (ctx, encoder_context, encode_state);
1952
1953 status =
1954 media_encoder_get_yuv_surface (ctx, profile, encode_state,
1955 encoder_context);
1956 if (status != VA_STATUS_SUCCESS)
1957 return status;
1958
1959 status =
1960 media_get_misc_params_vp8_encode (ctx, encoder_context, encode_state);
1961
1962 if (status != VA_STATUS_SUCCESS)
1963 return status;
1964
1965 if (VA_RC_CQP == encoder_context->rate_control_mode) {
1966 encoder_context->internal_rate_mode = HB_BRC_CQP;
1967 encoder_context->target_bit_rate = 0;
1968 encoder_context->max_bit_rate = 0;
1969 encoder_context->min_bit_rate = 0;
1970 encoder_context->init_vbv_buffer_fullness_in_bit = 0;
1971 encoder_context->vbv_buffer_size_in_bit = 0;
1972 } else if (VA_RC_CBR == encoder_context->rate_control_mode) {
1973 encoder_context->internal_rate_mode = HB_BRC_CBR;
1974 encoder_context->max_bit_rate = encoder_context->target_bit_rate;
1975 encoder_context->min_bit_rate = encoder_context->target_bit_rate;
1976 } else if (VA_RC_VBR == encoder_context->rate_control_mode) {
1977 encoder_context->internal_rate_mode = HB_BRC_VBR;
1978 }
1979
1980 encoder_context->init_brc_distortion_buffer = 0;
1981 media_encoder_init_priv_surfaces(ctx,
1982 encoder_context,
1983 encode_state->reconstructed_object);
1984 vp8_surface = encode_state->reconstructed_object->private_data;
1985 vp8_surface->qp_index = quant_params->quantization_index[0];
1986
1987 if (encoder_context->brc_enabled) {
1988 if (encoder_context->pic_coding_type == FRAME_TYPE_I)
1989 encoder_context->init_brc_distortion_buffer = 1;
1990 else {
1991 if (encoder_context->frame_num % encoder_context->gop_pic_size == 1)
1992 encoder_context->init_brc_distortion_buffer = 1;
1993 }
1994 }
1995
1996 media_kernel_init (ctx, encoder_context, encode_state);
1997
1998 return status;
1999 }
2000
2001 VAStatus
media_encoder_picture(VADriverContextP ctx,VAProfile profile,union codec_state * codec_state,struct hw_context * hw_context)2002 media_encoder_picture (VADriverContextP ctx,
2003 VAProfile profile,
2004 union codec_state * codec_state,
2005 struct hw_context * hw_context)
2006 {
2007 MEDIA_ENCODER_CTX *encoder_context = (MEDIA_ENCODER_CTX *) hw_context;
2008 struct encode_state *encode_state = &codec_state->encode;
2009 VAStatus status = VA_STATUS_SUCCESS;
2010 #ifdef DEBUG
2011 printf ("media_encoder_picture\n");
2012 #endif
2013 status =
2014 media_encoder_picture_init (ctx, profile, encoder_context, encode_state);
2015 #if 0
2016 if (status != VA_STATUS_SUCCESS)
2017 return status;
2018 #endif
2019 status =
2020 media_encode_kernel_functions (ctx, profile, encode_state,
2021 encoder_context);
2022 #if 0
2023 if (status != VA_STATUS_SUCCESS)
2024 return status;
2025 #endif
2026 status = media_kernel_dinit (ctx, encoder_context, encode_state);
2027 #if 0
2028 if (status != VA_STATUS_SUCCESS)
2029 return status;
2030 #endif
2031
2032 encoder_context->frame_num = encoder_context->frame_num + 1;
2033 encoder_context->brc_need_reset = 0;
2034 return status;
2035 }
2036