Coverage Report

Created: 2026-02-14 06:59

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