blob: 991692c2f0217e62820fdda4c1ed2cfa9a78a019 [file] [log] [blame]
Yaowu Xuc27fc142016-08-22 16:08:15 -07001/*
Yaowu Xu2ab7ff02016-09-02 12:04:54 -07002 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
Yaowu Xuc27fc142016-08-22 16:08:15 -07003 *
Yaowu Xu2ab7ff02016-09-02 12:04:54 -07004 * 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.
Yaowu Xuc27fc142016-08-22 16:08:15 -070010 */
11
James Zerne1cbb132018-08-22 14:10:36 -070012#ifndef AOM_AV1_COMMON_ENTROPY_H_
13#define AOM_AV1_COMMON_ENTROPY_H_
Yaowu Xuc27fc142016-08-22 16:08:15 -070014
Tom Finegan60e653d2018-05-22 11:34:58 -070015#include "config/aom_config.h"
16
Yaowu Xuf883b422016-08-30 14:01:10 -070017#include "aom/aom_integer.h"
Yaowu Xuc27fc142016-08-22 16:08:15 -070018#include "aom_dsp/prob.h"
19
Yaowu Xuc27fc142016-08-22 16:08:15 -070020#include "av1/common/common.h"
Alex Converseda3d94f2017-03-15 14:54:29 -070021#include "av1/common/common_data.h"
Yaowu Xuc27fc142016-08-22 16:08:15 -070022#include "av1/common/enums.h"
23
24#ifdef __cplusplus
25extern "C" {
26#endif
27
hui suef125a02017-07-31 12:56:15 -070028#define TOKEN_CDF_Q_CTXS 4
hui su0d103572017-03-01 17:58:01 -080029
Angie Chiangbd57fc52017-02-24 11:29:27 -080030#define TXB_SKIP_CONTEXTS 13
Angie Chiangf12cc4a2017-08-28 15:42:33 -070031
Jingning Hanff4a9f82018-06-08 10:48:45 -070032#define EOB_COEF_CONTEXTS 9
Angie Chiangf12cc4a2017-08-28 15:42:33 -070033
Jingning Hana24a6902017-10-26 14:25:46 -070034#define SIG_COEF_CONTEXTS_2D 26
Angie Chiang2b38def2017-08-28 14:04:09 -070035#define SIG_COEF_CONTEXTS_1D 16
Ola Hugossond2352ec2017-11-16 09:20:25 +010036#define SIG_COEF_CONTEXTS_EOB 4
Dake He4d447692017-12-15 09:10:06 -080037#define SIG_COEF_CONTEXTS (SIG_COEF_CONTEXTS_2D + SIG_COEF_CONTEXTS_1D)
Dake He03a32922017-10-31 08:06:45 -070038
Dake He03a32922017-10-31 08:06:45 -070039#define COEFF_BASE_CONTEXTS (SIG_COEF_CONTEXTS)
Angie Chiangbd57fc52017-02-24 11:29:27 -080040#define DC_SIGN_CONTEXTS 3
41
42#define BR_TMP_OFFSET 12
43#define BR_REF_CAT 4
Dake He7d01ab52017-11-24 17:53:28 -080044#define LEVEL_CONTEXTS 21
Angie Chiangbd57fc52017-02-24 11:29:27 -080045
46#define NUM_BASE_LEVELS 2
Ola Hugossone72a2092017-11-12 09:11:53 +010047
Ola Hugossone72a2092017-11-12 09:11:53 +010048#define BR_CDF_SIZE (4)
49#define COEFF_BASE_RANGE (4 * (BR_CDF_SIZE - 1))
Angie Chiangbd57fc52017-02-24 11:29:27 -080050
51#define COEFF_CONTEXT_BITS 6
52#define COEFF_CONTEXT_MASK ((1 << COEFF_CONTEXT_BITS) - 1)
Angie Chiang4f5c3522018-02-26 17:01:32 -080053#define MAX_BASE_BR_RANGE (COEFF_BASE_RANGE + NUM_BASE_LEVELS + 1)
Angie Chiangdef11252017-08-18 14:37:32 -070054
55#define BASE_CONTEXT_POSITION_NUM 12
Angie Chiangcf85d5c2017-08-20 12:56:19 -070056
57typedef enum TX_CLASS {
58 TX_CLASS_2D = 0,
59 TX_CLASS_HORIZ = 1,
60 TX_CLASS_VERT = 2,
61 TX_CLASSES = 3,
62} TX_CLASS;
63
Yaowu Xuc27fc142016-08-22 16:08:15 -070064#define DCT_MAX_VALUE 16384
Yaowu Xuc27fc142016-08-22 16:08:15 -070065#define DCT_MAX_VALUE_HIGH10 65536
66#define DCT_MAX_VALUE_HIGH12 262144
Yaowu Xuc27fc142016-08-22 16:08:15 -070067
Johann6b41d4d2018-02-08 14:32:53 -080068/* Coefficients are predicted via a 3-dimensional probability table indexed on
69 * REF_TYPES, COEF_BANDS and COEF_CONTEXTS. */
Yaowu Xuc27fc142016-08-22 16:08:15 -070070#define REF_TYPES 2 // intra=0, inter=1
71
Yaowu Xuf883b422016-08-30 14:01:10 -070072struct AV1Common;
Thomas Davies028b57f2017-02-22 16:42:11 +000073struct frame_contexts;
Hui Sudc54be62018-03-14 19:14:28 -070074void av1_reset_cdf_symbol_counters(struct frame_contexts *fc);
Yaowu Xuf883b422016-08-30 14:01:10 -070075void av1_default_coef_probs(struct AV1Common *cm);
Yaowu Xuc27fc142016-08-22 16:08:15 -070076
Nathan E. Egge46e84902016-08-24 14:52:42 -040077struct frame_contexts;
Nathan E. Eggead66b812017-05-09 11:57:31 -040078
Yaowu Xuc27fc142016-08-22 16:08:15 -070079typedef char ENTROPY_CONTEXT;
80
81static INLINE int combine_entropy_contexts(ENTROPY_CONTEXT a,
82 ENTROPY_CONTEXT b) {
83 return (a != 0) + (b != 0);
84}
85
86static INLINE int get_entropy_context(TX_SIZE tx_size, const ENTROPY_CONTEXT *a,
87 const ENTROPY_CONTEXT *l) {
88 ENTROPY_CONTEXT above_ec = 0, left_ec = 0;
89
Jingning Hanaa8a4a52016-12-13 17:30:48 -080090 switch (tx_size) {
Yaowu Xuc27fc142016-08-22 16:08:15 -070091 case TX_4X4:
92 above_ec = a[0] != 0;
93 left_ec = l[0] != 0;
94 break;
Yaowu Xuc27fc142016-08-22 16:08:15 -070095 case TX_4X8:
96 above_ec = a[0] != 0;
97 left_ec = !!*(const uint16_t *)l;
98 break;
99 case TX_8X4:
100 above_ec = !!*(const uint16_t *)a;
101 left_ec = l[0] != 0;
102 break;
103 case TX_8X16:
104 above_ec = !!*(const uint16_t *)a;
105 left_ec = !!*(const uint32_t *)l;
106 break;
107 case TX_16X8:
108 above_ec = !!*(const uint32_t *)a;
109 left_ec = !!*(const uint16_t *)l;
110 break;
111 case TX_16X32:
112 above_ec = !!*(const uint32_t *)a;
113 left_ec = !!*(const uint64_t *)l;
114 break;
115 case TX_32X16:
116 above_ec = !!*(const uint64_t *)a;
117 left_ec = !!*(const uint32_t *)l;
118 break;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700119 case TX_8X8:
120 above_ec = !!*(const uint16_t *)a;
121 left_ec = !!*(const uint16_t *)l;
122 break;
123 case TX_16X16:
124 above_ec = !!*(const uint32_t *)a;
125 left_ec = !!*(const uint32_t *)l;
126 break;
127 case TX_32X32:
128 above_ec = !!*(const uint64_t *)a;
129 left_ec = !!*(const uint64_t *)l;
130 break;
Debargha Mukherjee153e1f82016-11-17 09:59:14 -0800131 case TX_64X64:
132 above_ec = !!(*(const uint64_t *)a | *(const uint64_t *)(a + 8));
133 left_ec = !!(*(const uint64_t *)l | *(const uint64_t *)(l + 8));
134 break;
Debargha Mukherjee2b435012017-09-28 08:30:35 -0700135 case TX_32X64:
136 above_ec = !!*(const uint64_t *)a;
137 left_ec = !!(*(const uint64_t *)l | *(const uint64_t *)(l + 8));
138 break;
139 case TX_64X32:
140 above_ec = !!(*(const uint64_t *)a | *(const uint64_t *)(a + 8));
141 left_ec = !!*(const uint64_t *)l;
142 break;
Yue Chen56e226e2017-05-02 16:21:40 -0700143 case TX_4X16:
144 above_ec = a[0] != 0;
145 left_ec = !!*(const uint32_t *)l;
146 break;
147 case TX_16X4:
148 above_ec = !!*(const uint32_t *)a;
149 left_ec = l[0] != 0;
150 break;
151 case TX_8X32:
152 above_ec = !!*(const uint16_t *)a;
153 left_ec = !!*(const uint64_t *)l;
154 break;
155 case TX_32X8:
156 above_ec = !!*(const uint64_t *)a;
157 left_ec = !!*(const uint16_t *)l;
158 break;
Debargha Mukherjee3f921082017-12-01 21:45:57 -0800159 case TX_16X64:
160 above_ec = !!*(const uint32_t *)a;
161 left_ec = !!(*(const uint64_t *)l | *(const uint64_t *)(l + 8));
162 break;
163 case TX_64X16:
164 above_ec = !!(*(const uint64_t *)a | *(const uint64_t *)(a + 8));
165 left_ec = !!*(const uint32_t *)l;
166 break;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700167 default: assert(0 && "Invalid transform size."); break;
168 }
169 return combine_entropy_contexts(above_ec, left_ec);
170}
171
Debargha Mukherjeeb3eda2f2017-11-28 16:00:20 -0800172static INLINE TX_SIZE get_txsize_entropy_ctx(TX_SIZE txsize) {
173 return (TX_SIZE)((txsize_sqr_map[txsize] + txsize_sqr_up_map[txsize] + 1) >>
174 1);
175}
176
Yaowu Xuc27fc142016-08-22 16:08:15 -0700177#ifdef __cplusplus
178} // extern "C"
179#endif
180
James Zerne1cbb132018-08-22 14:10:36 -0700181#endif // AOM_AV1_COMMON_ENTROPY_H_