From: Pengfei Qu <pengfei...@intel.com> Signed-off-by: Pengfei Qu <pengfei...@intel.com> Reviewed-by: Sean V Kelley <sea...@posteo.de> --- src/gen9_avc_encoder.c | 298 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 298 insertions(+)
diff --git a/src/gen9_avc_encoder.c b/src/gen9_avc_encoder.c index 8aff0c8b..7f73c95e 100755 --- a/src/gen9_avc_encoder.c +++ b/src/gen9_avc_encoder.c @@ -7109,3 +7109,301 @@ gen9_avc_pak_context_destroy(void * context) i965_free_gpe_resource(&avc_ctx->res_direct_mv_buffersr[i]); } } + +static VAStatus +gen9_avc_get_coded_status(VADriverContextP ctx, + struct intel_encoder_context *encoder_context, + struct i965_coded_buffer_segment *coded_buf_seg) +{ + struct encoder_status *avc_encode_status; + + if (!encoder_context || !coded_buf_seg) + return VA_STATUS_ERROR_INVALID_BUFFER; + + avc_encode_status = (struct encoder_status *)coded_buf_seg->codec_private_data; + coded_buf_seg->base.size = avc_encode_status->bs_byte_count; + + return VA_STATUS_SUCCESS; +} + +Bool +gen9_avc_vme_context_init(VADriverContextP ctx, struct intel_encoder_context *encoder_context) +{ + /* VME & PAK share the same context */ + struct encoder_vme_mfc_context * vme_context = NULL; + struct generic_encoder_context * generic_ctx = NULL; + struct gen9_avc_encoder_context * avc_ctx = NULL; + struct generic_enc_codec_state * generic_state = NULL; + struct avc_enc_state * avc_state = NULL; + struct encoder_status_buffer_internal *status_buffer; + uint32_t base_offset = offsetof(struct i965_coded_buffer_segment, codec_private_data); + + vme_context = calloc(1, sizeof(struct encoder_vme_mfc_context)); + generic_ctx = calloc(1, sizeof(struct generic_encoder_context)); + avc_ctx = calloc(1, sizeof(struct gen9_avc_encoder_context)); + generic_state = calloc(1, sizeof(struct generic_enc_codec_state)); + avc_state = calloc(1, sizeof(struct avc_enc_state)); + + if(!vme_context || !generic_ctx || !avc_ctx || !generic_state || !avc_state) + goto allocate_structure_failed; + + memset(vme_context,0,sizeof(struct encoder_vme_mfc_context)); + memset(generic_ctx,0,sizeof(struct generic_encoder_context)); + memset(avc_ctx,0,sizeof(struct gen9_avc_encoder_context)); + memset(generic_state,0,sizeof(struct generic_enc_codec_state)); + memset(avc_state,0,sizeof(struct avc_enc_state)); + + encoder_context->vme_context = vme_context; + vme_context->generic_enc_ctx = generic_ctx; + vme_context->private_enc_ctx = avc_ctx; + vme_context->generic_enc_state = generic_state; + vme_context->private_enc_state = avc_state; + + avc_ctx->ctx = ctx; + /* initialize misc ? */ + generic_ctx->use_hw_scoreboard = 1; + generic_ctx->use_hw_non_stalling_scoreboard = 1; + + /* initialize generic state */ + + generic_state->kernel_mode = INTEL_ENC_KERNEL_NORMAL; + generic_state->preset = INTEL_PRESET_RT_SPEED; + generic_state->seq_frame_number = 0; + generic_state->total_frame_number = 0; + generic_state->frame_type = 0; + generic_state->first_frame = 1; + + generic_state->frame_width_in_pixel = 0; + generic_state->frame_height_in_pixel = 0; + generic_state->frame_width_in_mbs = 0; + generic_state->frame_height_in_mbs = 0; + generic_state->frame_width_4x = 0; + generic_state->frame_height_4x = 0; + generic_state->frame_width_16x = 0; + generic_state->frame_height_16x = 0; + generic_state->frame_width_32x = 0; + generic_state->downscaled_width_4x_in_mb = 0; + generic_state->downscaled_height_4x_in_mb = 0; + generic_state->downscaled_width_16x_in_mb = 0; + generic_state->downscaled_height_16x_in_mb = 0; + generic_state->downscaled_width_32x_in_mb = 0; + generic_state->downscaled_height_32x_in_mb = 0; + + generic_state->hme_supported = 1; + generic_state->b16xme_supported = 1; + generic_state->b32xme_supported = 0; + generic_state->hme_enabled = 0; + generic_state->b16xme_enabled = 0; + generic_state->b32xme_enabled = 0; + generic_state->brc_distortion_buffer_supported = 1; + generic_state->brc_constant_buffer_supported = 0; + + + generic_state->frame_rate = 30; + generic_state->brc_allocated = 0; + generic_state->brc_inited = 0; + generic_state->brc_need_reset = 0; + generic_state->is_low_delay = 0; + generic_state->brc_enabled = 0;//default + generic_state->internal_rate_mode = 0; + generic_state->curr_pak_pass = 0; + generic_state->num_pak_passes = MAX_AVC_PAK_PASS_NUM; + generic_state->is_first_pass = 1; + generic_state->is_last_pass = 0; + generic_state->mb_brc_enabled = 0; // enable mb brc + generic_state->brc_roi_enable = 0; + generic_state->brc_dirty_roi_enable = 0; + generic_state->skip_frame_enbale = 0; + + generic_state->target_bit_rate = 0; + generic_state->max_bit_rate = 0; + generic_state->min_bit_rate = 0; + generic_state->init_vbv_buffer_fullness_in_bit = 0; + generic_state->vbv_buffer_size_in_bit = 0; + generic_state->frames_per_100s = 0; + generic_state->gop_size = 0; + generic_state->gop_ref_distance = 0; + generic_state->brc_target_size = 0; + generic_state->brc_mode = 0; + generic_state->brc_init_current_target_buf_full_in_bits = 0.0; + generic_state->brc_init_reset_input_bits_per_frame = 0.0; + generic_state->brc_init_reset_buf_size_in_bits = 0; + generic_state->brc_init_previous_target_buf_full_in_bits = 0; + generic_state->window_size = 0;//default + generic_state->target_percentage = 0; + + generic_state->avbr_curracy = 0; + generic_state->avbr_convergence = 0; + + generic_state->num_skip_frames = 0; + generic_state->size_skip_frames = 0; + + generic_state->num_roi = 0; + generic_state->max_delta_qp = 0; + generic_state->min_delta_qp = 0; + + if (encoder_context->rate_control_mode != VA_RC_NONE && + encoder_context->rate_control_mode != VA_RC_CQP) { + generic_state->brc_enabled = 1; + generic_state->brc_distortion_buffer_supported = 1; + generic_state->brc_constant_buffer_supported = 1; + generic_state->num_pak_passes = MAX_AVC_PAK_PASS_NUM; + } + /*avc state initialization */ + avc_state->mad_enable = 0; + avc_state->mb_disable_skip_map_enable = 0; + avc_state->sfd_enable = 1;//default + avc_state->sfd_mb_enable = 1;//set it true + avc_state->adaptive_search_window_enable = 1;//default + avc_state->mb_qp_data_enable = 0; + avc_state->intra_refresh_i_enable = 0; + avc_state->min_max_qp_enable = 0; + avc_state->skip_bias_adjustment_enable = 0;//default,same as skip_bias_adjustment_supporte? no + + //external input + avc_state->non_ftq_skip_threshold_lut_input_enable = 0; + avc_state->ftq_skip_threshold_lut_input_enable = 0; + avc_state->ftq_override = 0; + + avc_state->direct_bias_adjustment_enable = 0; + avc_state->global_motion_bias_adjustment_enable = 0; + avc_state->disable_sub_mb_partion = 0; + avc_state->arbitrary_num_mbs_in_slice = 0; + avc_state->adaptive_transform_decision_enable = 0;//default + avc_state->skip_check_disable = 0; + avc_state->tq_enable = 0; + avc_state->enable_avc_ildb = 0; + avc_state->mbaff_flag = 0; + avc_state->enable_force_skip = 1;//default + avc_state->suppress_recon_enable = 1;//default + + avc_state->ref_pic_select_list_supported = 1; + avc_state->mb_brc_supported = 1;//?,default + avc_state->multi_pre_enable = 1;//default + avc_state->ftq_enable = 1;//default + avc_state->caf_supported = 1; //default + avc_state->caf_enable = 0; + avc_state->caf_disable_hd = 1;//default + avc_state->skip_bias_adjustment_supported = 1;//default + + avc_state->adaptive_intra_scaling_enable = 1;//default + avc_state->old_mode_cost_enable = 0;//default + avc_state->multi_ref_qp_enable = 1;//default + avc_state->weighted_ref_l0_enable = 1;//default + avc_state->weighted_ref_l1_enable = 1;//default + avc_state->weighted_prediction_supported = 0; + avc_state->brc_split_enable = 0; + avc_state->slice_level_report_supported = 0; + + avc_state->fbr_bypass_enable = 1;//default + avc_state->field_scaling_output_interleaved = 0; + avc_state->mb_variance_output_enable = 0; + avc_state->mb_pixel_average_output_enable = 0; + avc_state->rolling_intra_refresh_enable = 0;// same as intra_refresh_i_enable? + avc_state->mbenc_curbe_set_in_brc_update = 0; + avc_state->rounding_inter_enable = 1; //default + avc_state->adaptive_rounding_inter_enable = 1;//default + + avc_state->mbenc_i_frame_dist_in_use = 0; + avc_state->mb_status_supported = 1; //set in intialization for gen9 + avc_state->mb_status_enable = 0; + avc_state->mb_vproc_stats_enable = 0; + avc_state->flatness_check_enable = 0; + avc_state->flatness_check_supported = 1;//default + avc_state->block_based_skip_enable = 0; + avc_state->use_widi_mbenc_kernel = 0; + avc_state->kernel_trellis_enable = 0; + avc_state->generic_reserved = 0; + + avc_state->rounding_value = 0; + avc_state->rounding_inter_p = 255;//default + avc_state->rounding_inter_b = 255; //default + avc_state->rounding_inter_b_ref = 255; //default + avc_state->min_qp_i = INTEL_AVC_MIN_QP; + avc_state->min_qp_p = INTEL_AVC_MIN_QP; + avc_state->min_qp_b = INTEL_AVC_MIN_QP; + avc_state->max_qp_i = INTEL_AVC_MAX_QP; + avc_state->max_qp_p = INTEL_AVC_MAX_QP; + avc_state->max_qp_b = INTEL_AVC_MAX_QP; + + memset(avc_state->non_ftq_skip_threshold_lut,0,52*sizeof(uint8_t)); + memset(avc_state->ftq_skip_threshold_lut,0,52*sizeof(uint8_t)); + memset(avc_state->lamda_value_lut,0,52*2*sizeof(uint8_t)); + + avc_state->intra_refresh_qp_threshold = 0; + avc_state->trellis_flag = 0; + avc_state->hme_mv_cost_scaling_factor = 0; + avc_state->slice_height = 1; + avc_state->slice_num = 1; + memset(avc_state->dist_scale_factor_list0,0,32*sizeof(uint32_t)); + avc_state->bi_weight = 0; + avc_state->brc_const_data_surface_width = 64; + avc_state->brc_const_data_surface_height = 44; + + avc_state->num_refs[0] = 0; + avc_state->num_refs[1] = 0; + memset(avc_state->list_ref_idx,0,32*2*sizeof(uint32_t)); + memset(avc_state->top_field_poc,0,NUM_MFC_AVC_DMV_BUFFERS*sizeof(int32_t)); + avc_state->tq_rounding = 0; + avc_state->zero_mv_threshold = 0; + avc_state->slice_second_levle_batch_buffer_in_use = 0; + + //1. seq/pic/slice + + /* the definition of status buffer offset for Encoder */ + + status_buffer = &avc_ctx->status_buffer; + memset(status_buffer, 0,sizeof(struct encoder_status_buffer_internal)); + + status_buffer->base_offset = base_offset; + status_buffer->bs_byte_count_offset = base_offset + offsetof(struct encoder_status, bs_byte_count); + status_buffer->image_status_ctrl_offset = base_offset + offsetof(struct encoder_status, image_status_ctrl); + status_buffer->media_index_offset = base_offset + offsetof(struct encoder_status, media_index); + + status_buffer->status_buffer_size = sizeof(struct encoder_status); + status_buffer->bs_frame_reg_offset = MFC_BITSTREAM_BYTECOUNT_FRAME_REG; + status_buffer->image_status_ctrl_reg_offset = MFC_IMAGE_STATUS_CTRL_REG; + + gen9_avc_kernel_init(ctx,encoder_context); + encoder_context->vme_context = vme_context; + encoder_context->vme_pipeline = gen9_avc_vme_pipeline; + encoder_context->vme_context_destroy = gen9_avc_vme_context_destroy; + + return true; + +allocate_structure_failed: + + if(vme_context) + free(vme_context); + + if(generic_ctx) + free(generic_ctx); + + if(avc_ctx) + free(avc_ctx); + + if(generic_state) + free(generic_state); + + if(avc_state) + free(avc_state); + + return false; +} + +Bool +gen9_avc_pak_context_init(VADriverContextP ctx, struct intel_encoder_context *encoder_context) +{ + /* VME & PAK share the same context */ + struct encoder_vme_mfc_context * pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context; + + if (!pak_context) + return false; + + encoder_context->mfc_context = pak_context; + encoder_context->mfc_context_destroy = gen9_avc_pak_context_destroy; + encoder_context->mfc_pipeline = gen9_avc_pak_pipeline; + encoder_context->mfc_brc_prepare = gen9_avc_pak_brc_prepare; + encoder_context->get_status = gen9_avc_get_coded_status; + return true; +} -- 2.11.0 _______________________________________________ Libva mailing list Libva@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libva