mirror of
https://github.com/ultravideo/uvg266.git
synced 2024-11-23 18:14:06 +00:00
WIP
This commit is contained in:
parent
70cbaae619
commit
5ba8d45981
12
src/intra.c
12
src/intra.c
|
@ -324,8 +324,8 @@ static void get_cclm_parameters(
|
||||||
//int left_below_units = total_left_units - tu_height_in_units;
|
//int left_below_units = total_left_units - tu_height_in_units;
|
||||||
//int avai_above_right_units = 0; // TODO these are non zero only with non-square CUs
|
//int avai_above_right_units = 0; // TODO these are non zero only with non-square CUs
|
||||||
//int avai_left_below_units = 0;
|
//int avai_left_below_units = 0;
|
||||||
int avai_above_units = CLIP(0, tu_height_in_units, y0/base_unit_size);
|
int avai_above_units = y0 ? tu_width_in_units : 0;
|
||||||
int avai_left_units = CLIP(0, tu_width_in_units, x0 / base_unit_size);
|
int avai_left_units = x0 ? tu_height_in_units : 0;
|
||||||
|
|
||||||
bool above_available = avai_above_units != 0;
|
bool above_available = avai_above_units != 0;
|
||||||
bool left_available = avai_left_units != 0;
|
bool left_available = avai_left_units != 0;
|
||||||
|
@ -559,7 +559,7 @@ static void predict_cclm(
|
||||||
}
|
}
|
||||||
|
|
||||||
if(x0) {
|
if(x0) {
|
||||||
if (x_scu == 0) available_left_below = MIN(MIN(width / 2, (64 - y_scu - height * 2) / 2), (state->tile->frame->height - y0 - height * 2) / 2);
|
if (x_scu == 0) available_left_below = MIN(MIN(height / 2, (64 - y_scu - height * 2) / 2), (state->tile->frame->height - y0 - height * 2) / 2);
|
||||||
for (; available_left_below < height / 2; available_left_below++) {
|
for (; available_left_below < height / 2; available_left_below++) {
|
||||||
int y_extension = y_scu + height * 2 + 4 * available_left_below;
|
int y_extension = y_scu + height * 2 + 4 * available_left_below;
|
||||||
y_extension >>= tree_type == UVG_CHROMA_T;
|
y_extension >>= tree_type == UVG_CHROMA_T;
|
||||||
|
@ -937,7 +937,7 @@ static void intra_predict_regular(
|
||||||
uint8_t isp = color == COLOR_Y ? isp_mode : 0;
|
uint8_t isp = color == COLOR_Y ? isp_mode : 0;
|
||||||
|
|
||||||
const uvg_intra_ref *used_ref = &refs->ref;
|
const uvg_intra_ref *used_ref = &refs->ref;
|
||||||
if (cfg->intra_smoothing_disabled || color != COLOR_Y || mode == 1 || (width == 4 && height == 4) || multi_ref_index || width != height /*ISP_TODO: replace this fake ISP check*/) {
|
if (cfg->intra_smoothing_disabled || color != COLOR_Y || mode == 1 || (width == 4 && height == 4) || multi_ref_index || isp_mode /*ISP_TODO: replace this fake ISP check*/) {
|
||||||
// For chroma, DC and 4x4 blocks, always use unfiltered reference.
|
// For chroma, DC and 4x4 blocks, always use unfiltered reference.
|
||||||
} else if (mode == 0) {
|
} else if (mode == 0) {
|
||||||
// Otherwise, use filtered for planar.
|
// Otherwise, use filtered for planar.
|
||||||
|
@ -1400,7 +1400,7 @@ void uvg_intra_build_reference_inner(
|
||||||
|
|
||||||
// Limit the number of available pixels based on block size and dimensions
|
// Limit the number of available pixels based on block size and dimensions
|
||||||
// of the picture.
|
// of the picture.
|
||||||
px_available_left = MIN(px_available_left, cu_height * 2);
|
px_available_left = MIN(px_available_left, height * 2);
|
||||||
px_available_left = MIN(px_available_left, (pic_px->y - luma_px->y) >> is_chroma);
|
px_available_left = MIN(px_available_left, (pic_px->y - luma_px->y) >> is_chroma);
|
||||||
|
|
||||||
// Copy pixels from coded CUs.
|
// Copy pixels from coded CUs.
|
||||||
|
@ -1438,7 +1438,7 @@ void uvg_intra_build_reference_inner(
|
||||||
|
|
||||||
// Extend for MRL
|
// Extend for MRL
|
||||||
if (multi_ref_index) {
|
if (multi_ref_index) {
|
||||||
for (; i < width * 2 + multi_ref_index; ++i) {
|
for (; i < height * 2 + multi_ref_index; ++i) {
|
||||||
out_left_ref[i + 1] = nearest_pixel;
|
out_left_ref[i + 1] = nearest_pixel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1085,7 +1085,7 @@ static double search_cu(
|
||||||
false);
|
false);
|
||||||
|
|
||||||
downsample_cclm_rec(
|
downsample_cclm_rec(
|
||||||
state, x, y, cu_width / 2, cu_width / 2, lcu->rec.y, lcu->left_ref.y[64]
|
state, x, y, cu_width / 2, cu_height / 2, lcu->rec.y, lcu->left_ref.y[64]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
double intra_cost = intra_search.cost;
|
double intra_cost = intra_search.cost;
|
||||||
|
@ -1479,7 +1479,7 @@ static double search_cu(
|
||||||
// search.
|
// search.
|
||||||
memcpy(&state->search_cabac, &post_seach_cabac, sizeof(post_seach_cabac));
|
memcpy(&state->search_cabac, &post_seach_cabac, sizeof(post_seach_cabac));
|
||||||
downsample_cclm_rec(
|
downsample_cclm_rec(
|
||||||
state, x, y, cu_width / 2, cu_width / 2, lcu->rec.y, lcu->left_ref.y[64]
|
state, x, y, cu_width / 2, cu_height / 2, lcu->rec.y, lcu->left_ref.y[64]
|
||||||
);
|
);
|
||||||
|
|
||||||
if (state->frame->slicetype != UVG_SLICE_I) {
|
if (state->frame->slicetype != UVG_SLICE_I) {
|
||||||
|
@ -1498,7 +1498,7 @@ static double search_cu(
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
downsample_cclm_rec(
|
downsample_cclm_rec(
|
||||||
state, x, y, cu_width / 2, cu_width / 2, lcu->rec.y, lcu->left_ref.y[64]
|
state, x, y, cu_width / 2, cu_height / 2, lcu->rec.y, lcu->left_ref.y[64]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} else if (cur_cu->log2_height + cur_cu->log2_width > 4) {
|
} else if (cur_cu->log2_height + cur_cu->log2_width > 4) {
|
||||||
|
@ -1506,7 +1506,7 @@ static double search_cu(
|
||||||
// when searching SMP and AMP blocks.
|
// when searching SMP and AMP blocks.
|
||||||
if(tree_type != UVG_CHROMA_T) {
|
if(tree_type != UVG_CHROMA_T) {
|
||||||
downsample_cclm_rec(
|
downsample_cclm_rec(
|
||||||
state, x, y, cu_width / 2, cu_width / 2, lcu->rec.y, lcu->left_ref.y[64]
|
state, x, y, cu_width / 2, cu_height / 2, lcu->rec.y, lcu->left_ref.y[64]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -61,8 +61,8 @@ static void uvg_angular_pred_generic(
|
||||||
const uint8_t multi_ref_idx,
|
const uint8_t multi_ref_idx,
|
||||||
const uint8_t isp_mode)
|
const uint8_t isp_mode)
|
||||||
{
|
{
|
||||||
const int width = channel_type == COLOR_Y ? cu_loc->width : cu_loc->chroma_width;
|
int width = channel_type == COLOR_Y ? cu_loc->width : cu_loc->chroma_width;
|
||||||
const int height = channel_type == COLOR_Y ? cu_loc->height : cu_loc->chroma_height;
|
int height = channel_type == COLOR_Y ? cu_loc->height : cu_loc->chroma_height;
|
||||||
const int log2_width = uvg_g_convert_to_log2[width];
|
const int log2_width = uvg_g_convert_to_log2[width];
|
||||||
const int log2_height = uvg_g_convert_to_log2[height];
|
const int log2_height = uvg_g_convert_to_log2[height];
|
||||||
|
|
||||||
|
@ -180,13 +180,6 @@ static void uvg_angular_pred_generic(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Flip dimensions for horizontal modes
|
|
||||||
int tmp_width = vertical_mode ? width : height;
|
|
||||||
int tmp_height = vertical_mode ? height : width;
|
|
||||||
|
|
||||||
uvg_pixel tmp_dst[LCU_WIDTH * LCU_WIDTH];
|
|
||||||
uvg_pixel* dst_buf = vertical_mode ? dst : tmp_dst;
|
|
||||||
|
|
||||||
|
|
||||||
// compensate for line offset in reference line buffers
|
// compensate for line offset in reference line buffers
|
||||||
ref_main += multi_ref_index;
|
ref_main += multi_ref_index;
|
||||||
|
@ -207,7 +200,7 @@ static void uvg_angular_pred_generic(
|
||||||
uvg_pixel p[4];
|
uvg_pixel p[4];
|
||||||
bool use_cubic = true; // Default to cubic filter
|
bool use_cubic = true; // Default to cubic filter
|
||||||
static const int uvg_intra_hor_ver_dist_thres[8] = { 24, 24, 24, 14, 2, 0, 0, 0 };
|
static const int uvg_intra_hor_ver_dist_thres[8] = { 24, 24, 24, 14, 2, 0, 0, 0 };
|
||||||
int filter_threshold = uvg_intra_hor_ver_dist_thres[log2_width];
|
int filter_threshold = uvg_intra_hor_ver_dist_thres[(log2_width + log2_height) >> 1];
|
||||||
int dist_from_vert_or_hor = MIN(abs((int32_t)pred_mode - 50), abs((int32_t)pred_mode - 18));
|
int dist_from_vert_or_hor = MIN(abs((int32_t)pred_mode - 50), abs((int32_t)pred_mode - 18));
|
||||||
if (dist_from_vert_or_hor > filter_threshold) {
|
if (dist_from_vert_or_hor > filter_threshold) {
|
||||||
if ((abs(sample_disp) & 0x1F) != 0)
|
if ((abs(sample_disp) & 0x1F) != 0)
|
||||||
|
@ -270,38 +263,6 @@ static void uvg_angular_pred_generic(
|
||||||
dst_buf[y * tmp_width + x] = dst_buf[y * tmp_width + x] + ((wL * (left - dst_buf[y * tmp_width + x]) + 32) >> 6);
|
dst_buf[y * tmp_width + x] = dst_buf[y * tmp_width + x] + ((wL * (left - dst_buf[y * tmp_width + x]) + 32) >> 6);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
if (pred_mode == 2 || pred_mode == 66) {
|
|
||||||
int wT = 16 >> MIN(31, ((y << 1) >> scale));
|
|
||||||
for (int x = 0; x < width; x++) {
|
|
||||||
int wL = 16 >> MIN(31, ((x << 1) >> scale));
|
|
||||||
if (wT + wL == 0) break;
|
|
||||||
int c = x + y + 1;
|
|
||||||
if (c >= 2 * width) { wL = 0; }
|
|
||||||
if (c >= 2 * width) { wT = 0; }
|
|
||||||
const uvg_pixel left = (wL != 0) ? ref_side[c] : 0;
|
|
||||||
const uvg_pixel top = (wT != 0) ? ref_main[c] : 0;
|
|
||||||
dst[y * width + x] = CLIP_TO_PIXEL((wL * left + wT * top + (64 - wL - wT) * dst[y * width + x] + 32) >> 6);
|
|
||||||
}
|
|
||||||
} else if (sample_disp == 0 || sample_disp >= 12) {
|
|
||||||
int inv_angle_sum_0 = 2;
|
|
||||||
for (int x = 0; x < width; x++) {
|
|
||||||
inv_angle_sum_0 += modedisp2invsampledisp[abs(mode_disp)];
|
|
||||||
int delta_pos_0 = inv_angle_sum_0 >> 2;
|
|
||||||
int delta_frac_0 = delta_pos_0 & 63;
|
|
||||||
int delta_int_0 = delta_pos_0 >> 6;
|
|
||||||
int delta_y = y + delta_int_0 + 1;
|
|
||||||
// TODO: convert to JVET_K0500_WAIP
|
|
||||||
if (delta_y > width + width - 1) break;
|
|
||||||
|
|
||||||
int wL = 32 >> MIN(31, ((x << 1) >> scale));
|
|
||||||
if (wL == 0) break;
|
|
||||||
const uvg_pixel *p = ref_side + delta_y - 1;
|
|
||||||
uvg_pixel left = p[delta_frac_0 >> 5];
|
|
||||||
dst[y * width + x] = CLIP_TO_PIXEL((wL * left + (64 - wL) * dst[y * width + x] + 32) >> 6);
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -312,6 +273,7 @@ static void uvg_angular_pred_generic(
|
||||||
bool do_pdpc = (((tmp_width >= 4 && tmp_height >= 4) || channel_type != 0) && sample_disp >= 0 && multi_ref_index == 0 /*&& !bdpcm*/);
|
bool do_pdpc = (((tmp_width >= 4 && tmp_height >= 4) || channel_type != 0) && sample_disp >= 0 && multi_ref_index == 0 /*&& !bdpcm*/);
|
||||||
|
|
||||||
if (do_pdpc) {
|
if (do_pdpc) {
|
||||||
|
if (!vertical_mode) {SWAP(width, height, int)}
|
||||||
int scale = (log2_width + log2_height - 2) >> 2;
|
int scale = (log2_width + log2_height - 2) >> 2;
|
||||||
const uvg_pixel top_left = ref_main[0];
|
const uvg_pixel top_left = ref_main[0];
|
||||||
for (int_fast32_t y = 0; y < tmp_height; ++y) {
|
for (int_fast32_t y = 0; y < tmp_height; ++y) {
|
||||||
|
@ -332,9 +294,9 @@ static void uvg_angular_pred_generic(
|
||||||
|
|
||||||
// Flip the block if this is was a horizontal mode.
|
// Flip the block if this is was a horizontal mode.
|
||||||
if (!vertical_mode) {
|
if (!vertical_mode) {
|
||||||
for (int_fast32_t y = 0; y < tmp_height; ++y) {
|
for (int_fast32_t y = 0; y < height - 1; ++y) {
|
||||||
for (int_fast32_t x = 0; x < tmp_width; ++x) {
|
for (int_fast32_t x = y + 1; x < width; ++x) {
|
||||||
dst[x * width + y] = tmp_dst[y * tmp_width + x];
|
SWAP(dst[y * height + x], dst[x * width + y], uvg_pixel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue