Separate luma and chroma coefficient generation variables.

This commit is contained in:
Ari Koivula 2014-05-12 10:38:24 +03:00
parent 0ca65e7606
commit 59e0e98523

View file

@ -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);
} }
} }
} }