Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 1 | /* |
Yaowu Xu | 9c01aa1 | 2016-09-01 14:32:49 -0700 | [diff] [blame] | 2 | * Copyright (c) 2016, Alliance for Open Media. All rights reserved |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 3 | * |
Yaowu Xu | 9c01aa1 | 2016-09-01 14:32:49 -0700 | [diff] [blame] | 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. |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 10 | */ |
| 11 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 12 | #ifndef AOM_DSP_BITREADER_H_ |
| 13 | #define AOM_DSP_BITREADER_H_ |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 14 | |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 15 | #include <assert.h> |
Alex Converse | 7fe2ae8 | 2016-09-28 11:33:20 -0700 | [diff] [blame] | 16 | #include <limits.h> |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 17 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 18 | #include "./aom_config.h" |
Nathan E. Egge | baaaa16 | 2016-10-24 09:50:52 -0400 | [diff] [blame] | 19 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 20 | #include "aom/aomdx.h" |
| 21 | #include "aom/aom_integer.h" |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 22 | #if CONFIG_ANS |
Alex Converse | 7fe2ae8 | 2016-09-28 11:33:20 -0700 | [diff] [blame] | 23 | #include "aom_dsp/ansreader.h" |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 24 | #else |
Nathan E. Egge | 476c63c | 2017-05-18 18:35:16 -0400 | [diff] [blame] | 25 | #include "aom_dsp/daalaboolreader.h" |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 26 | #endif |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 27 | #include "aom_dsp/prob.h" |
Nathan E. Egge | 4446014 | 2016-06-20 13:44:22 -0400 | [diff] [blame] | 28 | #include "av1/common/odintrin.h" |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 29 | |
Michael Bebenita | 6048d05 | 2016-08-25 14:40:54 -0700 | [diff] [blame] | 30 | #if CONFIG_ACCOUNTING |
Luc Trudeau | 83fbd57 | 2017-04-21 11:24:34 -0400 | [diff] [blame] | 31 | #include "av1/decoder/accounting.h" |
Michael Bebenita | 6048d05 | 2016-08-25 14:40:54 -0700 | [diff] [blame] | 32 | #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. Egge | e069849 | 2017-01-06 19:40:36 -0500 | [diff] [blame] | 48 | #define aom_read_cdf(r, cdf, nsymbs, ACCT_STR_NAME) \ |
| 49 | aom_read_cdf_(r, cdf, nsymbs ACCT_STR_ARG(ACCT_STR_NAME)) |
Michael Bebenita | 6048d05 | 2016-08-25 14:40:54 -0700 | [diff] [blame] | 50 | #define aom_read_symbol(r, cdf, nsymbs, ACCT_STR_NAME) \ |
| 51 | aom_read_symbol_(r, cdf, nsymbs ACCT_STR_ARG(ACCT_STR_NAME)) |
| 52 | |
Jingning Han | 94cea4a | 2017-09-30 14:13:23 -0700 | [diff] [blame] | 53 | #if CONFIG_LV_MAP |
| 54 | #define aom_read_bin(r, cdf, nsymbs, ACCT_STR_NAME) \ |
| 55 | aom_read_bin_(r, cdf, nsymbs ACCT_STR_ARG(ACCT_STR_NAME)) |
| 56 | #endif |
| 57 | |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 58 | #ifdef __cplusplus |
| 59 | extern "C" { |
| 60 | #endif |
| 61 | |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 62 | #if CONFIG_ANS |
| 63 | typedef struct AnsDecoder aom_reader; |
| 64 | #else |
Nathan E. Egge | 476c63c | 2017-05-18 18:35:16 -0400 | [diff] [blame] | 65 | typedef struct daala_reader aom_reader; |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 66 | #endif |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 67 | |
Alex Converse | eb00cb2 | 2016-06-06 15:12:06 -0700 | [diff] [blame] | 68 | static INLINE int aom_reader_init(aom_reader *r, const uint8_t *buffer, |
Alex Converse | 346440b | 2017-01-03 13:47:37 -0800 | [diff] [blame] | 69 | size_t size, aom_decrypt_cb decrypt_cb, |
Alex Converse | eb00cb2 | 2016-06-06 15:12:06 -0700 | [diff] [blame] | 70 | void *decrypt_state) { |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 71 | (void)decrypt_cb; |
| 72 | (void)decrypt_state; |
Nathan E. Egge | 476c63c | 2017-05-18 18:35:16 -0400 | [diff] [blame] | 73 | #if CONFIG_ANS |
Alex Converse | 5b5140b | 2016-12-13 14:00:56 -0800 | [diff] [blame] | 74 | if (size > INT_MAX) return 1; |
Alex Converse | 346440b | 2017-01-03 13:47:37 -0800 | [diff] [blame] | 75 | return ans_read_init(r, buffer, (int)size); |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 76 | #else |
Nathan E. Egge | 476c63c | 2017-05-18 18:35:16 -0400 | [diff] [blame] | 77 | return aom_daala_reader_init(r, buffer, (int)size); |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 78 | #endif |
Alex Converse | eb00cb2 | 2016-06-06 15:12:06 -0700 | [diff] [blame] | 79 | } |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 80 | |
Alex Converse | eb00cb2 | 2016-06-06 15:12:06 -0700 | [diff] [blame] | 81 | static INLINE const uint8_t *aom_reader_find_end(aom_reader *r) { |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 82 | #if CONFIG_ANS |
| 83 | (void)r; |
| 84 | assert(0 && "Use the raw buffer size with ANS"); |
| 85 | return NULL; |
| 86 | #else |
Nathan E. Egge | 476c63c | 2017-05-18 18:35:16 -0400 | [diff] [blame] | 87 | return aom_daala_reader_find_end(r); |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 88 | #endif |
Alex Converse | eb00cb2 | 2016-06-06 15:12:06 -0700 | [diff] [blame] | 89 | } |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 90 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 91 | static INLINE int aom_reader_has_error(aom_reader *r) { |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 92 | #if CONFIG_ANS |
| 93 | return ans_reader_has_error(r); |
| 94 | #else |
Nathan E. Egge | 476c63c | 2017-05-18 18:35:16 -0400 | [diff] [blame] | 95 | return aom_daala_reader_has_error(r); |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 96 | #endif |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 97 | } |
| 98 | |
Michael Bebenita | d7baf45 | 2016-08-25 11:27:56 -0700 | [diff] [blame] | 99 | // Returns the position in the bit reader in bits. |
Nathan E. Egge | b244f39 | 2016-09-06 23:48:43 -0400 | [diff] [blame] | 100 | static INLINE uint32_t aom_reader_tell(const aom_reader *r) { |
Michael Bebenita | 868fc0b | 2016-08-03 16:13:04 -0700 | [diff] [blame] | 101 | #if CONFIG_ANS |
| 102 | (void)r; |
| 103 | assert(0 && "aom_reader_tell() is unimplemented for ANS"); |
| 104 | return 0; |
Michael Bebenita | 868fc0b | 2016-08-03 16:13:04 -0700 | [diff] [blame] | 105 | #else |
Nathan E. Egge | 476c63c | 2017-05-18 18:35:16 -0400 | [diff] [blame] | 106 | return aom_daala_reader_tell(r); |
Michael Bebenita | 868fc0b | 2016-08-03 16:13:04 -0700 | [diff] [blame] | 107 | #endif |
| 108 | } |
| 109 | |
Michael Bebenita | d7baf45 | 2016-08-25 11:27:56 -0700 | [diff] [blame] | 110 | // Returns the position in the bit reader in 1/8th bits. |
Nathan E. Egge | b244f39 | 2016-09-06 23:48:43 -0400 | [diff] [blame] | 111 | static INLINE uint32_t aom_reader_tell_frac(const aom_reader *r) { |
Michael Bebenita | d7baf45 | 2016-08-25 11:27:56 -0700 | [diff] [blame] | 112 | #if CONFIG_ANS |
| 113 | (void)r; |
| 114 | assert(0 && "aom_reader_tell_frac() is unimplemented for ANS"); |
| 115 | return 0; |
Michael Bebenita | d7baf45 | 2016-08-25 11:27:56 -0700 | [diff] [blame] | 116 | #else |
Nathan E. Egge | 476c63c | 2017-05-18 18:35:16 -0400 | [diff] [blame] | 117 | return aom_daala_reader_tell_frac(r); |
Michael Bebenita | d7baf45 | 2016-08-25 11:27:56 -0700 | [diff] [blame] | 118 | #endif |
| 119 | } |
| 120 | |
Michael Bebenita | 6048d05 | 2016-08-25 14:40:54 -0700 | [diff] [blame] | 121 | #if CONFIG_ACCOUNTING |
| 122 | static INLINE void aom_process_accounting(const aom_reader *r ACCT_STR_PARAM) { |
| 123 | if (r->accounting != NULL) { |
| 124 | uint32_t tell_frac; |
| 125 | tell_frac = aom_reader_tell_frac(r); |
| 126 | aom_accounting_record(r->accounting, ACCT_STR_NAME, |
| 127 | tell_frac - r->accounting->last_tell_frac); |
| 128 | r->accounting->last_tell_frac = tell_frac; |
| 129 | } |
| 130 | } |
Thomas Davies | f7f87ff | 2017-03-01 16:24:56 +0000 | [diff] [blame] | 131 | |
Yaowu Xu | 4ff59b5 | 2017-04-24 12:41:56 -0700 | [diff] [blame] | 132 | static INLINE void aom_update_symb_counts(const aom_reader *r, int is_binary) { |
Thomas Davies | f7f87ff | 2017-03-01 16:24:56 +0000 | [diff] [blame] | 133 | if (r->accounting != NULL) { |
| 134 | r->accounting->syms.num_multi_syms += !is_binary; |
| 135 | r->accounting->syms.num_binary_syms += !!is_binary; |
| 136 | } |
| 137 | } |
Michael Bebenita | 6048d05 | 2016-08-25 14:40:54 -0700 | [diff] [blame] | 138 | #endif |
| 139 | |
| 140 | static INLINE int aom_read_(aom_reader *r, int prob ACCT_STR_PARAM) { |
| 141 | int ret; |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 142 | #if CONFIG_ANS |
Alex Converse | c54692b | 2017-01-25 16:41:05 -0800 | [diff] [blame] | 143 | ret = rabs_read(r, prob); |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 144 | #else |
Nathan E. Egge | 476c63c | 2017-05-18 18:35:16 -0400 | [diff] [blame] | 145 | ret = aom_daala_read(r, prob); |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 146 | #endif |
Michael Bebenita | 6048d05 | 2016-08-25 14:40:54 -0700 | [diff] [blame] | 147 | #if CONFIG_ACCOUNTING |
| 148 | if (ACCT_STR_NAME) aom_process_accounting(r, ACCT_STR_NAME); |
Thomas Davies | f7f87ff | 2017-03-01 16:24:56 +0000 | [diff] [blame] | 149 | aom_update_symb_counts(r, 1); |
Michael Bebenita | 6048d05 | 2016-08-25 14:40:54 -0700 | [diff] [blame] | 150 | #endif |
| 151 | return ret; |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 152 | } |
| 153 | |
Michael Bebenita | 6048d05 | 2016-08-25 14:40:54 -0700 | [diff] [blame] | 154 | static INLINE int aom_read_bit_(aom_reader *r ACCT_STR_PARAM) { |
| 155 | int ret; |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 156 | #if CONFIG_ANS |
Alex Converse | c54692b | 2017-01-25 16:41:05 -0800 | [diff] [blame] | 157 | ret = rabs_read_bit(r); // Non trivial optimization at half probability |
Nathan E. Egge | 476c63c | 2017-05-18 18:35:16 -0400 | [diff] [blame] | 158 | #elif CONFIG_RAWBITS |
Nathan E. Egge | 08c99eb | 2016-11-09 13:40:26 -0500 | [diff] [blame] | 159 | // Note this uses raw bits and is not the same as aom_daala_read(r, 128); |
Thomas Davies | f7f87ff | 2017-03-01 16:24:56 +0000 | [diff] [blame] | 160 | // Calls to this function are omitted from raw symbol accounting. |
Nathan E. Egge | 08c99eb | 2016-11-09 13:40:26 -0500 | [diff] [blame] | 161 | ret = aom_daala_read_bit(r); |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 162 | #else |
Michael Bebenita | 6048d05 | 2016-08-25 14:40:54 -0700 | [diff] [blame] | 163 | ret = aom_read(r, 128, NULL); // aom_prob_half |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 164 | #endif |
Michael Bebenita | 6048d05 | 2016-08-25 14:40:54 -0700 | [diff] [blame] | 165 | #if CONFIG_ACCOUNTING |
| 166 | if (ACCT_STR_NAME) aom_process_accounting(r, ACCT_STR_NAME); |
| 167 | #endif |
| 168 | return ret; |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 169 | } |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 170 | |
Michael Bebenita | 6048d05 | 2016-08-25 14:40:54 -0700 | [diff] [blame] | 171 | static INLINE int aom_read_literal_(aom_reader *r, int bits ACCT_STR_PARAM) { |
Nathan E. Egge | e691a24 | 2016-06-16 09:00:39 -0400 | [diff] [blame] | 172 | int literal = 0, bit; |
| 173 | |
Michael Bebenita | 6048d05 | 2016-08-25 14:40:54 -0700 | [diff] [blame] | 174 | for (bit = bits - 1; bit >= 0; bit--) literal |= aom_read_bit(r, NULL) << bit; |
| 175 | #if CONFIG_ACCOUNTING |
| 176 | if (ACCT_STR_NAME) aom_process_accounting(r, ACCT_STR_NAME); |
| 177 | #endif |
Nathan E. Egge | e691a24 | 2016-06-16 09:00:39 -0400 | [diff] [blame] | 178 | return literal; |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 179 | } |
| 180 | |
Nathan E. Egge | 2d8dd96 | 2016-12-23 10:42:43 -0500 | [diff] [blame] | 181 | static INLINE int aom_read_cdf_(aom_reader *r, const aom_cdf_prob *cdf, |
Nathan E. Egge | e069849 | 2017-01-06 19:40:36 -0500 | [diff] [blame] | 182 | int nsymbs ACCT_STR_PARAM) { |
Michael Bebenita | 6048d05 | 2016-08-25 14:40:54 -0700 | [diff] [blame] | 183 | int ret; |
Alex Converse | 1e4e29f | 2016-11-08 14:12:14 -0800 | [diff] [blame] | 184 | #if CONFIG_ANS |
Alex Converse | a1ac972 | 2016-10-12 15:59:58 -0700 | [diff] [blame] | 185 | (void)nsymbs; |
Michael Bebenita | 6048d05 | 2016-08-25 14:40:54 -0700 | [diff] [blame] | 186 | ret = rans_read(r, cdf); |
Alex Converse | a1ac972 | 2016-10-12 15:59:58 -0700 | [diff] [blame] | 187 | #else |
Nathan E. Egge | cd53951 | 2017-05-16 12:00:36 -0400 | [diff] [blame] | 188 | ret = daala_read_symbol(r, cdf, nsymbs); |
Alex Converse | a1ac972 | 2016-10-12 15:59:58 -0700 | [diff] [blame] | 189 | #endif |
Alex Converse | 58c520a | 2016-10-20 14:21:06 -0700 | [diff] [blame] | 190 | |
Michael Bebenita | 6048d05 | 2016-08-25 14:40:54 -0700 | [diff] [blame] | 191 | #if CONFIG_ACCOUNTING |
| 192 | if (ACCT_STR_NAME) aom_process_accounting(r, ACCT_STR_NAME); |
Thomas Davies | f7f87ff | 2017-03-01 16:24:56 +0000 | [diff] [blame] | 193 | aom_update_symb_counts(r, (nsymbs == 2)); |
Nathan E. Egge | 4446014 | 2016-06-20 13:44:22 -0400 | [diff] [blame] | 194 | #endif |
Michael Bebenita | 6048d05 | 2016-08-25 14:40:54 -0700 | [diff] [blame] | 195 | return ret; |
Nathan E. Egge | 4446014 | 2016-06-20 13:44:22 -0400 | [diff] [blame] | 196 | } |
Nathan E. Egge | c98d286 | 2016-12-21 11:30:46 -0500 | [diff] [blame] | 197 | |
Nathan E. Egge | e069849 | 2017-01-06 19:40:36 -0500 | [diff] [blame] | 198 | static INLINE int aom_read_symbol_(aom_reader *r, aom_cdf_prob *cdf, |
| 199 | int nsymbs ACCT_STR_PARAM) { |
| 200 | int ret; |
| 201 | ret = aom_read_cdf(r, cdf, nsymbs, ACCT_STR_NAME); |
Nathan E. Egge | e069849 | 2017-01-06 19:40:36 -0500 | [diff] [blame] | 202 | update_cdf(cdf, ret, nsymbs); |
Nathan E. Egge | e069849 | 2017-01-06 19:40:36 -0500 | [diff] [blame] | 203 | return ret; |
| 204 | } |
| 205 | |
Jingning Han | 94cea4a | 2017-09-30 14:13:23 -0700 | [diff] [blame] | 206 | #if CONFIG_LV_MAP |
| 207 | static INLINE int aom_read_bin_(aom_reader *r, aom_cdf_prob *cdf, |
| 208 | int nsymbs ACCT_STR_PARAM) { |
| 209 | int ret; |
Jingning Han | 1c077a4 | 2017-10-11 08:49:15 -0700 | [diff] [blame] | 210 | aom_cdf_prob this_cdf[3] = { (aom_cdf_prob)((cdf[0] >> 8) << 8), 0, 0 }; |
| 211 | this_cdf[0] = clamp(this_cdf[0], (1 << 8), (127 << 8)); |
Jingning Han | 31122f5 | 2017-10-02 09:06:40 -0700 | [diff] [blame] | 212 | ret = aom_read_cdf(r, this_cdf, nsymbs, ACCT_STR_NAME); |
| 213 | update_bin(cdf, ret, nsymbs); |
Jingning Han | 94cea4a | 2017-09-30 14:13:23 -0700 | [diff] [blame] | 214 | return ret; |
| 215 | } |
| 216 | #endif |
| 217 | |
Nathan E. Egge | 0f11c78 | 2017-02-12 19:04:04 -0500 | [diff] [blame] | 218 | static INLINE int aom_read_tree_as_cdf(aom_reader *r, |
| 219 | const aom_tree_index *tree, |
| 220 | const aom_prob *probs) { |
| 221 | aom_tree_index i = 0; |
| 222 | do { |
| 223 | aom_cdf_prob cdf[16]; |
| 224 | aom_tree_index index[16]; |
| 225 | int path[16]; |
| 226 | int dist[16]; |
| 227 | int nsymbs; |
| 228 | int symb; |
| 229 | nsymbs = tree_to_cdf(tree, probs, i, cdf, index, path, dist); |
| 230 | symb = aom_read_cdf(r, cdf, nsymbs, NULL); |
| 231 | OD_ASSERT(symb >= 0 && symb < nsymbs); |
| 232 | i = index[symb]; |
| 233 | } while (i > 0); |
| 234 | return -i; |
| 235 | } |
Nathan E. Egge | 4446014 | 2016-06-20 13:44:22 -0400 | [diff] [blame] | 236 | |
Nathan E. Egge | 0f11c78 | 2017-02-12 19:04:04 -0500 | [diff] [blame] | 237 | static INLINE int aom_read_tree_(aom_reader *r, const aom_tree_index *tree, |
| 238 | const aom_prob *probs ACCT_STR_PARAM) { |
| 239 | int ret; |
Nathan E. Egge | 0f11c78 | 2017-02-12 19:04:04 -0500 | [diff] [blame] | 240 | ret = aom_read_tree_as_cdf(r, tree, probs); |
Nathan E. Egge | 0f11c78 | 2017-02-12 19:04:04 -0500 | [diff] [blame] | 241 | #if CONFIG_ACCOUNTING |
| 242 | if (ACCT_STR_NAME) aom_process_accounting(r, ACCT_STR_NAME); |
| 243 | #endif |
| 244 | return ret; |
| 245 | } |
| 246 | |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 247 | #ifdef __cplusplus |
| 248 | } // extern "C" |
| 249 | #endif |
| 250 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 251 | #endif // AOM_DSP_BITREADER_H_ |