mirror of
https://github.com/ultravideo/uvg266.git
synced 2024-11-24 02:24:07 +00:00
Separate luma and chroma coefficient generation variables.
This commit is contained in:
parent
0ca65e7606
commit
59e0e98523
|
@ -2974,11 +2974,13 @@ void encode_transform_tree(encoder_state * const encoder_state, int32_t x, int32
|
||||||
const encoder_control * const encoder = encoder_state->encoder_control;
|
const encoder_control * const encoder = encoder_state->encoder_control;
|
||||||
// we have 64>>depth transform size
|
// we have 64>>depth transform size
|
||||||
int x_local = (x&0x3f), y_local = (y&0x3f);
|
int x_local = (x&0x3f), y_local = (y&0x3f);
|
||||||
|
int32_t x_pu = x_local >> 2;
|
||||||
|
int32_t y_pu = y_local >> 2;
|
||||||
|
const vector2d lcu_px = {x & 0x3f, y & 0x3f};
|
||||||
cu_info *cur_cu = &lcu->cu[LCU_CU_OFFSET + (x_local>>3) + (y_local>>3)*LCU_T_CU_WIDTH];
|
cu_info *cur_cu = &lcu->cu[LCU_CU_OFFSET + (x_local>>3) + (y_local>>3)*LCU_T_CU_WIDTH];
|
||||||
|
const int8_t width = LCU_WIDTH>>depth;
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
const int8_t width = LCU_WIDTH>>depth;
|
|
||||||
const int8_t width_c = (depth == MAX_DEPTH + 1 ? width : width / 2);
|
|
||||||
|
|
||||||
// Tell clang-analyzer what is up. For some reason it can't figure out from
|
// Tell clang-analyzer what is up. For some reason it can't figure out from
|
||||||
// asserting just depth.
|
// asserting just depth.
|
||||||
|
@ -2986,7 +2988,7 @@ void encode_transform_tree(encoder_state * const encoder_state, int32_t x, int32
|
||||||
|
|
||||||
// Split transform and increase depth
|
// Split transform and increase depth
|
||||||
if (depth == 0 || cur_cu->tr_depth > depth) {
|
if (depth == 0 || cur_cu->tr_depth > depth) {
|
||||||
int offset = width_c;
|
int offset = width / 2;
|
||||||
encode_transform_tree(encoder_state, x, y, depth+1, lcu);
|
encode_transform_tree(encoder_state, x, y, depth+1, lcu);
|
||||||
encode_transform_tree(encoder_state, x + offset, y, depth+1, lcu);
|
encode_transform_tree(encoder_state, x + offset, y, depth+1, lcu);
|
||||||
encode_transform_tree(encoder_state, x, y + offset, depth+1, lcu);
|
encode_transform_tree(encoder_state, x, y + offset, depth+1, lcu);
|
||||||
|
@ -3012,41 +3014,31 @@ void encode_transform_tree(encoder_state * const encoder_state, int32_t x, int32
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
// Pointers to current location in arrays with prediction.
|
const int luma_offset = lcu_px.x + lcu_px.y * LCU_WIDTH;
|
||||||
pixel *recbase_y = &lcu->rec.y[x_local + y_local * LCU_WIDTH];
|
|
||||||
pixel *recbase_u = &lcu->rec.u[x_local/2 + (y_local * LCU_WIDTH)/4];
|
|
||||||
pixel *recbase_v = &lcu->rec.v[x_local/2 + (y_local * LCU_WIDTH)/4];
|
|
||||||
const int32_t recbase_stride = LCU_WIDTH;
|
|
||||||
|
|
||||||
// Pointers to current location in arrays with reference.
|
const int32_t recbase_stride = LCU_WIDTH;
|
||||||
const pixel *base_y = &lcu->ref.y[x_local + y_local * LCU_WIDTH];
|
|
||||||
const pixel *base_u = &lcu->ref.u[x_local/2 + (y_local * LCU_WIDTH)/4];
|
|
||||||
const pixel *base_v = &lcu->ref.v[x_local/2 + (y_local * LCU_WIDTH)/4];
|
|
||||||
const int32_t base_stride = LCU_WIDTH;
|
const int32_t base_stride = LCU_WIDTH;
|
||||||
|
const int32_t pred_stride = LCU_WIDTH;
|
||||||
|
const int32_t coeff_stride = LCU_WIDTH;
|
||||||
|
|
||||||
|
// Pointers to current location in arrays with prediction.
|
||||||
|
pixel *recbase_y = &lcu->rec.y[luma_offset];
|
||||||
|
// Pointers to current location in arrays with reference.
|
||||||
|
const pixel *base_y = &lcu->ref.y[luma_offset];
|
||||||
|
// Pointers to current location in arrays with kvantized coefficients.
|
||||||
|
coefficient *orig_coeff_y = &lcu->coeff.y[luma_offset];
|
||||||
|
|
||||||
// Temporary buffers. Not really used for much. Possibly unnecessary.
|
// Temporary buffers. Not really used for much. Possibly unnecessary.
|
||||||
pixel pred_y[LCU_WIDTH*LCU_WIDTH];
|
pixel pred_y[LCU_WIDTH*LCU_WIDTH];
|
||||||
const int32_t pred_stride = LCU_WIDTH;
|
|
||||||
|
|
||||||
// Buffers for coefficients.
|
// Buffers for coefficients.
|
||||||
coefficient coeff_y[LCU_WIDTH*LCU_WIDTH];
|
coefficient coeff_y[LCU_WIDTH*LCU_WIDTH];
|
||||||
|
|
||||||
// Pointers to current location in arrays with kvantized coefficients.
|
|
||||||
coefficient *orig_coeff_y = &lcu->coeff.y[x_local + y_local * LCU_WIDTH];
|
|
||||||
coefficient *orig_coeff_u = &lcu->coeff.u[x_local/2 + (y_local * LCU_WIDTH)/4];
|
|
||||||
coefficient *orig_coeff_v = &lcu->coeff.v[x_local/2 + (y_local * LCU_WIDTH)/4];
|
|
||||||
const int32_t coeff_stride = LCU_WIDTH;
|
|
||||||
|
|
||||||
// Temporary buffers for kvantization and transformation.
|
// Temporary buffers for kvantization and transformation.
|
||||||
int16_t block[LCU_WIDTH*LCU_WIDTH>>2];
|
int16_t block[LCU_WIDTH*LCU_WIDTH>>2];
|
||||||
int16_t pre_quant_coeff[LCU_WIDTH*LCU_WIDTH>>2];
|
int16_t pre_quant_coeff[LCU_WIDTH*LCU_WIDTH>>2];
|
||||||
|
|
||||||
uint32_t ac_sum = 0;
|
uint32_t ac_sum = 0;
|
||||||
uint8_t scan_idx_luma = SCAN_DIAG;
|
uint8_t scan_idx_luma = SCAN_DIAG;
|
||||||
uint8_t scan_idx_chroma = SCAN_DIAG;
|
|
||||||
|
|
||||||
int32_t x_pu = x_local >> 2;
|
|
||||||
int32_t y_pu = y_local >> 2;
|
|
||||||
|
|
||||||
#if OPTIMIZATION_SKIP_RESIDUAL_ON_THRESHOLD
|
#if OPTIMIZATION_SKIP_RESIDUAL_ON_THRESHOLD
|
||||||
uint32_t residual_sum = 0;
|
uint32_t residual_sum = 0;
|
||||||
|
@ -3068,7 +3060,6 @@ void encode_transform_tree(encoder_state * const encoder_state, int32_t x, int32
|
||||||
chroma_mode = cur_cu->intra[PU_INDEX(x_pu, y_pu)].mode;
|
chroma_mode = cur_cu->intra[PU_INDEX(x_pu, y_pu)].mode;
|
||||||
}
|
}
|
||||||
scan_idx_luma = get_scan_order(cur_cu->type, cur_cu->intra[PU_INDEX(x_pu, y_pu)].mode, depth);
|
scan_idx_luma = get_scan_order(cur_cu->type, cur_cu->intra[PU_INDEX(x_pu, y_pu)].mode, depth);
|
||||||
scan_idx_chroma = get_scan_order(cur_cu->type, chroma_mode, depth);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy Luma and Chroma to the pred-block
|
// Copy Luma and Chroma to the pred-block
|
||||||
|
@ -3214,19 +3205,27 @@ void encode_transform_tree(encoder_state * const encoder_state, int32_t x, int32
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// If luma is 4x4, do chroma for the 8x8 luma area when handling the top
|
// If luma is 4x4, do chroma for the 8x8 luma area when handling the top
|
||||||
// left PU because the coordinates are correct.
|
// left PU because the coordinates are correct.
|
||||||
if (depth <= MAX_DEPTH || (x_pu % 2 == 0 && y_pu % 2 == 0)) {
|
if (depth <= MAX_DEPTH || (x_pu % 2 == 0 && y_pu % 2 == 0)) {
|
||||||
if (cur_cu->intra[0].mode_chroma == 36) {
|
const int chroma_offset = lcu_px.x / 2 + lcu_px.y / 2 * LCU_WIDTH / 2;
|
||||||
cur_cu->intra[0].mode_chroma = cur_cu->intra[0].mode;
|
pixel *recbase_u = &lcu->rec.u[chroma_offset];
|
||||||
}
|
pixel *recbase_v = &lcu->rec.v[chroma_offset];
|
||||||
if (quantize_residual_chroma(encoder_state, cur_cu, depth, COLOR_U, base_u, recbase_u, orig_coeff_u)) {
|
const pixel *base_u = &lcu->ref.u[chroma_offset];
|
||||||
cbf_set(&cur_cu->cbf.u, depth);
|
const pixel *base_v = &lcu->ref.v[chroma_offset];
|
||||||
}
|
coefficient *orig_coeff_u = &lcu->coeff.u[chroma_offset];
|
||||||
if (quantize_residual_chroma(encoder_state, cur_cu, depth, COLOR_V, base_v, recbase_v, orig_coeff_v)) {
|
coefficient *orig_coeff_v = &lcu->coeff.v[chroma_offset];
|
||||||
cbf_set(&cur_cu->cbf.v, depth);
|
|
||||||
}
|
if (cur_cu->intra[0].mode_chroma == 36) {
|
||||||
|
cur_cu->intra[0].mode_chroma = cur_cu->intra[0].mode;
|
||||||
|
}
|
||||||
|
if (quantize_residual_chroma(encoder_state, cur_cu, depth, COLOR_U, base_u, recbase_u, orig_coeff_u)) {
|
||||||
|
cbf_set(&cur_cu->cbf.u, depth);
|
||||||
|
}
|
||||||
|
if (quantize_residual_chroma(encoder_state, cur_cu, depth, COLOR_V, base_v, recbase_v, orig_coeff_v)) {
|
||||||
|
cbf_set(&cur_cu->cbf.v, depth);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue