Coverage Report

Created: 2025-12-31 07:57

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