]> granicus.if.org Git - libvpx/commitdiff
Use vp10_[fwd/inv]_txfm2d_add_32x32 for bd 10
authorAngie Chiang <angiebird@google.com>
Tue, 22 Mar 2016 00:06:52 +0000 (17:06 -0700)
committerAngie Chiang <angiebird@google.com>
Mon, 28 Mar 2016 18:08:40 +0000 (11:08 -0700)
Change-Id: I996c48a90d7d71b52594a91a35cb8712c7fc212e

vp10/common/common.h
vp10/common/idct.c
vp10/decoder/detokenize.c
vp10/encoder/encodemb.c
vp10/encoder/hybrid_fwd_txfm.c
vp10/encoder/rdopt.c

index 54c7b89ba90b92682aa9463ccc7168b03e935fc7..fb5634ae9a3a3c0d2396d3deb813d6445fa45989 100644 (file)
@@ -67,6 +67,7 @@ static INLINE int get_unsigned_bits(unsigned int num_values) {
 
 #define VP9_FRAME_MARKER 0x2
 
+#define BITDEPTH_10 10
 
 #ifdef __cplusplus
 }  // extern "C"
index fbae4aa12a4bc272fabee37509e56e23253d99bd..47a3219b8de9610cf3a3ad314bd3b83a6bfaa0c5 100644 (file)
@@ -1289,7 +1289,7 @@ void vp10_highbd_inv_txfm_add_4x4(const tran_low_t *input, uint8_t *dest,
 
   switch (tx_type) {
     case DCT_DCT:
-      if (bd == 10)
+      if (bd == BITDEPTH_10)
         vp10_inv_txfm2d_add_4x4(input, CONVERT_TO_SHORTPTR(dest), stride,
                                 &inv_txfm_2d_cfg_dct_dct_4, bd);
       else
@@ -1332,7 +1332,7 @@ void vp10_highbd_inv_txfm_add_8x8(const tran_low_t *input, uint8_t *dest,
                                   TX_TYPE tx_type) {
   switch (tx_type) {
     case DCT_DCT:
-      if (bd == 10)
+      if (bd == BITDEPTH_10)
         vp10_inv_txfm2d_add_8x8(input, CONVERT_TO_SHORTPTR(dest), stride,
                                 &inv_txfm_2d_cfg_dct_dct_8, bd);
       else
@@ -1375,7 +1375,7 @@ void vp10_highbd_inv_txfm_add_16x16(const tran_low_t *input, uint8_t *dest,
                                     TX_TYPE tx_type) {
   switch (tx_type) {
     case DCT_DCT:
-      if (bd == 10)
+      if (bd == BITDEPTH_10)
         vp10_inv_txfm2d_add_16x16(input, CONVERT_TO_SHORTPTR(dest), stride,
                                   &inv_txfm_2d_cfg_dct_dct_16, bd);
       else
@@ -1418,7 +1418,11 @@ void vp10_highbd_inv_txfm_add_32x32(const tran_low_t *input, uint8_t *dest,
                                     TX_TYPE tx_type) {
   switch (tx_type) {
     case DCT_DCT:
-      vp10_highbd_idct32x32_add(input, dest, stride, eob, bd);
+      if (bd == BITDEPTH_10)
+        vp10_inv_txfm2d_add_32x32(input, CONVERT_TO_SHORTPTR(dest), stride,
+                                  &inv_txfm_2d_cfg_dct_dct_32, bd);
+      else
+        vp10_highbd_idct32x32_add(input, dest, stride, eob, bd);
       break;
 #if CONFIG_EXT_TX
     case ADST_DCT:
index c1153d29594adad12348eae9cee196b47e410ea0..e0f59fb6e3aba7b8a9c496cceadbcdc957f4d74f 100644 (file)
@@ -64,7 +64,7 @@ static int decode_coefs(const MACROBLOCKD *xd,
   unsigned int (*eob_branch_count)[COEFF_CONTEXTS];
   uint8_t token_cache[32 * 32];
   const uint8_t *band_translate = get_band_translate(tx_size);
-  const int dq_shift = (tx_size == TX_32X32);
+  int dq_shift;
   int v, token;
   int16_t dqv = dq[0];
   const uint8_t *cat1_prob;
@@ -113,6 +113,16 @@ static int decode_coefs(const MACROBLOCKD *xd,
   cat6_prob = vp10_cat6_prob;
 #endif
 
+#if CONFIG_VP9_HIGHBITDEPTH
+  if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH && xd->bd == BITDEPTH_10) {
+    dq_shift = 0;
+  } else {
+    dq_shift = (tx_size == TX_32X32);
+  }
+#else
+  dq_shift = (tx_size == TX_32X32);
+#endif
+
   while (c < max_eob) {
     int val = -1;
     band = *band_translate++;
@@ -237,7 +247,7 @@ static int decode_coefs_ans(const MACROBLOCKD *const xd,
   unsigned int (*eob_branch_count)[COEFF_CONTEXTS];
   uint8_t token_cache[32 * 32];
   const uint8_t *band_translate = get_band_translate(tx_size);
-  const int dq_shift = (tx_size == TX_32X32);
+  int dq_shift;
   int v, token;
   int16_t dqv = dq[0];
   const uint8_t *cat1_prob;
@@ -247,6 +257,16 @@ static int decode_coefs_ans(const MACROBLOCKD *const xd,
   const uint8_t *cat5_prob;
   const uint8_t *cat6_prob;
 
+#if CONFIG_VP9_HIGHBITDEPTH
+  if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH && xd->bd == BITDEPTH_10) {
+    dq_shift = 0;
+  } else {
+    dq_shift = (tx_size == TX_32X32);
+  }
+#else
+  dq_shift = (tx_size == TX_32X32);
+#endif
+
   if (counts) {
     coef_counts = counts->coef[tx_size][type][ref];
     eob_branch_count = counts->eob_branch[tx_size][type][ref];
index 00f2e038537a15da19d617752940e886e09cb8ef..0b7a04abe373fb8a5bdf65a4479209a6ab3e1fa4 100644 (file)
@@ -105,7 +105,7 @@ static int optimize_b(MACROBLOCK *mb, int plane, int block,
   const int eob = p->eobs[block];
   const PLANE_TYPE type = pd->plane_type;
   const int default_eob = 16 << (tx_size << 1);
-  const int mul = 1 + (tx_size == TX_32X32);
+  int mul;
   const int16_t *dequant_ptr = pd->dequant;
   const uint8_t *const band_translate = get_band_translate(tx_size);
   TX_TYPE tx_type = get_tx_type(type, xd, block, tx_size);
@@ -129,6 +129,16 @@ static int optimize_b(MACROBLOCK *mb, int plane, int block,
   assert((!type && !plane) || (type && plane));
   assert(eob <= default_eob);
 
+#if CONFIG_VP9_HIGHBITDEPTH
+  if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH && xd->bd == BITDEPTH_10) {
+    mul = 1;
+  } else {
+    mul = 1 + (tx_size == TX_32X32);
+  }
+#else
+  mul = 1 + (tx_size == TX_32X32);
+#endif
+
   /* Now set up a Viterbi trellis to evaluate alternative roundings. */
   if (!ref)
     rdmult = (rdmult * 9) >> 4;
@@ -384,7 +394,7 @@ void vp10_xform_quant(MACROBLOCK *x, int plane, int block, int blk_row,
       if (x->skip_block) {
         vp10_quantize_skip(tx2d_size, qcoeff, dqcoeff, eob);
       } else {
-        if (tx_size == TX_32X32)
+        if (tx_size == TX_32X32 && xd->bd != 10)
           quant_func_list[xform_quant_idx][QUANT_FUNC_HIGHBD_32](
               coeff, tx2d_size, p, qcoeff, pd, dqcoeff, eob, scan_order);
         else
index 8a19a401583dc1048d755fba1d0702b4629c8fad..d87a24fbca6ad95c38c873c889e52c3e4b3bbc76 100644 (file)
@@ -204,7 +204,7 @@ void vp10_highbd_fwd_txfm_4x4(const int16_t *src_diff, tran_low_t *coeff,
 
   switch (tx_type) {
     case DCT_DCT:
-      if (bd == 10) {
+      if (bd == BITDEPTH_10) {
         vp10_fwd_txfm2d_4x4(src_diff, coeff, diff_stride,
                             &fwd_txfm_2d_cfg_dct_dct_4, bd);
       } else {
@@ -248,7 +248,7 @@ static void highbd_fwd_txfm_8x8(const int16_t *src_diff, tran_low_t *coeff,
   (void)fwd_txfm_opt;
   switch (tx_type) {
     case DCT_DCT:
-      if (bd == 10) {
+      if (bd == BITDEPTH_10) {
         vp10_fwd_txfm2d_8x8(src_diff, coeff, diff_stride,
                             &fwd_txfm_2d_cfg_dct_dct_8, bd);
         break;
@@ -294,7 +294,7 @@ static void highbd_fwd_txfm_16x16(const int16_t *src_diff, tran_low_t *coeff,
   (void)fwd_txfm_opt;
   switch (tx_type) {
     case DCT_DCT:
-      if (bd == 10) {
+      if (bd == BITDEPTH_10) {
         vp10_fwd_txfm2d_16x16(src_diff, coeff, diff_stride,
                               &fwd_txfm_2d_cfg_dct_dct_16, bd);
         break;
@@ -341,10 +341,15 @@ static void highbd_fwd_txfm_32x32(int rd_transform, const int16_t *src_diff,
   (void)bd;
   switch (tx_type) {
     case DCT_DCT:
-      if (fwd_txfm_opt == FWD_TXFM_OPT_NORMAL)
-        highbd_fdct32x32(rd_transform, src_diff, coeff, diff_stride);
-      else  // FWD_TXFM_OPT_DC
-        vpx_highbd_fdct32x32_1(src_diff, coeff, diff_stride);
+      if (bd == BITDEPTH_10) {
+        vp10_fwd_txfm2d_32x32(src_diff, coeff, diff_stride,
+                              &fwd_txfm_2d_cfg_dct_dct_32, bd);
+      } else {
+        if (fwd_txfm_opt == FWD_TXFM_OPT_NORMAL)
+          highbd_fdct32x32(rd_transform, src_diff, coeff, diff_stride);
+        else  // FWD_TXFM_OPT_DC
+          vpx_highbd_fdct32x32_1(src_diff, coeff, diff_stride);
+      }
       break;
 #if CONFIG_EXT_TX
     case ADST_DCT:
index ba113d7b4c70c8a8566633cb2502dd8bed88de0d..0f87b54ad2b371af8f7fb8c51dec15499b1f886a 100644 (file)
@@ -1008,6 +1008,9 @@ static void dist_block(const VP10_COMP *cpi, MACROBLOCK *x, int plane,
     tran_low_t *const dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block);
 #if CONFIG_VP9_HIGHBITDEPTH
     const int bd = (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) ? xd->bd : 8;
+    if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH && xd->bd == BITDEPTH_10) {
+      shift = 2;
+    }
     *out_dist = vp10_highbd_block_error(coeff, dqcoeff, 16 << ss_txfrm_size,
                                         &this_sse, bd) >> shift;
 #else
@@ -1176,9 +1179,17 @@ static void block_rd_txfm(int plane, int block, int blk_row, int blk_col,
         int64_t dc_correct = orig_sse - resd_sse * resd_sse;
 #if CONFIG_VP9_HIGHBITDEPTH
         dc_correct >>= ((xd->bd - 8) * 2);
-#endif
+        if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH &&
+            xd->bd == BITDEPTH_10) {
+          dc_correct >>= 2;
+        } else {
+          if (tx_size != TX_32X32)
+            dc_correct >>= 2;
+        }
+#else
         if (tx_size != TX_32X32)
           dc_correct >>= 2;
+#endif
 
         dist = VPXMAX(0, sse - dc_correct);
       }