Home | History | Annotate | Download | only in encoder
      1 /*
      2  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #include <math.h>
     12 #include "./vpx_dsp_rtcd.h"
     13 #include "vpx_mem/vpx_mem.h"
     14 #include "vpx_ports/mem.h"
     15 
     16 #include "vp9/common/vp9_quant_common.h"
     17 #include "vp9/common/vp9_seg_common.h"
     18 
     19 #include "vp9/encoder/vp9_encoder.h"
     20 #include "vp9/encoder/vp9_quantize.h"
     21 #include "vp9/encoder/vp9_rd.h"
     22 
     23 void vp9_quantize_fp_c(const tran_low_t *coeff_ptr, intptr_t n_coeffs,
     24                        int skip_block,
     25                        const int16_t *zbin_ptr, const int16_t *round_ptr,
     26                        const int16_t *quant_ptr, const int16_t *quant_shift_ptr,
     27                        tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr,
     28                        const int16_t *dequant_ptr,
     29                        uint16_t *eob_ptr,
     30                        const int16_t *scan, const int16_t *iscan) {
     31   int i, eob = -1;
     32   // TODO(jingning) Decide the need of these arguments after the
     33   // quantization process is completed.
     34   (void)zbin_ptr;
     35   (void)quant_shift_ptr;
     36   (void)iscan;
     37 
     38   memset(qcoeff_ptr, 0, n_coeffs * sizeof(*qcoeff_ptr));
     39   memset(dqcoeff_ptr, 0, n_coeffs * sizeof(*dqcoeff_ptr));
     40 
     41   if (!skip_block) {
     42     // Quantization pass: All coefficients with index >= zero_flag are
     43     // skippable. Note: zero_flag can be zero.
     44     for (i = 0; i < n_coeffs; i++) {
     45       const int rc = scan[i];
     46       const int coeff = coeff_ptr[rc];
     47       const int coeff_sign = (coeff >> 31);
     48       const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign;
     49 
     50       int tmp = clamp(abs_coeff + round_ptr[rc != 0], INT16_MIN, INT16_MAX);
     51       tmp = (tmp * quant_ptr[rc != 0]) >> 16;
     52 
     53       qcoeff_ptr[rc] = (tmp ^ coeff_sign) - coeff_sign;
     54       dqcoeff_ptr[rc] = qcoeff_ptr[rc] * dequant_ptr[rc != 0];
     55 
     56       if (tmp)
     57         eob = i;
     58     }
     59   }
     60   *eob_ptr = eob + 1;
     61 }
     62 
     63 #if CONFIG_VP9_HIGHBITDEPTH
     64 void vp9_highbd_quantize_fp_c(const tran_low_t *coeff_ptr,
     65                               intptr_t count,
     66                               int skip_block,
     67                               const int16_t *zbin_ptr,
     68                               const int16_t *round_ptr,
     69                               const int16_t *quant_ptr,
     70                               const int16_t *quant_shift_ptr,
     71                               tran_low_t *qcoeff_ptr,
     72                               tran_low_t *dqcoeff_ptr,
     73                               const int16_t *dequant_ptr,
     74                               uint16_t *eob_ptr,
     75                               const int16_t *scan,
     76                               const int16_t *iscan) {
     77   int i;
     78   int eob = -1;
     79   // TODO(jingning) Decide the need of these arguments after the
     80   // quantization process is completed.
     81   (void)zbin_ptr;
     82   (void)quant_shift_ptr;
     83   (void)iscan;
     84 
     85   memset(qcoeff_ptr, 0, count * sizeof(*qcoeff_ptr));
     86   memset(dqcoeff_ptr, 0, count * sizeof(*dqcoeff_ptr));
     87 
     88   if (!skip_block) {
     89     // Quantization pass: All coefficients with index >= zero_flag are
     90     // skippable. Note: zero_flag can be zero.
     91     for (i = 0; i < count; i++) {
     92       const int rc = scan[i];
     93       const int coeff = coeff_ptr[rc];
     94       const int coeff_sign = (coeff >> 31);
     95       const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign;
     96       const int64_t tmp = abs_coeff + round_ptr[rc != 0];
     97       const uint32_t abs_qcoeff = (uint32_t)((tmp * quant_ptr[rc != 0]) >> 16);
     98       qcoeff_ptr[rc] = (tran_low_t)((abs_qcoeff ^ coeff_sign) - coeff_sign);
     99       dqcoeff_ptr[rc] = qcoeff_ptr[rc] * dequant_ptr[rc != 0];
    100       if (abs_qcoeff)
    101         eob = i;
    102     }
    103   }
    104   *eob_ptr = eob + 1;
    105 }
    106 #endif
    107 
    108 // TODO(jingning) Refactor this file and combine functions with similar
    109 // operations.
    110 void vp9_quantize_fp_32x32_c(const tran_low_t *coeff_ptr, intptr_t n_coeffs,
    111                              int skip_block,
    112                              const int16_t *zbin_ptr, const int16_t *round_ptr,
    113                              const int16_t *quant_ptr,
    114                              const int16_t *quant_shift_ptr,
    115                              tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr,
    116                              const int16_t *dequant_ptr,
    117                              uint16_t *eob_ptr,
    118                              const int16_t *scan, const int16_t *iscan) {
    119   int i, eob = -1;
    120   (void)zbin_ptr;
    121   (void)quant_shift_ptr;
    122   (void)iscan;
    123 
    124   memset(qcoeff_ptr, 0, n_coeffs * sizeof(*qcoeff_ptr));
    125   memset(dqcoeff_ptr, 0, n_coeffs * sizeof(*dqcoeff_ptr));
    126 
    127   if (!skip_block) {
    128     for (i = 0; i < n_coeffs; i++) {
    129       const int rc = scan[i];
    130       const int coeff = coeff_ptr[rc];
    131       const int coeff_sign = (coeff >> 31);
    132       int tmp = 0;
    133       int abs_coeff = (coeff ^ coeff_sign) - coeff_sign;
    134 
    135       if (abs_coeff >= (dequant_ptr[rc != 0] >> 2)) {
    136         abs_coeff += ROUND_POWER_OF_TWO(round_ptr[rc != 0], 1);
    137         abs_coeff = clamp(abs_coeff, INT16_MIN, INT16_MAX);
    138         tmp = (abs_coeff * quant_ptr[rc != 0]) >> 15;
    139         qcoeff_ptr[rc] = (tmp ^ coeff_sign) - coeff_sign;
    140         dqcoeff_ptr[rc] = qcoeff_ptr[rc] * dequant_ptr[rc != 0] / 2;
    141       }
    142 
    143       if (tmp)
    144         eob = i;
    145     }
    146   }
    147   *eob_ptr = eob + 1;
    148 }
    149 
    150 #if CONFIG_VP9_HIGHBITDEPTH
    151 void vp9_highbd_quantize_fp_32x32_c(const tran_low_t *coeff_ptr,
    152                                     intptr_t n_coeffs, int skip_block,
    153                                     const int16_t *zbin_ptr,
    154                                     const int16_t *round_ptr,
    155                                     const int16_t *quant_ptr,
    156                                     const int16_t *quant_shift_ptr,
    157                                     tran_low_t *qcoeff_ptr,
    158                                     tran_low_t *dqcoeff_ptr,
    159                                     const int16_t *dequant_ptr,
    160                                     uint16_t *eob_ptr,
    161                                     const int16_t *scan, const int16_t *iscan) {
    162   int i, eob = -1;
    163   (void)zbin_ptr;
    164   (void)quant_shift_ptr;
    165   (void)iscan;
    166 
    167   memset(qcoeff_ptr, 0, n_coeffs * sizeof(*qcoeff_ptr));
    168   memset(dqcoeff_ptr, 0, n_coeffs * sizeof(*dqcoeff_ptr));
    169 
    170   if (!skip_block) {
    171     for (i = 0; i < n_coeffs; i++) {
    172       uint32_t abs_qcoeff = 0;
    173       const int rc = scan[i];
    174       const int coeff = coeff_ptr[rc];
    175       const int coeff_sign = (coeff >> 31);
    176       const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign;
    177 
    178       if (abs_coeff >= (dequant_ptr[rc != 0] >> 2)) {
    179         const int64_t tmp = abs_coeff
    180                            + ROUND_POWER_OF_TWO(round_ptr[rc != 0], 1);
    181         abs_qcoeff = (uint32_t) ((tmp * quant_ptr[rc != 0]) >> 15);
    182         qcoeff_ptr[rc] = (tran_low_t)((abs_qcoeff ^ coeff_sign) - coeff_sign);
    183         dqcoeff_ptr[rc] = qcoeff_ptr[rc] * dequant_ptr[rc != 0] / 2;
    184       }
    185 
    186       if (abs_qcoeff)
    187         eob = i;
    188     }
    189   }
    190   *eob_ptr = eob + 1;
    191 }
    192 #endif
    193 
    194 void vp9_regular_quantize_b_4x4(MACROBLOCK *x, int plane, int block,
    195                                 const int16_t *scan, const int16_t *iscan) {
    196   MACROBLOCKD *const xd = &x->e_mbd;
    197   struct macroblock_plane *p = &x->plane[plane];
    198   struct macroblockd_plane *pd = &xd->plane[plane];
    199 
    200 #if CONFIG_VP9_HIGHBITDEPTH
    201   if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
    202     vpx_highbd_quantize_b(BLOCK_OFFSET(p->coeff, block),
    203                           16, x->skip_block,
    204                           p->zbin, p->round, p->quant, p->quant_shift,
    205                           BLOCK_OFFSET(p->qcoeff, block),
    206                           BLOCK_OFFSET(pd->dqcoeff, block),
    207                           pd->dequant, &p->eobs[block],
    208                           scan, iscan);
    209     return;
    210   }
    211 #endif
    212   vpx_quantize_b(BLOCK_OFFSET(p->coeff, block),
    213                  16, x->skip_block,
    214                  p->zbin, p->round, p->quant, p->quant_shift,
    215                  BLOCK_OFFSET(p->qcoeff, block),
    216                  BLOCK_OFFSET(pd->dqcoeff, block),
    217                  pd->dequant, &p->eobs[block], scan, iscan);
    218 }
    219 
    220 static void invert_quant(int16_t *quant, int16_t *shift, int d) {
    221   unsigned t;
    222   int l;
    223   t = d;
    224   for (l = 0; t > 1; l++)
    225     t >>= 1;
    226   t = 1 + (1 << (16 + l)) / d;
    227   *quant = (int16_t)(t - (1 << 16));
    228   *shift = 1 << (16 - l);
    229 }
    230 
    231 static int get_qzbin_factor(int q, vpx_bit_depth_t bit_depth) {
    232   const int quant = vp9_dc_quant(q, 0, bit_depth);
    233 #if CONFIG_VP9_HIGHBITDEPTH
    234   switch (bit_depth) {
    235     case VPX_BITS_8:
    236       return q == 0 ? 64 : (quant < 148 ? 84 : 80);
    237     case VPX_BITS_10:
    238       return q == 0 ? 64 : (quant < 592 ? 84 : 80);
    239     case VPX_BITS_12:
    240       return q == 0 ? 64 : (quant < 2368 ? 84 : 80);
    241     default:
    242       assert(0 && "bit_depth should be VPX_BITS_8, VPX_BITS_10 or VPX_BITS_12");
    243       return -1;
    244   }
    245 #else
    246   (void) bit_depth;
    247   return q == 0 ? 64 : (quant < 148 ? 84 : 80);
    248 #endif
    249 }
    250 
    251 void vp9_init_quantizer(VP9_COMP *cpi) {
    252   VP9_COMMON *const cm = &cpi->common;
    253   QUANTS *const quants = &cpi->quants;
    254   int i, q, quant;
    255 
    256   for (q = 0; q < QINDEX_RANGE; q++) {
    257     const int qzbin_factor = get_qzbin_factor(q, cm->bit_depth);
    258     const int qrounding_factor = q == 0 ? 64 : 48;
    259 
    260     for (i = 0; i < 2; ++i) {
    261       int qrounding_factor_fp = i == 0 ? 48 : 42;
    262       if (q == 0)
    263         qrounding_factor_fp = 64;
    264 
    265       // y
    266       quant = i == 0 ? vp9_dc_quant(q, cm->y_dc_delta_q, cm->bit_depth)
    267                      : vp9_ac_quant(q, 0, cm->bit_depth);
    268       invert_quant(&quants->y_quant[q][i], &quants->y_quant_shift[q][i], quant);
    269       quants->y_quant_fp[q][i] = (1 << 16) / quant;
    270       quants->y_round_fp[q][i] = (qrounding_factor_fp * quant) >> 7;
    271       quants->y_zbin[q][i] = ROUND_POWER_OF_TWO(qzbin_factor * quant, 7);
    272       quants->y_round[q][i] = (qrounding_factor * quant) >> 7;
    273       cpi->y_dequant[q][i] = quant;
    274 
    275       // uv
    276       quant = i == 0 ? vp9_dc_quant(q, cm->uv_dc_delta_q, cm->bit_depth)
    277                      : vp9_ac_quant(q, cm->uv_ac_delta_q, cm->bit_depth);
    278       invert_quant(&quants->uv_quant[q][i],
    279                    &quants->uv_quant_shift[q][i], quant);
    280       quants->uv_quant_fp[q][i] = (1 << 16) / quant;
    281       quants->uv_round_fp[q][i] = (qrounding_factor_fp * quant) >> 7;
    282       quants->uv_zbin[q][i] = ROUND_POWER_OF_TWO(qzbin_factor * quant, 7);
    283       quants->uv_round[q][i] = (qrounding_factor * quant) >> 7;
    284       cpi->uv_dequant[q][i] = quant;
    285     }
    286 
    287     for (i = 2; i < 8; i++) {
    288       quants->y_quant[q][i] = quants->y_quant[q][1];
    289       quants->y_quant_fp[q][i] = quants->y_quant_fp[q][1];
    290       quants->y_round_fp[q][i] = quants->y_round_fp[q][1];
    291       quants->y_quant_shift[q][i] = quants->y_quant_shift[q][1];
    292       quants->y_zbin[q][i] = quants->y_zbin[q][1];
    293       quants->y_round[q][i] = quants->y_round[q][1];
    294       cpi->y_dequant[q][i] = cpi->y_dequant[q][1];
    295 
    296       quants->uv_quant[q][i] = quants->uv_quant[q][1];
    297       quants->uv_quant_fp[q][i] = quants->uv_quant_fp[q][1];
    298       quants->uv_round_fp[q][i] = quants->uv_round_fp[q][1];
    299       quants->uv_quant_shift[q][i] = quants->uv_quant_shift[q][1];
    300       quants->uv_zbin[q][i] = quants->uv_zbin[q][1];
    301       quants->uv_round[q][i] = quants->uv_round[q][1];
    302       cpi->uv_dequant[q][i] = cpi->uv_dequant[q][1];
    303     }
    304   }
    305 }
    306 
    307 void vp9_init_plane_quantizers(VP9_COMP *cpi, MACROBLOCK *x) {
    308   const VP9_COMMON *const cm = &cpi->common;
    309   MACROBLOCKD *const xd = &x->e_mbd;
    310   QUANTS *const quants = &cpi->quants;
    311   const int segment_id = xd->mi[0]->mbmi.segment_id;
    312   const int qindex = vp9_get_qindex(&cm->seg, segment_id, cm->base_qindex);
    313   const int rdmult = vp9_compute_rd_mult(cpi, qindex + cm->y_dc_delta_q);
    314   int i;
    315 
    316   // Y
    317   x->plane[0].quant = quants->y_quant[qindex];
    318   x->plane[0].quant_fp = quants->y_quant_fp[qindex];
    319   x->plane[0].round_fp = quants->y_round_fp[qindex];
    320   x->plane[0].quant_shift = quants->y_quant_shift[qindex];
    321   x->plane[0].zbin = quants->y_zbin[qindex];
    322   x->plane[0].round = quants->y_round[qindex];
    323   xd->plane[0].dequant = cpi->y_dequant[qindex];
    324 
    325   x->plane[0].quant_thred[0] = x->plane[0].zbin[0] * x->plane[0].zbin[0];
    326   x->plane[0].quant_thred[1] = x->plane[0].zbin[1] * x->plane[0].zbin[1];
    327 
    328   // UV
    329   for (i = 1; i < 3; i++) {
    330     x->plane[i].quant = quants->uv_quant[qindex];
    331     x->plane[i].quant_fp = quants->uv_quant_fp[qindex];
    332     x->plane[i].round_fp = quants->uv_round_fp[qindex];
    333     x->plane[i].quant_shift = quants->uv_quant_shift[qindex];
    334     x->plane[i].zbin = quants->uv_zbin[qindex];
    335     x->plane[i].round = quants->uv_round[qindex];
    336     xd->plane[i].dequant = cpi->uv_dequant[qindex];
    337 
    338     x->plane[i].quant_thred[0] = x->plane[i].zbin[0] * x->plane[i].zbin[0];
    339     x->plane[i].quant_thred[1] = x->plane[i].zbin[1] * x->plane[i].zbin[1];
    340   }
    341 
    342   x->skip_block = segfeature_active(&cm->seg, segment_id, SEG_LVL_SKIP);
    343   x->q_index = qindex;
    344 
    345   x->errorperbit = rdmult >> 6;
    346   x->errorperbit += (x->errorperbit == 0);
    347 
    348   vp9_initialize_me_consts(cpi, x, x->q_index);
    349 }
    350 
    351 void vp9_frame_init_quantizer(VP9_COMP *cpi) {
    352   vp9_init_plane_quantizers(cpi, &cpi->td.mb);
    353 }
    354 
    355 void vp9_set_quantizer(VP9_COMMON *cm, int q) {
    356   // quantizer has to be reinitialized with vp9_init_quantizer() if any
    357   // delta_q changes.
    358   cm->base_qindex = q;
    359   cm->y_dc_delta_q = 0;
    360   cm->uv_dc_delta_q = 0;
    361   cm->uv_ac_delta_q = 0;
    362 }
    363 
    364 // Table that converts 0-63 Q-range values passed in outside to the Qindex
    365 // range used internally.
    366 static const int quantizer_to_qindex[] = {
    367   0,    4,   8,  12,  16,  20,  24,  28,
    368   32,   36,  40,  44,  48,  52,  56,  60,
    369   64,   68,  72,  76,  80,  84,  88,  92,
    370   96,  100, 104, 108, 112, 116, 120, 124,
    371   128, 132, 136, 140, 144, 148, 152, 156,
    372   160, 164, 168, 172, 176, 180, 184, 188,
    373   192, 196, 200, 204, 208, 212, 216, 220,
    374   224, 228, 232, 236, 240, 244, 249, 255,
    375 };
    376 
    377 int vp9_quantizer_to_qindex(int quantizer) {
    378   return quantizer_to_qindex[quantizer];
    379 }
    380 
    381 int vp9_qindex_to_quantizer(int qindex) {
    382   int quantizer;
    383 
    384   for (quantizer = 0; quantizer < 64; ++quantizer)
    385     if (quantizer_to_qindex[quantizer] >= qindex)
    386       return quantizer;
    387 
    388   return 63;
    389 }
    390