Coverage Report

Created: 2026-05-16 07:49

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