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> |
| 16 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 17 | #include "./aom_config.h" |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 18 | #include "aom/aomdx.h" |
| 19 | #include "aom/aom_integer.h" |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 20 | #if CONFIG_ANS |
| 21 | #include "aom_dsp/ans.h" |
| 22 | #else |
Alex Converse | eb00cb2 | 2016-06-06 15:12:06 -0700 | [diff] [blame] | 23 | #include "aom_dsp/dkboolreader.h" |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 24 | #endif |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 25 | #include "aom_dsp/prob.h" |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 26 | |
| 27 | #ifdef __cplusplus |
| 28 | extern "C" { |
| 29 | #endif |
| 30 | |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 31 | #if CONFIG_ANS |
| 32 | typedef struct AnsDecoder aom_reader; |
| 33 | #else |
Alex Converse | eb00cb2 | 2016-06-06 15:12:06 -0700 | [diff] [blame] | 34 | typedef struct aom_dk_reader aom_reader; |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 35 | #endif |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 36 | |
Alex Converse | eb00cb2 | 2016-06-06 15:12:06 -0700 | [diff] [blame] | 37 | static INLINE int aom_reader_init(aom_reader *r, const uint8_t *buffer, |
| 38 | size_t size, aom_decrypt_cb decrypt_cb, |
| 39 | void *decrypt_state) { |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 40 | #if CONFIG_ANS |
| 41 | (void)decrypt_cb; |
| 42 | (void)decrypt_state; |
| 43 | assert(size <= INT_MAX); |
| 44 | return ans_read_init(r, buffer, size); |
| 45 | #else |
Alex Converse | eb00cb2 | 2016-06-06 15:12:06 -0700 | [diff] [blame] | 46 | return aom_dk_reader_init(r, buffer, size, decrypt_cb, decrypt_state); |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 47 | #endif |
Alex Converse | eb00cb2 | 2016-06-06 15:12:06 -0700 | [diff] [blame] | 48 | } |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 49 | |
Alex Converse | eb00cb2 | 2016-06-06 15:12:06 -0700 | [diff] [blame] | 50 | static INLINE const uint8_t *aom_reader_find_end(aom_reader *r) { |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 51 | #if CONFIG_ANS |
| 52 | (void)r; |
| 53 | assert(0 && "Use the raw buffer size with ANS"); |
| 54 | return NULL; |
| 55 | #else |
Alex Converse | eb00cb2 | 2016-06-06 15:12:06 -0700 | [diff] [blame] | 56 | return aom_dk_reader_find_end(r); |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 57 | #endif |
Alex Converse | eb00cb2 | 2016-06-06 15:12:06 -0700 | [diff] [blame] | 58 | } |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 59 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 60 | static INLINE int aom_reader_has_error(aom_reader *r) { |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 61 | #if CONFIG_ANS |
| 62 | return ans_reader_has_error(r); |
| 63 | #else |
Alex Converse | eb00cb2 | 2016-06-06 15:12:06 -0700 | [diff] [blame] | 64 | return aom_dk_reader_has_error(r); |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 65 | #endif |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 66 | } |
| 67 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 68 | static INLINE int aom_read(aom_reader *r, int prob) { |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 69 | #if CONFIG_ANS |
| 70 | return uabs_read(r, prob); |
| 71 | #else |
Alex Converse | eb00cb2 | 2016-06-06 15:12:06 -0700 | [diff] [blame] | 72 | return aom_dk_read(r, prob); |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 73 | #endif |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 74 | } |
| 75 | |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 76 | static INLINE int aom_read_bit(aom_reader *r) { |
| 77 | #if CONFIG_ANS |
| 78 | return uabs_read_bit(r); // Non trivial optimization at half probability |
| 79 | #else |
| 80 | return aom_dk_read_bit(r); |
| 81 | #endif |
| 82 | } |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 83 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 84 | static INLINE int aom_read_literal(aom_reader *r, int bits) { |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 85 | #if CONFIG_ANS |
| 86 | return uabs_read_literal(r, bits); |
| 87 | #else |
Alex Converse | eb00cb2 | 2016-06-06 15:12:06 -0700 | [diff] [blame] | 88 | return aom_dk_read_literal(r, bits); |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 89 | #endif |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 90 | } |
| 91 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 92 | static INLINE int aom_read_tree(aom_reader *r, const aom_tree_index *tree, |
| 93 | const aom_prob *probs) { |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 94 | #if CONFIG_ANS |
| 95 | return uabs_read_tree(r, tree, probs); |
| 96 | #else |
Alex Converse | eb00cb2 | 2016-06-06 15:12:06 -0700 | [diff] [blame] | 97 | return aom_dk_read_tree(r, tree, probs); |
Alex Converse | acef60b | 2016-09-23 14:21:02 -0700 | [diff] [blame] | 98 | #endif |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 99 | } |
| 100 | |
| 101 | #ifdef __cplusplus |
| 102 | } // extern "C" |
| 103 | #endif |
| 104 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 105 | #endif // AOM_DSP_BITREADER_H_ |