diff options
author | Pengfei Qu <Pengfei.Qu@intel.com> | 2016-12-28 13:40:39 +0800 |
---|---|---|
committer | Sean V Kelley <seanvk@posteo.de> | 2017-01-10 15:22:11 -0800 |
commit | 641b63363b376ea4d1011cd60d3eb71f16dd6fe6 (patch) | |
tree | 0fe613027d3b68f7a3def72f77e80a60a971cd82 | |
parent | cea8c261210b7a64cab16bc01c33744fa4862a83 (diff) |
ENC: WP/SFD kernel for AVC encoder
Signed-off-by: Pengfei Qu <Pengfei.Qu@intel.com>
Reviewed-by: Sean V Kelley <seanvk@posteo.de>
-rwxr-xr-x | src/gen9_avc_encoder.c | 277 |
1 files changed, 277 insertions, 0 deletions
diff --git a/src/gen9_avc_encoder.c b/src/gen9_avc_encoder.c index d64694c..ea83cbd 100755 --- a/src/gen9_avc_encoder.c +++ b/src/gen9_avc_encoder.c @@ -4212,3 +4212,280 @@ gen9_avc_kernel_me(VADriverContextP ctx, return VA_STATUS_SUCCESS; } + +/* +wp related function +*/ +static void +gen9_avc_set_curbe_wp(VADriverContextP ctx, + struct encode_state *encode_state, + struct i965_gpe_context *gpe_context, + struct intel_encoder_context *encoder_context, + void * param) +{ + gen9_avc_wp_curbe_data *cmd; + struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context; + struct avc_enc_state * avc_state = (struct avc_enc_state * )vme_context->private_enc_state; + VAEncSliceParameterBufferH264 * slice_param = avc_state->slice_param[0]; + struct wp_param * curbe_param = (struct wp_param *)param; + + cmd = i965_gpe_context_map_curbe(gpe_context); + + if (!cmd) + return; + memset(cmd,0,sizeof(gen9_avc_wp_curbe_data)); + if(curbe_param->ref_list_idx) + { + cmd->dw0.default_weight = slice_param->luma_weight_l1[0]; + cmd->dw0.default_offset = slice_param->luma_offset_l1[0]; + }else + { + cmd->dw0.default_weight = slice_param->luma_weight_l0[0]; + cmd->dw0.default_offset = slice_param->luma_offset_l0[0]; + } + + cmd->dw49.input_surface = GEN9_AVC_WP_INPUT_REF_SURFACE_INDEX; + cmd->dw50.output_surface = GEN9_AVC_WP_OUTPUT_SCALED_SURFACE_INDEX; + + i965_gpe_context_unmap_curbe(gpe_context); + +} + +static void +gen9_avc_send_surface_wp(VADriverContextP ctx, + struct encode_state *encode_state, + struct i965_gpe_context *gpe_context, + struct intel_encoder_context *encoder_context, + void * param) +{ + struct i965_driver_data *i965 = i965_driver_data(ctx); + struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context; + struct gen9_avc_encoder_context * avc_ctx = (struct gen9_avc_encoder_context * )vme_context->private_enc_ctx; + struct avc_enc_state * avc_state = (struct avc_enc_state * )vme_context->private_enc_state; + struct wp_param * curbe_param = (struct wp_param *)param; + struct object_surface *obj_surface; + VAEncSliceParameterBufferH264 * slice_param = avc_state->slice_param[0]; + VASurfaceID surface_id; + + if(curbe_param->ref_list_idx) + { + surface_id = slice_param->RefPicList1[0].picture_id; + obj_surface = SURFACE(surface_id); + if (!obj_surface || !obj_surface->private_data) + avc_state->weighted_ref_l1_enable = 0; + else + avc_state->weighted_ref_l1_enable = 1; + }else + { + surface_id = slice_param->RefPicList0[0].picture_id; + obj_surface = SURFACE(surface_id); + if (!obj_surface || !obj_surface->private_data) + avc_state->weighted_ref_l0_enable = 0; + else + avc_state->weighted_ref_l0_enable = 1; + } + if(!obj_surface) + obj_surface = encode_state->reference_objects[0]; + + + gen9_add_adv_gpe_surface(ctx, gpe_context, + obj_surface, + GEN9_AVC_WP_INPUT_REF_SURFACE_INDEX); + + obj_surface = avc_ctx->wp_output_pic_select_surface_obj[curbe_param->ref_list_idx]; + gen9_add_adv_gpe_surface(ctx, gpe_context, + obj_surface, + GEN9_AVC_WP_OUTPUT_SCALED_SURFACE_INDEX); +} + + +static VAStatus +gen9_avc_kernel_wp(VADriverContextP ctx, + struct encode_state *encode_state, + struct intel_encoder_context *encoder_context, + unsigned int list1_in_use) +{ + struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context; + struct gen9_avc_encoder_context * avc_ctx = (struct gen9_avc_encoder_context * )vme_context->private_enc_ctx; + struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state; + struct generic_encoder_context * generic_ctx = (struct generic_encoder_context * )vme_context->generic_enc_ctx; + + struct i965_gpe_context *gpe_context; + struct gpe_media_object_walker_parameter media_object_walker_param; + struct gpe_encoder_kernel_walker_parameter kernel_walker_param; + int media_function = INTEL_MEDIA_STATE_ENC_WP; + struct wp_param param; + + gpe_context = &(avc_ctx->context_wp.gpe_contexts); + + gen8_gpe_context_init(ctx, gpe_context); + gen9_gpe_reset_binding_table(ctx, gpe_context); + + memset(¶m,0,sizeof(param)); + param.ref_list_idx = (list1_in_use == 1)? 1: 0; + /*set curbe*/ + generic_ctx->pfn_set_curbe_wp(ctx,encode_state,gpe_context,encoder_context,¶m); + + /*send surface*/ + generic_ctx->pfn_send_wp_surface(ctx,encode_state,gpe_context,encoder_context,¶m); + + gen8_gpe_setup_interface_data(ctx, gpe_context); + + memset(&kernel_walker_param, 0, sizeof(kernel_walker_param)); + /* the scaling is based on 8x8 blk level */ + kernel_walker_param.resolution_x = generic_state->frame_width_in_mbs; + kernel_walker_param.resolution_y = generic_state->frame_height_in_mbs; + kernel_walker_param.no_dependency = 1; + + i965_init_media_object_walker_parameter(&kernel_walker_param, &media_object_walker_param); + + gen9_avc_run_kernel_media_object_walker(ctx, encoder_context, + gpe_context, + media_function, + &media_object_walker_param); + + return VA_STATUS_SUCCESS; +} + + +/* +sfd related function +*/ +static void +gen9_avc_set_curbe_sfd(VADriverContextP ctx, + struct encode_state *encode_state, + struct i965_gpe_context *gpe_context, + struct intel_encoder_context *encoder_context, + void * param) +{ + gen9_avc_sfd_curbe_data *cmd; + struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context; + struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state; + struct avc_enc_state * avc_state = (struct avc_enc_state * )vme_context->private_enc_state; + VAEncSliceParameterBufferH264 * slice_param = avc_state->slice_param[0]; + + cmd = i965_gpe_context_map_curbe(gpe_context); + + if (!cmd) + return; + memset(cmd,0,sizeof(gen9_avc_sfd_curbe_data)); + + cmd->dw0.enable_intra_cost_scaling_for_static_frame = 1 ; + cmd->dw0.enable_adaptive_mv_stream_in = 0 ; //vdenc + cmd->dw0.stream_in_type = 7 ; //vdenc + cmd->dw0.slice_type = slice_type_kernel[generic_state->frame_type] ; + cmd->dw0.brc_mode_enable = generic_state->brc_enabled ; + cmd->dw0.vdenc_mode_disable = 1 ; + + cmd->dw1.hme_stream_in_ref_cost = 5 ; + cmd->dw1.num_of_refs = slice_param->num_ref_idx_l0_active_minus1 ;//vdenc + cmd->dw1.qp_value = avc_state->pic_param->pic_init_qp + slice_param->slice_qp_delta ; + + cmd->dw2.frame_width_in_mbs = generic_state->frame_width_in_mbs ; + cmd->dw2.frame_height_in_mbs = generic_state->frame_height_in_mbs ; + + cmd->dw3.large_mv_threshold = 128 ; + cmd->dw4.total_large_mv_threshold = (generic_state->frame_width_in_mbs * generic_state->frame_height_in_mbs)/100 ; + cmd->dw5.zmv_threshold = 4 ; + cmd->dw6.total_zmv_threshold = (generic_state->frame_width_in_mbs * generic_state->frame_height_in_mbs * avc_state->zero_mv_threshold)/100 ; // zero_mv_threshold = 60; + cmd->dw7.min_dist_threshold = 10 ; + + if(generic_state->frame_type == SLICE_TYPE_P) + { + memcpy(cmd->cost_table,gen9_avc_sfd_cost_table_p_frame,52* sizeof(unsigned char)); + + }else if(generic_state->frame_type == SLICE_TYPE_B) + { + memcpy(cmd->cost_table,gen9_avc_sfd_cost_table_b_frame,52* sizeof(unsigned char)); + } + + cmd->dw21.actual_width_in_mb = cmd->dw2.frame_width_in_mbs ; + cmd->dw21.actual_height_in_mb = cmd->dw2.frame_height_in_mbs ; + cmd->dw24.vdenc_input_image_state_index = GEN9_AVC_SFD_VDENC_INPUT_IMAGE_STATE_INDEX ; + cmd->dw26.mv_data_surface_index = GEN9_AVC_SFD_MV_DATA_SURFACE_INDEX ; + cmd->dw27.inter_distortion_surface_index = GEN9_AVC_SFD_INTER_DISTORTION_SURFACE_INDEX ; + cmd->dw28.output_data_surface_index = GEN9_AVC_SFD_OUTPUT_DATA_SURFACE_INDEX ; + cmd->dw29.vdenc_output_image_state_index = GEN9_AVC_SFD_VDENC_OUTPUT_IMAGE_STATE_INDEX ; + + i965_gpe_context_unmap_curbe(gpe_context); + +} + +static void +gen9_avc_send_surface_sfd(VADriverContextP ctx, + struct encode_state *encode_state, + struct i965_gpe_context *gpe_context, + struct intel_encoder_context *encoder_context, + void * param) +{ + struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context; + struct gen9_avc_encoder_context * avc_ctx = (struct gen9_avc_encoder_context * )vme_context->private_enc_ctx; + struct i965_gpe_resource *gpe_resource; + int size = 0; + + /*HME mv data surface memv output 4x*/ + gpe_resource = &avc_ctx->s4x_memv_data_buffer; + gen9_add_buffer_2d_gpe_surface(ctx, gpe_context, + gpe_resource, + 1, + I965_SURFACEFORMAT_R8_UNORM, + GEN9_AVC_SFD_MV_DATA_SURFACE_INDEX); + + /* memv distortion */ + gpe_resource = &avc_ctx->s4x_memv_distortion_buffer; + gen9_add_buffer_2d_gpe_surface(ctx, gpe_context, + gpe_resource, + 1, + I965_SURFACEFORMAT_R8_UNORM, + GEN9_AVC_SFD_INTER_DISTORTION_SURFACE_INDEX); + /*buffer output*/ + size = 32 * 4 *4; + gpe_resource = &avc_ctx->res_sfd_output_buffer; + gen9_add_buffer_gpe_surface(ctx, + gpe_context, + gpe_resource, + 0, + size / 4, + 0, + GEN9_AVC_SFD_OUTPUT_DATA_SURFACE_INDEX); + +} + +static VAStatus +gen9_avc_kernel_sfd(VADriverContextP ctx, + struct encode_state *encode_state, + struct intel_encoder_context *encoder_context) +{ + struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context; + struct gen9_avc_encoder_context * avc_ctx = (struct gen9_avc_encoder_context * )vme_context->private_enc_ctx; + struct generic_encoder_context * generic_ctx = (struct generic_encoder_context * )vme_context->generic_enc_ctx; + + struct i965_gpe_context *gpe_context; + struct gpe_media_object_parameter media_object_param; + struct gpe_media_object_inline_data media_object_inline_data; + int media_function = INTEL_MEDIA_STATE_STATIC_FRAME_DETECTION; + gpe_context = &(avc_ctx->context_sfd.gpe_contexts); + + gen8_gpe_context_init(ctx, gpe_context); + gen9_gpe_reset_binding_table(ctx, gpe_context); + + /*set curbe*/ + generic_ctx->pfn_set_curbe_sfd(ctx,encode_state,gpe_context,encoder_context,NULL); + + /*send surface*/ + generic_ctx->pfn_send_sfd_surface(ctx,encode_state,gpe_context,encoder_context,NULL); + + gen8_gpe_setup_interface_data(ctx, gpe_context); + + memset(&media_object_param, 0, sizeof(media_object_param)); + memset(&media_object_inline_data, 0, sizeof(media_object_inline_data)); + media_object_param.pinline_data = &media_object_inline_data; + media_object_param.inline_size = sizeof(media_object_inline_data); + + gen9_avc_run_kernel_media_object(ctx, encoder_context, + gpe_context, + media_function, + &media_object_param); + + return VA_STATUS_SUCCESS; +} |