blob: 5171f1144e68e689f2b8124fe59ea63b53f60a69 [file] [log] [blame]
Yaowu Xuc27fc142016-08-22 16:08:15 -07001/*
Yaowu Xu2ab7ff02016-09-02 12:04:54 -07002 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
Yaowu Xuc27fc142016-08-22 16:08:15 -07003 *
Yaowu Xu2ab7ff02016-09-02 12:04:54 -07004 * 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.
Yaowu Xuc27fc142016-08-22 16:08:15 -070010 */
11
12#include <assert.h>
13
14#include "av1/common/entropy.h"
15
16#include "av1/decoder/dsubexp.h"
17
18static int inv_recenter_nonneg(int v, int m) {
19 if (v > 2 * m) return v;
20
21 return (v & 1) ? m - ((v + 1) >> 1) : m + (v >> 1);
22}
23
Michael Bebenita6048d052016-08-25 14:40:54 -070024#define decode_uniform(r, ACCT_STR_NAME) \
25 decode_uniform_(r ACCT_STR_ARG(ACCT_STR_NAME))
26#define decode_term_subexp(r, ACCT_STR_NAME) \
27 decode_term_subexp_(r ACCT_STR_ARG(ACCT_STR_NAME))
28
29static int decode_uniform_(aom_reader *r ACCT_STR_PARAM) {
Yaowu Xuc27fc142016-08-22 16:08:15 -070030 const int l = 8;
31 const int m = (1 << l) - 190;
Michael Bebenita6048d052016-08-25 14:40:54 -070032 const int v = aom_read_literal(r, l - 1, ACCT_STR_NAME);
33 return v < m ? v : (v << 1) - m + aom_read_bit(r, ACCT_STR_NAME);
Yaowu Xuc27fc142016-08-22 16:08:15 -070034}
35
36static int inv_remap_prob(int v, int m) {
Michael Bebenita6048d052016-08-25 14:40:54 -070037 /* clang-format off */
Yaowu Xuc27fc142016-08-22 16:08:15 -070038 static uint8_t inv_map_table[MAX_PROB - 1] = {
Michael Bebenita6048d052016-08-25 14:40:54 -070039 7, 20, 33, 46, 59, 72, 85, 98, 111, 124, 137, 150, 163, 176, 189,
40 202, 215, 228, 241, 254, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11,
41 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27,
42 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43,
43 44, 45, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60,
44 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 73, 74, 75, 76,
45 77, 78, 79, 80, 81, 82, 83, 84, 86, 87, 88, 89, 90, 91, 92,
46 93, 94, 95, 96, 97, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108,
Yaowu Xuc27fc142016-08-22 16:08:15 -070047 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 125,
48 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 138, 139, 140, 141,
49 142, 143, 144, 145, 146, 147, 148, 149, 151, 152, 153, 154, 155, 156, 157,
50 158, 159, 160, 161, 162, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173,
51 174, 175, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 190,
52 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 203, 204, 205, 206,
53 207, 208, 209, 210, 211, 212, 213, 214, 216, 217, 218, 219, 220, 221, 222,
54 223, 224, 225, 226, 227, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238,
Michael Bebenita6048d052016-08-25 14:40:54 -070055 239, 240, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253
56 }; /* clang-format on */
Yaowu Xuc27fc142016-08-22 16:08:15 -070057 assert(v < (int)(sizeof(inv_map_table) / sizeof(inv_map_table[0])));
58 v = inv_map_table[v];
59 m--;
60 if ((m << 1) <= MAX_PROB) {
61 return 1 + inv_recenter_nonneg(v, m);
62 } else {
63 return MAX_PROB - inv_recenter_nonneg(v, MAX_PROB - 1 - m);
64 }
65}
66
Michael Bebenita6048d052016-08-25 14:40:54 -070067static int decode_term_subexp_(aom_reader *r ACCT_STR_PARAM) {
68 if (!aom_read_bit(r, ACCT_STR_NAME))
69 return aom_read_literal(r, 4, ACCT_STR_NAME);
70 if (!aom_read_bit(r, ACCT_STR_NAME))
71 return aom_read_literal(r, 4, ACCT_STR_NAME) + 16;
72 if (!aom_read_bit(r, ACCT_STR_NAME))
73 return aom_read_literal(r, 5, ACCT_STR_NAME) + 32;
74 return decode_uniform(r, ACCT_STR_NAME) + 64;
Yaowu Xuc27fc142016-08-22 16:08:15 -070075}
76
Michael Bebenita6048d052016-08-25 14:40:54 -070077void av1_diff_update_prob_(aom_reader *r, aom_prob *p ACCT_STR_PARAM) {
78 if (aom_read(r, DIFF_UPDATE_PROB, ACCT_STR_NAME)) {
79 const int delp = decode_term_subexp(r, ACCT_STR_NAME);
Yaowu Xuf883b422016-08-30 14:01:10 -070080 *p = (aom_prob)inv_remap_prob(delp, *p);
Yaowu Xuc27fc142016-08-22 16:08:15 -070081 }
82}