Coverage Report

Created: 2025-07-23 06:32

/src/aom/av1/common/txb_common.h
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
#ifndef AOM_AV1_COMMON_TXB_COMMON_H_
13
#define AOM_AV1_COMMON_TXB_COMMON_H_
14
15
#include "av1/common/av1_common_int.h"
16
17
extern const int16_t av1_eob_group_start[12];
18
extern const int16_t av1_eob_offset_bits[12];
19
20
extern const int8_t *av1_nz_map_ctx_offset[TX_SIZES_ALL];
21
22
typedef struct txb_ctx {
23
  int txb_skip_ctx;
24
  int dc_sign_ctx;
25
} TXB_CTX;
26
27
static const int base_level_count_to_index[13] = {
28
  0, 0, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,
29
};
30
31
static const TX_CLASS tx_type_to_class[TX_TYPES] = {
32
  TX_CLASS_2D,     // DCT_DCT
33
  TX_CLASS_2D,     // ADST_DCT
34
  TX_CLASS_2D,     // DCT_ADST
35
  TX_CLASS_2D,     // ADST_ADST
36
  TX_CLASS_2D,     // FLIPADST_DCT
37
  TX_CLASS_2D,     // DCT_FLIPADST
38
  TX_CLASS_2D,     // FLIPADST_FLIPADST
39
  TX_CLASS_2D,     // ADST_FLIPADST
40
  TX_CLASS_2D,     // FLIPADST_ADST
41
  TX_CLASS_2D,     // IDTX
42
  TX_CLASS_VERT,   // V_DCT
43
  TX_CLASS_HORIZ,  // H_DCT
44
  TX_CLASS_VERT,   // V_ADST
45
  TX_CLASS_HORIZ,  // H_ADST
46
  TX_CLASS_VERT,   // V_FLIPADST
47
  TX_CLASS_HORIZ,  // H_FLIPADST
48
};
49
50
32.4M
static inline int get_txb_bhl(TX_SIZE tx_size) {
51
32.4M
  tx_size = av1_get_adjusted_tx_size(tx_size);
52
32.4M
  return tx_size_high_log2[tx_size];
53
32.4M
}
decodetxb.c:get_txb_bhl
Line
Count
Source
50
32.4M
static inline int get_txb_bhl(TX_SIZE tx_size) {
51
32.4M
  tx_size = av1_get_adjusted_tx_size(tx_size);
52
32.4M
  return tx_size_high_log2[tx_size];
53
32.4M
}
Unexecuted instantiation: entropy.c:get_txb_bhl
Unexecuted instantiation: entropymode.c:get_txb_bhl
Unexecuted instantiation: txb_common.c:get_txb_bhl
54
55
33.5M
static inline int get_txb_wide(TX_SIZE tx_size) {
56
33.5M
  tx_size = av1_get_adjusted_tx_size(tx_size);
57
33.5M
  return tx_size_wide[tx_size];
58
33.5M
}
decodetxb.c:get_txb_wide
Line
Count
Source
55
33.5M
static inline int get_txb_wide(TX_SIZE tx_size) {
56
33.5M
  tx_size = av1_get_adjusted_tx_size(tx_size);
57
33.5M
  return tx_size_wide[tx_size];
58
33.5M
}
Unexecuted instantiation: entropy.c:get_txb_wide
Unexecuted instantiation: entropymode.c:get_txb_wide
Unexecuted instantiation: txb_common.c:get_txb_wide
59
60
31.5M
static inline int get_txb_high(TX_SIZE tx_size) {
61
31.5M
  tx_size = av1_get_adjusted_tx_size(tx_size);
62
31.5M
  return tx_size_high[tx_size];
63
31.5M
}
decodetxb.c:get_txb_high
Line
Count
Source
60
31.5M
static inline int get_txb_high(TX_SIZE tx_size) {
61
31.5M
  tx_size = av1_get_adjusted_tx_size(tx_size);
62
31.5M
  return tx_size_high[tx_size];
63
31.5M
}
Unexecuted instantiation: entropy.c:get_txb_high
Unexecuted instantiation: entropymode.c:get_txb_high
Unexecuted instantiation: txb_common.c:get_txb_high
64
65
30.4M
static inline uint8_t *set_levels(uint8_t *const levels_buf, const int height) {
66
30.4M
  return levels_buf + TX_PAD_TOP * (height + TX_PAD_HOR);
67
30.4M
}
decodetxb.c:set_levels
Line
Count
Source
65
30.4M
static inline uint8_t *set_levels(uint8_t *const levels_buf, const int height) {
66
30.4M
  return levels_buf + TX_PAD_TOP * (height + TX_PAD_HOR);
67
30.4M
}
Unexecuted instantiation: entropy.c:set_levels
Unexecuted instantiation: entropymode.c:set_levels
Unexecuted instantiation: txb_common.c:set_levels
68
69
664M
static inline int get_padded_idx(const int idx, const int bhl) {
70
664M
  return idx + ((idx >> bhl) << TX_PAD_HOR_LOG2);
71
664M
}
decodetxb.c:get_padded_idx
Line
Count
Source
69
664M
static inline int get_padded_idx(const int idx, const int bhl) {
70
664M
  return idx + ((idx >> bhl) << TX_PAD_HOR_LOG2);
71
664M
}
Unexecuted instantiation: entropy.c:get_padded_idx
Unexecuted instantiation: entropymode.c:get_padded_idx
Unexecuted instantiation: txb_common.c:get_padded_idx
72
73
static inline int get_br_ctx_2d(const uint8_t *const levels,
74
                                const int c,  // raster order
75
13.0M
                                const int bhl) {
76
13.0M
  assert(c > 0);
77
13.0M
  const int col = c >> bhl;
78
13.0M
  const int row = c - (col << bhl);
79
13.0M
  const int stride = (1 << bhl) + TX_PAD_HOR;
80
13.0M
  const int pos = col * stride + row;
81
13.0M
  int mag = AOMMIN(levels[pos + 1], MAX_BASE_BR_RANGE) +
82
13.0M
            AOMMIN(levels[pos + stride], MAX_BASE_BR_RANGE) +
83
13.0M
            AOMMIN(levels[pos + 1 + stride], MAX_BASE_BR_RANGE);
84
13.0M
  mag = AOMMIN((mag + 1) >> 1, 6);
85
  //((row | col) < 2) is equivalent to ((row < 2) && (col < 2))
86
13.0M
  if ((row | col) < 2) return mag + 7;
87
9.84M
  return mag + 14;
88
13.0M
}
decodetxb.c:get_br_ctx_2d
Line
Count
Source
75
13.0M
                                const int bhl) {
76
13.0M
  assert(c > 0);
77
13.0M
  const int col = c >> bhl;
78
13.0M
  const int row = c - (col << bhl);
79
13.0M
  const int stride = (1 << bhl) + TX_PAD_HOR;
80
13.0M
  const int pos = col * stride + row;
81
13.0M
  int mag = AOMMIN(levels[pos + 1], MAX_BASE_BR_RANGE) +
82
13.0M
            AOMMIN(levels[pos + stride], MAX_BASE_BR_RANGE) +
83
13.0M
            AOMMIN(levels[pos + 1 + stride], MAX_BASE_BR_RANGE);
84
13.0M
  mag = AOMMIN((mag + 1) >> 1, 6);
85
  //((row | col) < 2) is equivalent to ((row < 2) && (col < 2))
86
13.0M
  if ((row | col) < 2) return mag + 7;
87
9.84M
  return mag + 14;
88
13.0M
}
Unexecuted instantiation: entropy.c:get_br_ctx_2d
Unexecuted instantiation: entropymode.c:get_br_ctx_2d
Unexecuted instantiation: txb_common.c:get_br_ctx_2d
89
90
static AOM_FORCE_INLINE int get_br_ctx_eob(const int c,  // raster order
91
                                           const int bhl,
92
619k
                                           const TX_CLASS tx_class) {
93
619k
  const int col = c >> bhl;
94
619k
  const int row = c - (col << bhl);
95
619k
  if (c == 0) return 0;
96
271k
  if ((tx_class == TX_CLASS_2D && row < 2 && col < 2) ||
97
271k
      (tx_class == TX_CLASS_HORIZ && col == 0) ||
98
271k
      (tx_class == TX_CLASS_VERT && row == 0))
99
20.4k
    return 7;
100
251k
  return 14;
101
271k
}
decodetxb.c:get_br_ctx_eob
Line
Count
Source
92
619k
                                           const TX_CLASS tx_class) {
93
619k
  const int col = c >> bhl;
94
619k
  const int row = c - (col << bhl);
95
619k
  if (c == 0) return 0;
96
271k
  if ((tx_class == TX_CLASS_2D && row < 2 && col < 2) ||
97
271k
      (tx_class == TX_CLASS_HORIZ && col == 0) ||
98
271k
      (tx_class == TX_CLASS_VERT && row == 0))
99
20.4k
    return 7;
100
251k
  return 14;
101
271k
}
Unexecuted instantiation: entropy.c:get_br_ctx_eob
Unexecuted instantiation: entropymode.c:get_br_ctx_eob
Unexecuted instantiation: txb_common.c:get_br_ctx_eob
102
103
static AOM_FORCE_INLINE int get_br_ctx(const uint8_t *const levels,
104
                                       const int c,  // raster order
105
4.33M
                                       const int bhl, const TX_CLASS tx_class) {
106
4.33M
  const int col = c >> bhl;
107
4.33M
  const int row = c - (col << bhl);
108
4.33M
  const int stride = (1 << bhl) + TX_PAD_HOR;
109
4.33M
  const int pos = col * stride + row;
110
4.33M
  int mag = levels[pos + 1];
111
4.33M
  mag += levels[pos + stride];
112
4.33M
  switch (tx_class) {
113
3.51M
    case TX_CLASS_2D:
114
3.51M
      mag += levels[pos + stride + 1];
115
3.51M
      mag = AOMMIN((mag + 1) >> 1, 6);
116
3.51M
      if (c == 0) return mag;
117
18.4E
      if ((row < 2) && (col < 2)) return mag + 7;
118
18.4E
      break;
119
18.4E
    case TX_CLASS_HORIZ:
120
566k
      mag += levels[pos + (stride << 1)];
121
566k
      mag = AOMMIN((mag + 1) >> 1, 6);
122
566k
      if (c == 0) return mag;
123
509k
      if (col == 0) return mag + 7;
124
288k
      break;
125
288k
    case TX_CLASS_VERT:
126
257k
      mag += levels[pos + 2];
127
257k
      mag = AOMMIN((mag + 1) >> 1, 6);
128
257k
      if (c == 0) return mag;
129
229k
      if (row == 0) return mag + 7;
130
122k
      break;
131
122k
    default: break;
132
4.33M
  }
133
134
411k
  return mag + 14;
135
4.33M
}
decodetxb.c:get_br_ctx
Line
Count
Source
105
4.33M
                                       const int bhl, const TX_CLASS tx_class) {
106
4.33M
  const int col = c >> bhl;
107
4.33M
  const int row = c - (col << bhl);
108
4.33M
  const int stride = (1 << bhl) + TX_PAD_HOR;
109
4.33M
  const int pos = col * stride + row;
110
4.33M
  int mag = levels[pos + 1];
111
4.33M
  mag += levels[pos + stride];
112
4.33M
  switch (tx_class) {
113
3.51M
    case TX_CLASS_2D:
114
3.51M
      mag += levels[pos + stride + 1];
115
3.51M
      mag = AOMMIN((mag + 1) >> 1, 6);
116
3.51M
      if (c == 0) return mag;
117
18.4E
      if ((row < 2) && (col < 2)) return mag + 7;
118
18.4E
      break;
119
18.4E
    case TX_CLASS_HORIZ:
120
566k
      mag += levels[pos + (stride << 1)];
121
566k
      mag = AOMMIN((mag + 1) >> 1, 6);
122
566k
      if (c == 0) return mag;
123
509k
      if (col == 0) return mag + 7;
124
288k
      break;
125
288k
    case TX_CLASS_VERT:
126
257k
      mag += levels[pos + 2];
127
257k
      mag = AOMMIN((mag + 1) >> 1, 6);
128
257k
      if (c == 0) return mag;
129
229k
      if (row == 0) return mag + 7;
130
122k
      break;
131
122k
    default: break;
132
4.33M
  }
133
134
411k
  return mag + 14;
135
4.33M
}
Unexecuted instantiation: entropy.c:get_br_ctx
Unexecuted instantiation: entropymode.c:get_br_ctx
Unexecuted instantiation: txb_common.c:get_br_ctx
136
137
static const uint8_t clip_max3[256] = {
138
  0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
139
  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
140
  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
141
  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
142
  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
143
  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
144
  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
145
  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
146
  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
147
  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
148
};
149
150
static AOM_FORCE_INLINE int get_nz_mag(const uint8_t *const levels,
151
25.9M
                                       const int bhl, const TX_CLASS tx_class) {
152
25.9M
  int mag;
153
154
  // Note: AOMMIN(level, 3) is useless for decoder since level < 3.
155
25.9M
  mag = clip_max3[levels[(1 << bhl) + TX_PAD_HOR]];  // { 0, 1 }
156
25.9M
  mag += clip_max3[levels[1]];                       // { 1, 0 }
157
158
25.9M
  if (tx_class == TX_CLASS_2D) {
159
9.47M
    mag += clip_max3[levels[(1 << bhl) + TX_PAD_HOR + 1]];          // { 1, 1 }
160
9.47M
    mag += clip_max3[levels[(2 << bhl) + (2 << TX_PAD_HOR_LOG2)]];  // { 0, 2 }
161
9.47M
    mag += clip_max3[levels[2]];                                    // { 2, 0 }
162
16.4M
  } else if (tx_class == TX_CLASS_VERT) {
163
5.30M
    mag += clip_max3[levels[2]];  // { 2, 0 }
164
5.30M
    mag += clip_max3[levels[3]];  // { 3, 0 }
165
5.30M
    mag += clip_max3[levels[4]];  // { 4, 0 }
166
11.1M
  } else {
167
11.1M
    mag += clip_max3[levels[(2 << bhl) + (2 << TX_PAD_HOR_LOG2)]];  // { 0, 2 }
168
11.1M
    mag += clip_max3[levels[(3 << bhl) + (3 << TX_PAD_HOR_LOG2)]];  // { 0, 3 }
169
11.1M
    mag += clip_max3[levels[(4 << bhl) + (4 << TX_PAD_HOR_LOG2)]];  // { 0, 4 }
170
11.1M
  }
171
172
25.9M
  return mag;
173
25.9M
}
decodetxb.c:get_nz_mag
Line
Count
Source
151
25.9M
                                       const int bhl, const TX_CLASS tx_class) {
152
25.9M
  int mag;
153
154
  // Note: AOMMIN(level, 3) is useless for decoder since level < 3.
155
25.9M
  mag = clip_max3[levels[(1 << bhl) + TX_PAD_HOR]];  // { 0, 1 }
156
25.9M
  mag += clip_max3[levels[1]];                       // { 1, 0 }
157
158
25.9M
  if (tx_class == TX_CLASS_2D) {
159
9.47M
    mag += clip_max3[levels[(1 << bhl) + TX_PAD_HOR + 1]];          // { 1, 1 }
160
9.47M
    mag += clip_max3[levels[(2 << bhl) + (2 << TX_PAD_HOR_LOG2)]];  // { 0, 2 }
161
9.47M
    mag += clip_max3[levels[2]];                                    // { 2, 0 }
162
16.4M
  } else if (tx_class == TX_CLASS_VERT) {
163
5.30M
    mag += clip_max3[levels[2]];  // { 2, 0 }
164
5.30M
    mag += clip_max3[levels[3]];  // { 3, 0 }
165
5.30M
    mag += clip_max3[levels[4]];  // { 4, 0 }
166
11.1M
  } else {
167
11.1M
    mag += clip_max3[levels[(2 << bhl) + (2 << TX_PAD_HOR_LOG2)]];  // { 0, 2 }
168
11.1M
    mag += clip_max3[levels[(3 << bhl) + (3 << TX_PAD_HOR_LOG2)]];  // { 0, 3 }
169
11.1M
    mag += clip_max3[levels[(4 << bhl) + (4 << TX_PAD_HOR_LOG2)]];  // { 0, 4 }
170
11.1M
  }
171
172
25.9M
  return mag;
173
25.9M
}
Unexecuted instantiation: entropy.c:get_nz_mag
Unexecuted instantiation: entropymode.c:get_nz_mag
Unexecuted instantiation: txb_common.c:get_nz_mag
174
175
#define NZ_MAP_CTX_0 SIG_COEF_CONTEXTS_2D
176
#define NZ_MAP_CTX_5 (NZ_MAP_CTX_0 + 5)
177
#define NZ_MAP_CTX_10 (NZ_MAP_CTX_0 + 10)
178
179
static const int nz_map_ctx_offset_1d[32] = {
180
  NZ_MAP_CTX_0,  NZ_MAP_CTX_5,  NZ_MAP_CTX_10, NZ_MAP_CTX_10, NZ_MAP_CTX_10,
181
  NZ_MAP_CTX_10, NZ_MAP_CTX_10, NZ_MAP_CTX_10, NZ_MAP_CTX_10, NZ_MAP_CTX_10,
182
  NZ_MAP_CTX_10, NZ_MAP_CTX_10, NZ_MAP_CTX_10, NZ_MAP_CTX_10, NZ_MAP_CTX_10,
183
  NZ_MAP_CTX_10, NZ_MAP_CTX_10, NZ_MAP_CTX_10, NZ_MAP_CTX_10, NZ_MAP_CTX_10,
184
  NZ_MAP_CTX_10, NZ_MAP_CTX_10, NZ_MAP_CTX_10, NZ_MAP_CTX_10, NZ_MAP_CTX_10,
185
  NZ_MAP_CTX_10, NZ_MAP_CTX_10, NZ_MAP_CTX_10, NZ_MAP_CTX_10, NZ_MAP_CTX_10,
186
  NZ_MAP_CTX_10, NZ_MAP_CTX_10,
187
};
188
189
static AOM_FORCE_INLINE int get_nz_map_ctx_from_stats(
190
    const int stats,
191
    const int coeff_idx,  // raster order
192
25.9M
    const int bhl, const TX_SIZE tx_size, const TX_CLASS tx_class) {
193
  // tx_class == 0(TX_CLASS_2D)
194
25.9M
  if ((tx_class | coeff_idx) == 0) return 0;
195
16.4M
  int ctx = (stats + 1) >> 1;
196
16.4M
  ctx = AOMMIN(ctx, 4);
197
16.4M
  switch (tx_class) {
198
0
    case TX_CLASS_2D: {
199
      // This is the algorithm to generate av1_nz_map_ctx_offset[][]
200
      //   const int width = tx_size_wide[tx_size];
201
      //   const int height = tx_size_high[tx_size];
202
      //   if (width < height) {
203
      //     if (row < 2) return 11 + ctx;
204
      //   } else if (width > height) {
205
      //     if (col < 2) return 16 + ctx;
206
      //   }
207
      //   if (row + col < 2) return ctx + 1;
208
      //   if (row + col < 4) return 5 + ctx + 1;
209
      //   return 21 + ctx;
210
0
      return ctx + av1_nz_map_ctx_offset[tx_size][coeff_idx];
211
0
    }
212
11.2M
    case TX_CLASS_HORIZ: {
213
11.2M
      const int col = coeff_idx >> bhl;
214
11.2M
      return ctx + nz_map_ctx_offset_1d[col];
215
0
    }
216
5.30M
    case TX_CLASS_VERT: {
217
5.30M
      const int col = coeff_idx >> bhl;
218
5.30M
      const int row = coeff_idx - (col << bhl);
219
5.30M
      return ctx + nz_map_ctx_offset_1d[row];
220
0
    }
221
0
    default: break;
222
16.4M
  }
223
0
  return 0;
224
16.4M
}
decodetxb.c:get_nz_map_ctx_from_stats
Line
Count
Source
192
25.9M
    const int bhl, const TX_SIZE tx_size, const TX_CLASS tx_class) {
193
  // tx_class == 0(TX_CLASS_2D)
194
25.9M
  if ((tx_class | coeff_idx) == 0) return 0;
195
16.4M
  int ctx = (stats + 1) >> 1;
196
16.4M
  ctx = AOMMIN(ctx, 4);
197
16.4M
  switch (tx_class) {
198
0
    case TX_CLASS_2D: {
199
      // This is the algorithm to generate av1_nz_map_ctx_offset[][]
200
      //   const int width = tx_size_wide[tx_size];
201
      //   const int height = tx_size_high[tx_size];
202
      //   if (width < height) {
203
      //     if (row < 2) return 11 + ctx;
204
      //   } else if (width > height) {
205
      //     if (col < 2) return 16 + ctx;
206
      //   }
207
      //   if (row + col < 2) return ctx + 1;
208
      //   if (row + col < 4) return 5 + ctx + 1;
209
      //   return 21 + ctx;
210
0
      return ctx + av1_nz_map_ctx_offset[tx_size][coeff_idx];
211
0
    }
212
11.2M
    case TX_CLASS_HORIZ: {
213
11.2M
      const int col = coeff_idx >> bhl;
214
11.2M
      return ctx + nz_map_ctx_offset_1d[col];
215
0
    }
216
5.30M
    case TX_CLASS_VERT: {
217
5.30M
      const int col = coeff_idx >> bhl;
218
5.30M
      const int row = coeff_idx - (col << bhl);
219
5.30M
      return ctx + nz_map_ctx_offset_1d[row];
220
0
    }
221
0
    default: break;
222
16.4M
  }
223
0
  return 0;
224
16.4M
}
Unexecuted instantiation: entropy.c:get_nz_map_ctx_from_stats
Unexecuted instantiation: entropymode.c:get_nz_map_ctx_from_stats
Unexecuted instantiation: txb_common.c:get_nz_map_ctx_from_stats
225
226
typedef aom_cdf_prob (*base_cdf_arr)[CDF_SIZE(4)];
227
typedef aom_cdf_prob (*br_cdf_arr)[CDF_SIZE(BR_CDF_SIZE)];
228
229
20.4M
static inline int get_lower_levels_ctx_eob(int bhl, int width, int scan_idx) {
230
20.4M
  if (scan_idx == 0) return 0;
231
10.2M
  if (scan_idx <= (width << bhl) / 8) return 1;
232
5.91M
  if (scan_idx <= (width << bhl) / 4) return 2;
233
4.49M
  return 3;
234
5.91M
}
decodetxb.c:get_lower_levels_ctx_eob
Line
Count
Source
229
20.4M
static inline int get_lower_levels_ctx_eob(int bhl, int width, int scan_idx) {
230
20.4M
  if (scan_idx == 0) return 0;
231
10.2M
  if (scan_idx <= (width << bhl) / 8) return 1;
232
5.91M
  if (scan_idx <= (width << bhl) / 4) return 2;
233
4.49M
  return 3;
234
5.91M
}
Unexecuted instantiation: entropy.c:get_lower_levels_ctx_eob
Unexecuted instantiation: entropymode.c:get_lower_levels_ctx_eob
Unexecuted instantiation: txb_common.c:get_lower_levels_ctx_eob
235
236
static inline int get_lower_levels_ctx_2d(const uint8_t *levels, int coeff_idx,
237
190M
                                          int bhl, TX_SIZE tx_size) {
238
190M
  assert(coeff_idx > 0);
239
190M
  int mag;
240
  // Note: AOMMIN(level, 3) is useless for decoder since level < 3.
241
190M
  levels = levels + get_padded_idx(coeff_idx, bhl);
242
190M
  mag = AOMMIN(levels[(1 << bhl) + TX_PAD_HOR], 3);               // { 0, 1 }
243
190M
  mag += AOMMIN(levels[1], 3);                                    // { 1, 0 }
244
190M
  mag += AOMMIN(levels[(1 << bhl) + TX_PAD_HOR + 1], 3);          // { 1, 1 }
245
190M
  mag += AOMMIN(levels[(2 << bhl) + (2 << TX_PAD_HOR_LOG2)], 3);  // { 0, 2 }
246
190M
  mag += AOMMIN(levels[2], 3);                                    // { 2, 0 }
247
248
190M
  const int ctx = AOMMIN((mag + 1) >> 1, 4);
249
190M
  return ctx + av1_nz_map_ctx_offset[tx_size][coeff_idx];
250
190M
}
decodetxb.c:get_lower_levels_ctx_2d
Line
Count
Source
237
190M
                                          int bhl, TX_SIZE tx_size) {
238
190M
  assert(coeff_idx > 0);
239
190M
  int mag;
240
  // Note: AOMMIN(level, 3) is useless for decoder since level < 3.
241
190M
  levels = levels + get_padded_idx(coeff_idx, bhl);
242
190M
  mag = AOMMIN(levels[(1 << bhl) + TX_PAD_HOR], 3);               // { 0, 1 }
243
190M
  mag += AOMMIN(levels[1], 3);                                    // { 1, 0 }
244
190M
  mag += AOMMIN(levels[(1 << bhl) + TX_PAD_HOR + 1], 3);          // { 1, 1 }
245
190M
  mag += AOMMIN(levels[(2 << bhl) + (2 << TX_PAD_HOR_LOG2)], 3);  // { 0, 2 }
246
190M
  mag += AOMMIN(levels[2], 3);                                    // { 2, 0 }
247
248
190M
  const int ctx = AOMMIN((mag + 1) >> 1, 4);
249
190M
  return ctx + av1_nz_map_ctx_offset[tx_size][coeff_idx];
250
190M
}
Unexecuted instantiation: entropy.c:get_lower_levels_ctx_2d
Unexecuted instantiation: entropymode.c:get_lower_levels_ctx_2d
Unexecuted instantiation: txb_common.c:get_lower_levels_ctx_2d
251
static AOM_FORCE_INLINE int get_lower_levels_ctx(const uint8_t *levels,
252
                                                 int coeff_idx, int bhl,
253
                                                 TX_SIZE tx_size,
254
25.9M
                                                 TX_CLASS tx_class) {
255
25.9M
  const int stats =
256
25.9M
      get_nz_mag(levels + get_padded_idx(coeff_idx, bhl), bhl, tx_class);
257
25.9M
  return get_nz_map_ctx_from_stats(stats, coeff_idx, bhl, tx_size, tx_class);
258
25.9M
}
decodetxb.c:get_lower_levels_ctx
Line
Count
Source
254
25.9M
                                                 TX_CLASS tx_class) {
255
25.9M
  const int stats =
256
25.9M
      get_nz_mag(levels + get_padded_idx(coeff_idx, bhl), bhl, tx_class);
257
25.9M
  return get_nz_map_ctx_from_stats(stats, coeff_idx, bhl, tx_size, tx_class);
258
25.9M
}
Unexecuted instantiation: entropy.c:get_lower_levels_ctx
Unexecuted instantiation: entropymode.c:get_lower_levels_ctx
Unexecuted instantiation: txb_common.c:get_lower_levels_ctx
259
260
static inline int get_lower_levels_ctx_general(int is_last, int scan_idx,
261
                                               int bhl, int width,
262
                                               const uint8_t *levels,
263
                                               int coeff_idx, TX_SIZE tx_size,
264
0
                                               TX_CLASS tx_class) {
265
0
  if (is_last) {
266
0
    if (scan_idx == 0) return 0;
267
0
    if (scan_idx <= (width << bhl) >> 3) return 1;
268
0
    if (scan_idx <= (width << bhl) >> 2) return 2;
269
0
    return 3;
270
0
  }
271
0
  return get_lower_levels_ctx(levels, coeff_idx, bhl, tx_size, tx_class);
272
0
}
Unexecuted instantiation: decodetxb.c:get_lower_levels_ctx_general
Unexecuted instantiation: entropy.c:get_lower_levels_ctx_general
Unexecuted instantiation: entropymode.c:get_lower_levels_ctx_general
Unexecuted instantiation: txb_common.c:get_lower_levels_ctx_general
273
274
20.3M
static inline void set_dc_sign(int *cul_level, int dc_val) {
275
20.3M
  if (dc_val < 0)
276
4.95M
    *cul_level |= 1 << COEFF_CONTEXT_BITS;
277
15.3M
  else if (dc_val > 0)
278
12.6M
    *cul_level += 2 << COEFF_CONTEXT_BITS;
279
20.3M
}
decodetxb.c:set_dc_sign
Line
Count
Source
274
20.3M
static inline void set_dc_sign(int *cul_level, int dc_val) {
275
20.3M
  if (dc_val < 0)
276
4.95M
    *cul_level |= 1 << COEFF_CONTEXT_BITS;
277
15.3M
  else if (dc_val > 0)
278
12.6M
    *cul_level += 2 << COEFF_CONTEXT_BITS;
279
20.3M
}
Unexecuted instantiation: entropy.c:set_dc_sign
Unexecuted instantiation: entropymode.c:set_dc_sign
Unexecuted instantiation: txb_common.c:set_dc_sign
280
281
static void get_txb_ctx_general(const BLOCK_SIZE plane_bsize,
282
                                const TX_SIZE tx_size, const int plane,
283
                                const ENTROPY_CONTEXT *const a,
284
                                const ENTROPY_CONTEXT *const l,
285
12.5M
                                TXB_CTX *const txb_ctx) {
286
32.7M
#define MAX_TX_SIZE_UNIT 16
287
12.5M
  static const int8_t signs[3] = { 0, -1, 1 };
288
12.5M
  static const int8_t dc_sign_contexts[4 * MAX_TX_SIZE_UNIT + 1] = {
289
12.5M
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
290
12.5M
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
291
12.5M
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
292
12.5M
  };
293
12.5M
  const int txb_w_unit = tx_size_wide_unit[tx_size];
294
12.5M
  const int txb_h_unit = tx_size_high_unit[tx_size];
295
12.5M
  int dc_sign = 0;
296
12.5M
  int k = 0;
297
298
56.5M
  do {
299
56.5M
    const unsigned int sign = ((uint8_t)a[k]) >> COEFF_CONTEXT_BITS;
300
56.5M
    assert(sign <= 2);
301
56.5M
    dc_sign += signs[sign];
302
56.5M
  } while (++k < txb_w_unit);
303
304
12.5M
  k = 0;
305
38.3M
  do {
306
38.3M
    const unsigned int sign = ((uint8_t)l[k]) >> COEFF_CONTEXT_BITS;
307
38.3M
    assert(sign <= 2);
308
38.3M
    dc_sign += signs[sign];
309
38.3M
  } while (++k < txb_h_unit);
310
311
12.5M
  txb_ctx->dc_sign_ctx = dc_sign_contexts[dc_sign + 2 * MAX_TX_SIZE_UNIT];
312
313
12.5M
  if (plane == 0) {
314
5.09M
    if (plane_bsize == txsize_to_bsize[tx_size]) {
315
4.27M
      txb_ctx->txb_skip_ctx = 0;
316
4.27M
    } else {
317
      // This is the algorithm to generate table skip_contexts[top][left].
318
      //    const int max = AOMMIN(top | left, 4);
319
      //    const int min = AOMMIN(AOMMIN(top, left), 4);
320
      //    if (!max)
321
      //      txb_skip_ctx = 1;
322
      //    else if (!min)
323
      //      txb_skip_ctx = 2 + (max > 3);
324
      //    else if (max <= 3)
325
      //      txb_skip_ctx = 4;
326
      //    else if (min <= 3)
327
      //      txb_skip_ctx = 5;
328
      //    else
329
      //      txb_skip_ctx = 6;
330
820k
      static const uint8_t skip_contexts[5][5] = { { 1, 2, 2, 2, 3 },
331
820k
                                                   { 2, 4, 4, 4, 5 },
332
820k
                                                   { 2, 4, 4, 4, 5 },
333
820k
                                                   { 2, 4, 4, 4, 5 },
334
820k
                                                   { 3, 5, 5, 5, 6 } };
335
      // For top and left, we only care about which of the following three
336
      // categories they belong to: { 0 }, { 1, 2, 3 }, or { 4, 5, ... }. The
337
      // spec calculates top and left with the Max() function. We can calculate
338
      // an approximate max with bitwise OR because the real max and the
339
      // approximate max belong to the same category.
340
820k
      int top = 0;
341
820k
      int left = 0;
342
343
820k
      k = 0;
344
8.23M
      do {
345
8.23M
        top |= a[k];
346
8.23M
      } while (++k < txb_w_unit);
347
820k
      top &= COEFF_CONTEXT_MASK;
348
820k
      top = AOMMIN(top, 4);
349
350
820k
      k = 0;
351
8.15M
      do {
352
8.15M
        left |= l[k];
353
8.15M
      } while (++k < txb_h_unit);
354
820k
      left &= COEFF_CONTEXT_MASK;
355
820k
      left = AOMMIN(left, 4);
356
357
820k
      txb_ctx->txb_skip_ctx = skip_contexts[top][left];
358
820k
    }
359
7.50M
  } else {
360
7.50M
    const int ctx_base = get_entropy_context(tx_size, a, l);
361
7.50M
    const int ctx_offset = (num_pels_log2_lookup[plane_bsize] >
362
7.50M
                            num_pels_log2_lookup[txsize_to_bsize[tx_size]])
363
7.50M
                               ? 10
364
7.50M
                               : 7;
365
7.50M
    txb_ctx->txb_skip_ctx = ctx_base + ctx_offset;
366
7.50M
  }
367
12.5M
}
decodetxb.c:get_txb_ctx_general
Line
Count
Source
285
12.5M
                                TXB_CTX *const txb_ctx) {
286
12.5M
#define MAX_TX_SIZE_UNIT 16
287
12.5M
  static const int8_t signs[3] = { 0, -1, 1 };
288
12.5M
  static const int8_t dc_sign_contexts[4 * MAX_TX_SIZE_UNIT + 1] = {
289
12.5M
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
290
12.5M
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
291
12.5M
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
292
12.5M
  };
293
12.5M
  const int txb_w_unit = tx_size_wide_unit[tx_size];
294
12.5M
  const int txb_h_unit = tx_size_high_unit[tx_size];
295
12.5M
  int dc_sign = 0;
296
12.5M
  int k = 0;
297
298
56.5M
  do {
299
56.5M
    const unsigned int sign = ((uint8_t)a[k]) >> COEFF_CONTEXT_BITS;
300
56.5M
    assert(sign <= 2);
301
56.5M
    dc_sign += signs[sign];
302
56.5M
  } while (++k < txb_w_unit);
303
304
12.5M
  k = 0;
305
38.3M
  do {
306
38.3M
    const unsigned int sign = ((uint8_t)l[k]) >> COEFF_CONTEXT_BITS;
307
38.3M
    assert(sign <= 2);
308
38.3M
    dc_sign += signs[sign];
309
38.3M
  } while (++k < txb_h_unit);
310
311
12.5M
  txb_ctx->dc_sign_ctx = dc_sign_contexts[dc_sign + 2 * MAX_TX_SIZE_UNIT];
312
313
12.5M
  if (plane == 0) {
314
5.09M
    if (plane_bsize == txsize_to_bsize[tx_size]) {
315
4.27M
      txb_ctx->txb_skip_ctx = 0;
316
4.27M
    } else {
317
      // This is the algorithm to generate table skip_contexts[top][left].
318
      //    const int max = AOMMIN(top | left, 4);
319
      //    const int min = AOMMIN(AOMMIN(top, left), 4);
320
      //    if (!max)
321
      //      txb_skip_ctx = 1;
322
      //    else if (!min)
323
      //      txb_skip_ctx = 2 + (max > 3);
324
      //    else if (max <= 3)
325
      //      txb_skip_ctx = 4;
326
      //    else if (min <= 3)
327
      //      txb_skip_ctx = 5;
328
      //    else
329
      //      txb_skip_ctx = 6;
330
820k
      static const uint8_t skip_contexts[5][5] = { { 1, 2, 2, 2, 3 },
331
820k
                                                   { 2, 4, 4, 4, 5 },
332
820k
                                                   { 2, 4, 4, 4, 5 },
333
820k
                                                   { 2, 4, 4, 4, 5 },
334
820k
                                                   { 3, 5, 5, 5, 6 } };
335
      // For top and left, we only care about which of the following three
336
      // categories they belong to: { 0 }, { 1, 2, 3 }, or { 4, 5, ... }. The
337
      // spec calculates top and left with the Max() function. We can calculate
338
      // an approximate max with bitwise OR because the real max and the
339
      // approximate max belong to the same category.
340
820k
      int top = 0;
341
820k
      int left = 0;
342
343
820k
      k = 0;
344
8.23M
      do {
345
8.23M
        top |= a[k];
346
8.23M
      } while (++k < txb_w_unit);
347
820k
      top &= COEFF_CONTEXT_MASK;
348
820k
      top = AOMMIN(top, 4);
349
350
820k
      k = 0;
351
8.15M
      do {
352
8.15M
        left |= l[k];
353
8.15M
      } while (++k < txb_h_unit);
354
820k
      left &= COEFF_CONTEXT_MASK;
355
820k
      left = AOMMIN(left, 4);
356
357
820k
      txb_ctx->txb_skip_ctx = skip_contexts[top][left];
358
820k
    }
359
7.50M
  } else {
360
7.50M
    const int ctx_base = get_entropy_context(tx_size, a, l);
361
7.50M
    const int ctx_offset = (num_pels_log2_lookup[plane_bsize] >
362
7.50M
                            num_pels_log2_lookup[txsize_to_bsize[tx_size]])
363
7.50M
                               ? 10
364
7.50M
                               : 7;
365
7.50M
    txb_ctx->txb_skip_ctx = ctx_base + ctx_offset;
366
7.50M
  }
367
12.5M
}
Unexecuted instantiation: entropy.c:get_txb_ctx_general
Unexecuted instantiation: entropymode.c:get_txb_ctx_general
Unexecuted instantiation: txb_common.c:get_txb_ctx_general
368
369
#define SPECIALIZE_GET_TXB_CTX(w, h)                                          \
370
  static void get_txb_ctx_##w##x##h(                                          \
