Coverage Report

Created: 2026-10-28 08:13

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