Coverage Report

Created: 2026-07-25 07:52

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