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