homerHEVC代码阅读(39)——熵编码(3)熵编码初始化和启动熵编码模型

来源:互联网 发布:淘宝客服周总结计划 编辑:程序博客网 时间:2024/06/05 14:48

一、熵编码上下文初始化的函数是ee_init_contexts,它被HOMER_enc_control函数调用

二、它的主要作用就是调用init_context,对各个上下文模型进行初始化

void ee_init_contexts(enc_env_t *ee){/* 当前的上下文模型 */context_model_t*curr_ctx= ee->contexts;/* 熵编码模型 */entropy_model_t*entropy_models = ee->e_ctx;//int total_ctx = NUM_CTXs;curr_ctx+=init_context(&entropy_models->cu_split_flag_model, curr_ctx, 1, NUM_SPLIT_FLAG_CTX, &INIT_SPLIT_FLAG[0][0]);curr_ctx+=init_context(&entropy_models->cu_skip_flag_model, curr_ctx, 1, NUM_SKIP_FLAG_CTX, &INIT_SKIP_FLAG[0][0]);curr_ctx+=init_context(&entropy_models->cu_merge_flag_model, curr_ctx, 1, NUM_MERGE_FLAG_EXT_CTX, &INIT_MERGE_FLAG_EXT[0][0]);curr_ctx+=init_context(&entropy_models->cu_merge_idx_model, curr_ctx, 1, NUM_MERGE_IDX_EXT_CTX, &INIT_MERGE_IDX_EXT[0][0]);curr_ctx+=init_context(&entropy_models->cu_part_size_model, curr_ctx, 1, NUM_PART_SIZE_CTX, &INIT_PART_SIZE[0][0]);//curr_ctx+=init_context(&entropy_models->cu_amp_model, curr_ctx, 1, NUM_CU_AMP_CTX, &INIT_CU_AMP_POS[0][0]);curr_ctx+=init_context(&entropy_models->cu_pred_mode_flag_model, curr_ctx, 1, NUM_PRED_MODE_CTX, &INIT_PRED_MODE[0][0]);curr_ctx+=init_context(&entropy_models->cu_intra_pred_model, curr_ctx, 1, NUM_ADI_CTX, &INIT_INTRA_PRED_MODE[0][0]);curr_ctx+=init_context(&entropy_models->cu_chroma_pred_model, curr_ctx, 1, NUM_CHROMA_PRED_CTX, &INIT_CHROMA_PRED_MODE[0][0]);curr_ctx+=init_context(&entropy_models->cu_inter_dir_model, curr_ctx, 1, NUM_INTER_DIR_CTX, &INIT_INTER_DIR[0][0]);curr_ctx+=init_context(&entropy_models->cu_mvd_model, curr_ctx, 1, NUM_MV_RES_CTX, &INIT_MVD[0][0]);curr_ctx+=init_context(&entropy_models->cu_ref_pic_model, curr_ctx, 1, NUM_REF_NO_CTX, &INIT_REF_PIC[0][0]);curr_ctx+=init_context(&entropy_models->cu_delta_qp_model, curr_ctx, 1, NUM_DELTA_QP_CTX, &INIT_DQP[0][0]);curr_ctx+=init_context(&entropy_models->cu_qt_cbf_model, curr_ctx, 2, NUM_QT_CBF_CTX, &INIT_QT_CBF[0][0]);curr_ctx+=init_context(&entropy_models->cu_qt_root_cbf_model, curr_ctx, 1, NUM_QT_ROOT_CBF_CTX, &INIT_QT_ROOT_CBF[0][0]);curr_ctx+=init_context(&entropy_models->cu_sig_coeff_group_model, curr_ctx, 2, NUM_SIG_CG_FLAG_CTX, &INIT_SIG_CG_FLAG[0][0]);curr_ctx+=init_context(&entropy_models->cu_sig_model, curr_ctx, 1, NUM_SIG_FLAG_CTX, &INIT_SIG_FLAG[0][0]);curr_ctx+=init_context(&entropy_models->cu_ctx_last_x_model, curr_ctx, 2, NUM_CTX_LAST_FLAG_XY, &INIT_LAST[0][0]);curr_ctx+=init_context(&entropy_models->cu_ctx_last_y_model, curr_ctx, 2, NUM_CTX_LAST_FLAG_XY, &INIT_LAST[0][0]);curr_ctx+=init_context(&entropy_models->cu_one_model, curr_ctx, 1, NUM_ONE_FLAG_CTX, &INIT_ONE_FLAG[0][0]);curr_ctx+=init_context(&entropy_models->cu_abs_model, curr_ctx, 1, NUM_ABS_FLAG_CTX, &INIT_ABS_FLAG[0][0]);curr_ctx+=init_context(&entropy_models->cu_mvp_idx_model, curr_ctx, 1, NUM_MVP_IDX_CTX, &INIT_MVP_IDX[0][0]);curr_ctx+=init_context(&entropy_models->cu_trans_subdiv_flag_model, curr_ctx, 1, NUM_TRANS_SUBDIV_FLAG_CTX, &INIT_TRANS_SUBDIV_FLAG[0][0]);curr_ctx+=init_context(&entropy_models->sao_merge_model, curr_ctx, 1, NUM_SAO_MERGE_FLAG_CTX, &INIT_SAO_MERGE_FLAG[0][0]);curr_ctx+=init_context(&entropy_models->sao_type_model, curr_ctx, 1, NUM_SAO_TYPE_IDX_CTX, &INIT_SAO_TYPE_IDX[0][0]);curr_ctx+=init_context(&entropy_models->transform_skip_model, curr_ctx, 2, NUM_TRANSFORMSKIP_FLAG_CTX, &INIT_TRANSFORMSKIP_FLAG[0][0]);curr_ctx+=init_context(&entropy_models->transquant_bypass_flag_model, curr_ctx, 1, NUM_CU_TRANSQUANT_BYPASS_FLAG_CTX, &INIT_CU_TRANSQUANT_BYPASS_FLAG[0][0]);}
int init_context(context_model_buff_t *cm, context_model_t *ctx, int size_y, int size_x, const byte *ref_ctx_model){/* context_model_buff_t用一个一维的context_model_t,来实现三维的数组 */cm->ctx = ctx;cm->size_x = size_x;cm->size_y = size_y;cm->size_xy = size_x*size_y;cm->ref_ctx_model = ref_ctx_model;return cm->size_xy;}



三、开始熵编码的函数是ee_start_entropy_model,它被wfpp_encoder_thread函数(线程函数)调用

四、它的主要作用就是启动熵编码模型,对各种语法元素的上下文模型调用start_context,计算状态以及重置比特数(相当于初始化)

void ee_start_entropy_model(enc_env_t *ee, slice_t *currslice){entropy_model_t*entropy_models = ee->e_ctx;int table_idx = I_SLICE;int slice_type = currslice->slice_type;int init_type = slice_type;int qp = currslice->qp;int cabac_init_flag = currslice->pps->cabac_init_flag;int cabac_table_idx = slice_type;if (currslice->slice_type != I_SLICE && (table_idx==B_SLICE || table_idx==P_SLICE) && cabac_init_flag){init_type = table_idx;}start_context(&entropy_models->cu_split_flag_model, init_type, qp);start_context(&entropy_models->cu_skip_flag_model, init_type, qp);start_context(&entropy_models->cu_merge_flag_model, init_type, qp);start_context(&entropy_models->cu_merge_idx_model, init_type, qp);start_context(&entropy_models->cu_part_size_model, init_type, qp);start_context(&entropy_models->cu_amp_model, init_type, qp);start_context(&entropy_models->cu_pred_mode_flag_model, init_type, qp);start_context(&entropy_models->cu_intra_pred_model, init_type, qp);start_context(&entropy_models->cu_chroma_pred_model, init_type, qp);start_context(&entropy_models->cu_inter_dir_model, init_type, qp);start_context(&entropy_models->cu_mvd_model, init_type, qp);start_context(&entropy_models->cu_ref_pic_model, init_type, qp);start_context(&entropy_models->cu_delta_qp_model, init_type, qp);start_context(&entropy_models->cu_qt_cbf_model, init_type, qp);start_context(&entropy_models->cu_qt_root_cbf_model, init_type, qp);start_context(&entropy_models->cu_sig_coeff_group_model, init_type, qp);start_context(&entropy_models->cu_sig_model, init_type, qp);start_context(&entropy_models->cu_ctx_last_x_model, init_type, qp);start_context(&entropy_models->cu_ctx_last_y_model, init_type, qp);start_context(&entropy_models->cu_one_model, init_type, qp);start_context(&entropy_models->cu_abs_model, init_type, qp);start_context(&entropy_models->cu_mvp_idx_model, init_type, qp);start_context(&entropy_models->cu_trans_subdiv_flag_model, init_type, qp);start_context(&entropy_models->sao_merge_model, init_type, qp);start_context(&entropy_models->sao_type_model, init_type, qp);start_context(&entropy_models->transform_skip_model, init_type, qp);start_context(&entropy_models->transquant_bypass_flag_model, init_type, qp);}
void start_context(context_model_buff_t *cm, int init_type, int qp){int i;const byte *ref_ctx_model = cm->ref_ctx_model + init_type*cm->size_xy;context_model_t *ctx = cm->ctx;for(i=0;i<cm->size_xy;i++){ctx[i].state = calc_ctx_state(qp, ref_ctx_model[i]);ctx[i].num_bins_coded = 0;}}



0 0
原创粉丝点击