From a430d48669aa70d5f80b2fb366df629d03bccbec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arttu=20M=C3=A4kinen?= Date: Mon, 25 Nov 2019 15:04:26 +0200 Subject: [PATCH] ALF works now with VTM7.0 as in VTM6.1. VTM properly decodes bitstream from kvazaar but the checksum doesn't match. Couple hard coded values needed for this in function "kvz_encode_alf_bits". --- src/alf.c | 110 +++++++++++++------------------------------------- src/alf.h | 1 + src/cfg.c | 6 +-- src/context.c | 32 ++++++--------- src/kvazaar.h | 2 +- 5 files changed, 45 insertions(+), 106 deletions(-) diff --git a/src/alf.c b/src/alf.c index 3fd21c51..8811a4d3 100644 --- a/src/alf.c +++ b/src/alf.c @@ -565,7 +565,7 @@ int length_uvlc(int ui_code) return (ui_length >> 1) + ((ui_length + 1) >> 1); } -double get_dist_coeff_force_0(bool* coded_var_bins, double error_force_0_coeff_tab[MAX_NUM_ALF_CLASSES][2], int* bits_var_bin, const int num_filters) +double get_dist_coeff_force_0(bool* coded_var_bins, double error_force_0_coeff_tab[MAX_NUM_ALF_CLASSES][2], int* bits_var_bin, int zero_bits_var_bin, const int num_filters) { double dist_force_0 = 0; memset(coded_var_bins, 0, sizeof(*coded_var_bins) * MAX_NUM_ALF_CLASSES); @@ -2537,7 +2537,8 @@ void kvz_alf_get_avai_aps_ids_luma(encoder_state_t *const state, state->slice->tile_group_luma_aps_id[i] = aps_ids[i]; } - *new_aps_id = g_aps_id_start - 1; + //*new_aps_id = g_aps_id_start - 1; + *new_aps_id = ALF_CTB_MAX_NUM_APS - *size_of_aps_ids - 1; if (*new_aps_id < 0) { *new_aps_id = (int)ALF_CTB_MAX_NUM_APS - 1; @@ -4391,16 +4392,6 @@ void kvz_alf_reconstructor(encoder_state_t const *state, { ctu_enable_flag |= g_ctu_enable_flag[comp_idx][ctu_idx] > 0; } - if (ctu_enable_flag && is_crossed_by_virtual_boundaries(x_pos, y_pos, width, height, &clip_top, &clip_bottom, &clip_left, &clip_right, &num_hor_vir_bndry, &num_ver_vir_bndry, hor_vir_bndry_pos, ver_vir_bndry_pos, state)) - { - int y_start = y_pos; - for (int i = 0; i <= num_hor_vir_bndry; i++) - { - const int y_end = i == num_hor_vir_bndry ? y_pos + height : hor_vir_bndry_pos[i]; - const int h = y_end - y_start; - const bool clip_t = (i == 0 && clip_top) || (i > 0) || (y_start == 0); - const bool clip_b = (i == num_hor_vir_bndry && clip_bottom) || (i < num_hor_vir_bndry) || (y_end == luma_height); - int x_start = x_pos; for (int j = 0; j <= num_ver_vir_bndry; j++) { @@ -4691,6 +4682,24 @@ void code_alf_ctu_filter_index(encoder_state_t * const state, unsigned num_available_filt_sets = num_aps + ALF_NUM_FIXED_FILTER_SETS; if (num_available_filt_sets > ALF_NUM_FIXED_FILTER_SETS) { +#if JVET_P0162_REMOVE_ALF_CTB_FIRST_USE_APS_FLAG + int use_temporal_filt = (filter_set_idx >= ALF_NUM_FIXED_FILTER_SETS) ? 1 : 0; + cabac->cur_ctx = &(cabac->ctx.alf_temporal_filt); + CABAC_BIN(cabac, use_temporal_filt, "use_latest_filt"); + if (use_temporal_filt) + { + assert(filter_set_idx < num_available_filt_sets); //"temporal non-latest set" + if (num_aps > 1) + { + kvz_cabac_encode_trunc_bin(cabac, filter_set_idx - ALF_NUM_FIXED_FILTER_SETS, num_available_filt_sets - ALF_NUM_FIXED_FILTER_SETS); + } + } + else + { + assert(filter_set_idx < ALF_NUM_FIXED_FILTER_SETS); //"fixed set larger than temporal" + kvz_cabac_encode_trunc_bin(cabac, filter_set_idx, ALF_NUM_FIXED_FILTER_SETS); + } +#else int use_latest_filt = (filter_set_idx == ALF_NUM_FIXED_FILTER_SETS) ? 1 : 0; /*if (num_aps == 0) { use_latest_filt = 1; @@ -4727,6 +4736,7 @@ void code_alf_ctu_filter_index(encoder_state_t * const state, } } } +#endif } else { @@ -4811,10 +4821,12 @@ void kvz_encode_alf_bits(encoder_state_t * const state, for (int comp_idx = 0; comp_idx < MAX_NUM_COMPONENT; comp_idx++) { bool is_luma = comp_idx == COMPONENT_Y ? true : false; + //Pitäisi poistaa// if (!is_luma) { - state->slice->tile_group_alf_enabled_flag[comp_idx] = 0; + state->slice->tile_group_alf_enabled_flag[comp_idx] = false; } + // // code_alf_ctu_enable_flag(state, &state->cabac, ctu_idx, comp_idx, NULL); if (is_luma) { @@ -4831,11 +4843,10 @@ void kvz_encode_alf_bits(encoder_state_t * const state, code_alf_ctu_filter_index(state, &state->cabac, ctu_idx, state->slice->tile_group_alf_enabled_flag[COMPONENT_Y]); }*/ - int num_aps = state->slice->tile_group_num_aps; - state->slice->tile_group_num_aps = 2; + int num_aps = state->slice->tile_group_num_aps; //Pitäisi poistaa + state->slice->tile_group_num_aps = 1; //Pitäisi poistaa code_alf_ctu_filter_index(state, &state->cabac, ctu_idx, state->slice->tile_group_alf_enabled_flag[COMPONENT_Y]); - state->slice->tile_group_num_aps = num_aps; - + state->slice->tile_group_num_aps = num_aps; //Pitäisi poistaa } } if (!is_luma) @@ -5809,71 +5820,6 @@ void kvz_alf_derive_classification(encoder_state_t *const state, } } -/*kvz_alf_reset_pcm_blk_class_info -//Turha jos PCM on pois päältä. -void kvz_alf_reset_pcm_blk_class_info(encoder_state_t *const state, - const lcu_order_element_t *const lcu, - const int width, - const int height, - int x_pos, - int y_pos) -{ - if (!ENABLE_PCM) //!cs.sps->getPCMFilterDisableFlag() - { - return; - } - - //alf_classifier **g_classifier = state->tile->frame->alf_info->g_classifier; - - int max_height = y_pos + height; - int max_width = x_pos + width; - const int cls_size_y = 4; - const int cls_size_x = 4; - int class_idx = ALF_UNUSED_CLASS_IDX; - int transpose_idx = ALF_UNUSED_TRANSPOSE_IDX; - - for (int i = y_pos; i < max_height; i += CLASSIFICATION_BLK_SIZE) - { - int n_height = MIN(i + CLASSIFICATION_BLK_SIZE, max_height) - i; - - for (int j = x_pos; j < max_width; j += CLASSIFICATION_BLK_SIZE) - { - int n_width = MIN(j + CLASSIFICATION_BLK_SIZE, max_width) - j; - int pos_x = j; - int pos_y = i; - - for (int subi = 0; subi < n_height; subi += cls_size_y) - { - for (int subj = 0; subj < n_width; subj += cls_size_x) - { - int y_offset = subi + pos_y; - int x_offset = subj + pos_x; - //Position pos(xOffset, yOffset); - - //const CodingUnit* cu = cs.getCU(pos, CH_L); - if (1) //cu->ipcm ///ipcm_flag = 0 - { - alf_classifier *cl0 = g_classifier[y_offset] + x_offset; - alf_classifier *cl1 = g_classifier[y_offset + 1] + x_offset; - alf_classifier *cl2 = g_classifier[y_offset + 2] + x_offset; - alf_classifier *cl3 = g_classifier[y_offset + 3] + x_offset; - - cl0[0].class_idx = cl0[1].class_idx = cl0[2].class_idx = cl0[3].class_idx = - cl1[0].class_idx = cl1[1].class_idx = cl1[2].class_idx = cl1[3].class_idx = - cl2[0].class_idx = cl2[1].class_idx = cl2[2].class_idx = cl2[3].class_idx = - cl3[0].class_idx = cl3[1].class_idx = cl3[2].class_idx = cl3[3].class_idx = class_idx; - - cl0[0].transpose_idx = cl0[1].transpose_idx = cl0[2].transpose_idx = cl0[3].transpose_idx = - cl1[0].transpose_idx = cl1[1].transpose_idx = cl1[2].transpose_idx = cl1[3].transpose_idx = - cl2[0].transpose_idx = cl2[1].transpose_idx = cl2[2].transpose_idx = cl2[3].transpose_idx = - cl3[0].transpose_idx = cl3[1].transpose_idx = cl3[2].transpose_idx = cl3[3].transpose_idx = transpose_idx; - } - } - } - } - } -}*/ - void kvz_alf_derive_classification_blk(encoder_state_t * const state, const int shift, const int n_height, diff --git a/src/alf.h b/src/alf.h index e28b2ae0..74cdb690 100644 --- a/src/alf.h +++ b/src/alf.h @@ -447,6 +447,7 @@ void get_frame_stat(alf_covariance* frame_cov, alf_covariance** ctb_cov, uint8_t void copy_cov(alf_covariance *dst, alf_covariance *src); void copy_alf_param(alf_aps *dst, alf_aps *src); void copy_alf_param_w_channel(alf_aps* dst, alf_aps* src, channel_type channel); +//bool compare_alf_param(const alf_aps* aps_1, const alf_aps* aps_2); void reset_alf_param(alf_aps *src); void add_alf_cov(alf_covariance *dst, alf_covariance *src); void add_alf_cov_lhs_rhs(alf_covariance *dst, alf_covariance *lhs, alf_covariance *rhs); diff --git a/src/cfg.c b/src/cfg.c index ab154418..c1b70468 100644 --- a/src/cfg.c +++ b/src/cfg.c @@ -49,9 +49,9 @@ int kvz_config_init(kvz_config *cfg) cfg->deblock_beta = 0; cfg->deblock_tc = 0; cfg->sao_type = 3; - cfg->alf_enable = 0; - cfg->alf_non_linear_luma = 0; - cfg->alf_non_linear_chroma = 0; + cfg->alf_enable = 1; + cfg->alf_non_linear_luma = 1; + cfg->alf_non_linear_chroma = 1; cfg->loop_filter_across_virtual_boundaries_disabled_flag = 0; cfg->rdoq_enable = 1; cfg->rdoq_skip = 1; diff --git a/src/context.c b/src/context.c index 1324610a..fbc071d2 100644 --- a/src/context.c +++ b/src/context.c @@ -271,31 +271,24 @@ static const uint8_t INIT_JOINT_CB_CR_FLAG[4][3] = { { 12, 21, 35, }, { 1, 1, 0, }, static const uint8_t INIT_ALF_CTB_FLAG[4][9] = { - { 26, 45, 46, 33, 61, 54, 33, 61, 54, }, - { 6, 23, 46, 27, 61, 54, 20, 46, 54, }, - { 39, 39, 39, 54, 39, 39, 31, 62, 39, }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, }, + { 26, 52, 46, 18, 61, 54, 18, 61, 54, }, + { 6, 23, 46, 12, 61, 54, 5, 46, 54, }, + { 39, 39, 39, 62, 39, 39, 31, 39, 39, }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }; static const INIT_ALF_CTB_ALTERNATIVE[4][2] = { - { 18, 18, }, - { 20, 12, }, - { 44, 44, }, - { 0, 0, }, -}; - -static const uint8_t INIT_ALF_LATEST_FILT[4] = { - { 58, }, - { 50, }, - { 31, }, - { 0, }, + { 11, 11, }, + { 20, 12, }, + { 28, 28, }, + { 0, 0, }, }; static const uint8_t INIT_ALF_TEMPORAL_FILT[4] = { - { 53, }, - { 53, }, - { CNU, }, - { 0, }, + { 46, }, + { 53, }, + { 46, }, + { 0, }, }; static const uint8_t INIT_CU_TRANSQUANT_BYPASS[4][1] = { @@ -365,7 +358,6 @@ void kvz_init_contexts(encoder_state_t *state, int8_t QP, int8_t slice) // Initialize contexts kvz_ctx_init(&cabac->ctx.sao_merge_flag_model, QP, INIT_SAO_MERGE_FLAG[slice], INIT_SAO_MERGE_FLAG[3]); kvz_ctx_init(&cabac->ctx.sao_type_idx_model, QP, INIT_SAO_TYPE_IDX[slice], INIT_SAO_TYPE_IDX[3]); - kvz_ctx_init(&cabac->ctx.alf_latest_filt, QP, INIT_ALF_LATEST_FILT[slice], INIT_ALF_LATEST_FILT[3]); kvz_ctx_init(&cabac->ctx.alf_temporal_filt, QP, INIT_ALF_TEMPORAL_FILT[slice], INIT_ALF_TEMPORAL_FILT[3]); kvz_ctx_init(&cabac->ctx.cu_merge_flag_ext_model, QP, INIT_MERGE_FLAG_EXT[slice][0], INIT_MERGE_FLAG_EXT[3][0]); diff --git a/src/kvazaar.h b/src/kvazaar.h index d47ef8de..b4846b00 100644 --- a/src/kvazaar.h +++ b/src/kvazaar.h @@ -502,7 +502,6 @@ enum kvz_nal_unit_type { KVZ_NAL_STSA = 1, KVZ_NAL_RADL = 2, KVZ_NAL_RASL = 3, - KVZ_NAL_APS_NUT = 4, // Intra random access point pictures KVZ_NAL_IDR_W_RADL = 7, @@ -515,6 +514,7 @@ enum kvz_nal_unit_type { KVZ_NAL_VPS_NUT = 14, KVZ_NAL_SPS_NUT = 15, KVZ_NAL_PPS_NUT = 16, + KVZ_NAL_APS_NUT = 18, KVZ_NAL_AUD_NUT = 20,