371
      const BLOCK_SIZE plane_bsize, const int plane,                          \
372
      const ENTROPY_CONTEXT *const a, const ENTROPY_CONTEXT *const l,         \
373
20.0M
      TXB_CTX *const txb_ctx) {                                               \
374
20.0M
    static const int8_t signs[3] = { 0, -1, 1 };                              \
375
20.0M
    static const int8_t dc_sign_contexts[4 * MAX_TX_SIZE_UNIT + 1] = {        \
376
20.0M
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,       \
377
20.0M
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,       \
378
20.0M
      2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2           \
379
20.0M
    };                                                                        \
380
20.0M
    const TX_SIZE tx_size = TX_##w##X##h;                                     \
381
20.0M
    const int txb_w_unit = tx_size_wide_unit[tx_size];                        \
382
20.0M
    const int txb_h_unit = tx_size_high_unit[tx_size];                        \
383
20.0M
    int dc_sign = 0;                                                          \
384
20.0M
    int k = 0;                                                                \
385
20.0M
                                                                              \
386
45.1M
    do {                                                                      \
387
45.1M
      const unsigned int sign = ((uint8_t)a[k]) >> COEFF_CONTEXT_BITS;        \
388
45.1M
      assert(sign <= 2);                                                      \
389
45.1M
      dc_sign += signs[sign];                                                 \
390
45.1M
    } while (++k < txb_w_unit);                                               \
391
20.0M
                                                                              \
392
20.0M
    k = 0;                                                                    \
393
45.1M
    do {                                                                      \
394
45.1M
      const unsigned int sign = ((uint8_t)l[k]) >> COEFF_CONTEXT_BITS;        \
395
45.1M
      assert(sign <= 2);                                                      \
396
45.2M
      dc_sign += signs[sign];                                                 \
397
45.2M
    } while (++k < txb_h_unit);                                               \
398
20.0M
                                                                              \
399
20.1M
    txb_ctx->dc_sign_ctx = dc_sign_contexts[dc_sign + 2 * MAX_TX_SIZE_UNIT];  \
400
20.1M
                                                                              \
401
20.1M
    if (plane == 0) {                                                         \
402
9.71M
      if (plane_bsize == txsize_to_bsize[tx_size]) {                          \
403
2.55M
        txb_ctx->txb_skip_ctx = 0;                                            \
404
7.16M
      } else {                                                                \
405
7.16M
        static const uint8_t skip_contexts[5][5] = { { 1, 2, 2, 2, 3 },       \
406
7.16M
                                                     { 2, 4, 4, 4, 5 },       \
407
7.16M
                                                     { 2, 4, 4, 4, 5 },       \
408
7.16M
                                                     { 2, 4, 4, 4, 5 },       \
409
7.16M
                                                     { 3, 5, 5, 5, 6 } };     \
410
7.16M
        int top = 0;                                                          \
411
7.16M
        int left = 0;                                                         \
412
7.16M
                                                                              \
413
7.16M
        k = 0;                                                                \
414
9.86M
        do {                                                                  \
415
9.86M
          top |= a[k];                                                        \
416
9.86M
        } while (++k < txb_w_unit);                                           \
417
7.16M
        top &= COEFF_CONTEXT_MASK;                                            \
418
7.16M
        top = AOMMIN(top, 4);                                                 \
419
7.16M
                                                                              \
420
7.16M
        k = 0;                                                                \
421
9.86M
        do {                                                                  \
422
9.86M
          left |= l[k];                                                       \
423
9.86M
        } while (++k < txb_h_unit);                                           \
424
7.16M
        left &= COEFF_CONTEXT_MASK;                                           \
425
7.16M
        left = AOMMIN(left, 4);                                               \
426
7.16M
                                                                              \
427
7.16M
        txb_ctx->txb_skip_ctx = skip_contexts[top][left];                     \
428
7.16M
      }                                                                       \
429
10.4M
    } else {                                                                  \
430
10.4M
      const int ctx_base = get_entropy_context(tx_size, a, l);                \
431
10.4M
      const int ctx_offset = (num_pels_log2_lookup[plane_bsize] >             \
432
10.4M
                              num_pels_log2_lookup[txsize_to_bsize[tx_size]]) \
433
10.4M
                                 ? 10                                         \
434
10.4M
                                 : 7;                                         \
435
10.4M
      txb_ctx->txb_skip_ctx = ctx_base + ctx_offset;                          \
436
10.4M
    }                                                                         \
437
20.1M
  }
