Coverage Report

Created: 2026-04-01 07:42

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