diff --git a/vp10/common/reconintra.c b/vp10/common/reconintra.c index da35530106294b90d0c4e79baebe23920a28da78..c53d7a19736ae312effe1dc43e7f037061f8db42 100644 --- a/vp10/common/reconintra.c +++ b/vp10/common/reconintra.c @@ -55,16 +55,24 @@ static intra_high_pred_fn dc_pred_high[2][2][4]; #endif // CONFIG_VP9_HIGHBITDEPTH static void vp10_init_intra_predictors_internal(void) { -#define INIT_ALL_SIZES(p, type) \ - p[TX_4X4] = vpx_##type##_predictor_4x4; \ +#define INIT_NO_4X4(p, type) \ p[TX_8X8] = vpx_##type##_predictor_8x8; \ p[TX_16X16] = vpx_##type##_predictor_16x16; \ p[TX_32X32] = vpx_##type##_predictor_32x32 +#define INIT_ALL_SIZES(p, type) \ + p[TX_4X4] = vpx_##type##_predictor_4x4; \ + INIT_NO_4X4(p, type) + INIT_ALL_SIZES(pred[V_PRED], v); INIT_ALL_SIZES(pred[H_PRED], h); INIT_ALL_SIZES(pred[D207_PRED], d207); +#if CONFIG_MISC_FIXES + pred[D45_PRED][TX_4X4] = vpx_d45e_predictor_4x4; + INIT_NO_4X4(pred[D45_PRED], d45); +#else INIT_ALL_SIZES(pred[D45_PRED], d45); +#endif INIT_ALL_SIZES(pred[D63_PRED], d63); INIT_ALL_SIZES(pred[D117_PRED], d117); INIT_ALL_SIZES(pred[D135_PRED], d135); @@ -80,7 +88,12 @@ static void vp10_init_intra_predictors_internal(void) { INIT_ALL_SIZES(pred_high[V_PRED], highbd_v); INIT_ALL_SIZES(pred_high[H_PRED], highbd_h); INIT_ALL_SIZES(pred_high[D207_PRED], highbd_d207); +#if CONFIG_MISC_FIXES + pred_high[D45_PRED][TX_4X4] = vpx_highbd_d45e_predictor_4x4; + INIT_NO_4X4(pred_high[D45_PRED], highbd_d45); +#else INIT_ALL_SIZES(pred_high[D45_PRED], highbd_d45); +#endif INIT_ALL_SIZES(pred_high[D63_PRED], highbd_d63); INIT_ALL_SIZES(pred_high[D117_PRED], highbd_d117); INIT_ALL_SIZES(pred_high[D135_PRED], highbd_d135); diff --git a/vpx_dsp/intrapred.c b/vpx_dsp/intrapred.c index aafd8bfb75cbe415b3d12e10983cc74a9f3a618e..a5e3d3039fcfdd5314b35b2f08adbc4063ae6822 100644 --- a/vpx_dsp/intrapred.c +++ b/vpx_dsp/intrapred.c @@ -518,6 +518,21 @@ static INLINE void highbd_d45_predictor(uint16_t *dst, ptrdiff_t stride, int bs, } } +static INLINE void highbd_d45e_predictor(uint16_t *dst, ptrdiff_t stride, + int bs, 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) { + dst[c] = AVG3(above[r + c], above[r + c + 1], + above[r + c + 1 + (r + c + 2 < 8)]); + } + dst += stride; + } +} + static INLINE void highbd_d117_predictor(uint16_t *dst, ptrdiff_t stride, int bs, const uint16_t *above, const uint16_t *left, int bd) { @@ -766,4 +781,7 @@ intra_pred_allsizes(dc_128) intra_pred_allsizes(dc_left) intra_pred_allsizes(dc_top) intra_pred_allsizes(dc) +#if CONFIG_VP9_HIGHBITDEPTH && CONFIG_MISC_FIXES +intra_pred_highbd_sized(d45e, 4) +#endif #undef intra_pred_allsizes diff --git a/vpx_dsp/vpx_dsp_rtcd_defs.pl b/vpx_dsp/vpx_dsp_rtcd_defs.pl index 1916f3df3850191c0f44113dfa8d0f0cd1d58474..535944e29b69a12d214d7a7762375fab835c27e4 100644 --- a/vpx_dsp/vpx_dsp_rtcd_defs.pl +++ b/vpx_dsp/vpx_dsp_rtcd_defs.pl @@ -230,6 +230,9 @@ if (vpx_config("CONFIG_VP9_HIGHBITDEPTH") eq "yes") { add_proto qw/void vpx_highbd_d45_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd"; specialize qw/vpx_highbd_d45_predictor_4x4/; + add_proto qw/void vpx_highbd_d45e_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd"; + specialize qw/vpx_highbd_d45e_predictor_4x4/; + add_proto qw/void vpx_highbd_d63_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd"; specialize qw/vpx_highbd_d63_predictor_4x4/;