decodetxb.c:get_txb_ctx_4x4
Line
Count
Source
373
11.3M
      TXB_CTX *const txb_ctx) {                                               \
374
11.3M
    static const int8_t signs[3] = { 0, -1, 1 };                              \
375
11.3M
    static const int8_t dc_sign_contexts[4 * MAX_TX_SIZE_UNIT + 1] = {        \
376
11.3M
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,       \
377
11.3M
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,       \
378
11.3M
      2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2           \
379
11.3M
    };                                                                        \
380
11.3M
    const TX_SIZE tx_size = TX_##w##X##h;                                     \
381
11.3M
    const int txb_w_unit = tx_size_wide_unit[tx_size];                        \
382
11.3M
    const int txb_h_unit = tx_size_high_unit[tx_size];                        \
383
11.3M
    int dc_sign = 0;                                                          \
384
11.3M
    int k = 0;                                                                \
385
11.3M
                                                                              \
386
11.3M
    do {                                                                      \
387
11.3M
      const unsigned int sign = ((uint8_t)a[k]) >> COEFF_CONTEXT_BITS;        \
388
11.3M
      assert(sign <= 2);                                                      \
389
11.4M
      dc_sign += signs[sign];                                                 \
390
11.4M
    } while (++k < txb_w_unit);                                               \
391
11.3M
                                                                              \
392
11.4M
    k = 0;                                                                    \
393
11.4M
    do {                                                                      \
394
11.4M
      const unsigned int sign = ((uint8_t)l[k]) >> COEFF_CONTEXT_BITS;        \
395
11.4M
      assert(sign <= 2);                                                      \
396
11.5M
      dc_sign += signs[sign];                                                 \
397
11.5M
    } while (++k < txb_h_unit);                                               \
398
11.4M
                                                                              \
399
11.5M
    txb_ctx->dc_sign_ctx = dc_sign_contexts[dc_sign + 2 * MAX_TX_SIZE_UNIT];  \
400
11.5M
                                                                              \
401
11.5M
    if (plane == 0) {                                                         \
402
5.87M
      if (plane_bsize == txsize_to_bsize[tx_size]) {                          \
403
324k
        txb_ctx->txb_skip_ctx = 0;                                            \
404
5.55M
      } else {                                                                \
405
5.55M
        static const uint8_t skip_contexts[5][5] = { { 1, 2, 2, 2, 3 },       \
406
5.55M
                                                     { 2, 4, 4, 4, 5 },       \
407
5.55M
                                                     { 2, 4, 4, 4, 5 },       \
408
5.55M
                                                     { 2, 4, 4, 4, 5 },       \
409
5.55M
                                                     { 3, 5, 5, 5, 6 } };     \
410
5.55M
        int top = 0;                                                          \
411
5.55M
        int left = 0;                                                         \
412
5.55M
                                                                              \
413
5.55M
        k = 0;                                                                \
414
5.55M
        do {                                                                  \
415
5.55M
          top |= a[k];                                                        \
416
5.55M
        } while (++k < txb_w_unit);                                           \
417
5.55M
        top &= COEFF_CONTEXT_MASK;                                            \
418
5.55M
        top = AOMMIN(top, 4);                                                 \
419
5.55M
                                                                              \
420
5.55M
        k = 0;                                                                \
421
5.55M
        do {                                                                  \
422
5.55M
          left |= l[k];                                                       \
423
5.55M
        } while (++k < txb_h_unit);                                           \
424
5.55M
        left &= COEFF_CONTEXT_MASK;                                           \
425
5.55M
        left = AOMMIN(left, 4);                                               \
426
5.55M
                                                                              \
427
5.55M
        txb_ctx->txb_skip_ctx = skip_contexts[top][left];                     \
428
5.55M
      }                                                                       \
429
5.87M
    } else {                                                                  \
430
5.63M
      const int ctx_base = get_entropy_context(tx_size, a, l);                \
431
5.63M
      const int ctx_offset = (num_pels_log2_lookup[plane_bsize] >             \
432
5.63M
                              num_pels_log2_lookup[txsize_to_bsize[tx_size]]) \
433
5.63M
                                 ? 10                                         \
434
5.63M
                                 : 7;                                         \
435
5.63M
      txb_ctx->txb_skip_ctx = ctx_base + ctx_offset;                          \
436
5.63M
    }                                                                         \
437
11.5M
  }
