Bug fixes.

WIP.
This commit is contained in:
Arttu Mäkinen 2019-11-05 11:43:48 +02:00 committed by Arttu Makinen
parent 09c68d9de6
commit 9cad95c94c
3 changed files with 148 additions and 103 deletions

206
src/alf.c
View file

@ -1180,11 +1180,12 @@ void adjust_pixels(kvz_pixel *src, int x_start, int x_end, int y_start, int y_en
} }
//right side //right side
if (x_end == pic_width) { if (x_end == pic_width) {
const int x_px = x_end - 1;
for (int y = y_start; y < y_end; y++) { for (int y = y_start; y < y_end; y++) {
src[y * stride + x_end + 4] = src[y * stride + x_px + 4] =
src[y * stride + x_end + 3] = src[y * stride + x_px + 3] =
src[y * stride + x_end + 2] = src[y * stride + x_px + 2] =
src[y * stride + x_end + 1] = src[y * stride + x_end]; src[y * stride + x_px + 1] = src[y * stride + x_px];
} }
} }
//top //top
@ -1197,12 +1198,13 @@ void adjust_pixels(kvz_pixel *src, int x_start, int x_end, int y_start, int y_en
} }
} }
//bottom //bottom
if (y_end == pic_width) { if (y_end == pic_height) {
const int y_px = y_end - 1;
for (int x = x_start; x < x_end; x++) { for (int x = x_start; x < x_end; x++) {
src[x + stride * (4 + y_end)] = src[x + stride * (4 + y_px)] =
src[x + stride * (3 + y_end)] = src[x + stride * (3 + y_px)] =
src[x + stride * (2 + y_end)] = src[x + stride * (2 + y_px)] =
src[x + stride * (1 + y_end)] = src[x + stride * y_end]; src[x + stride * (1 + y_px)] = src[x + stride * y_px];
} }
} }
//left top corner //left top corner
@ -1216,29 +1218,33 @@ void adjust_pixels(kvz_pixel *src, int x_start, int x_end, int y_start, int y_en
} }
//right top corner //right top corner
if (top_right) { if (top_right) {
for (int x = pic_width + 1; x < pic_width + 5; x++) { const int x_px = x_end - 1;
for (int x = pic_width; x < pic_width + 4; x++) {
src[-4 * stride + x] = src[-4 * stride + x] =
src[-3 * stride + x] = src[-3 * stride + x] =
src[-2 * stride + x] = src[-2 * stride + x] =
src[-1 * stride + x] = src[x_end]; src[-1 * stride + x] = src[x_px];
} }
} }
//left or right bottom corner //left or right bottom corner
if (bottom_left) { if (bottom_left) {
const int y_px = y_end - 1;
for (int x = -4; x < 0; x++) { for (int x = -4; x < 0; x++) {
src[(4 + y_end) * stride + x] = src[(4 + y_px) * stride + x] =
src[(3 + y_end) * stride + x] = src[(3 + y_px) * stride + x] =
src[(2 + y_end) * stride + x] = src[(2 + y_px) * stride + x] =
src[(1 + y_end) * stride + x] = src[stride * y_end]; src[(1 + y_px) * stride + x] = src[stride * y_px];
} }
} }
if (bottom_right) { if (bottom_right) {
for (int x = x_end + 1; x < x_end + 5; x++) { const int x_px = x_end - 1;
src[(4 + y_end) * stride + x] = const int y_px = y_end - 1;
src[(3 + y_end) * stride + x] = for (int x = x_end; x < x_end + 4; x++) {
src[(2 + y_end) * stride + x] = src[(4 + y_px) * stride + x] =
src[(1 + y_end) * stride + x] = src[stride * y_end + x_end]; src[(3 + y_px) * stride + x] =
src[(2 + y_px) * stride + x] =
src[(1 + y_px) * stride + x] = src[stride * y_px + x_px];
} }
} }
} }
@ -1367,6 +1373,10 @@ void kvz_alf_enc_process(encoder_state_t *const state,
}*/ }*/
g_alf_ctb_filter_index[lcu->index] = ALF_NUM_FIXED_FILTER_SETS; g_alf_ctb_filter_index[lcu->index] = ALF_NUM_FIXED_FILTER_SETS;
//g_classifier
//g_alf_covariance
//g_alf_ctb_filter
kvz_alf_derive_filter__encode__reconstruct(state, lcu, 0.0); kvz_alf_derive_filter__encode__reconstruct(state, lcu, 0.0);
} }
@ -1415,7 +1425,7 @@ void kvz_alf_derive_filter__encode__reconstruct(encoder_state_t *const state,
//memcpy(&state->cabac, &cabac_estimator, sizeof(state->cabac)); //memcpy(&state->cabac, &cabac_estimator, sizeof(state->cabac));
//state->cabac.only_count = 0; //state->cabac.only_count = 0;
//kvz_encode_alf(state, lcu->index, &alf_param); //kvz_encode_alf(state, lcu->index, &alf_param);
kvz_encode_alf_new(state, lcu_index); kvz_encode_alf_bits(state, lcu_index);
kvz_alf_reconstructor(state, lcu_index); kvz_alf_reconstructor(state, lcu_index);
} }
@ -1631,10 +1641,10 @@ double kvz_alf_derive_ctb_alf_enable_flags(encoder_state_t * const state,
void kvz_alf_enc_create(encoder_state_t const *state, void kvz_alf_enc_create(encoder_state_t const *state,
const lcu_order_element_t *lcu) const lcu_order_element_t *lcu)
{ {
if (g_curr_frame == state->tile->frame->poc) { if (g_curr_frame == g_old_frame) {
return; return;
} }
g_curr_frame = state->tile->frame->poc; g_curr_frame = g_old_frame;
kvz_alf_create(state, lcu); kvz_alf_create(state, lcu);
@ -1838,10 +1848,11 @@ void kvz_alf_enc_create(encoder_state_t const *state,
} }
void kvz_alf_enc_destroy(videoframe_t * const frame, void kvz_alf_enc_destroy(encoder_state_t const *state,
videoframe_t * const frame,
const lcu_order_element_t *lcu) const lcu_order_element_t *lcu)
{ {
if (!(lcu->index == g_num_ctus_in_pic - 1)) { if (lcu->index != g_num_ctus_in_pic - 1) {
return; return;
} }
@ -1850,6 +1861,73 @@ void kvz_alf_enc_destroy(videoframe_t * const frame,
return; return;
} }
g_curr_frame += 1;
const int width = frame->width;
const int height = frame->height;
int height_in_lcu = state->tile->frame->height_in_lcu;
int width_in_lcu = state->tile->frame->width_in_lcu;
enum kvz_chroma_format chroma_fmt = state->encoder_control->chroma_format;
const int chroma_scale_x = (chroma_fmt == KVZ_CSP_444) ? 0 : 1;
const int chroma_scale_y = (chroma_fmt != KVZ_CSP_420) ? 0 : 1;
int luma_stride = frame->rec->stride;
int chroma_stride = luma_stride >> chroma_scale_x;
int h_end = 0;
int h_start = 0;
int h_end_chroma = 0;
int h_start_chroma = 0;
int w_end = 0;
int w_start = 0;
int w_end_chroma = 0;
int w_start_chroma = 0;
int cur_ctb = 0;
{
if (state->slice->tile_group_alf_enabled_flag[COMPONENT_Y])
{
for (int h_lcu = 0; h_lcu < height_in_lcu; h_lcu++)
{
h_end = MIN(h_end + LCU_WIDTH, height);
h_end_chroma = h_end >> chroma_scale_y;
for (int w_lcu = 0; w_lcu < width_in_lcu; w_lcu++)
{
w_end = MIN(w_end + LCU_WIDTH, width);
w_end_chroma = w_end >> chroma_scale_x;
if (g_ctu_enable_flag[COMPONENT_Y][cur_ctb])
{
for (int h = h_start; h < h_end; h++)
{
for (int w = w_start; w < w_end; w++)
{
frame->rec->y[h * luma_stride + w] = alf_tmp_y[h * luma_stride + w];
}
}
}
if (g_ctu_enable_flag[COMPONENT_Cb][cur_ctb] && g_ctu_enable_flag[COMPONENT_Cr][cur_ctb])
{
for (int h = h_start_chroma; h < h_end_chroma; h++)
{
for (int w = w_start_chroma; w < w_end_chroma; w++)
{
frame->rec->u[h * chroma_stride + w] = alf_tmp_u[h * chroma_stride + w];
frame->rec->v[h * chroma_stride + w] = alf_tmp_v[h * chroma_stride + w];
}
}
}
cur_ctb += 1;
w_start = w_end;
w_start_chroma = w_end_chroma;
}
w_start = w_end = 0;
w_start_chroma = w_end_chroma = 0;
h_start = h_end;
h_start_chroma = h_end_chroma;
}
}
}
for (int channel_idx = 0; channel_idx < MAX_NUM_CHANNEL_TYPE; channel_idx++) for (int channel_idx = 0; channel_idx < MAX_NUM_CHANNEL_TYPE; channel_idx++)
{ {
if (g_alf_covariance_frame[channel_idx]) if (g_alf_covariance_frame[channel_idx])
@ -1970,15 +2048,14 @@ void kvz_alf_enc_destroy(videoframe_t * const frame,
tmp_rec_pic = NULL; tmp_rec_pic = NULL;
}*/ }*/
const int width = frame->width;
const int height = frame->height; /*
int stride = frame->rec->stride;
{
for (int h = 0; h < height; h++) { for (int h = 0; h < height; h++) {
for (int w = 0; w < width; w++) { for (int w = 0; w < width; w++) {
frame->rec->y[h * stride + w] = alf_tmp_y[h * stride + w]; frame->rec->y[h * stride + w] = alf_tmp_y[h * stride + w];
} }
} }
stride = stride >> 1; stride = stride >> 1;
for (int h = 0; h < height >> 1; h++) { for (int h = 0; h < height >> 1; h++) {
for (int w = 0; w < width >> 1; w++) { for (int w = 0; w < width >> 1; w++) {
@ -1987,10 +2064,12 @@ void kvz_alf_enc_destroy(videoframe_t * const frame,
} }
} }
}
}*/
//memcpy(&frame->rec->y, &alf_tmp_y, sizeof(frame->rec->y)); //memcpy(&frame->rec->y, &alf_tmp_y, sizeof(frame->rec->y));
//memcpy(&frame->rec->u, &alf_tmp_u, sizeof(frame->rec->u)); //memcpy(&frame->rec->u, &alf_tmp_u, sizeof(frame->rec->u));
//memcpy(&frame->rec->v, &alf_tmp_v, sizeof(frame->rec->v)); //memcpy(&frame->rec->v, &alf_tmp_v, sizeof(frame->rec->v));
}
kvz_alf_destroy(frame); kvz_alf_destroy(frame);
} }
@ -2339,7 +2418,6 @@ void kvz_alf_derive_stats_for_filtering(encoder_state_t *const state,
int hor_vir_bndry_pos[] = { 0, 0, 0 }; int hor_vir_bndry_pos[] = { 0, 0, 0 };
int ver_vir_bndry_pos[] = { 0, 0, 0 }; int ver_vir_bndry_pos[] = { 0, 0, 0 };
int max_cu_width = LCU_WIDTH;
int max_cu_height = LCU_WIDTH; int max_cu_height = LCU_WIDTH;
//turhat //turhat
@ -2351,8 +2429,8 @@ void kvz_alf_derive_stats_for_filtering(encoder_state_t *const state,
//lcu->size //lcu->size
const int x_pos = lcu->position_px.x; const int x_pos = lcu->position_px.x;
const int y_pos = lcu->position_px.y; const int y_pos = lcu->position_px.y;
int width = lcu->size.x; //(x_pos + max_cu_width > pic_width) ? (pic_width - x_pos) : max_cu_width; const int width = lcu->size.x; //(x_pos + max_cu_width > pic_width) ? (pic_width - x_pos) : max_cu_width;
int height = lcu->size.y; //(y_pos + max_cu_height > pic_height) ? (pic_height - y_pos) : max_cu_height; const int height = lcu->size.y; //(y_pos + max_cu_height > pic_height) ? (pic_height - y_pos) : max_cu_height;
if (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)) if (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))
{ {
@ -2455,7 +2533,7 @@ void kvz_alf_derive_stats_for_filtering(encoder_state_t *const state,
int32_t rec_stride = is_luma ? state->tile->frame->rec->stride : state->tile->frame->rec->stride >> chroma_scale_x; int32_t rec_stride = is_luma ? state->tile->frame->rec->stride : state->tile->frame->rec->stride >> chroma_scale_x;
kvz_pixel *org = comp_idx ? (comp_idx - 1 ? &state->tile->frame->source->v[pos_x + pos_y * org_stride] : &state->tile->frame->source->u[pos_x + pos_y * org_stride]) : &state->tile->frame->source->y[pos_x + pos_y * org_stride]; kvz_pixel *org = comp_idx ? (comp_idx - 1 ? &state->tile->frame->source->v[pos_x + pos_y * org_stride] : &state->tile->frame->source->u[pos_x + pos_y * org_stride]) : &state->tile->frame->source->y[pos_x + pos_y * org_stride];
kvz_pixel *rec = comp_idx ? (comp_idx - 1 ? &state->tile->frame->rec->v[pos_x + pos_y * org_stride] : &state->tile->frame->rec->u[pos_x + pos_y * org_stride]) : &state->tile->frame->rec->y[pos_x + pos_y * org_stride]; kvz_pixel *rec = comp_idx ? (comp_idx - 1 ? &state->tile->frame->rec->v[pos_x + pos_y * rec_stride] : &state->tile->frame->rec->u[pos_x + pos_y * rec_stride]) : &state->tile->frame->rec->y[pos_x + pos_y * rec_stride];
for (int shape = 0; shape != 1/*m_filterShapes[ch_type].size()*/; shape++) for (int shape = 0; shape != 1/*m_filterShapes[ch_type].size()*/; shape++)
{ {
@ -2751,6 +2829,7 @@ double kvz_alf_get_filter_coeff_and_cost(encoder_state_t *const state,
if (is_luma) if (is_luma)
{ {
//#if JVET_O0090_ALF_CHROMA_FILTER_ALTERNATIVES_CTB //#if JVET_O0090_ALF_CHROMA_FILTER_ALTERNATIVES_CTB
//Tarvitaanko tätä alustusta ollenkaan?
const int fill_val = g_alf_aps_temp.non_linear_flag[channel][0] ? g_alf_num_clipping_values[CHANNEL_TYPE_LUMA] / 2 : 0; const int fill_val = g_alf_aps_temp.non_linear_flag[channel][0] ? g_alf_num_clipping_values[CHANNEL_TYPE_LUMA] / 2 : 0;
for (int i = 0; i < MAX_NUM_ALF_CLASSES; i++) { for (int i = 0; i < MAX_NUM_ALF_CLASSES; i++) {
for (int j = 0; j < MAX_NUM_ALF_CLASSES; j++) { for (int j = 0; j < MAX_NUM_ALF_CLASSES; j++) {
@ -2767,6 +2846,7 @@ double kvz_alf_get_filter_coeff_and_cost(encoder_state_t *const state,
reset_alf_covariance(&g_alf_covariance_merged[i_shape_idx][MAX_NUM_ALF_CLASSES], g_alf_num_clipping_values[channel]); reset_alf_covariance(&g_alf_covariance_merged[i_shape_idx][MAX_NUM_ALF_CLASSES], g_alf_num_clipping_values[channel]);
reset_alf_covariance(&g_alf_covariance_merged[i_shape_idx][MAX_NUM_ALF_CLASSES + 1], g_alf_num_clipping_values[channel]); reset_alf_covariance(&g_alf_covariance_merged[i_shape_idx][MAX_NUM_ALF_CLASSES + 1], g_alf_num_clipping_values[channel]);
//distortion //distortion
//clip_merged:iä ei tarvitse nollata ennen
dist += kvz_alf_merge_filters_and_cost(state, &g_alf_aps_temp, channel, ui_coeff_bits, g_alf_covariance_frame[channel][i_shape_idx], g_alf_covariance_merged[i_shape_idx], g_alf_clip_merged[i_shape_idx]); dist += kvz_alf_merge_filters_and_cost(state, &g_alf_aps_temp, channel, ui_coeff_bits, g_alf_covariance_frame[channel][i_shape_idx], g_alf_covariance_merged[i_shape_idx], g_alf_clip_merged[i_shape_idx]);
} }
else else
@ -2821,12 +2901,12 @@ double kvz_alf_get_filter_coeff_and_cost(encoder_state_t *const state,
copy_alf_param(&best_slice_param, &g_alf_aps_temp); copy_alf_param(&best_slice_param, &g_alf_aps_temp);
} }
} }
ui_coeff_bits += best_coeff_bits; *ui_coeff_bits += best_coeff_bits;
dist += best_dist; dist += best_dist;
copy_alf_param(&g_alf_aps_temp, &best_slice_param); copy_alf_param(&g_alf_aps_temp, &best_slice_param);
} }
ui_coeff_bits += length_uvlc(g_alf_aps_temp.num_alternatives_chroma - 1); *ui_coeff_bits += length_uvlc(g_alf_aps_temp.num_alternatives_chroma - 1);
ui_coeff_bits += g_alf_aps_temp.num_alternatives_chroma; // non-linear flags *ui_coeff_bits += g_alf_aps_temp.num_alternatives_chroma; // non-linear flags
/*#if !JVET_O0491_HLS_CLEANUP /*#if !JVET_O0491_HLS_CLEANUP
uiSliceFlag = lengthTruncatedUnary(alfChromaIdc, 3) uiSliceFlag = lengthTruncatedUnary(alfChromaIdc, 3)
- lengthTruncatedUnary(0, 3); // rate already put on Luma - lengthTruncatedUnary(0, 3); // rate already put on Luma
@ -2962,11 +3042,6 @@ void kvz_alf_merge_classes(channel_type channel,
// init Clip // init Clip
for (int i = 0; i < num_classes; i++) for (int i = 0; i < num_classes; i++)
{ {
//std::fill_n(clipMerged[numRemaining - 1][i], MAX_NUM_ALF_LUMA_COEFF, m_alfParamTemp.non_linear_flag[CHANNEL_TYPE_LUMA] ? AlfNumClippingValues[CHANNEL_TYPE_LUMA] / 2 : 0);
for (int val = 0; val < MAX_NUM_ALF_LUMA_COEFF; val++) {
clip_merged[num_remaining - 1][i][val] = g_alf_aps_temp.non_linear_flag[CHANNEL_TYPE_LUMA] ? g_alf_num_clipping_values[CHANNEL_TYPE_LUMA] / 2 : 0;
}
//#if JVET_O0090_ALF_CHROMA_FILTER_ALTERNATIVES_CTB //#if JVET_O0090_ALF_CHROMA_FILTER_ALTERNATIVES_CTB
for (int val = 0; val < MAX_NUM_ALF_LUMA_COEFF; val++) { for (int val = 0; val < MAX_NUM_ALF_LUMA_COEFF; val++) {
clip_merged[num_remaining - 1][i][val] = g_alf_aps_temp.non_linear_flag[CHANNEL_TYPE_LUMA][0] ? g_alf_num_clipping_values[CHANNEL_TYPE_LUMA] / 2 : 0; clip_merged[num_remaining - 1][i][val] = g_alf_aps_temp.non_linear_flag[CHANNEL_TYPE_LUMA][0] ? g_alf_num_clipping_values[CHANNEL_TYPE_LUMA] / 2 : 0;
@ -3097,6 +3172,7 @@ double kvz_alf_merge_filters_and_cost(encoder_state_t *const state,
double cost, cost0, dist, dist_force0, cost_min = MAX_DOUBLE; double cost, cost0, dist, dist_force0, cost_min = MAX_DOUBLE;
int coeff_bits, coeff_bits_force0; int coeff_bits, coeff_bits_force0;
//clip_merged:iä ei tarvitse nollata ennen
kvz_alf_merge_classes(channel, cov_frame, cov_merged, clip_merged, MAX_NUM_ALF_CLASSES, g_filter_indices); kvz_alf_merge_classes(channel, cov_frame, cov_merged, clip_merged, MAX_NUM_ALF_CLASSES, g_filter_indices);
while (num_filters >= 1) while (num_filters >= 1)
@ -3750,7 +3826,7 @@ void kvz_alf_encoder_ctb(encoder_state_t *const state,
//newAPS = m_apsMap->allocatePS(newApsId); //newAPS = m_apsMap->allocatePS(newApsId);
assert(new_aps_id + NUM_APS_TYPE_LEN + T_ALF_APS < MAX_NUM_APS); //Invalid PS id assert(new_aps_id + NUM_APS_TYPE_LEN + T_ALF_APS < MAX_NUM_APS); //Invalid PS id
bool found = false; bool found = false;
for (int i = 0; i < (sizeof(state->slice->param_set_map) / sizeof(state->slice->param_set_map[0])); i++) { for (int i = 0; i < ALF_CTB_MAX_NUM_APS; i++) {
if (state->slice->param_set_map[i].parameter_set.aps_id == new_aps_id + NUM_APS_TYPE_LEN + T_ALF_APS) { if (state->slice->param_set_map[i].parameter_set.aps_id == new_aps_id + NUM_APS_TYPE_LEN + T_ALF_APS) {
found = true; found = true;
} }
@ -3762,6 +3838,7 @@ void kvz_alf_encoder_ctb(encoder_state_t *const state,
state->slice->param_set_map[new_aps_id + NUM_APS_TYPE_LEN + T_ALF_APS].parameter_set.aps_id = new_aps_id + NUM_APS_TYPE_LEN + T_ALF_APS; state->slice->param_set_map[new_aps_id + NUM_APS_TYPE_LEN + T_ALF_APS].parameter_set.aps_id = new_aps_id + NUM_APS_TYPE_LEN + T_ALF_APS;
} }
copy_alf_param(new_aps, &state->slice->param_set_map[new_aps_id + NUM_APS_TYPE_LEN + T_ALF_APS].parameter_set); copy_alf_param(new_aps, &state->slice->param_set_map[new_aps_id + NUM_APS_TYPE_LEN + T_ALF_APS].parameter_set);
new_aps->aps_id = new_aps_id; new_aps->aps_id = new_aps_id;
new_aps->aps_type = T_ALF_APS; new_aps->aps_type = T_ALF_APS;
} }
@ -4061,7 +4138,7 @@ void kvz_alf_encoder_ctb(encoder_state_t *const state,
} }
new_aps->new_filter_flag[CHANNEL_TYPE_CHROMA] = true; new_aps->new_filter_flag[CHANNEL_TYPE_CHROMA] = true;
if (!alf_aps_new_filters_best.new_filter_flag[CHANNEL_TYPE_LUMA]) { if (!alf_aps_new_filters_best.new_filter_flag[CHANNEL_TYPE_LUMA]) {
new_aps->new_filter_flag[CHANNEL_TYPE_LUMA]; new_aps->new_filter_flag[CHANNEL_TYPE_LUMA] = false;
} }
//#if JVET_O0090_ALF_CHROMA_FILTER_ALTERNATIVES_CTB //#if JVET_O0090_ALF_CHROMA_FILTER_ALTERNATIVES_CTB
@ -4238,7 +4315,7 @@ void kvz_alf_reconstructor(encoder_state_t const *state,
if (g_ctu_enable_flag[COMPONENT_Y][ctu_idx]) if (g_ctu_enable_flag[COMPONENT_Y][ctu_idx])
{ {
//Area blk(x_pos, y_pos, width, height); //Area blk(x_pos, y_pos, width, height);
short filter_set_index = g_alf_ctb_filter_index[ctu_idx]; short filter_set_index = alf_ctu_filter_index[ctu_idx];
short *coeff; short *coeff;
short *clip; short *clip;
if (filter_set_index >= ALF_NUM_FIXED_FILTER_SETS) if (filter_set_index >= ALF_NUM_FIXED_FILTER_SETS)
@ -4259,7 +4336,7 @@ void kvz_alf_reconstructor(encoder_state_t const *state,
((y_pos + max_cu_height >= luma_height) ? luma_height : g_alf_vb_luma_pos), ((y_pos + max_cu_height >= luma_height) ? luma_height : g_alf_vb_luma_pos),
g_alf_vb_luma_ctu_height); g_alf_vb_luma_ctu_height);
} }
else /*else
{ {
int stride = state->tile->frame->rec->stride; int stride = state->tile->frame->rec->stride;
for (int h = y_pos; h < y_pos + height; h++) { for (int h = y_pos; h < y_pos + height; h++) {
@ -4267,7 +4344,7 @@ void kvz_alf_reconstructor(encoder_state_t const *state,
alf_tmp_y[h * stride + w] = state->tile->frame->rec->y[h * stride + w]; alf_tmp_y[h * stride + w] = state->tile->frame->rec->y[h * stride + w];
} }
} }
} }*/
for (int comp_idx = 1; comp_idx < MAX_NUM_COMPONENT; comp_idx++) for (int comp_idx = 1; comp_idx < MAX_NUM_COMPONENT; comp_idx++)
{ {
alf_component_id comp_id = comp_idx; alf_component_id comp_id = comp_idx;
@ -4304,7 +4381,7 @@ void kvz_alf_reconstructor(encoder_state_t const *state,
g_alf_vb_chma_ctu_height); g_alf_vb_chma_ctu_height);
#endif*/ #endif*/
} }
else /*else
{ {
int stride = state->tile->frame->rec->stride >> chroma_scale_y; int stride = state->tile->frame->rec->stride >> chroma_scale_y;
int h_start = y_pos >> chroma_scale_y; int h_start = y_pos >> chroma_scale_y;
@ -4328,7 +4405,7 @@ void kvz_alf_reconstructor(encoder_state_t const *state,
} }
} }
} }
} }*/
} }
} }
} }
@ -4443,6 +4520,9 @@ void code_alf_ctu_filter_index(encoder_state_t * const state,
if (num_available_filt_sets > ALF_NUM_FIXED_FILTER_SETS) if (num_available_filt_sets > ALF_NUM_FIXED_FILTER_SETS)
{ {
int use_latest_filt = (filter_set_idx == ALF_NUM_FIXED_FILTER_SETS) ? 1 : 0; int use_latest_filt = (filter_set_idx == ALF_NUM_FIXED_FILTER_SETS) ? 1 : 0;
/*if (num_aps == 0) {
use_latest_filt = 1;
}*/
cabac->cur_ctx = &(cabac->ctx.alf_latest_filt); cabac->cur_ctx = &(cabac->ctx.alf_latest_filt);
CABAC_BIN(cabac, use_latest_filt, "use_latest_filt"); CABAC_BIN(cabac, use_latest_filt, "use_latest_filt");
@ -4553,37 +4633,13 @@ void code_alf_ctu_alternative_ctu(encoder_state_t * const state,
} }
//#endif //#endif
void kvz_encode_alf(encoder_state_t * const state, void kvz_encode_alf_bits(encoder_state_t * const state,
const int ctu_idx,
alf_aps *aps)
{
code_alf_ctu_enable_flag(state, &state->cabac, ctu_idx, COMPONENT_Y, aps);
if (g_ctu_enable_flag[0][ctu_idx]) {
code_alf_ctu_filter_index(state, &state->cabac, ctu_idx, aps->enabled_flag[COMPONENT_Y]);
}
const int8_t chroma_idc = state->slice->tile_group_alf_enabled_flag[COMPONENT_Cb] + state->slice->tile_group_alf_enabled_flag[COMPONENT_Cr] * 2;
if (chroma_idc == 1 || chroma_idc == 3) {
code_alf_ctu_enable_flag(state, &state->cabac, ctu_idx, COMPONENT_Cb, aps);
if (g_ctu_enable_flag[1][ctu_idx] && aps->num_alternatives_chroma - 1 > 0) {
code_alf_ctu_alternative_ctu(state, &state->cabac, ctu_idx, COMPONENT_Cb, aps);
}
}
if (chroma_idc == 2 || chroma_idc == 3) {
code_alf_ctu_enable_flag(state, &state->cabac, ctu_idx, COMPONENT_Cr, aps);
if (g_ctu_enable_flag[2][ctu_idx] && aps->num_alternatives_chroma - 1 > 0) {
code_alf_ctu_alternative_ctu(state, &state->cabac, ctu_idx, COMPONENT_Cr, aps);
}
}
}
void kvz_encode_alf_new(encoder_state_t * const state,
const int ctu_idx) const int ctu_idx)
{ {
for (int comp_idx = 0; comp_idx < MAX_NUM_COMPONENT; comp_idx++) for (int comp_idx = 0; comp_idx < MAX_NUM_COMPONENT; comp_idx++)
{ {
bool is_luma = comp_idx == COMPONENT_Y ? true : false; bool is_luma = comp_idx == COMPONENT_Y ? true : false;
//state->slice->tile_group_alf_enabled_flag[component_id] = 0; //state->slice->tile_group_alf_enabled_flag[comp_idx] = 0;
code_alf_ctu_enable_flag(state, &state->cabac, ctu_idx, comp_idx, NULL); code_alf_ctu_enable_flag(state, &state->cabac, ctu_idx, comp_idx, NULL);
if (is_luma) if (is_luma)
{ {

View file

@ -362,6 +362,7 @@ int** g_filter_clipp_set; // [lumaClassIdx][coeffIdx]
short* g_alf_ctb_filter_set_index_tmp; //g_num_ctus_in_pic //voisi olla lokaali muuttuja? short* g_alf_ctb_filter_set_index_tmp; //g_num_ctus_in_pic //voisi olla lokaali muuttuja?
short* g_alf_ctb_filter_index; //g_num_ctus_in_pic short* g_alf_ctb_filter_index; //g_num_ctus_in_pic
static uint32_t g_curr_frame = MAX_INT; static uint32_t g_curr_frame = MAX_INT;
static uint32_t g_old_frame = 0;
alf_aps alf_param; alf_aps alf_param;
//temps //temps
@ -469,7 +470,6 @@ void kvz_alf_derive_filter__encode__reconstruct(encoder_state_t *const state,
//#endif //#endif
); );
//cabac contextit
double kvz_alf_derive_ctb_alf_enable_flags(encoder_state_t * const state, double kvz_alf_derive_ctb_alf_enable_flags(encoder_state_t * const state,
channel_type channel, channel_type channel,
const int i_shape_idx, const int i_shape_idx,
@ -484,7 +484,8 @@ double kvz_alf_derive_ctb_alf_enable_flags(encoder_state_t * const state,
void kvz_alf_enc_create(encoder_state_t const *state, void kvz_alf_enc_create(encoder_state_t const *state,
const lcu_order_element_t *lcu); const lcu_order_element_t *lcu);
void kvz_alf_enc_destroy(videoframe_t * const frame, void kvz_alf_enc_destroy(encoder_state_t const *state,
videoframe_t * const frame,
const lcu_order_element_t *lcu); const lcu_order_element_t *lcu);
void kvz_alf_encoder(encoder_state_t *const state, void kvz_alf_encoder(encoder_state_t *const state,
@ -586,7 +587,6 @@ void kvz_alf_encoder_ctb(encoder_state_t *const state,
//#endif //#endif
); );
//Funktion kvz_alf_filter_block kutsut; w, h, x, y, x_dst, y_dst, buf(s)?
void kvz_alf_reconstructor(encoder_state_t const *state, int ctu_idx); void kvz_alf_reconstructor(encoder_state_t const *state, int ctu_idx);
//---------------------------------------------------------------------- //----------------------------------------------------------------------
@ -605,14 +605,12 @@ void code_alf_ctu_enable_flags_component(encoder_state_t * const state,
alf_component_id component_id, alf_component_id component_id,
alf_aps *aps); alf_aps *aps);
//4
void code_alf_ctu_enable_flag(encoder_state_t * const state, void code_alf_ctu_enable_flag(encoder_state_t * const state,
cabac_data_t * const cabac, cabac_data_t * const cabac,
uint32_t ctu_rs_addr, uint32_t ctu_rs_addr,
alf_component_id component_id, alf_component_id component_id,
alf_aps *aps); alf_aps *aps);
//1
void code_alf_ctu_filter_index(encoder_state_t * const state, void code_alf_ctu_filter_index(encoder_state_t * const state,
cabac_data_t * const cabac, cabac_data_t * const cabac,
uint32_t ctu_rs_addr, uint32_t ctu_rs_addr,
@ -630,18 +628,13 @@ void code_alf_ctu_alternatives_component(encoder_state_t * const state,
alf_aps* aps, alf_aps* aps,
int ctu_idx); int ctu_idx);
//1
void code_alf_ctu_alternative_ctu(encoder_state_t * const state, void code_alf_ctu_alternative_ctu(encoder_state_t * const state,
cabac_data_t * const cabac, cabac_data_t * const cabac,
uint32_t ctu_rs_addr, uint32_t ctu_rs_addr,
const alf_component_id comp_idx, const alf_component_id comp_idx,
const alf_aps* aps); const alf_aps* aps);
void kvz_encode_alf(encoder_state_t * const state, void kvz_encode_alf_bits(encoder_state_t * const state,
const int ctu_idx,
alf_aps *aps);
void kvz_encode_alf_new(encoder_state_t * const state,
const int ctu_idx); const int ctu_idx);
//--------------------------------------------------------------------- //---------------------------------------------------------------------

View file

@ -677,7 +677,7 @@ static void encoder_state_worker_encode_lcu(void * opaque)
kvz_alf_enc_create(state, lcu); kvz_alf_enc_create(state, lcu);
kvz_alf_init(state, slice); kvz_alf_init(state, slice);
kvz_alf_enc_process(state, lcu); kvz_alf_enc_process(state, lcu);
kvz_alf_enc_destroy(frame, lcu); kvz_alf_enc_destroy(state, frame, lcu);
} }
//Encode coding tree //Encode coding tree
@ -785,10 +785,6 @@ static void encoder_state_encode_leaf(encoder_state_t * const state)
for (int i = 0; i < state->lcu_order_count; ++i) { for (int i = 0; i < state->lcu_order_count; ++i) {
encoder_state_worker_encode_lcu(&state->lcu_order[i]); encoder_state_worker_encode_lcu(&state->lcu_order[i]);
} }
/*if (state->encoder_control->cfg.alf_enable) {
kvz_alf_derive_filter__encode__reconstruct(state, 0.0);
kvz_alf_enc_destroy(state); //eri paikkaan
}*/
} else { } else {
// Add each LCU in the wavefront row as it's own job to the queue. // Add each LCU in the wavefront row as it's own job to the queue.