[Libva] [PATCH 21/31] ENC: WP/SFD kernel for AVC encoder

Sean V Kelley seanvk at posteo.de
Tue Jan 10 23:38:03 UTC 2017


From: Pengfei Qu <Pengfei.Qu at intel.com>

Signed-off-by: Pengfei Qu <Pengfei.Qu at intel.com>
Reviewed-by: Sean V Kelley <seanvk at posteo.de>
---
 src/gen9_avc_encoder.c | 277 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 277 insertions(+)

diff --git a/src/gen9_avc_encoder.c b/src/gen9_avc_encoder.c
index d64694ca..ea83cbd0 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(&param,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,&param);
+
+    /*send surface*/
+    generic_ctx->pfn_send_wp_surface(ctx,encode_state,gpe_context,encoder_context,&param);
+
+    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;
+}
-- 
2.11.0



More information about the Libva mailing list