Coverage Report

Created: 2026-05-23 07:06

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