blob: 88bedccc22fa7cb89d67fb00f64f56420ef1503e [file] [log] [blame]
Yaowu Xuc27fc142016-08-22 16:08:15 -07001/*
Yaowu Xu9c01aa12016-09-01 14:32:49 -07002 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
Yaowu Xuc27fc142016-08-22 16:08:15 -07003 *
Yaowu Xu9c01aa12016-09-01 14:32:49 -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
Yaowu Xuf883b422016-08-30 14:01:10 -070012#ifndef AOM_DSP_BITREADER_H_
13#define AOM_DSP_BITREADER_H_
Yaowu Xuc27fc142016-08-22 16:08:15 -070014
Alex Converseacef60b2016-09-23 14:21:02 -070015#include <assert.h>
Alex Converse7fe2ae82016-09-28 11:33:20 -070016#include <limits.h>
Alex Converseacef60b2016-09-23 14:21:02 -070017
Yaowu Xuf883b422016-08-30 14:01:10 -070018#include "./aom_config.h"
Nathan E. Eggebaaaa162016-10-24 09:50:52 -040019
Yaowu Xuf883b422016-08-30 14:01:10 -070020#include "aom/aomdx.h"
21#include "aom/aom_integer.h"
Alex Converseacef60b2016-09-23 14:21:02 -070022#if CONFIG_ANS
Alex Converse7fe2ae82016-09-28 11:33:20 -070023#include "aom_dsp/ansreader.h"
Alex Converseacef60b2016-09-23 14:21:02 -070024#else
Nathan E. Egge476c63c2017-05-18 18:35:16 -040025#include "aom_dsp/daalaboolreader.h"
Alex Converseacef60b2016-09-23 14:21:02 -070026#endif
Yaowu Xuc27fc142016-08-22 16:08:15 -070027#include "aom_dsp/prob.h"
Nathan E. Egge44460142016-06-20 13:44:22 -040028#include "av1/common/odintrin.h"
Yaowu Xuc27fc142016-08-22 16:08:15 -070029
Michael Bebenita6048d052016-08-25 14:40:54 -070030#if CONFIG_ACCOUNTING
Luc Trudeau83fbd572017-04-21 11:24:34 -040031#include "av1/decoder/accounting.h"
Michael Bebenita6048d052016-08-25 14:40:54 -070032#define ACCT_STR_NAME acct_str
33#define ACCT_STR_PARAM , const char *ACCT_STR_NAME
34#define ACCT_STR_ARG(s) , s
35#else
36#define ACCT_STR_PARAM
37#define ACCT_STR_ARG(s)
38#endif
39
40#define aom_read(r, prob, ACCT_STR_NAME) \
41 aom_read_(r, prob ACCT_STR_ARG(ACCT_STR_NAME))
42#define aom_read_bit(r, ACCT_STR_NAME) \
43 aom_read_bit_(r ACCT_STR_ARG(ACCT_STR_NAME))
44#define aom_read_tree(r, tree, probs, ACCT_STR_NAME) \
45 aom_read_tree_(r, tree, probs ACCT_STR_ARG(ACCT_STR_NAME))
46#define aom_read_literal(r, bits, ACCT_STR_NAME) \
47 aom_read_literal_(r, bits ACCT_STR_ARG(ACCT_STR_NAME))
Nathan E. Eggee0698492017-01-06 19:40:36 -050048#define aom_read_cdf(r, cdf, nsymbs, ACCT_STR_NAME) \
49 aom_read_cdf_(r, cdf, nsymbs ACCT_STR_ARG(ACCT_STR_NAME))
Michael Bebenita6048d052016-08-25 14:40:54 -070050#define aom_read_symbol(r, cdf, nsymbs, ACCT_STR_NAME) \
51 aom_read_symbol_(r, cdf, nsymbs ACCT_STR_ARG(ACCT_STR_NAME))
52
Yaowu Xuc27fc142016-08-22 16:08:15 -070053#ifdef __cplusplus
54extern "C" {
55#endif
56
Alex Converseacef60b2016-09-23 14:21:02 -070057#if CONFIG_ANS
58typedef struct AnsDecoder aom_reader;
59#else
Nathan E. Egge476c63c2017-05-18 18:35:16 -040060typedef struct daala_reader aom_reader;
Alex Converseacef60b2016-09-23 14:21:02 -070061#endif
Yaowu Xuc27fc142016-08-22 16:08:15 -070062
Alex Converseeb00cb22016-06-06 15:12:06 -070063static INLINE int aom_reader_init(aom_reader *r, const uint8_t *buffer,
Alex Converse346440b2017-01-03 13:47:37 -080064 size_t size, aom_decrypt_cb decrypt_cb,
Alex Converseeb00cb22016-06-06 15:12:06 -070065 void *decrypt_state) {
Alex Converseacef60b2016-09-23 14:21:02 -070066 (void)decrypt_cb;
67 (void)decrypt_state;
Nathan E. Egge476c63c2017-05-18 18:35:16 -040068#if CONFIG_ANS
Alex Converse5b5140b2016-12-13 14:00:56 -080069 if (size > INT_MAX) return 1;
Alex Converse346440b2017-01-03 13:47:37 -080070 return ans_read_init(r, buffer, (int)size);
Alex Converseacef60b2016-09-23 14:21:02 -070071#else
Nathan E. Egge476c63c2017-05-18 18:35:16 -040072 return aom_daala_reader_init(r, buffer, (int)size);
Alex Converseacef60b2016-09-23 14:21:02 -070073#endif
Alex Converseeb00cb22016-06-06 15:12:06 -070074}
Yaowu Xuc27fc142016-08-22 16:08:15 -070075
Alex Converseeb00cb22016-06-06 15:12:06 -070076static INLINE const uint8_t *aom_reader_find_end(aom_reader *r) {
Alex Converseacef60b2016-09-23 14:21:02 -070077#if CONFIG_ANS
78 (void)r;
79 assert(0 && "Use the raw buffer size with ANS");
80 return NULL;
81#else
Nathan E. Egge476c63c2017-05-18 18:35:16 -040082 return aom_daala_reader_find_end(r);
Alex Converseacef60b2016-09-23 14:21:02 -070083#endif
Alex Converseeb00cb22016-06-06 15:12:06 -070084}
Yaowu Xuc27fc142016-08-22 16:08:15 -070085
Yaowu Xuf883b422016-08-30 14:01:10 -070086static INLINE int aom_reader_has_error(aom_reader *r) {
Alex Converseacef60b2016-09-23 14:21:02 -070087#if CONFIG_ANS
88 return ans_reader_has_error(r);
89#else
Nathan E. Egge476c63c2017-05-18 18:35:16 -040090 return aom_daala_reader_has_error(r);
Alex Converseacef60b2016-09-23 14:21:02 -070091#endif
Yaowu Xuc27fc142016-08-22 16:08:15 -070092}
93
Michael Bebenitad7baf452016-08-25 11:27:56 -070094// Returns the position in the bit reader in bits.
Nathan E. Eggeb244f392016-09-06 23:48:43 -040095static INLINE uint32_t aom_reader_tell(const aom_reader *r) {
Michael Bebenita868fc0b2016-08-03 16:13:04 -070096#if CONFIG_ANS
97 (void)r;
98 assert(0 && "aom_reader_tell() is unimplemented for ANS");
99 return 0;
Michael Bebenita868fc0b2016-08-03 16:13:04 -0700100#else
Nathan E. Egge476c63c2017-05-18 18:35:16 -0400101 return aom_daala_reader_tell(r);
Michael Bebenita868fc0b2016-08-03 16:13:04 -0700102#endif
103}
104
Michael Bebenitad7baf452016-08-25 11:27:56 -0700105// Returns the position in the bit reader in 1/8th bits.
Nathan E. Eggeb244f392016-09-06 23:48:43 -0400106static INLINE uint32_t aom_reader_tell_frac(const aom_reader *r) {
Michael Bebenitad7baf452016-08-25 11:27:56 -0700107#if CONFIG_ANS
108 (void)r;
109 assert(0 && "aom_reader_tell_frac() is unimplemented for ANS");
110 return 0;
Michael Bebenitad7baf452016-08-25 11:27:56 -0700111#else
Nathan E. Egge476c63c2017-05-18 18:35:16 -0400112 return aom_daala_reader_tell_frac(r);
Michael Bebenitad7baf452016-08-25 11:27:56 -0700113#endif
114}
115
Michael Bebenita6048d052016-08-25 14:40:54 -0700116#if CONFIG_ACCOUNTING
117static INLINE void aom_process_accounting(const aom_reader *r ACCT_STR_PARAM) {
118 if (r->accounting != NULL) {
119 uint32_t tell_frac;
120 tell_frac = aom_reader_tell_frac(r);
121 aom_accounting_record(r->accounting, ACCT_STR_NAME,
122 tell_frac - r->accounting->last_tell_frac);
123 r->accounting->last_tell_frac = tell_frac;
124 }
125}
Thomas Daviesf7f87ff2017-03-01 16:24:56 +0000126
Yaowu Xu4ff59b52017-04-24 12:41:56 -0700127static INLINE void aom_update_symb_counts(const aom_reader *r, int is_binary) {
Thomas Daviesf7f87ff2017-03-01 16:24:56 +0000128 if (r->accounting != NULL) {
129 r->accounting->syms.num_multi_syms += !is_binary;
130 r->accounting->syms.num_binary_syms += !!is_binary;
131 }
132}
Michael Bebenita6048d052016-08-25 14:40:54 -0700133#endif
134
135static INLINE int aom_read_(aom_reader *r, int prob ACCT_STR_PARAM) {
136 int ret;
Alex Converseacef60b2016-09-23 14:21:02 -0700137#if CONFIG_ANS
Alex Conversec54692b2017-01-25 16:41:05 -0800138 ret = rabs_read(r, prob);
Alex Converseacef60b2016-09-23 14:21:02 -0700139#else
Nathan E. Egge476c63c2017-05-18 18:35:16 -0400140 ret = aom_daala_read(r, prob);
Alex Converseacef60b2016-09-23 14:21:02 -0700141#endif
Michael Bebenita6048d052016-08-25 14:40:54 -0700142#if CONFIG_ACCOUNTING
143 if (ACCT_STR_NAME) aom_process_accounting(r, ACCT_STR_NAME);
Thomas Daviesf7f87ff2017-03-01 16:24:56 +0000144 aom_update_symb_counts(r, 1);
Michael Bebenita6048d052016-08-25 14:40:54 -0700145#endif
146 return ret;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700147}
148
Michael Bebenita6048d052016-08-25 14:40:54 -0700149static INLINE int aom_read_bit_(aom_reader *r ACCT_STR_PARAM) {
150 int ret;
Alex Converseacef60b2016-09-23 14:21:02 -0700151#if CONFIG_ANS
Alex Conversec54692b2017-01-25 16:41:05 -0800152 ret = rabs_read_bit(r); // Non trivial optimization at half probability
Nathan E. Egge476c63c2017-05-18 18:35:16 -0400153#elif CONFIG_RAWBITS
Nathan E. Egge08c99eb2016-11-09 13:40:26 -0500154 // Note this uses raw bits and is not the same as aom_daala_read(r, 128);
Thomas Daviesf7f87ff2017-03-01 16:24:56 +0000155 // Calls to this function are omitted from raw symbol accounting.
Nathan E. Egge08c99eb2016-11-09 13:40:26 -0500156 ret = aom_daala_read_bit(r);
Alex Converseacef60b2016-09-23 14:21:02 -0700157#else
Michael Bebenita6048d052016-08-25 14:40:54 -0700158 ret = aom_read(r, 128, NULL); // aom_prob_half
Alex Converseacef60b2016-09-23 14:21:02 -0700159#endif
Michael Bebenita6048d052016-08-25 14:40:54 -0700160#if CONFIG_ACCOUNTING
161 if (ACCT_STR_NAME) aom_process_accounting(r, ACCT_STR_NAME);
162#endif
163 return ret;
Alex Converseacef60b2016-09-23 14:21:02 -0700164}
Yaowu Xuc27fc142016-08-22 16:08:15 -0700165
Michael Bebenita6048d052016-08-25 14:40:54 -0700166static INLINE int aom_read_literal_(aom_reader *r, int bits ACCT_STR_PARAM) {
Nathan E. Eggee691a242016-06-16 09:00:39 -0400167 int literal = 0, bit;
168
Michael Bebenita6048d052016-08-25 14:40:54 -0700169 for (bit = bits - 1; bit >= 0; bit--) literal |= aom_read_bit(r, NULL) << bit;
170#if CONFIG_ACCOUNTING
171 if (ACCT_STR_NAME) aom_process_accounting(r, ACCT_STR_NAME);
172#endif
Nathan E. Eggee691a242016-06-16 09:00:39 -0400173 return literal;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700174}
175
Nathan E. Egge2d8dd962016-12-23 10:42:43 -0500176static INLINE int aom_read_cdf_(aom_reader *r, const aom_cdf_prob *cdf,
Nathan E. Eggee0698492017-01-06 19:40:36 -0500177 int nsymbs ACCT_STR_PARAM) {
Michael Bebenita6048d052016-08-25 14:40:54 -0700178 int ret;
Alex Converse1e4e29f2016-11-08 14:12:14 -0800179#if CONFIG_ANS
Alex Conversea1ac9722016-10-12 15:59:58 -0700180 (void)nsymbs;
Michael Bebenita6048d052016-08-25 14:40:54 -0700181 ret = rans_read(r, cdf);
Alex Conversea1ac9722016-10-12 15:59:58 -0700182#else
Nathan E. Eggecd539512017-05-16 12:00:36 -0400183 ret = daala_read_symbol(r, cdf, nsymbs);
Alex Conversea1ac9722016-10-12 15:59:58 -0700184#endif
Alex Converse58c520a2016-10-20 14:21:06 -0700185
Michael Bebenita6048d052016-08-25 14:40:54 -0700186#if CONFIG_ACCOUNTING
187 if (ACCT_STR_NAME) aom_process_accounting(r, ACCT_STR_NAME);
Thomas Daviesf7f87ff2017-03-01 16:24:56 +0000188 aom_update_symb_counts(r, (nsymbs == 2));
Nathan E. Egge44460142016-06-20 13:44:22 -0400189#endif
Michael Bebenita6048d052016-08-25 14:40:54 -0700190 return ret;
Nathan E. Egge44460142016-06-20 13:44:22 -0400191}
Nathan E. Eggec98d2862016-12-21 11:30:46 -0500192
Nathan E. Eggee0698492017-01-06 19:40:36 -0500193static INLINE int aom_read_symbol_(aom_reader *r, aom_cdf_prob *cdf,
194 int nsymbs ACCT_STR_PARAM) {
195 int ret;
196 ret = aom_read_cdf(r, cdf, nsymbs, ACCT_STR_NAME);
Nathan E. Eggee0698492017-01-06 19:40:36 -0500197 update_cdf(cdf, ret, nsymbs);
Nathan E. Eggee0698492017-01-06 19:40:36 -0500198 return ret;
199}
200
Nathan E. Egge0f11c782017-02-12 19:04:04 -0500201static INLINE int aom_read_tree_as_cdf(aom_reader *r,
202 const aom_tree_index *tree,
203 const aom_prob *probs) {
204 aom_tree_index i = 0;
205 do {
206 aom_cdf_prob cdf[16];
207 aom_tree_index index[16];
208 int path[16];
209 int dist[16];
210 int nsymbs;
211 int symb;
212 nsymbs = tree_to_cdf(tree, probs, i, cdf, index, path, dist);
213 symb = aom_read_cdf(r, cdf, nsymbs, NULL);
214 OD_ASSERT(symb >= 0 && symb < nsymbs);
215 i = index[symb];
216 } while (i > 0);
217 return -i;
218}
Nathan E. Egge44460142016-06-20 13:44:22 -0400219
Nathan E. Egge0f11c782017-02-12 19:04:04 -0500220static INLINE int aom_read_tree_(aom_reader *r, const aom_tree_index *tree,
221 const aom_prob *probs ACCT_STR_PARAM) {
222 int ret;
Nathan E. Egge0f11c782017-02-12 19:04:04 -0500223 ret = aom_read_tree_as_cdf(r, tree, probs);
Nathan E. Egge0f11c782017-02-12 19:04:04 -0500224#if CONFIG_ACCOUNTING
225 if (ACCT_STR_NAME) aom_process_accounting(r, ACCT_STR_NAME);
226#endif
227 return ret;
228}
229
Yaowu Xuc27fc142016-08-22 16:08:15 -0700230#ifdef __cplusplus
231} // extern "C"
232#endif
233
Yaowu Xuf883b422016-08-30 14:01:10 -0700234#endif // AOM_DSP_BITREADER_H_