Coverage Report

Created: 2026-03-12 06:20

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