Feature: histogram constructed with decimated frame (2x2 pixels centered in each 4x4)
diff --git a/av1/common/av1_common_int.h b/av1/common/av1_common_int.h index 6fded67..4b31248 100644 --- a/av1/common/av1_common_int.h +++ b/av1/common/av1_common_int.h
@@ -392,8 +392,6 @@ uint16_t *mask; /** buffer with block pixel values */ uint16_t *block_values; - /** buffer with # of occurrens of pixel values in a block */ - uint16_t *block_hist; /** stride from frame, mask and c_values buffers */ int stride; /** frame height for 'frame', mask and c_values buffers */
diff --git a/av1/common/debanding.c b/av1/common/debanding.c index cb758c0..2c01cb7 100644 --- a/av1/common/debanding.c +++ b/av1/common/debanding.c
@@ -229,8 +229,7 @@ int mask_size = (frame_width>>CAMDA_LOG2_BLOCK_SIZE) * (frame_height>>CAMDA_LOG2_BLOCK_SIZE) * sizeof(uint16_t); dbi->mask = aom_malloc(mask_size); - dbi->block_values = aom_malloc(mask_size * (CAMDA_BLOCK_MAX_COUNT+1)); - dbi->block_hist = aom_malloc(mask_size * CAMDA_BLOCK_MAX_COUNT); + dbi->block_values = aom_malloc(mask_size * CAMDA_BLOCK_MAX_COUNT); } return use_deband; @@ -274,32 +273,26 @@ } -uint16_t pixel_count_if_below_thr(DebandInfo *dbi, uint16_t *image, ptrdiff_t stride, - int mask_pos, int b_row, int b_col) { +static inline void store_pixel_data(DebandInfo *dbi, uint16_t *image, ptrdiff_t stride, + int mask_pos, int b_row, int b_col) { + /* Note: assumes CAMDA_BLOCK_SIZE=4 + 4x4 block, pixels considered in histogram in X: + O O O O + O X X O + O X X O + O O O O + */ const int row = b_row << CAMDA_LOG2_BLOCK_SIZE; const int col = b_col << CAMDA_LOG2_BLOCK_SIZE; - long int index = row * stride + col; - uint16_t num_vals = 0; - uint16_t *values = (uint16_t*) dbi->block_values + mask_pos * (CAMDA_BLOCK_MAX_COUNT+1); - uint16_t *hist = (uint16_t*) dbi->block_hist + mask_pos * CAMDA_BLOCK_MAX_COUNT; + long int index = (row+1) * stride + col; + uint16_t *values = (uint16_t*) dbi->block_values + mask_pos * CAMDA_BLOCK_MAX_COUNT; + uint16_t count = 0; - for (int i=0; i<CAMDA_BLOCK_SIZE; i++, index+=stride) { - for (int j=0; j<CAMDA_BLOCK_SIZE; j++) { - uint16_t count = 0; - while (values[count]!=image[index+j] && values[count]!=UINT16_MAX) - count++; - - if (count>num_vals) { - num_vals = count; - if (count==CAMDA_BLOCK_MAX_COUNT) - return 0; - } - - values[count] = image[index+j]; - hist[count]++; + for (int i=1; i<3; i++, index+=stride) { + for (int j=1; j<3; j++) { + values[count++] = image[index+j]; } } - return num_vals+1; } void camda_get_spatial_mask(DebandInfo *dbi, int width, int height) { @@ -318,8 +311,7 @@ int mask_size = mask_height * mask_stride * sizeof(uint16_t); memset(mask_data, 0, mask_size); - memset(dbi->block_values, UINT16_MAX, mask_size * (CAMDA_BLOCK_MAX_COUNT+1)); - memset(dbi->block_hist, 0, mask_size * CAMDA_BLOCK_MAX_COUNT); + memset(dbi->block_values, UINT16_MAX, mask_size * CAMDA_BLOCK_MAX_COUNT); // Initial computation: fill dp except for the last row for (int i = 0; i < pad_size; i++) { @@ -380,8 +372,9 @@ int mask_j = left >> CAMDA_LOG2_BLOCK_SIZE; if (result > mask_index) { int mask_pos = mask_i * mask_stride + mask_j; - mask_data[mask_pos] = pixel_count_if_below_thr(dbi, image_data, stride, - mask_pos, mask_i, mask_j); + mask_data[mask_pos] = 1; + store_pixel_data(dbi, image_data, stride, + mask_pos, mask_i, mask_j); } } } @@ -390,24 +383,20 @@ } static inline void add_hist_to_histogram(DebandInfo *dbi, uint16_t *histogram, - ptrdiff_t mask_pos, const uint16_t num_diffs, - uint16_t num_values) { + ptrdiff_t mask_pos, const uint16_t num_diffs) { uint16_t *hist_diff = histogram + num_diffs; - ptrdiff_t hist_pos = mask_pos * CAMDA_BLOCK_MAX_COUNT; - ptrdiff_t values_pos = hist_pos + mask_pos; - for (int i=0; i<num_values; i++) { - hist_diff[dbi->block_values[values_pos++]] += dbi->block_hist[hist_pos++]; + ptrdiff_t values_pos = mask_pos * CAMDA_BLOCK_MAX_COUNT; + for (int i=0; i<CAMDA_BLOCK_MAX_COUNT; i++) { + hist_diff[dbi->block_values[values_pos+i]]++; } } static inline void sub_hist_to_histogram(DebandInfo *dbi, uint16_t *histogram, - ptrdiff_t mask_pos, const uint16_t num_diffs, - uint16_t num_values) { + ptrdiff_t mask_pos, const uint16_t num_diffs) { uint16_t *hist_diff = histogram + num_diffs; - ptrdiff_t hist_pos = mask_pos * CAMDA_BLOCK_MAX_COUNT; - ptrdiff_t values_pos = hist_pos + mask_pos; - for (int i=0; i<num_values; i++) { - hist_diff[dbi->block_values[values_pos++]] -= dbi->block_hist[hist_pos++]; + ptrdiff_t values_pos = mask_pos * CAMDA_BLOCK_MAX_COUNT; + for (int i=0; i<CAMDA_BLOCK_MAX_COUNT; i++) { + hist_diff[dbi->block_values[values_pos+i]]--; } } @@ -454,7 +443,7 @@ int row = b_row << CAMDA_LOG2_BLOCK_SIZE; int col = b_col << CAMDA_LOG2_BLOCK_SIZE; - int pixels_in_window = dbi->pixels_in_window; + int pixels_in_window = (dbi->pixels_in_window) >> 2; ptrdiff_t dst_pix_r = row * dbi->dst_stride + col; ptrdiff_t img_pix_r = row * stride + col; @@ -503,7 +492,7 @@ if (b_row+b_i>=0 && b_row+b_i<b_height) { ptrdiff_t mask_pos = (b_row+b_i) * mask_stride + b_j; if (mask[mask_pos]) - add_hist_to_histogram(dbi, hist, mask_pos, num_diffs, mask[mask_pos]); + add_hist_to_histogram(dbi, hist, mask_pos, num_diffs); } if (mask[b_row * mask_stride]) @@ -519,13 +508,13 @@ if (b_col_out >= 0) { ptrdiff_t mask_pos = b_row_curr * mask_stride + b_col_out; if (mask[mask_pos]) - sub_hist_to_histogram(dbi, hist, mask_pos, num_diffs, mask[mask_pos]); + sub_hist_to_histogram(dbi, hist, mask_pos, num_diffs); } if (b_col_in<b_width) { ptrdiff_t mask_pos = b_row_curr * mask_stride + b_col_in; if (mask[mask_pos]) - add_hist_to_histogram(dbi, hist, mask_pos, num_diffs, mask[mask_pos]); + add_hist_to_histogram(dbi, hist, mask_pos, num_diffs); } } } @@ -577,6 +566,5 @@ aom_free(dbi->buffers.c_values_histograms); } else { aom_free(dbi->block_values); - aom_free(dbi->block_hist); } }