Coverage Report

Created: 2026-01-16 07:48

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