Coverage Report

Created: 2025-08-29 06:49

/src/libvpx/vp9/decoder/vp9_dsubexp.c
Line
Count
Source
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 <assert.h>
12
13
#include "vp9/common/vp9_entropy.h"
14
15
#include "vp9/decoder/vp9_dsubexp.h"
16
17
274k
static int inv_recenter_nonneg(int v, int m) {
18
274k
  if (v > 2 * m) return v;
19
20
126k
  return (v & 1) ? m - ((v + 1) >> 1) : m + (v >> 1);
21
274k
}
22
23
76.2k
static int decode_uniform(vpx_reader *r) {
24
76.2k
  const int l = 8;
25
76.2k
  const int m = (1 << l) - 191;
26
76.2k
  const int v = vpx_read_literal(r, l - 1);
27
76.2k
  return v < m ? v : (v << 1) - m + vpx_read_bit(r);
28
76.2k
}
29
30
274k
static int inv_remap_prob(int v, int m) {
31
274k
  static uint8_t inv_map_table[MAX_PROB] = {
32
274k
    7,   20,  33,  46,  59,  72,  85,  98,  111, 124, 137, 150, 163, 176, 189,
33
274k
    202, 215, 228, 241, 254, 1,   2,   3,   4,   5,   6,   8,   9,   10,  11,
34
274k
    12,  13,  14,  15,  16,  17,  18,  19,  21,  22,  23,  24,  25,  26,  27,
35
274k
    28,  29,  30,  31,  32,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,
36
274k
    44,  45,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  60,
37
274k
    61,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,  73,  74,  75,  76,
38
274k
    77,  78,  79,  80,  81,  82,  83,  84,  86,  87,  88,  89,  90,  91,  92,
39
274k
    93,  94,  95,  96,  97,  99,  100, 101, 102, 103, 104, 105, 106, 107, 108,
40
274k
    109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 125,
41
274k
    126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 138, 139, 140, 141,
42
274k
    142, 143, 144, 145, 146, 147, 148, 149, 151, 152, 153, 154, 155, 156, 157,
43
274k
    158, 159, 160, 161, 162, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173,
44
274k
    174, 175, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 190,
45
274k
    191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 203, 204, 205, 206,
46
274k
    207, 208, 209, 210, 211, 212, 213, 214, 216, 217, 218, 219, 220, 221, 222,
47
274k
    223, 224, 225, 226, 227, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238,
48
274k
    239, 240, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 253
49
274k
  };
50
274k
  assert(v < (int)(sizeof(inv_map_table) / sizeof(inv_map_table[0])));
51
274k
  v = inv_map_table[v];
52
274k
  m--;
53
274k
  if ((m << 1) <= MAX_PROB) {
54
187k
    return 1 + inv_recenter_nonneg(v, m);
55
187k
  } else {
56
86.8k
    return MAX_PROB - inv_recenter_nonneg(v, MAX_PROB - 1 - m);
57
86.8k
  }
58
274k
}
59
60
274k
static int decode_term_subexp(vpx_reader *r) {
61
274k
  if (!vpx_read_bit(r)) return vpx_read_literal(r, 4);
62
163k
  if (!vpx_read_bit(r)) return vpx_read_literal(r, 4) + 16;
63
98.6k
  if (!vpx_read_bit(r)) return vpx_read_literal(r, 5) + 32;
64
76.2k
  return decode_uniform(r) + 64;
65
98.6k
}
66
67
19.6M
void vp9_diff_update_prob(vpx_reader *r, vpx_prob *p) {
68
19.6M
  if (vpx_read(r, DIFF_UPDATE_PROB)) {
69
274k
    const int delp = decode_term_subexp(r);
70
274k
    *p = (vpx_prob)inv_remap_prob(delp, *p);
71
274k
  }
72
19.6M
}