Coverage Report

Created: 2025-06-22 08:04

/src/aom/aom_dsp/binary_codes_writer.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright (c) 2017, Alliance for Open Media. All rights reserved.
3
 *
4
 * This source code is subject to the terms of the BSD 2 Clause License and
5
 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6
 * was not distributed with this source code in the LICENSE file, you can
7
 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8
 * Media Patent License 1.0 was not distributed with this source code in the
9
 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10
 */
11
12
#include "aom_dsp/bitwriter.h"
13
#include "aom_dsp/binary_codes_writer.h"
14
#include "aom_dsp/recenter.h"
15
#include "aom_ports/bitops.h"
16
17
// Encodes a value v in [0, n-1] quasi-uniformly
18
0
static void write_primitive_quniform(aom_writer *w, uint16_t n, uint16_t v) {
19
0
  if (n <= 1) return;
20
0
  const int l = get_msb(n) + 1;
21
0
  const int m = (1 << l) - n;
22
0
  if (v < m) {
23
0
    aom_write_literal(w, v, l - 1);
24
0
  } else {
25
0
    aom_write_literal(w, m + ((v - m) >> 1), l - 1);
26
0
    aom_write_bit(w, (v - m) & 1);
27
0
  }
28
0
}
29
30
0
static int count_primitive_quniform(uint16_t n, uint16_t v) {
31
0
  if (n <= 1) return 0;
32
0
  const int l = get_msb(n) + 1;
33
0
  const int m = (1 << l) - n;
34
0
  return v < m ? l - 1 : l;
35
0
}
36
37
// Finite subexponential code that codes a symbol v in [0, n-1] with parameter k
38
static void write_primitive_subexpfin(aom_writer *w, uint16_t n, uint16_t k,
39
0
                                      uint16_t v) {
40
0
  int i = 0;
41
0
  int mk = 0;
42
0
  while (1) {
43
0
    int b = (i ? k + i - 1 : k);
44
0
    int a = (1 << b);
45
0
    if (n <= mk + 3 * a) {
46
0
      write_primitive_quniform(w, n - mk, v - mk);
47
0
      break;
48
0
    } else {
49
0
      int t = (v >= mk + a);
50
0
      aom_write_bit(w, t);
51
0
      if (t) {
52
0
        i = i + 1;
53
0
        mk += a;
54
0
      } else {
55
0
        aom_write_literal(w, v - mk, b);
56
0
        break;
57
0
      }
58
0
    }
59
0
  }
60
0
}
61
62
0
static int count_primitive_subexpfin(uint16_t n, uint16_t k, uint16_t v) {
63
0
  int count = 0;
64
0
  int i = 0;
65
0
  int mk = 0;
66
0
  while (1) {
67
0
    int b = (i ? k + i - 1 : k);
68
0
    int a = (1 << b);
69
0
    if (n <= mk + 3 * a) {
70
0
      count += count_primitive_quniform(n - mk, v - mk);
71
0
      break;
72
0
    } else {
73
0
      int t = (v >= mk + a);
74
0
      count++;
75
0
      if (t) {
76
0
        i = i + 1;
77
0
        mk += a;
78
0
      } else {
79
0
        count += b;
80
0
        break;
81
0
      }
82
0
    }
83
0
  }
84
0
  return count;
85
0
}
86
87
// Finite subexponential code that codes a symbol v in [0, n-1] with parameter k
88
// based on a reference ref also in [0, n-1].
89
// Recenters symbol around r first and then uses a finite subexponential code.
90
void aom_write_primitive_refsubexpfin(aom_writer *w, uint16_t n, uint16_t k,
91
0
                                      uint16_t ref, uint16_t v) {
92
0
  write_primitive_subexpfin(w, n, k, recenter_finite_nonneg(n, ref, v));
93
0
}
94
95
int aom_count_primitive_refsubexpfin(uint16_t n, uint16_t k, uint16_t ref,
96
0
                                     uint16_t v) {
97
0
  return count_primitive_subexpfin(n, k, recenter_finite_nonneg(n, ref, v));
98
0
}
99
100
int aom_count_signed_primitive_refsubexpfin(uint16_t n, uint16_t k, int16_t ref,
101
0
                                            int16_t v) {
102
0
  ref += n - 1;
103
0
  v += n - 1;
104
0
  const uint16_t scaled_n = (n << 1) - 1;
105
0
  return aom_count_primitive_refsubexpfin(scaled_n, k, ref, v);
106
0
}