decodetxb.c:get_txb_ctx_8x8
Line
Count
Source
373
4.27M
      TXB_CTX *const txb_ctx) {                                               \
374
4.27M
    static const int8_t signs[3] = { 0, -1, 1 };                              \
375
4.27M
    static const int8_t dc_sign_contexts[4 * MAX_TX_SIZE_UNIT + 1] = {        \
376
4.27M
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,       \
377
4.27M
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,       \
378
4.27M
      2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2           \
379
4.27M
    };                                                                        \
380
4.27M
    const TX_SIZE tx_size = TX_##w##X##h;                                     \
381
4.27M
    const int txb_w_unit = tx_size_wide_unit[tx_size];                        \
382
4.27M
    const int txb_h_unit = tx_size_high_unit[tx_size];                        \
383
4.27M
    int dc_sign = 0;                                                          \
384
4.27M
    int k = 0;                                                                \
385
4.27M
                                                                              \
386
8.54M
    do {                                                                      \
387
8.54M
      const unsigned int sign = ((uint8_t)a[k]) >> COEFF_CONTEXT_BITS;        \
388
8.54M
      assert(sign <= 2);                                                      \
389
8.54M
      dc_sign += signs[sign];                                                 \
390
8.54M
    } while (++k < txb_w_unit);                                               \
391
4.27M
                                                                              \
392
4.27M
    k = 0;                                                                    \
393
8.54M
    do {                                                                      \
394
8.54M
      const unsigned int sign = ((uint8_t)l[k]) >> COEFF_CONTEXT_BITS;        \
395
8.54M
      assert(sign <= 2);                                                      \
396
8.54M
      dc_sign += signs[sign];                                                 \
397
8.54M
    } while (++k < txb_h_unit);                                               \
398
4.27M
                                                                              \
399
4.27M
    txb_ctx->dc_sign_ctx = dc_sign_contexts[dc_sign + 2 * MAX_TX_SIZE_UNIT];  \
400
4.27M
                                                                              \
401
4.27M
    if (plane == 0) {                                                         \
402
2.16M
      if (plane_bsize == txsize_to_bsize[tx_size]) {                          \
403
921k
        txb_ctx->txb_skip_ctx = 0;                                            \
404
1.23M
      } else {                                                                \
405
1.23M
        static const uint8_t skip_contexts[5][5] = { { 1, 2, 2, 2, 3 },       \
406
1.23M
                                                     { 2, 4, 4, 4, 5 },       \
407
1.23M
                                                     { 2, 4, 4, 4, 5 },       \
408
1.23M
                                                     { 2, 4, 4, 4, 5 },       \
409
1.23M
                                                     { 3, 5, 5, 5, 6 } };     \
410
1.23M
        int top = 0;                                                          \
411
1.23M
        int left = 0;                                                         \
412
1.23M
                                                                              \
413
1.23M
        k = 0;                                                                \
414
2.47M
        do {                                                                  \
415
2.47M
          top |= a[k];                                                        \
416
2.47M
        } while (++k < txb_w_unit);                                           \
417
1.23M
        top &= COEFF_CONTEXT_MASK;                                            \
418
1.23M
        top = AOMMIN(top, 4);                                                 \
419
1.23M
                                                                              \
420
1.23M
        k = 0;                                                                \
421
2.47M
        do {                                                                  \
422
2.47M
          left |= l[k];                                                       \
423
2.47M
        } while (++k < txb_h_unit);                                           \
424
1.23M
        left &= COEFF_CONTEXT_MASK;                                           \
425
1.23M
        left = AOMMIN(left, 4);                                               \
426
1.23M
                                                                              \
427
1.23M
        txb_ctx->txb_skip_ctx = skip_contexts[top][left];                     \
428
1.23M
      }                                                                       \
429
2.16M
    } else {                                                                  \
430
2.11M
      const int ctx_base = get_entropy_context(tx_size, a, l);                \
431
2.11M
      const int ctx_offset = (num_pels_log2_lookup[plane_bsize] >             \
432
2.11M
                              num_pels_log2_lookup[txsize_to_bsize[tx_size]]) \
433
2.11M
                                 ? 10                                         \
434
2.11M
                                 : 7;                                         \
435
2.11M
      txb_ctx->txb_skip_ctx = ctx_base + ctx_offset;                          \
436
2.11M
    }                                                                         \
437
4.27M
  }
decodetxb.c:get_txb_ctx_16x16
Line
Count
Source
373
2.42M
      TXB_CTX *const txb_ctx) {                                               \
374
2.42M
    static const int8_t signs[3] = { 0, -1, 1 };                              \
375
2.42M
    static const int8_t dc_sign_contexts[4 * MAX_TX_SIZE_UNIT + 1] = {        \
376
2.42M
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,       \
377
2.42M
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,       \
378
2.42M
      2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2           \
379
2.42M
    };                                                                        \
380
2.42M
    const TX_SIZE tx_size = TX_##w##X##h;                                     \
381
2.42M
    const int txb_w_unit = tx_size_wide_unit[tx_size];                        \
382
2.42M
    const int txb_h_unit = tx_size_high_unit[tx_size];                        \
383
2.42M
    int dc_sign = 0;                                                          \
384
2.42M
    int k = 0;                                                                \
385
2.42M
                                                                              \
386
9.70M
    do {                                                                      \
387
9.70M
      const unsigned int sign = ((uint8_t)a[k]) >> COEFF_CONTEXT_BITS;        \
388
9.70M
      assert(sign <= 2);                                                      \
389
9.70M
      dc_sign += signs[sign];                                                 \
390
9.70M
    } while (++k < txb_w_unit);                                               \
391
2.42M
                                                                              \
392
2.42M
    k = 0;                                                                    \
393
9.70M
    do {                                                                      \
394
9.70M
      const unsigned int sign = ((uint8_t)l[k]) >> COEFF_CONTEXT_BITS;        \
395
9.70M
      assert(sign <= 2);                                                      \
396
9.70M
      dc_sign += signs[sign];                                                 \
397
9.70M
    } while (++k < txb_h_unit);                                               \
398
2.42M
                                                                              \
399
2.42M
    txb_ctx->dc_sign_ctx = dc_sign_contexts[dc_sign + 2 * MAX_TX_SIZE_UNIT];  \
400
2.42M
                                                                              \
401
2.42M
    if (plane == 0) {                                                         \
402
1.07M
      if (plane_bsize == txsize_to_bsize[tx_size]) {                          \
403
789k
        txb_ctx->txb_skip_ctx = 0;                                            \
404
789k
      } else {                                                                \
405
289k
        static const uint8_t skip_contexts[5][5] = { { 1, 2, 2, 2, 3 },       \
406
289k
                                                     { 2, 4, 4, 4, 5 },       \
407
289k
                                                     { 2, 4, 4, 4, 5 },       \
408
289k
                                                     { 2, 4, 4, 4, 5 },       \
409
289k
                                                     { 3, 5, 5, 5, 6 } };     \
410
289k
        int top = 0;                                                          \
411
289k
        int left = 0;                                                         \
412
289k
                                                                              \
413
289k
        k = 0;                                                                \
414
1.15M
        do {                                                                  \
415
1.15M
          top |= a[k];                                                        \
416
1.15M
        } while (++k < txb_w_unit);                                           \
417
289k
        top &= COEFF_CONTEXT_MASK;                                            \
418
289k
        top = AOMMIN(top, 4);                                                 \
419
289k
                                                                              \
420
289k
        k = 0;                                                                \
421
1.15M
        do {                                                                  \
422
1.15M
          left |= l[k];                                                       \
423
1.15M
        } while (++k < txb_h_unit);                                           \
424
289k
        left &= COEFF_CONTEXT_MASK;                                           \
425
289k
        left = AOMMIN(left, 4);                                               \
426
289k
                                                                              \
427
289k
        txb_ctx->txb_skip_ctx = skip_contexts[top][left];                     \
428
289k
      }                                                                       \
429
1.34M
    } else {                                                                  \
430
1.34M
      const int ctx_base = get_entropy_context(tx_size, a, l);                \
431
1.34M
      const int ctx_offset = (num_pels_log2_lookup[plane_bsize] >             \
432
1.34M
                              num_pels_log2_lookup[txsize_to_bsize[tx_size]]) \
433
1.34M
                                 ? 10                                         \
434
1.34M
                                 : 7;                                         \
435
1.34M
      txb_ctx->txb_skip_ctx = ctx_base + ctx_offset;                          \
436
1.34M
    }                                                                         \
437
2.42M
  }
decodetxb.c:get_txb_ctx_32x32
Line
Count
Source
373
1.93M
      TXB_CTX *const txb_ctx) {                                               \
374
1.93M
    static const int8_t signs[3] = { 0, -1, 1 };                              \
375
1.93M
    static const int8_t dc_sign_contexts[4 * MAX_TX_SIZE_UNIT + 1] = {        \
376
1.93M
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,       \
377
1.93M
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,       \
378
1.93M
      2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2           \
379
1.93M
    };                                                                        \
380
1.93M
    const TX_SIZE tx_size = TX_##w##X##h;                                     \
381
1.93M
    const int txb_w_unit = tx_size_wide_unit[tx_size];                        \
382
1.93M
    const int txb_h_unit = tx_size_high_unit[tx_size];                        \
383
1.93M
    int dc_sign = 0;                                                          \
384
1.93M
    int k = 0;                                                                \
385
1.93M
                                                                              \
386
15.5M
    do {                                                                      \
387
15.5M
      const unsigned int sign = ((uint8_t)a[k]) >> COEFF_CONTEXT_BITS;        \
388
15.5M
      assert(sign <= 2);                                                      \
389
15.5M
      dc_sign += signs[sign];                                                 \
390
15.5M
    } while (++k < txb_w_unit);                                               \
391
1.93M
                                                                              \
392
1.93M
    k = 0;                                                                    \
393
15.5M
    do {                                                                      \
394
15.5M
      const unsigned int sign = ((uint8_t)l[k]) >> COEFF_CONTEXT_BITS;        \
395
15.5M
      assert(sign <= 2);                                                      \
396
15.5M
      dc_sign += signs[sign];                                                 \
397
15.5M
    } while (++k < txb_h_unit);                                               \
398
1.93M
                                                                              \
399
1.93M
    txb_ctx->dc_sign_ctx = dc_sign_contexts[dc_sign + 2 * MAX_TX_SIZE_UNIT];  \
400
1.93M
                                                                              \
401
1.93M
    if (plane == 0) {                                                         \
402
601k
      if (plane_bsize == txsize_to_bsize[tx_size]) {                          \
403
517k
        txb_ctx->txb_skip_ctx = 0;                                            \
404
517k
      } else {                                                                \
405
84.5k
        static const uint8_t skip_contexts[5][5] = { { 1, 2, 2, 2, 3 },       \
406
84.5k
                                                     { 2, 4, 4, 4, 5 },       \
407
84.5k
                                                     { 2, 4, 4, 4, 5 },       \
408
84.5k
                                                     { 2, 4, 4, 4, 5 },       \
409
84.5k
                                                     { 3, 5, 5, 5, 6 } };     \
410
84.5k
        int top = 0;                                                          \
411
84.5k
        int left = 0;                                                         \
412
84.5k
                                                                              \
413
84.5k
        k = 0;                                                                \
414
676k
        do {                                                                  \
415
676k
          top |= a[k];                                                        \
416
676k
        } while (++k < txb_w_unit);                                           \
417
84.5k
        top &= COEFF_CONTEXT_MASK;                                            \
418
84.5k
        top = AOMMIN(top, 4);                                                 \
419
84.5k
                                                                              \
420
84.5k
        k = 0;                                                                \
421
676k
        do {                                                                  \
422
676k
          left |= l[k];                                                       \
423
676k
        } while (++k < txb_h_unit);                                           \
424
84.5k
        left &= COEFF_CONTEXT_MASK;                                           \
425
84.5k
        left = AOMMIN(left, 4);                                               \
426
84.5k
                                                                              \
427
84.5k
        txb_ctx->txb_skip_ctx = skip_contexts[top][left];                     \
428
84.5k
      }                                                                       \
429
1.33M
    } else {                                                                  \
430
1.33M
      const int ctx_base = get_entropy_context(tx_size, a, l);                \
431
1.33M
      const int ctx_offset = (num_pels_log2_lookup[plane_bsize] >             \
432
1.33M
                              num_pels_log2_lookup[txsize_to_bsize[tx_size]]) \
433
1.33M
                                 ? 10                                         \
434
1.33M
                                 : 7;                                         \
435
1.33M
      txb_ctx->txb_skip_ctx = ctx_base + ctx_offset;                          \
436
1.33M
    }                                                                         \
437
1.93M
  }
Unexecuted instantiation: entropy.c:get_txb_ctx_4x4
Unexecuted instantiation: entropy.c:get_txb_ctx_8x8
Unexecuted instantiation: entropy.c:get_txb_ctx_16x16
Unexecuted instantiation: entropy.c:get_txb_ctx_32x32
Unexecuted instantiation: entropymode.c:get_txb_ctx_4x4
Unexecuted instantiation: entropymode.c:get_txb_ctx_8x8
Unexecuted instantiation: entropymode.c:get_txb_ctx_16x16
Unexecuted instantiation: entropymode.c:get_txb_ctx_32x32
Unexecuted instantiation: txb_common.c:get_txb_ctx_4x4
Unexecuted instantiation: txb_common.c:get_txb_ctx_8x8
Unexecuted instantiation: txb_common.c:get_txb_ctx_16x16
Unexecuted instantiation: txb_common.c:get_txb_ctx_32x32
438
439
SPECIALIZE_GET_TXB_CTX(4, 4)
440
SPECIALIZE_GET_TXB_CTX(8, 8)
441
SPECIALIZE_GET_TXB_CTX(16, 16)
442
SPECIALIZE_GET_TXB_CTX(32, 32)
443
444
// Wrapper for get_txb_ctx that calls the specialized version of get_txb_ctc_*
445
// so that the compiler can compile away the while loops.
446
static inline void get_txb_ctx(const BLOCK_SIZE plane_bsize,
447
                               const TX_SIZE tx_size, const int plane,
448
                               const ENTROPY_CONTEXT *const a,
449
                               const ENTROPY_CONTEXT *const l,
450
32.5M
                               TXB_CTX *const txb_ctx) {
451
32.5M
  switch (tx_size) {
452
11.4M
    case TX_4X4: get_txb_ctx_4x4(plane_bsize, plane, a, l, txb_ctx); break;
453
4.27M
    case TX_8X8: get_txb_ctx_8x8(plane_bsize, plane, a, l, txb_ctx); break;
454
2.42M
    case TX_16X16: get_txb_ctx_16x16(plane_bsize, plane, a, l, txb_ctx); break;
455
1.93M
    case TX_32X32: get_txb_ctx_32x32(plane_bsize, plane, a, l, txb_ctx); break;
456
12.5M
    default:
457
12.5M
      get_txb_ctx_general(plane_bsize, tx_size, plane, a, l, txb_ctx);
458
12.5M
      break;
459
32.5M
  }
460
32.5M
}
decodetxb.c:get_txb_ctx
Line
Count
Source
450
32.5M
                               TXB_CTX *const txb_ctx) {
451
32.5M
  switch (tx_size) {
452
11.4M
    case TX_4X4: get_txb_ctx_4x4(plane_bsize, plane, a, l, txb_ctx); break;
453
4.27M
    case TX_8X8: get_txb_ctx_8x8(plane_bsize, plane, a, l, txb_ctx); break;
454
2.42M
    case TX_16X16: get_txb_ctx_16x16(plane_bsize, plane, a, l, txb_ctx); break;
455
1.93M
    case TX_32X32: get_txb_ctx_32x32(plane_bsize, plane, a, l, txb_ctx); break;
456
12.5M
    default:
457
12.5M
      get_txb_ctx_general(plane_bsize, tx_size, plane, a, l, txb_ctx);
458
12.5M
      break;
459
32.5M
  }
460
32.5M
}
Unexecuted instantiation: entropy.c:get_txb_ctx
Unexecuted instantiation: entropymode.c:get_txb_ctx
Unexecuted instantiation: txb_common.c:get_txb_ctx
461
#undef MAX_TX_SIZE_UNIT
462
463
#endif  // AOM_AV1_COMMON_TXB_COMMON_H_