Coverage Report

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