mirror of
https://github.com/ultravideo/uvg266.git
synced 2024-11-27 19:24:06 +00:00
Bug fixes.
WIP.
This commit is contained in:
parent
09c68d9de6
commit
9cad95c94c
230
src/alf.c
230
src/alf.c
|
@ -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,27 +2048,28 @@ 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 w = 0; w < width; w++) {
|
||||||
for (int h = 0; h < height; h++) {
|
frame->rec->y[h * stride + w] = alf_tmp_y[h * stride + w];
|
||||||
for (int w = 0; w < width; w++) {
|
}
|
||||||
frame->rec->y[h * stride + w] = alf_tmp_y[h * stride + w];
|
}
|
||||||
|
|
||||||
|
stride = stride >> 1;
|
||||||
|
for (int h = 0; h < height >> 1; h++) {
|
||||||
|
for (int w = 0; w < width >> 1; w++) {
|
||||||
|
frame->rec->u[h * stride + w] = alf_tmp_u[h * stride + w];
|
||||||
|
frame->rec->v[h * stride + w] = alf_tmp_v[h * stride + w];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
stride = stride >> 1;
|
|
||||||
for (int h = 0; h < height >> 1; h++) {
|
|
||||||
for (int w = 0; w < width >> 1; w++) {
|
|
||||||
frame->rec->u[h * stride + w] = alf_tmp_u[h * stride + w];
|
|
||||||
frame->rec->v[h * stride + w] = alf_tmp_v[h * stride + w];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//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,7 +2846,8 @@ 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
|
||||||
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]);
|
//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]);
|
||||||
}
|
}
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
|
15
src/alf.h
15
src/alf.h
|
@ -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);
|
||||||
|
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue