mirror of
https://github.com/ultravideo/uvg266.git
synced 2024-11-27 19:24:06 +00:00
Add multiRefIndex to reference handling.
This commit is contained in:
parent
b8d4af3660
commit
3462ac7219
|
@ -41,7 +41,7 @@
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Generage angular predictions.
|
* \brief Generate angular predictions.
|
||||||
* \param log2_width Log2 of width, range 2..5.
|
* \param log2_width Log2 of width, range 2..5.
|
||||||
* \param intra_mode Angular mode in range 2..34.
|
* \param intra_mode Angular mode in range 2..34.
|
||||||
* \param in_ref_above Pointer to -1 index of above reference, length=width*2+1.
|
* \param in_ref_above Pointer to -1 index of above reference, length=width*2+1.
|
||||||
|
@ -102,12 +102,18 @@ static void kvz_angular_pred_generic(
|
||||||
|
|
||||||
// Temporary buffer for modes 11-25.
|
// Temporary buffer for modes 11-25.
|
||||||
// It only needs to be big enough to hold indices from -width to width-1.
|
// It only needs to be big enough to hold indices from -width to width-1.
|
||||||
|
|
||||||
|
// TODO: check the correct size for these arrays when MRL is used
|
||||||
|
kvz_pixel tmp_ref[2 * 128] = { 0 };
|
||||||
kvz_pixel temp_main[2 * 128] = { 0 };
|
kvz_pixel temp_main[2 * 128] = { 0 };
|
||||||
kvz_pixel temp_side[2 * 128] = { 0 };
|
kvz_pixel temp_side[2 * 128] = { 0 };
|
||||||
const int_fast32_t width = 1 << log2_width;
|
const int_fast32_t width = 1 << log2_width;
|
||||||
|
|
||||||
uint32_t pred_mode = intra_mode; // ToDo: handle WAIP
|
uint32_t pred_mode = intra_mode; // ToDo: handle WAIP
|
||||||
|
|
||||||
|
// TODO: pass the multiRefIdx to this function and assign to this variable
|
||||||
|
uint8_t multiRefIndex = 0;
|
||||||
|
|
||||||
// Whether to swap references to always project on the left reference row.
|
// Whether to swap references to always project on the left reference row.
|
||||||
const bool vertical_mode = intra_mode >= 34;
|
const bool vertical_mode = intra_mode >= 34;
|
||||||
// Modes distance to horizontal or vertical mode.
|
// Modes distance to horizontal or vertical mode.
|
||||||
|
@ -128,20 +134,22 @@ static void kvz_angular_pred_generic(
|
||||||
// Set ref_main and ref_side such that, when indexed with 0, they point to
|
// Set ref_main and ref_side such that, when indexed with 0, they point to
|
||||||
// index 0 in block coordinates.
|
// index 0 in block coordinates.
|
||||||
if (sample_disp < 0) {
|
if (sample_disp < 0) {
|
||||||
for (int i = 0; i <= width + 1; i++) {
|
|
||||||
|
// TODO: for non-square blocks, separate loops for x and y is needed
|
||||||
|
for (int i = 0; i <= width + 1 + multiRefIndex; i++) {
|
||||||
temp_main[width + i] = (vertical_mode ? in_ref_above[i] : in_ref_left[i]);
|
temp_main[width + i] = (vertical_mode ? in_ref_above[i] : in_ref_left[i]);
|
||||||
temp_side[width + i] = (vertical_mode ? in_ref_left[i] : in_ref_above[i]);
|
temp_side[width + i] = (vertical_mode ? in_ref_left[i] : in_ref_above[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: take into account non-square blocks
|
||||||
ref_main = temp_main + width;
|
ref_main = temp_main + width;
|
||||||
ref_side = temp_side + width;
|
ref_side = temp_side + width;
|
||||||
|
|
||||||
|
// TODO: for non square blocks, need to check if width or height is used for reference extension
|
||||||
for (int i = -width; i <= -1; i++) {
|
for (int i = -width; i <= -1; i++) {
|
||||||
ref_main[i] = ref_side[MIN((-i * modedisp2invsampledisp[abs(mode_disp)] + 256) >> 9, width)];
|
ref_main[i] = ref_side[MIN((-i * modedisp2invsampledisp[abs(mode_disp)] + 256) >> 9, width)];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//const uint32_t index_offset = width + 1;
|
//const uint32_t index_offset = width + 1;
|
||||||
//const int32_t last_index = width;
|
//const int32_t last_index = width;
|
||||||
//const int_fast32_t most_negative_index = (width * sample_disp) >> 5;
|
//const int_fast32_t most_negative_index = (width * sample_disp) >> 5;
|
||||||
|
@ -176,17 +184,20 @@ static void kvz_angular_pred_generic(
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
for (int i = 0; i <= (width << 1); i++) {
|
// TODO: again, separate loop needed for non-square blocks
|
||||||
|
for (int i = 0; i <= (width << 1) + multiRefIndex; i++) {
|
||||||
temp_main[i] = (vertical_mode ? in_ref_above[i] : in_ref_left[i]);
|
temp_main[i] = (vertical_mode ? in_ref_above[i] : in_ref_left[i]);
|
||||||
temp_side[i] = (vertical_mode ? in_ref_left[i] : in_ref_above[i]);
|
temp_side[i] = (vertical_mode ? in_ref_left[i] : in_ref_above[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: this code block will need to change also when non-square blocks are used
|
||||||
|
const int log2_ratio = 0;
|
||||||
const int s = 0;
|
const int s = 0;
|
||||||
const int max_index = (0 << s) + 2;
|
const int max_index = (multiRefIndex << s) + 2;
|
||||||
const int ref_length = width << 1;
|
const int ref_length = width << 1;
|
||||||
const kvz_pixel val = temp_main[ref_length];
|
const kvz_pixel val = temp_main[ref_length + multiRefIndex];
|
||||||
for (int j = 0; j <= max_index; j++) {
|
for (int j = 0; j <= max_index; j++) {
|
||||||
temp_main[ref_length + j] = val;
|
temp_main[ref_length + multiRefIndex + j] = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
ref_main = temp_main;
|
ref_main = temp_main;
|
||||||
|
@ -203,12 +214,16 @@ static void kvz_angular_pred_generic(
|
||||||
//tmp_ref[width + last_index] = tmp_ref[width + last_index - 1];
|
//tmp_ref[width + last_index] = tmp_ref[width + last_index - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// compensate for line offset in reference line buffers
|
||||||
|
ref_main += multiRefIndex;
|
||||||
|
ref_side += multiRefIndex;
|
||||||
|
|
||||||
if (sample_disp != 0) {
|
if (sample_disp != 0) {
|
||||||
// The mode is not horizontal or vertical, we have to do interpolation.
|
// The mode is not horizontal or vertical, we have to do interpolation.
|
||||||
|
|
||||||
int_fast32_t delta_pos = 0;
|
int_fast32_t delta_pos = 0;
|
||||||
for (int_fast32_t y = 0; y < width; ++y) {
|
for (int_fast32_t y = 0; y < width; ++y) {
|
||||||
delta_pos += sample_disp;
|
delta_pos += sample_disp * (1 + multiRefIndex);
|
||||||
int_fast32_t delta_int = delta_pos >> 5;
|
int_fast32_t delta_int = delta_pos >> 5;
|
||||||
int_fast32_t delta_fract = delta_pos & (32 - 1);
|
int_fast32_t delta_fract = delta_pos & (32 - 1);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue