Commit 84c56af0 authored by Debargha Mukherjee's avatar Debargha Mukherjee

Support 64x64 intra prediction

Change-Id: I2536b5b55f28c2ee59445c3b70d3e073e69945cd
parent 5678ad98
......@@ -314,6 +314,62 @@ specialize qw/aom_dc_left_predictor_32x32 msa neon sse2/;
add_proto qw/void aom_dc_128_predictor_32x32/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
specialize qw/aom_dc_128_predictor_32x32 msa neon sse2/;
if ((aom_config("CONFIG_TX64X64") eq "yes")) {
add_proto qw/void aom_d207_predictor_64x64/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
specialize qw/aom_d207_predictor_64x64/;
add_proto qw/void aom_d207e_predictor_64x64/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
specialize qw/aom_d207e_predictor_64x64/;
add_proto qw/void aom_d45_predictor_64x64/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
specialize qw/aom_d45_predictor_64x64/;
add_proto qw/void aom_d45e_predictor_64x64/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
specialize qw/aom_d45e_predictor_64x64/;
add_proto qw/void aom_d63_predictor_64x64/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
specialize qw/aom_d63_predictor_64x64/;
add_proto qw/void aom_d63e_predictor_64x64/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
specialize qw/aom_d63e_predictor_64x64/;
add_proto qw/void aom_h_predictor_64x64/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
specialize qw/aom_h_predictor_64x64/;
add_proto qw/void aom_d117_predictor_64x64/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
specialize qw/aom_d117_predictor_64x64/;
add_proto qw/void aom_d135_predictor_64x64/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
specialize qw/aom_d135_predictor_64x64/;
add_proto qw/void aom_d153_predictor_64x64/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
specialize qw/aom_d153_predictor_64x64/;
add_proto qw/void aom_v_predictor_64x64/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
specialize qw/aom_v_predictor_64x64/;
if ((aom_config("CONFIG_ALT_INTRA") eq "yes")) {
add_proto qw/void aom_paeth_predictor_64x64/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
specialize qw/aom_paeth_predictor_64x64/;
} else {
add_proto qw/void aom_tm_predictor_64x64/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
specialize qw/aom_tm_predictor_64x64/;
} # CONFIG_ALT_INTRA
add_proto qw/void aom_dc_predictor_64x64/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
specialize qw/aom_dc_predictor_64x64/;
add_proto qw/void aom_dc_top_predictor_64x64/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
specialize qw/aom_dc_top_predictor_64x64/;
add_proto qw/void aom_dc_left_predictor_64x64/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
specialize qw/aom_dc_left_predictor_64x64/;
add_proto qw/void aom_dc_128_predictor_64x64/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
specialize qw/aom_dc_128_predictor_64x64/;
}
# High bitdepth functions
if (aom_config("CONFIG_AOM_HIGHBITDEPTH") eq "yes") {
add_proto qw/void aom_highbd_d207_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
......@@ -524,6 +580,60 @@ if (aom_config("CONFIG_AOM_HIGHBITDEPTH") eq "yes") {
add_proto qw/void aom_highbd_dc_128_predictor_32x32/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
specialize qw/aom_highbd_dc_128_predictor_32x32/;
if ((aom_config("CONFIG_TX64X64") eq "yes")) {
add_proto qw/void aom_highbd_d207_predictor_64x64/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
specialize qw/aom_highbd_d207_predictor_64x64/;
add_proto qw/void aom_highbd_d207e_predictor_64x64/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
specialize qw/aom_highbd_d207e_predictor_64x64/;
add_proto qw/void aom_highbd_d45_predictor_64x64/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
specialize qw/aom_highbd_d45_predictor_64x64/;
add_proto qw/void aom_highbd_d45e_predictor_64x64/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
specialize qw/aom_highbd_d45e_predictor_64x64/;
add_proto qw/void aom_highbd_d63_predictor_64x64/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
specialize qw/aom_highbd_d63_predictor_64x64/;
add_proto qw/void aom_highbd_d63e_predictor_64x64/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
specialize qw/aom_highbd_d63e_predictor_64x64/;
add_proto qw/void aom_highbd_h_predictor_64x64/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
specialize qw/aom_highbd_h_predictor_64x64/;
add_proto qw/void aom_highbd_d117_predictor_64x64/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
specialize qw/aom_highbd_d117_predictor_64x64/;
add_proto qw/void aom_highbd_d135_predictor_64x64/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
specialize qw/aom_highbd_d135_predictor_64x64/;
add_proto qw/void aom_highbd_d153_predictor_64x64/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
specialize qw/aom_highbd_d153_predictor_64x64/;
add_proto qw/void aom_highbd_v_predictor_64x64/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
specialize qw/aom_highbd_v_predictor_64x64/;
if ((aom_config("CONFIG_ALT_INTRA") eq "yes")) {
add_proto qw/void aom_highbd_paeth_predictor_64x64/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
} else {
add_proto qw/void aom_highbd_tm_predictor_64x64/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
specialize qw/aom_highbd_tm_predictor_64x64/;
} # CONFIG_ALT_INTRA
add_proto qw/void aom_highbd_dc_predictor_64x64/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
specialize qw/aom_highbd_dc_predictor_64x64/;
add_proto qw/void aom_highbd_dc_top_predictor_64x64/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
specialize qw/aom_highbd_dc_top_predictor_64x64/;
add_proto qw/void aom_highbd_dc_left_predictor_64x64/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
specialize qw/aom_highbd_dc_left_predictor_64x64/;
add_proto qw/void aom_highbd_dc_128_predictor_64x64/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
specialize qw/aom_highbd_dc_128_predictor_64x64/;
}
} # CONFIG_AOM_HIGHBITDEPTH
#
......
......@@ -149,6 +149,15 @@ static INLINE void d117_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
static INLINE void d135_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
const uint8_t *above, const uint8_t *left) {
int i;
#if CONFIG_TX64X64
#if defined(__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ > 7
// silence a spurious -Warray-bounds warning, possibly related to:
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56273
uint8_t border[133];
#else
uint8_t border[64 + 64 - 1]; // outer border from bottom-left to top-right
#endif
#else
#if defined(__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ > 7
// silence a spurious -Warray-bounds warning, possibly related to:
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56273
......@@ -156,6 +165,7 @@ static INLINE void d135_predictor(uint8_t *dst, ptrdiff_t stride, int bs,
#else
uint8_t border[32 + 32 - 1]; // outer border from bottom-left to top-right
#endif
#endif // CONFIG_TX64X64
// dst(bs, bs - 2)[0], i.e., border starting at bottom-left
for (i = 0; i < bs - 2; ++i) {
......@@ -965,6 +975,31 @@ static INLINE void highbd_dc_predictor(uint16_t *dst, ptrdiff_t stride, int bs,
}
/* 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, 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_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
#define intra_pred_allsizes(type) \
intra_pred_sized(type, 2) \
intra_pred_sized(type, 4) \
......@@ -984,8 +1019,25 @@ static INLINE void highbd_dc_predictor(uint16_t *dst, ptrdiff_t stride, int bs,
intra_pred_highbd_sized(type, 8) \
intra_pred_highbd_sized(type, 16) \
intra_pred_highbd_sized(type, 32)
#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_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
#define intra_pred_allsizes(type) \
intra_pred_sized(type, 2) \
intra_pred_sized(type, 4) \
......@@ -997,6 +1049,7 @@ static INLINE void highbd_dc_predictor(uint16_t *dst, ptrdiff_t stride, int bs,
intra_pred_sized(type, 8) \
intra_pred_sized(type, 16) \
intra_pred_sized(type, 32)
#endif // CONFIG_TX64X64
#endif // CONFIG_AOM_HIGHBITDEPTH
intra_pred_above_4x4(d207)
......
......@@ -322,10 +322,18 @@ static intra_high_pred_fn dc_pred_high[2][2][TX_SIZES];
#endif // CONFIG_AOM_HIGHBITDEPTH
static void av1_init_intra_predictors_internal(void) {
#if CONFIG_TX64X64
#define INIT_NO_4X4(p, type) \
p[TX_8X8] = aom_##type##_predictor_8x8; \
p[TX_16X16] = aom_##type##_predictor_16x16; \
p[TX_32X32] = aom_##type##_predictor_32x32; \
p[TX_64X64] = aom_##type##_predictor_64x64
#else
#define INIT_NO_4X4(p, type) \
p[TX_8X8] = aom_##type##_predictor_8x8; \
p[TX_16X16] = aom_##type##_predictor_16x16; \
p[TX_32X32] = aom_##type##_predictor_32x32
#endif // CONFIG_TX64X64
#define INIT_ALL_SIZES(p, type) \
p[TX_4X4] = aom_##type##_predictor_4x4; \
......@@ -910,17 +918,46 @@ int av1_filter_intra_taps_4[TX_SIZES][INTRA_MODES][4] = {
{ 589, 646, -495, 255 },
{ 740, 884, -728, 77 },
},
#if CONFIG_TX64X64
{
{ 477, 737, -393, 150 },
{ 881, 630, -546, 67 },
{ 506, 984, -443, -20 },
{ 114, 459, -270, 528 },
{ 433, 528, 14, 3 },
{ 837, 470, -301, -30 },
{ 181, 777, 89, -107 },
{ -29, 716, -232, 259 },
{ 589, 646, -495, 255 },
{ 740, 884, -728, 77 },
},
#endif // CONFIG_TX64X64
};
static INLINE TX_SIZE get_txsize_from_blocklen(int bs) {
switch (bs) {
case 4: return TX_4X4;
case 8: return TX_8X8;
case 16: return TX_16X16;
case 32: return TX_32X32;
#if CONFIG_TX64X64
case 64: return TX_64X64;
#endif // CONFIG_TX64X64
default: assert(0);
}
}
static void filter_intra_predictors_4tap(uint8_t *dst, ptrdiff_t stride, int bs,
const uint8_t *above,
const uint8_t *left, int mode) {
int k, r, c;
int buffer[33][65];
int mean, ipred;
const TX_SIZE tx_size =
(bs == 32) ? TX_32X32
: ((bs == 16) ? TX_16X16 : ((bs == 8) ? TX_8X8 : (TX_4X4)));
#if CONFIG_TX64X64
int buffer[65][129];
#else
int buffer[33][65];
#endif // CONFIG_TX64X64
const TX_SIZE tx_size = get_txsize_from_blocklen(bs);
const int c0 = av1_filter_intra_taps_4[tx_size][mode][0];
const int c1 = av1_filter_intra_taps_4[tx_size][mode][1];
const int c2 = av1_filter_intra_taps_4[tx_size][mode][2];
......@@ -1040,11 +1077,13 @@ static void highbd_filter_intra_predictors_4tap(uint16_t *dst, ptrdiff_t stride,
const uint16_t *left, int mode,
int bd) {
int k, r, c;
int preds[33][65];
int mean, ipred;
const TX_SIZE tx_size =
(bs == 32) ? TX_32X32
: ((bs == 16) ? TX_16X16 : ((bs == 8) ? TX_8X8 : (TX_4X4)));
#if CONFIG_TX64X64
int preds[65][129];
#else
int preds[33][65];
#endif // CONFIG_TX64X64
const TX_SIZE tx_size = get_txsize_from_blocklen(bs);
const int c0 = av1_filter_intra_taps_4[tx_size][mode][0];
const int c1 = av1_filter_intra_taps_4[tx_size][mode][1];
const int c2 = av1_filter_intra_taps_4[tx_size][mode][2];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment