summaryrefslogtreecommitdiffstats
path: root/third_party/aom/aom_dsp/intrapred.c
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/aom/aom_dsp/intrapred.c')
-rw-r--r--third_party/aom/aom_dsp/intrapred.c569
1 files changed, 311 insertions, 258 deletions
diff --git a/third_party/aom/aom_dsp/intrapred.c b/third_party/aom/aom_dsp/intrapred.c
index 370d0374b..b4d47ae89 100644
--- a/third_party/aom/aom_dsp/intrapred.c
+++ b/third_party/aom/aom_dsp/intrapred.c
@@ -23,13 +23,14 @@
#define AVG3(a, b, c) (((a) + 2 * (b) + (c) + 2) >> 2)
#define AVG2(a, b) (((a) + (b) + 1) >> 1)
-static INLINE void d207e_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
- const uint8_t *above, const uint8_t *left) {
+static INLINE void d207e_predictor(uint8_t *dst, ptrdiff_t stride, int bw,
+ int bh, const uint8_t *above,
+ const uint8_t *left) {
int r, c;
(void)above;
- for (r = 0; r < bs; ++r) {
- for (c = 0; c < bs; ++c) {
+ for (r = 0; r < bh; ++r) {
+ for (c = 0; c < bw; ++c) {
dst[c] = c & 1 ? AVG3(left[(c >> 1) + r], left[(c >> 1) + r + 1],
left[(c >> 1) + r + 2])
: AVG2(left[(c >> 1) + r], left[(c >> 1) + r + 1]);
@@ -38,12 +39,13 @@ static INLINE void d207e_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
}
}
-static INLINE void d63e_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
- const uint8_t *above, const uint8_t *left) {
+static INLINE void d63e_predictor(uint8_t *dst, ptrdiff_t stride, int bw,
+ int bh, const uint8_t *above,
+ const uint8_t *left) {
int r, c;
(void)left;
- for (r = 0; r < bs; ++r) {
- for (c = 0; c < bs; ++c) {
+ for (r = 0; r < bh; ++r) {
+ for (c = 0; c < bw; ++c) {
dst[c] = r & 1 ? AVG3(above[(r >> 1) + c], above[(r >> 1) + c + 1],
above[(r >> 1) + c + 2])
: AVG2(above[(r >> 1) + c], above[(r >> 1) + c + 1]);
@@ -52,46 +54,49 @@ static INLINE void d63e_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
}
}
-static INLINE void d45e_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
- const uint8_t *above, const uint8_t *left) {
+static INLINE void d45e_predictor(uint8_t *dst, ptrdiff_t stride, int bw,
+ int bh, const uint8_t *above,
+ const uint8_t *left) {
int r, c;
(void)left;
- for (r = 0; r < bs; ++r) {
- for (c = 0; c < bs; ++c) {
+ for (r = 0; r < bh; ++r) {
+ for (c = 0; c < bw; ++c) {
dst[c] = AVG3(above[r + c], above[r + c + 1],
- above[r + c + 1 + (r + c + 2 < bs * 2)]);
+ above[r + c + 1 + (r + c + 2 < bw + bh)]);
}
dst += stride;
}
}
-static INLINE void d117_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
- const uint8_t *above, const uint8_t *left) {
+static INLINE void d117_predictor(uint8_t *dst, ptrdiff_t stride, int bw,
+ int bh, const uint8_t *above,
+ const uint8_t *left) {
int r, c;
// first row
- for (c = 0; c < bs; c++) dst[c] = AVG2(above[c - 1], above[c]);
+ for (c = 0; c < bw; c++) dst[c] = AVG2(above[c - 1], above[c]);
dst += stride;
// second row
dst[0] = AVG3(left[0], above[-1], above[0]);
- for (c = 1; c < bs; c++) dst[c] = AVG3(above[c - 2], above[c - 1], above[c]);
+ for (c = 1; c < bw; c++) dst[c] = AVG3(above[c - 2], above[c - 1], above[c]);
dst += stride;
// the rest of first col
dst[0] = AVG3(above[-1], left[0], left[1]);
- for (r = 3; r < bs; ++r)
+ for (r = 3; r < bh; ++r)
dst[(r - 2) * stride] = AVG3(left[r - 3], left[r - 2], left[r - 1]);
// the rest of the block
- for (r = 2; r < bs; ++r) {
- for (c = 1; c < bs; c++) dst[c] = dst[-2 * stride + c - 1];
+ for (r = 2; r < bh; ++r) {
+ for (c = 1; c < bw; c++) dst[c] = dst[-2 * stride + c - 1];
dst += stride;
}
}
-static INLINE void d135_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
- const uint8_t *above, const uint8_t *left) {
+static INLINE void d135_predictor(uint8_t *dst, ptrdiff_t stride, int bw,
+ int bh, const uint8_t *above,
+ const uint8_t *left) {
int i;
#if CONFIG_TX64X64
#if defined(__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ > 7
@@ -111,64 +116,65 @@ static INLINE void d135_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
#endif
#endif // CONFIG_TX64X64
- // dst(bs, bs - 2)[0], i.e., border starting at bottom-left
- for (i = 0; i < bs - 2; ++i) {
- border[i] = AVG3(left[bs - 3 - i], left[bs - 2 - i], left[bs - 1 - i]);
+ // dst(bh, bh - 2)[0], i.e., border starting at bottom-left
+ for (i = 0; i < bh - 2; ++i) {
+ border[i] = AVG3(left[bh - 3 - i], left[bh - 2 - i], left[bh - 1 - i]);
}
- border[bs - 2] = AVG3(above[-1], left[0], left[1]);
- border[bs - 1] = AVG3(left[0], above[-1], above[0]);
- border[bs - 0] = AVG3(above[-1], above[0], above[1]);
+ border[bh - 2] = AVG3(above[-1], left[0], left[1]);
+ border[bh - 1] = AVG3(left[0], above[-1], above[0]);
+ border[bh - 0] = AVG3(above[-1], above[0], above[1]);
// dst[0][2, size), i.e., remaining top border ascending
- for (i = 0; i < bs - 2; ++i) {
- border[bs + 1 + i] = AVG3(above[i], above[i + 1], above[i + 2]);
+ for (i = 0; i < bw - 2; ++i) {
+ border[bh + 1 + i] = AVG3(above[i], above[i + 1], above[i + 2]);
}
- for (i = 0; i < bs; ++i) {
- memcpy(dst + i * stride, border + bs - 1 - i, bs);
+ for (i = 0; i < bh; ++i) {
+ memcpy(dst + i * stride, border + bh - 1 - i, bw);
}
}
-static INLINE void d153_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
- const uint8_t *above, const uint8_t *left) {
+static INLINE void d153_predictor(uint8_t *dst, ptrdiff_t stride, int bw,
+ int bh, const uint8_t *above,
+ const uint8_t *left) {
int r, c;
dst[0] = AVG2(above[-1], left[0]);
- for (r = 1; r < bs; r++) dst[r * stride] = AVG2(left[r - 1], left[r]);
+ for (r = 1; r < bh; r++) dst[r * stride] = AVG2(left[r - 1], left[r]);
dst++;
dst[0] = AVG3(left[0], above[-1], above[0]);
dst[stride] = AVG3(above[-1], left[0], left[1]);
- for (r = 2; r < bs; r++)
+ for (r = 2; r < bh; r++)
dst[r * stride] = AVG3(left[r - 2], left[r - 1], left[r]);
dst++;
- for (c = 0; c < bs - 2; c++)
+ for (c = 0; c < bw - 2; c++)
dst[c] = AVG3(above[c - 1], above[c], above[c + 1]);
dst += stride;
- for (r = 1; r < bs; ++r) {
- for (c = 0; c < bs - 2; c++) dst[c] = dst[-stride + c - 2];
+ for (r = 1; r < bh; ++r) {
+ for (c = 0; c < bw - 2; c++) dst[c] = dst[-stride + c - 2];
dst += stride;
}
}
-static INLINE void v_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
+static INLINE void v_predictor(uint8_t *dst, ptrdiff_t stride, int bw, int bh,
const uint8_t *above, const uint8_t *left) {
int r;
(void)left;
- for (r = 0; r < bs; r++) {
- memcpy(dst, above, bs);
+ for (r = 0; r < bh; r++) {
+ memcpy(dst, above, bw);
dst += stride;
}
}
-static INLINE void h_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
+static INLINE void h_predictor(uint8_t *dst, ptrdiff_t stride, int bw, int bh,
const uint8_t *above, const uint8_t *left) {
int r;
(void)above;
- for (r = 0; r < bs; r++) {
- memset(dst, left[r], bs);
+ for (r = 0; r < bh; r++) {
+ memset(dst, left[r], bw);
dst += stride;
}
}
@@ -189,13 +195,14 @@ static INLINE uint16_t paeth_predictor_single(uint16_t left, uint16_t top,
: (p_top <= p_top_left) ? top : top_left;
}
-static INLINE void paeth_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
- const uint8_t *above, const uint8_t *left) {
+static INLINE void paeth_predictor(uint8_t *dst, ptrdiff_t stride, int bw,
+ int bh, const uint8_t *above,
+ const uint8_t *left) {
int r, c;
const uint8_t ytop_left = above[-1];
- for (r = 0; r < bs; r++) {
- for (c = 0; c < bs; c++)
+ for (r = 0; r < bh; r++) {
+ for (c = 0; c < bw; c++)
dst[c] = (uint8_t)paeth_predictor_single(left[r], above[c], ytop_left);
dst += stride;
}
@@ -236,32 +243,38 @@ static const uint8_t sm_weight_arrays[2 * MAX_BLOCK_DIM] = {
};
// Some basic checks on weights for smooth predictor.
-#define sm_weights_sanity_checks(weights, weights_scale, pred_scale) \
- assert(weights[0] < weights_scale); \
- assert(weights_scale - weights[bs - 1] < weights_scale); \
+#define sm_weights_sanity_checks(weights_w, weights_h, weights_scale, \
+ pred_scale) \
+ assert(weights_w[0] < weights_scale); \
+ assert(weights_h[0] < weights_scale); \
+ assert(weights_scale - weights_w[bw - 1] < weights_scale); \
+ assert(weights_scale - weights_h[bh - 1] < weights_scale); \
assert(pred_scale < 31) // ensures no overflow when calculating predictor.
#define divide_round(value, bits) (((value) + (1 << ((bits)-1))) >> (bits))
-static INLINE void smooth_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
- const uint8_t *above, const uint8_t *left) {
- const uint8_t below_pred = left[bs - 1]; // estimated by bottom-left pixel
- const uint8_t right_pred = above[bs - 1]; // estimated by top-right pixel
- const uint8_t *const sm_weights = sm_weight_arrays + bs;
+static INLINE void smooth_predictor(uint8_t *dst, ptrdiff_t stride, int bw,
+ int bh, const uint8_t *above,
+ const uint8_t *left) {
+ const uint8_t below_pred = left[bh - 1]; // estimated by bottom-left pixel
+ const uint8_t right_pred = above[bw - 1]; // estimated by top-right pixel
+ const uint8_t *const sm_weights_w = sm_weight_arrays + bw;
+ const uint8_t *const sm_weights_h = sm_weight_arrays + bh;
// scale = 2 * 2^sm_weight_log2_scale
const int log2_scale = 1 + sm_weight_log2_scale;
const uint16_t scale = (1 << sm_weight_log2_scale);
- sm_weights_sanity_checks(sm_weights, scale, log2_scale + sizeof(*dst));
+ sm_weights_sanity_checks(sm_weights_w, sm_weights_h, scale,
+ log2_scale + sizeof(*dst));
int r;
- for (r = 0; r < bs; ++r) {
+ for (r = 0; r < bh; ++r) {
int c;
- for (c = 0; c < bs; ++c) {
+ for (c = 0; c < bw; ++c) {
const uint8_t pixels[] = { above[c], below_pred, left[r], right_pred };
- const uint8_t weights[] = { sm_weights[r], scale - sm_weights[r],
- sm_weights[c], scale - sm_weights[c] };
+ const uint8_t weights[] = { sm_weights_h[r], scale - sm_weights_h[r],
+ sm_weights_w[c], scale - sm_weights_w[c] };
uint32_t this_pred = 0;
int i;
- assert(scale >= sm_weights[r] && scale >= sm_weights[c]);
+ assert(scale >= sm_weights_h[r] && scale >= sm_weights_w[c]);
for (i = 0; i < 4; ++i) {
this_pred += weights[i] * pixels[i];
}
@@ -272,20 +285,21 @@ static INLINE void smooth_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
}
#if CONFIG_SMOOTH_HV
-static INLINE void smooth_v_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
- const uint8_t *above,
+static INLINE void smooth_v_predictor(uint8_t *dst, ptrdiff_t stride, int bw,
+ int bh, const uint8_t *above,
const uint8_t *left) {
- const uint8_t below_pred = left[bs - 1]; // estimated by bottom-left pixel
- const uint8_t *const sm_weights = sm_weight_arrays + bs;
+ const uint8_t below_pred = left[bh - 1]; // estimated by bottom-left pixel
+ const uint8_t *const sm_weights = sm_weight_arrays + bh;
// scale = 2^sm_weight_log2_scale
const int log2_scale = sm_weight_log2_scale;
const uint16_t scale = (1 << sm_weight_log2_scale);
- sm_weights_sanity_checks(sm_weights, scale, log2_scale + sizeof(*dst));
+ sm_weights_sanity_checks(sm_weights, sm_weights, scale,
+ log2_scale + sizeof(*dst));
int r;
- for (r = 0; r < bs; r++) {
+ for (r = 0; r < bh; r++) {
int c;
- for (c = 0; c < bs; ++c) {
+ for (c = 0; c < bw; ++c) {
const uint8_t pixels[] = { above[c], below_pred };
const uint8_t weights[] = { sm_weights[r], scale - sm_weights[r] };
uint32_t this_pred = 0;
@@ -300,20 +314,21 @@ static INLINE void smooth_v_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
}
}
-static INLINE void smooth_h_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
- const uint8_t *above,
+static INLINE void smooth_h_predictor(uint8_t *dst, ptrdiff_t stride, int bw,
+ int bh, const uint8_t *above,
const uint8_t *left) {
- const uint8_t right_pred = above[bs - 1]; // estimated by top-right pixel
- const uint8_t *const sm_weights = sm_weight_arrays + bs;
+ const uint8_t right_pred = above[bw - 1]; // estimated by top-right pixel
+ const uint8_t *const sm_weights = sm_weight_arrays + bw;
// scale = 2^sm_weight_log2_scale
const int log2_scale = sm_weight_log2_scale;
const uint16_t scale = (1 << sm_weight_log2_scale);
- sm_weights_sanity_checks(sm_weights, scale, log2_scale + sizeof(*dst));
+ sm_weights_sanity_checks(sm_weights, sm_weights, scale,
+ log2_scale + sizeof(*dst));
int r;
- for (r = 0; r < bs; r++) {
+ for (r = 0; r < bh; r++) {
int c;
- for (c = 0; c < bs; ++c) {
+ for (c = 0; c < bw; ++c) {
const uint8_t pixels[] = { left[r], right_pred };
const uint8_t weights[] = { sm_weights[c], scale - sm_weights[c] };
uint32_t this_pred = 0;
@@ -331,74 +346,78 @@ static INLINE void smooth_h_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
#else
-static INLINE void tm_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
+static INLINE void tm_predictor(uint8_t *dst, ptrdiff_t stride, int bw, int bh,
const uint8_t *above, const uint8_t *left) {
int r, c;
int ytop_left = above[-1];
- for (r = 0; r < bs; r++) {
- for (c = 0; c < bs; c++)
+ for (r = 0; r < bh; r++) {
+ for (c = 0; c < bw; c++)
dst[c] = clip_pixel(left[r] + above[c] - ytop_left);
dst += stride;
}
}
#endif // CONFIG_ALT_INTRA
-static INLINE void dc_128_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
- const uint8_t *above, const uint8_t *left) {
+static INLINE void dc_128_predictor(uint8_t *dst, ptrdiff_t stride, int bw,
+ int bh, const uint8_t *above,
+ const uint8_t *left) {
int r;
(void)above;
(void)left;
- for (r = 0; r < bs; r++) {
- memset(dst, 128, bs);
+ for (r = 0; r < bh; r++) {
+ memset(dst, 128, bw);
dst += stride;
}
}
-static INLINE void dc_left_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
- const uint8_t *above,
+static INLINE void dc_left_predictor(uint8_t *dst, ptrdiff_t stride, int bw,
+ int bh, const uint8_t *above,
const uint8_t *left) {
int i, r, expected_dc, sum = 0;
(void)above;
- for (i = 0; i < bs; i++) sum += left[i];
- expected_dc = (sum + (bs >> 1)) / bs;
+ for (i = 0; i < bh; i++) sum += left[i];
+ expected_dc = (sum + (bh >> 1)) / bh;
- for (r = 0; r < bs; r++) {
- memset(dst, expected_dc, bs);
+ for (r = 0; r < bh; r++) {
+ memset(dst, expected_dc, bw);
dst += stride;
}
}
-static INLINE void dc_top_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
- const uint8_t *above, const uint8_t *left) {
+static INLINE void dc_top_predictor(uint8_t *dst, ptrdiff_t stride, int bw,
+ int bh, const uint8_t *above,
+ const uint8_t *left) {
int i, r, expected_dc, sum = 0;
(void)left;
- for (i = 0; i < bs; i++) sum += above[i];
- expected_dc = (sum + (bs >> 1)) / bs;
+ for (i = 0; i < bw; i++) sum += above[i];
+ expected_dc = (sum + (bw >> 1)) / bw;
- for (r = 0; r < bs; r++) {
- memset(dst, expected_dc, bs);
+ for (r = 0; r < bh; r++) {
+ memset(dst, expected_dc, bw);
dst += stride;
}
}
-static INLINE void dc_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
+static INLINE void dc_predictor(uint8_t *dst, ptrdiff_t stride, int bw, int bh,
const uint8_t *above, const uint8_t *left) {
int i, r, expected_dc, sum = 0;
- const int count = 2 * bs;
+ const int count = bw + bh;
- for (i = 0; i < bs; i++) {
+ for (i = 0; i < bw; i++) {
sum += above[i];
+ }
+ for (i = 0; i < bh; i++) {
sum += left[i];
}
expected_dc = (sum + (count >> 1)) / count;
- for (r = 0; r < bs; r++) {
- memset(dst, expected_dc, bs);
+ for (r = 0; r < bh; r++) {
+ memset(dst, expected_dc, bw);
dst += stride;
}
}
@@ -546,14 +565,14 @@ void aom_d153_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
#if CONFIG_HIGHBITDEPTH
static INLINE void highbd_d207e_predictor(uint16_t *dst, ptrdiff_t stride,
- int bs, const uint16_t *above,
+ int bw, int bh, const uint16_t *above,
const uint16_t *left, int bd) {
int r, c;
(void)above;
(void)bd;
- for (r = 0; r < bs; ++r) {
- for (c = 0; c < bs; ++c) {
+ for (r = 0; r < bh; ++r) {
+ for (c = 0; c < bw; ++c) {
dst[c] = c & 1 ? AVG3(left[(c >> 1) + r], left[(c >> 1) + r + 1],
left[(c >> 1) + r + 2])
: AVG2(left[(c >> 1) + r], left[(c >> 1) + r + 1]);
@@ -563,13 +582,13 @@ static INLINE void highbd_d207e_predictor(uint16_t *dst, ptrdiff_t stride,
}
static INLINE void highbd_d63e_predictor(uint16_t *dst, ptrdiff_t stride,
- int bs, const uint16_t *above,
+ int bw, int bh, const uint16_t *above,
const uint16_t *left, int bd) {
int r, c;
(void)left;
(void)bd;
- for (r = 0; r < bs; ++r) {
- for (c = 0; c < bs; ++c) {
+ for (r = 0; r < bh; ++r) {
+ for (c = 0; c < bw; ++c) {
dst[c] = r & 1 ? AVG3(above[(r >> 1) + c], above[(r >> 1) + c + 1],
above[(r >> 1) + c + 2])
: AVG2(above[(r >> 1) + c], above[(r >> 1) + c + 1]);
@@ -579,111 +598,111 @@ static INLINE void highbd_d63e_predictor(uint16_t *dst, ptrdiff_t stride,
}
static INLINE void highbd_d45e_predictor(uint16_t *dst, ptrdiff_t stride,
- int bs, const uint16_t *above,
+ int bw, int bh, const uint16_t *above,
const uint16_t *left, int bd) {
int r, c;
(void)left;
(void)bd;
- for (r = 0; r < bs; ++r) {
- for (c = 0; c < bs; ++c) {
+ for (r = 0; r < bh; ++r) {
+ for (c = 0; c < bw; ++c) {
dst[c] = AVG3(above[r + c], above[r + c + 1],
- above[r + c + 1 + (r + c + 2 < bs * 2)]);
+ above[r + c + 1 + (r + c + 2 < bw + bh)]);
}
dst += stride;
}
}
static INLINE void highbd_d117_predictor(uint16_t *dst, ptrdiff_t stride,
- int bs, const uint16_t *above,
+ int bw, int bh, const uint16_t *above,
const uint16_t *left, int bd) {
int r, c;
(void)bd;
// first row
- for (c = 0; c < bs; c++) dst[c] = AVG2(above[c - 1], above[c]);
+ for (c = 0; c < bw; c++) dst[c] = AVG2(above[c - 1], above[c]);
dst += stride;
// second row
dst[0] = AVG3(left[0], above[-1], above[0]);
- for (c = 1; c < bs; c++) dst[c] = AVG3(above[c - 2], above[c - 1], above[c]);
+ for (c = 1; c < bw; c++) dst[c] = AVG3(above[c - 2], above[c - 1], above[c]);
dst += stride;
// the rest of first col
dst[0] = AVG3(above[-1], left[0], left[1]);
- for (r = 3; r < bs; ++r)
+ for (r = 3; r < bh; ++r)
dst[(r - 2) * stride] = AVG3(left[r - 3], left[r - 2], left[r - 1]);
// the rest of the block
- for (r = 2; r < bs; ++r) {
- for (c = 1; c < bs; c++) dst[c] = dst[-2 * stride + c - 1];
+ for (r = 2; r < bh; ++r) {
+ for (c = 1; c < bw; c++) dst[c] = dst[-2 * stride + c - 1];
dst += stride;
}
}
static INLINE void highbd_d135_predictor(uint16_t *dst, ptrdiff_t stride,
- int bs, const uint16_t *above,
+ int bw, int bh, const uint16_t *above,
const uint16_t *left, int bd) {
int r, c;
(void)bd;
dst[0] = AVG3(left[0], above[-1], above[0]);
- for (c = 1; c < bs; c++) dst[c] = AVG3(above[c - 2], above[c - 1], above[c]);
+ for (c = 1; c < bw; c++) dst[c] = AVG3(above[c - 2], above[c - 1], above[c]);
dst[stride] = AVG3(above[-1], left[0], left[1]);
- for (r = 2; r < bs; ++r)
+ for (r = 2; r < bh; ++r)
dst[r * stride] = AVG3(left[r - 2], left[r - 1], left[r]);
dst += stride;
- for (r = 1; r < bs; ++r) {
- for (c = 1; c < bs; c++) dst[c] = dst[-stride + c - 1];
+ for (r = 1; r < bh; ++r) {
+ for (c = 1; c < bw; c++) dst[c] = dst[-stride + c - 1];
dst += stride;
}
}
static INLINE void highbd_d153_predictor(uint16_t *dst, ptrdiff_t stride,
- int bs, const uint16_t *above,
+ int bw, int bh, const uint16_t *above,
const uint16_t *left, int bd) {
int r, c;
(void)bd;
dst[0] = AVG2(above[-1], left[0]);
- for (r = 1; r < bs; r++) dst[r * stride] = AVG2(left[r - 1], left[r]);
+ for (r = 1; r < bh; r++) dst[r * stride] = AVG2(left[r - 1], left[r]);
dst++;
dst[0] = AVG3(left[0], above[-1], above[0]);
dst[stride] = AVG3(above[-1], left[0], left[1]);
- for (r = 2; r < bs; r++)
+ for (r = 2; r < bh; r++)
dst[r * stride] = AVG3(left[r - 2], left[r - 1], left[r]);
dst++;
- for (c = 0; c < bs - 2; c++)
+ for (c = 0; c < bw - 2; c++)
dst[c] = AVG3(above[c - 1], above[c], above[c + 1]);
dst += stride;
- for (r = 1; r < bs; ++r) {
- for (c = 0; c < bs - 2; c++) dst[c] = dst[-stride + c - 2];
+ for (r = 1; r < bh; ++r) {
+ for (c = 0; c < bw - 2; c++) dst[c] = dst[-stride + c - 2];
dst += stride;
}
}
-static INLINE void highbd_v_predictor(uint16_t *dst, ptrdiff_t stride, int bs,
- const uint16_t *above,
+static INLINE void highbd_v_predictor(uint16_t *dst, ptrdiff_t stride, int bw,
+ int bh, const uint16_t *above,
const uint16_t *left, int bd) {
int r;
(void)left;
(void)bd;
- for (r = 0; r < bs; r++) {
- memcpy(dst, above, bs * sizeof(uint16_t));
+ for (r = 0; r < bh; r++) {
+ memcpy(dst, above, bw * sizeof(uint16_t));
dst += stride;
}
}
-static INLINE void highbd_h_predictor(uint16_t *dst, ptrdiff_t stride, int bs,
- const uint16_t *above,
+static INLINE void highbd_h_predictor(uint16_t *dst, ptrdiff_t stride, int bw,
+ int bh, const uint16_t *above,
const uint16_t *left, int bd) {
int r;
(void)above;
(void)bd;
- for (r = 0; r < bs; r++) {
- aom_memset16(dst, left[r], bs);
+ for (r = 0; r < bh; r++) {
+ aom_memset16(dst, left[r], bw);
dst += stride;
}
}
@@ -777,39 +796,42 @@ void aom_highbd_d153_predictor_2x2_c(uint16_t *dst, ptrdiff_t stride,
#if CONFIG_ALT_INTRA
static INLINE void highbd_paeth_predictor(uint16_t *dst, ptrdiff_t stride,
- int bs, const uint16_t *above,
+ int bw, int bh, const uint16_t *above,
const uint16_t *left, int bd) {
int r, c;
const uint16_t ytop_left = above[-1];
(void)bd;
- for (r = 0; r < bs; r++) {
- for (c = 0; c < bs; c++)
+ for (r = 0; r < bh; r++) {
+ for (c = 0; c < bw; c++)
dst[c] = paeth_predictor_single(left[r], above[c], ytop_left);
dst += stride;
}
}
static INLINE void highbd_smooth_predictor(uint16_t *dst, ptrdiff_t stride,
- int bs, const uint16_t *above,
+ int bw, int bh,
+ const uint16_t *above,
const uint16_t *left, int bd) {
- const uint16_t below_pred = left[bs - 1]; // estimated by bottom-left pixel
- const uint16_t right_pred = above[bs - 1]; // estimated by top-right pixel
- const uint8_t *const sm_weights = sm_weight_arrays + bs;
+ const uint16_t below_pred = left[bh - 1]; // estimated by bottom-left pixel
+ const uint16_t right_pred = above[bw - 1]; // estimated by top-right pixel
+ const uint8_t *const sm_weights_w = sm_weight_arrays + bw;
+ const uint8_t *const sm_weights_h = sm_weight_arrays + bh;
// scale = 2 * 2^sm_weight_log2_scale
const int log2_scale = 1 + sm_weight_log2_scale;
const uint16_t scale = (1 << sm_weight_log2_scale);
- sm_weights_sanity_checks(sm_weights, scale, log2_scale + sizeof(*dst));
+ sm_weights_sanity_checks(sm_weights_w, sm_weights_h, scale,
+ log2_scale + sizeof(*dst));
int r;
- for (r = 0; r < bs; ++r) {
+ for (r = 0; r < bh; ++r) {
int c;
- for (c = 0; c < bs; ++c) {
+ for (c = 0; c < bw; ++c) {
const uint16_t pixels[] = { above[c], below_pred, left[r], right_pred };
- const uint8_t weights[] = { sm_weights[r], scale - sm_weights[r],
- sm_weights[c], scale - sm_weights[c] };
+ const uint8_t weights[] = { sm_weights_h[r], scale - sm_weights_h[r],
+ sm_weights_w[c], scale - sm_weights_w[c] };
uint32_t this_pred = 0;
int i;
- assert(scale >= sm_weights[r] && scale >= sm_weights[c]);
+ assert(scale >= sm_weights_h[r] && scale >= sm_weights_w[c]);
for (i = 0; i < 4; ++i) {
this_pred += weights[i] * pixels[i];
}
@@ -821,19 +843,21 @@ static INLINE void highbd_smooth_predictor(uint16_t *dst, ptrdiff_t stride,
#if CONFIG_SMOOTH_HV
static INLINE void highbd_smooth_v_predictor(uint16_t *dst, ptrdiff_t stride,
- int bs, const uint16_t *above,
+ int bw, int bh,
+ const uint16_t *above,
const uint16_t *left, int bd) {
- const uint16_t below_pred = left[bs - 1]; // estimated by bottom-left pixel
- const uint8_t *const sm_weights = sm_weight_arrays + bs;
+ const uint16_t below_pred = left[bh - 1]; // estimated by bottom-left pixel
+ const uint8_t *const sm_weights = sm_weight_arrays + bh;
// scale = 2^sm_weight_log2_scale
const int log2_scale = sm_weight_log2_scale;
const uint16_t scale = (1 << sm_weight_log2_scale);
- sm_weights_sanity_checks(sm_weights, scale, log2_scale + sizeof(*dst));
+ sm_weights_sanity_checks(sm_weights, sm_weights, scale,
+ log2_scale + sizeof(*dst));
int r;
- for (r = 0; r < bs; r++) {
+ for (r = 0; r < bh; r++) {
int c;
- for (c = 0; c < bs; ++c) {
+ for (c = 0; c < bw; ++c) {
const uint16_t pixels[] = { above[c], below_pred };
const uint8_t weights[] = { sm_weights[r], scale - sm_weights[r] };
uint32_t this_pred = 0;
@@ -849,19 +873,21 @@ static INLINE void highbd_smooth_v_predictor(uint16_t *dst, ptrdiff_t stride,
}
static INLINE void highbd_smooth_h_predictor(uint16_t *dst, ptrdiff_t stride,
- int bs, const uint16_t *above,
+ int bw, int bh,
+ const uint16_t *above,
const uint16_t *left, int bd) {
- const uint16_t right_pred = above[bs - 1]; // estimated by top-right pixel
- const uint8_t *const sm_weights = sm_weight_arrays + bs;
+ const uint16_t right_pred = above[bw - 1]; // estimated by top-right pixel
+ const uint8_t *const sm_weights = sm_weight_arrays + bw;
// scale = 2^sm_weight_log2_scale
const int log2_scale = sm_weight_log2_scale;
const uint16_t scale = (1 << sm_weight_log2_scale);
- sm_weights_sanity_checks(sm_weights, scale, log2_scale + sizeof(*dst));
+ sm_weights_sanity_checks(sm_weights, sm_weights, scale,
+ log2_scale + sizeof(*dst));
int r;
- for (r = 0; r < bs; r++) {
+ for (r = 0; r < bh; r++) {
int c;
- for (c = 0; c < bs; ++c) {
+ for (c = 0; c < bw; ++c) {
const uint16_t pixels[] = { left[r], right_pred };
const uint8_t weights[] = { sm_weights[c], scale - sm_weights[c] };
uint32_t this_pred = 0;
@@ -878,15 +904,15 @@ static INLINE void highbd_smooth_h_predictor(uint16_t *dst, ptrdiff_t stride,
#endif
#else
-static INLINE void highbd_tm_predictor(uint16_t *dst, ptrdiff_t stride, int bs,
- const uint16_t *above,
+static INLINE void highbd_tm_predictor(uint16_t *dst, ptrdiff_t stride, int bw,
+ int bh, const uint16_t *above,
const uint16_t *left, int bd) {
int r, c;
int ytop_left = above[-1];
(void)bd;
- for (r = 0; r < bs; r++) {
- for (c = 0; c < bs; c++)
+ for (r = 0; r < bh; r++) {
+ for (c = 0; c < bw; c++)
dst[c] = clip_pixel_highbd(left[r] + above[c] - ytop_left, bd);
dst += stride;
}
@@ -894,66 +920,71 @@ static INLINE void highbd_tm_predictor(uint16_t *dst, ptrdiff_t stride, int bs,
#endif // CONFIG_ALT_INTRA
static INLINE void highbd_dc_128_predictor(uint16_t *dst, ptrdiff_t stride,
- int bs, const uint16_t *above,
+ int bw, int bh,
+ const uint16_t *above,
const uint16_t *left, int bd) {
int r;
(void)above;
(void)left;
- for (r = 0; r < bs; r++) {
- aom_memset16(dst, 128 << (bd - 8), bs);
+ for (r = 0; r < bh; r++) {
+ aom_memset16(dst, 128 << (bd - 8), bw);
dst += stride;
}
}
static INLINE void highbd_dc_left_predictor(uint16_t *dst, ptrdiff_t stride,
- int bs, const uint16_t *above,
+ int bw, int bh,
+ const uint16_t *above,
const uint16_t *left, int bd) {
int i, r, expected_dc, sum = 0;
(void)above;
(void)bd;
- for (i = 0; i < bs; i++) sum += left[i];
- expected_dc = (sum + (bs >> 1)) / bs;
+ for (i = 0; i < bh; i++) sum += left[i];
+ expected_dc = (sum + (bh >> 1)) / bh;
- for (r = 0; r < bs; r++) {
- aom_memset16(dst, expected_dc, bs);
+ for (r = 0; r < bh; r++) {
+ aom_memset16(dst, expected_dc, bw);
dst += stride;
}
}
static INLINE void highbd_dc_top_predictor(uint16_t *dst, ptrdiff_t stride,
- int bs, const uint16_t *above,
+ int bw, int bh,
+ const uint16_t *above,
const uint16_t *left, int bd) {
int i, r, expected_dc, sum = 0;
(void)left;
(void)bd;
- for (i = 0; i < bs; i++) sum += above[i];
- expected_dc = (sum + (bs >> 1)) / bs;
+ for (i = 0; i < bw; i++) sum += above[i];
+ expected_dc = (sum + (bw >> 1)) / bw;
- for (r = 0; r < bs; r++) {
- aom_memset16(dst, expected_dc, bs);
+ for (r = 0; r < bh; r++) {
+ aom_memset16(dst, expected_dc, bw);
dst += stride;
}
}
-static INLINE void highbd_dc_predictor(uint16_t *dst, ptrdiff_t stride, int bs,
- const uint16_t *above,
+static INLINE void highbd_dc_predictor(uint16_t *dst, ptrdiff_t stride, int bw,
+ int bh, const uint16_t *above,
const uint16_t *left, int bd) {
int i, r, expected_dc, sum = 0;
- const int count = 2 * bs;
+ const int count = bw + bh;
(void)bd;
- for (i = 0; i < bs; i++) {
+ for (i = 0; i < bw; i++) {
sum += above[i];
+ }
+ for (i = 0; i < bh; i++) {
sum += left[i];
}
expected_dc = (sum + (count >> 1)) / count;
- for (r = 0; r < bs; r++) {
- aom_memset16(dst, expected_dc, bs);
+ for (r = 0; r < bh; r++) {
+ aom_memset16(dst, expected_dc, bw);
dst += stride;
}
}
@@ -962,99 +993,121 @@ static INLINE void highbd_dc_predictor(uint16_t *dst, ptrdiff_t stride, int bs,
// This serves as a wrapper function, so that all the prediction functions
// can be unified and accessed as a pointer array. Note that the boundary
// above and left are not necessarily used all the time.
-#define intra_pred_sized(type, size) \
- void aom_##type##_predictor_##size##x##size##_c( \
- uint8_t *dst, ptrdiff_t stride, const uint8_t *above, \
- const uint8_t *left) { \
- type##_predictor(dst, stride, size, above, left); \
+#define intra_pred_sized(type, width, height) \
+ void aom_##type##_predictor_##width##x##height##_c( \
+ uint8_t *dst, ptrdiff_t stride, const uint8_t *above, \
+ const uint8_t *left) { \
+ type##_predictor(dst, stride, width, height, above, left); \
}
#if CONFIG_HIGHBITDEPTH
-#define intra_pred_highbd_sized(type, size) \
- void aom_highbd_##type##_predictor_##size##x##size##_c( \
- uint16_t *dst, ptrdiff_t stride, const uint16_t *above, \
- const uint16_t *left, int bd) { \
- highbd_##type##_predictor(dst, stride, size, above, left, bd); \
+#define intra_pred_highbd_sized(type, width, height) \
+ void aom_highbd_##type##_predictor_##width##x##height##_c( \
+ uint16_t *dst, ptrdiff_t stride, const uint16_t *above, \
+ const uint16_t *left, int bd) { \
+ highbd_##type##_predictor(dst, stride, width, height, above, left, bd); \
}
/* clang-format off */
#if CONFIG_TX64X64
-#define intra_pred_allsizes(type) \
- intra_pred_sized(type, 2) \
- intra_pred_sized(type, 4) \
- intra_pred_sized(type, 8) \
- intra_pred_sized(type, 16) \
- intra_pred_sized(type, 32) \
- intra_pred_sized(type, 64) \
- intra_pred_highbd_sized(type, 2) \
- intra_pred_highbd_sized(type, 4) \
- intra_pred_highbd_sized(type, 8) \
- intra_pred_highbd_sized(type, 16) \
- intra_pred_highbd_sized(type, 32) \
- intra_pred_highbd_sized(type, 64)
-
+#define intra_pred_rectangular(type) \
+ intra_pred_sized(type, 4, 8) \
+ intra_pred_sized(type, 8, 4) \
+ intra_pred_sized(type, 8, 16) \
+ intra_pred_sized(type, 16, 8) \
+ intra_pred_sized(type, 16, 32) \
+ intra_pred_sized(type, 32, 16) \
+ intra_pred_highbd_sized(type, 4, 8) \
+ intra_pred_highbd_sized(type, 8, 4) \
+ intra_pred_highbd_sized(type, 8, 16) \
+ intra_pred_highbd_sized(type, 16, 8) \
+ intra_pred_highbd_sized(type, 16, 32) \
+ intra_pred_highbd_sized(type, 32, 16)
#define intra_pred_above_4x4(type) \
- intra_pred_sized(type, 8) \
- intra_pred_sized(type, 16) \
- intra_pred_sized(type, 32) \
- intra_pred_sized(type, 64) \
- intra_pred_highbd_sized(type, 4) \
- intra_pred_highbd_sized(type, 8) \
- intra_pred_highbd_sized(type, 16) \
- intra_pred_highbd_sized(type, 32) \
- intra_pred_highbd_sized(type, 64)
-#else // CONFIG_TX64X64
+ intra_pred_sized(type, 8, 8) \
+ intra_pred_sized(type, 16, 16) \
+ intra_pred_sized(type, 32, 32) \
+ intra_pred_sized(type, 64, 64) \
+ intra_pred_highbd_sized(type, 4, 4) \
+ intra_pred_highbd_sized(type, 8, 8) \
+ intra_pred_highbd_sized(type, 16, 16) \
+ intra_pred_highbd_sized(type, 32, 32) \
+ intra_pred_highbd_sized(type, 64, 64) \
+ intra_pred_rectangular(type)
#define intra_pred_allsizes(type) \
- intra_pred_sized(type, 2) \
- intra_pred_sized(type, 4) \
- intra_pred_sized(type, 8) \
- intra_pred_sized(type, 16) \
- intra_pred_sized(type, 32) \
- intra_pred_highbd_sized(type, 2) \
- intra_pred_highbd_sized(type, 4) \
- intra_pred_highbd_sized(type, 8) \
- intra_pred_highbd_sized(type, 16) \
- intra_pred_highbd_sized(type, 32)
-
+ intra_pred_sized(type, 2, 2) \
+ intra_pred_sized(type, 4, 4) \
+ intra_pred_highbd_sized(type, 2, 2) \
+ intra_pred_above_4x4(type)
+#else // CONFIG_TX64X64
+#define intra_pred_rectangular(type) \
+ intra_pred_sized(type, 4, 8) \
+ intra_pred_sized(type, 8, 4) \
+ intra_pred_sized(type, 8, 16) \
+ intra_pred_sized(type, 16, 8) \
+ intra_pred_sized(type, 16, 32) \
+ intra_pred_sized(type, 32, 16) \
+ intra_pred_highbd_sized(type, 4, 8) \
+ intra_pred_highbd_sized(type, 8, 4) \
+ intra_pred_highbd_sized(type, 8, 16) \
+ intra_pred_highbd_sized(type, 16, 8) \
+ intra_pred_highbd_sized(type, 16, 32) \
+ intra_pred_highbd_sized(type, 32, 16)
#define intra_pred_above_4x4(type) \
- intra_pred_sized(type, 8) \
- intra_pred_sized(type, 16) \
- intra_pred_sized(type, 32) \
- intra_pred_highbd_sized(type, 4) \
- intra_pred_highbd_sized(type, 8) \
- intra_pred_highbd_sized(type, 16) \
- intra_pred_highbd_sized(type, 32)
+ intra_pred_sized(type, 8, 8) \
+ intra_pred_sized(type, 16, 16) \
+ intra_pred_sized(type, 32, 32) \
+ intra_pred_highbd_sized(type, 4, 4) \
+ intra_pred_highbd_sized(type, 8, 8) \
+ intra_pred_highbd_sized(type, 16, 16) \
+ intra_pred_highbd_sized(type, 32, 32) \
+ intra_pred_rectangular(type)
+#define intra_pred_allsizes(type) \
+ intra_pred_sized(type, 2, 2) \
+ intra_pred_sized(type, 4, 4) \
+ intra_pred_highbd_sized(type, 2, 2) \
+ intra_pred_above_4x4(type)
#endif // CONFIG_TX64X64
#else
#if CONFIG_TX64X64
-#define intra_pred_allsizes(type) \
- intra_pred_sized(type, 2) \
- intra_pred_sized(type, 4) \
- intra_pred_sized(type, 8) \
- intra_pred_sized(type, 16) \
- intra_pred_sized(type, 32) \
- intra_pred_sized(type, 64)
-
+#define intra_pred_rectangular(type) \
+ intra_pred_sized(type, 4, 8) \
+ intra_pred_sized(type, 8, 4) \
+ intra_pred_sized(type, 8, 16) \
+ intra_pred_sized(type, 16, 8) \
+ intra_pred_sized(type, 16, 32) \
+ intra_pred_sized(type, 32, 16)
#define intra_pred_above_4x4(type) \
- intra_pred_sized(type, 8) \
- intra_pred_sized(type, 16) \
- intra_pred_sized(type, 32) \
- intra_pred_sized(type, 64)
-#else // CONFIG_TX64X64
+ intra_pred_sized(type, 8, 8) \
+ intra_pred_sized(type, 16, 16) \
+ intra_pred_sized(type, 32, 32) \
+ intra_pred_sized(type, 64, 64) \
+ intra_pred_rectangular(type)
#define intra_pred_allsizes(type) \
- intra_pred_sized(type, 2) \
- intra_pred_sized(type, 4) \
- intra_pred_sized(type, 8) \
- intra_pred_sized(type, 16) \
- intra_pred_sized(type, 32)
-
+ intra_pred_sized(type, 2, 2) \
+ intra_pred_sized(type, 4, 4) \
+ intra_pred_above_4x4(type)
+#else // CONFIG_TX64X64
+#define intra_pred_rectangular(type) \
+ intra_pred_sized(type, 4, 8) \
+ intra_pred_sized(type, 8, 4) \
+ intra_pred_sized(type, 8, 16) \
+ intra_pred_sized(type, 16, 8) \
+ intra_pred_sized(type, 16, 32) \
+ intra_pred_sized(type, 32, 16)
#define intra_pred_above_4x4(type) \
- intra_pred_sized(type, 8) \
- intra_pred_sized(type, 16) \
- intra_pred_sized(type, 32)
+ intra_pred_sized(type, 8, 8) \
+ intra_pred_sized(type, 16, 16) \
+ intra_pred_sized(type, 32, 32) \
+ intra_pred_rectangular(type)
+#define intra_pred_allsizes(type) \
+ intra_pred_sized(type, 2, 2) \
+ intra_pred_sized(type, 4, 4) \
+ intra_pred_above_4x4(type)
#endif // CONFIG_TX64X64
+
#endif // CONFIG_HIGHBITDEPTH
intra_pred_allsizes(d207e)