shithub: libvpx

Download patch

ref: 3fedf4a59bbe8e879e611012fdd0dd3de7cad1af
parent: cb5c47f20d83a00e9f0efa6ae5fd15f5bfec933a
parent: 62a1579525afad6e874dbbfe5c2f6233257013aa
author: Ronald S. Bultje <[email protected]>
date: Fri Oct 2 13:15:59 EDT 2015

Merge "vp10: reimplement d45/4x4 to match vp8 instead of vp9."

--- a/vp10/common/reconintra.c
+++ b/vp10/common/reconintra.c
@@ -55,16 +55,24 @@
 #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 @@
   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);
--- a/vpx_dsp/intrapred.c
+++ b/vpx_dsp/intrapred.c
@@ -518,6 +518,21 @@
   }
 }
 
+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_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
--- a/vpx_dsp/vpx_dsp_rtcd_defs.pl
+++ b/vpx_dsp/vpx_dsp_rtcd_defs.pl
@@ -230,6 +230,9 @@
   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/;