Line data Source code
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 :
14 : #include "av1/common/common.h"
15 :
16 : // Inverse recenters a non-negative literal v around a reference r
17 0 : static uint16_t inv_recenter_nonneg(uint16_t r, uint16_t v) {
18 0 : if (v > (r << 1))
19 0 : return v;
20 0 : else if ((v & 1) == 0)
21 0 : return (v >> 1) + r;
22 : else
23 0 : return r - ((v + 1) >> 1);
24 : }
25 :
26 : // Inverse recenters a non-negative literal v in [0, n-1] around a
27 : // reference r also in [0, n-1]
28 0 : static uint16_t inv_recenter_finite_nonneg(uint16_t n, uint16_t r, uint16_t v) {
29 0 : if ((r << 1) <= n) {
30 0 : return inv_recenter_nonneg(r, v);
31 : } else {
32 0 : return n - 1 - inv_recenter_nonneg(n - 1 - r, v);
33 : }
34 : }
35 :
36 0 : int16_t aom_read_primitive_symmetric_(aom_reader *r,
37 : unsigned int mag_bits ACCT_STR_PARAM) {
38 0 : if (aom_read_bit(r, ACCT_STR_NAME)) {
39 0 : int s = aom_read_bit(r, ACCT_STR_NAME);
40 0 : int16_t x = aom_read_literal(r, mag_bits, ACCT_STR_NAME) + 1;
41 0 : return (s > 0 ? -x : x);
42 : } else {
43 0 : return 0;
44 : }
45 : }
46 :
47 0 : uint16_t aom_read_primitive_quniform_(aom_reader *r,
48 : uint16_t n ACCT_STR_PARAM) {
49 0 : if (n <= 1) return 0;
50 0 : const int l = get_msb(n - 1) + 1;
51 0 : const int m = (1 << l) - n;
52 0 : const int v = aom_read_literal(r, l - 1, ACCT_STR_NAME);
53 0 : return v < m ? v : (v << 1) - m + aom_read_bit(r, ACCT_STR_NAME);
54 : }
55 :
56 0 : uint16_t aom_read_primitive_refbilevel_(aom_reader *r, uint16_t n, uint16_t p,
57 : uint16_t ref ACCT_STR_PARAM) {
58 0 : if (n <= 1) return 0;
59 0 : assert(p > 0 && p <= n);
60 0 : assert(ref < n);
61 0 : int lolimit = ref - p / 2;
62 0 : const int hilimit = lolimit + p - 1;
63 0 : if (lolimit < 0) {
64 0 : lolimit = 0;
65 0 : } else if (hilimit >= n) {
66 0 : lolimit = n - p;
67 : }
68 : int v;
69 0 : if (aom_read_bit(r, ACCT_STR_NAME)) {
70 0 : v = aom_read_primitive_quniform(r, p, ACCT_STR_NAME) + lolimit;
71 : } else {
72 0 : v = aom_read_primitive_quniform(r, n - p, ACCT_STR_NAME);
73 0 : if (v >= lolimit) v += p;
74 : }
75 0 : return v;
76 : }
77 :
78 : // Decode finite subexponential code that for a symbol v in [0, n-1] with
79 : // parameter k
80 0 : uint16_t aom_read_primitive_subexpfin_(aom_reader *r, uint16_t n,
81 : uint16_t k ACCT_STR_PARAM) {
82 0 : int i = 0;
83 0 : int mk = 0;
84 : uint16_t v;
85 0 : while (1) {
86 0 : int b = (i ? k + i - 1 : k);
87 0 : int a = (1 << b);
88 0 : if (n <= mk + 3 * a) {
89 0 : v = aom_read_primitive_quniform(r, n - mk, ACCT_STR_NAME) + mk;
90 0 : break;
91 : } else {
92 0 : if (aom_read_bit(r, ACCT_STR_NAME)) {
93 0 : i = i + 1;
94 0 : mk += a;
95 : } else {
96 0 : v = aom_read_literal(r, b, ACCT_STR_NAME) + mk;
97 0 : break;
98 : }
99 : }
100 : }
101 0 : return v;
102 : }
103 :
104 : // Decode finite subexponential code that for a symbol v in [0, n-1] with
105 : // parameter k
106 : // based on a reference ref also in [0, n-1].
107 0 : uint16_t aom_read_primitive_refsubexpfin_(aom_reader *r, uint16_t n, uint16_t k,
108 : uint16_t ref ACCT_STR_PARAM) {
109 0 : return inv_recenter_finite_nonneg(
110 0 : n, ref, aom_read_primitive_subexpfin(r, n, k, ACCT_STR_NAME));
111 : }
112 :
113 : // Decode finite subexponential code that for a symbol v in [-(n-1), n-1] with
114 : // parameter k based on a reference ref also in [-(n-1), n-1].
115 0 : int16_t aom_read_signed_primitive_refsubexpfin_(aom_reader *r, uint16_t n,
116 : uint16_t k,
117 : int16_t ref ACCT_STR_PARAM) {
118 0 : ref += n - 1;
119 0 : const uint16_t scaled_n = (n << 1) - 1;
120 0 : return aom_read_primitive_refsubexpfin(r, scaled_n, k, ref, ACCT_STR_NAME) -
121 0 : n + 1;
122 : }
|