Home | History | Annotate | Download | only in aom_dsp
      1 /*
      2  * Copyright (c) 2017, Alliance for Open Media. All rights reserved
      3  *
      4  * This source code is subject to the terms of the BSD 2 Clause License and
      5  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
      6  * was not distributed with this source code in the LICENSE file, you can
      7  * obtain it at www.aomedia.org/license/software. If the Alliance for Open
      8  * Media Patent License 1.0 was not distributed with this source code in the
      9  * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
     10  */
     11 
     12 #include "aom_dsp/binary_codes_reader.h"
     13 #include "aom_dsp/recenter.h"
     14 #include "av1/common/common.h"
     15 
     16 uint16_t aom_read_primitive_quniform_(aom_reader *r,
     17                                       uint16_t n ACCT_STR_PARAM) {
     18   if (n <= 1) return 0;
     19   const int l = get_msb(n) + 1;
     20   const int m = (1 << l) - n;
     21   const int v = aom_read_literal(r, l - 1, ACCT_STR_NAME);
     22   return v < m ? v : (v << 1) - m + aom_read_bit(r, ACCT_STR_NAME);
     23 }
     24 
     25 // Decode finite subexponential code that for a symbol v in [0, n-1] with
     26 // parameter k
     27 uint16_t aom_read_primitive_subexpfin_(aom_reader *r, uint16_t n,
     28                                        uint16_t k ACCT_STR_PARAM) {
     29   int i = 0;
     30   int mk = 0;
     31 
     32   while (1) {
     33     int b = (i ? k + i - 1 : k);
     34     int a = (1 << b);
     35 
     36     if (n <= mk + 3 * a) {
     37       return aom_read_primitive_quniform(r, n - mk, ACCT_STR_NAME) + mk;
     38     }
     39 
     40     if (!aom_read_bit(r, ACCT_STR_NAME)) {
     41       return aom_read_literal(r, b, ACCT_STR_NAME) + mk;
     42     }
     43 
     44     i = i + 1;
     45     mk += a;
     46   }
     47 
     48   assert(0);
     49   return 0;
     50 }
     51 
     52 uint16_t aom_read_primitive_refsubexpfin_(aom_reader *r, uint16_t n, uint16_t k,
     53                                           uint16_t ref ACCT_STR_PARAM) {
     54   return inv_recenter_finite_nonneg(
     55       n, ref, aom_read_primitive_subexpfin(r, n, k, ACCT_STR_NAME));
     56 }
     57