Line data Source code
1 : /*
2 : * Copyright (c) 2016, 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_DSP_DAALABOOLREADER_H_
13 : #define AOM_DSP_DAALABOOLREADER_H_
14 :
15 : #include "aom/aom_integer.h"
16 : #include "aom_dsp/entdec.h"
17 : #include "aom_dsp/prob.h"
18 : #if CONFIG_ACCOUNTING
19 : #include "av1/decoder/accounting.h"
20 : #endif
21 : #if CONFIG_BITSTREAM_DEBUG
22 : #include <stdio.h>
23 : #include "aom_util/debug_util.h"
24 : #endif // CONFIG_BITSTREAM_DEBUG
25 :
26 : #ifdef __cplusplus
27 : extern "C" {
28 : #endif
29 :
30 : struct daala_reader {
31 : const uint8_t *buffer;
32 : const uint8_t *buffer_end;
33 : od_ec_dec ec;
34 : #if CONFIG_ACCOUNTING
35 : Accounting *accounting;
36 : #endif
37 : };
38 :
39 : typedef struct daala_reader daala_reader;
40 :
41 : int aom_daala_reader_init(daala_reader *r, const uint8_t *buffer, int size);
42 : const uint8_t *aom_daala_reader_find_end(daala_reader *r);
43 : uint32_t aom_daala_reader_tell(const daala_reader *r);
44 : uint32_t aom_daala_reader_tell_frac(const daala_reader *r);
45 :
46 0 : static INLINE int aom_daala_read(daala_reader *r, int prob) {
47 : int bit;
48 : #if CONFIG_EC_SMALLMUL
49 0 : int p = (0x7FFFFF - (prob << 15) + prob) >> 8;
50 : #else
51 : int p = ((prob << 15) + 256 - prob) >> 8;
52 : #endif
53 : #if CONFIG_BITSTREAM_DEBUG
54 : /*{
55 : const int queue_r = bitstream_queue_get_read();
56 : const int frame_idx = bitstream_queue_get_frame_read();
57 : if (frame_idx == 0 && queue_r == 0) {
58 : fprintf(stderr, "\n *** bitstream queue at frame_idx_r %d queue_r %d\n",
59 : frame_idx, queue_r);
60 : }
61 : }*/
62 : #endif
63 :
64 0 : bit = od_ec_decode_bool_q15(&r->ec, p);
65 :
66 : #if CONFIG_BITSTREAM_DEBUG
67 : {
68 : int i;
69 : int ref_bit, ref_nsymbs;
70 : aom_cdf_prob ref_cdf[16];
71 : const int queue_r = bitstream_queue_get_read();
72 : const int frame_idx = bitstream_queue_get_frame_read();
73 : bitstream_queue_pop(&ref_bit, ref_cdf, &ref_nsymbs);
74 : if (ref_nsymbs != 2) {
75 : fprintf(stderr,
76 : "\n *** [bit] nsymbs error, frame_idx_r %d nsymbs %d ref_nsymbs "
77 : "%d queue_r %d\n",
78 : frame_idx, 2, ref_nsymbs, queue_r);
79 : assert(0);
80 : }
81 : if ((ref_nsymbs != 2) || (ref_cdf[0] != (aom_cdf_prob)p) ||
82 : (ref_cdf[1] != 32767)) {
83 : fprintf(stderr,
84 : "\n *** [bit] cdf error, frame_idx_r %d cdf {%d, %d} ref_cdf {%d",
85 : frame_idx, p, 32767, ref_cdf[0]);
86 : for (i = 1; i < ref_nsymbs; ++i) fprintf(stderr, ", %d", ref_cdf[i]);
87 : fprintf(stderr, "} queue_r %d\n", queue_r);
88 : assert(0);
89 : }
90 : if (bit != ref_bit) {
91 : fprintf(stderr,
92 : "\n *** [bit] symb error, frame_idx_r %d symb %d ref_symb %d "
93 : "queue_r %d\n",
94 : frame_idx, bit, ref_bit, queue_r);
95 : assert(0);
96 : }
97 : }
98 : #endif
99 :
100 0 : return bit;
101 : }
102 :
103 : #if CONFIG_RAWBITS
104 : static INLINE int aom_daala_read_bit(daala_reader *r) {
105 : return od_ec_dec_bits(&r->ec, 1, "aom_bits");
106 : }
107 : #endif
108 :
109 0 : static INLINE int aom_daala_reader_has_error(daala_reader *r) {
110 0 : return r->ec.error;
111 : }
112 :
113 0 : static INLINE int daala_read_symbol(daala_reader *r, const aom_cdf_prob *cdf,
114 : int nsymbs) {
115 : int symb;
116 0 : symb = od_ec_decode_cdf_q15(&r->ec, cdf, nsymbs);
117 :
118 : #if CONFIG_BITSTREAM_DEBUG
119 : {
120 : int i;
121 : int cdf_error = 0;
122 : int ref_symb, ref_nsymbs;
123 : aom_cdf_prob ref_cdf[16];
124 : const int queue_r = bitstream_queue_get_read();
125 : const int frame_idx = bitstream_queue_get_frame_read();
126 : bitstream_queue_pop(&ref_symb, ref_cdf, &ref_nsymbs);
127 : if (nsymbs != ref_nsymbs) {
128 : fprintf(stderr,
129 : "\n *** nsymbs error, frame_idx_r %d nsymbs %d ref_nsymbs %d "
130 : "queue_r %d\n",
131 : frame_idx, nsymbs, ref_nsymbs, queue_r);
132 : cdf_error = 0;
133 : assert(0);
134 : } else {
135 : for (i = 0; i < nsymbs; ++i)
136 : if (cdf[i] != ref_cdf[i]) cdf_error = 1;
137 : }
138 : if (cdf_error) {
139 : fprintf(stderr, "\n *** cdf error, frame_idx_r %d cdf {%d", frame_idx,
140 : cdf[0]);
141 : for (i = 1; i < nsymbs; ++i) fprintf(stderr, ", %d", cdf[i]);
142 : fprintf(stderr, "} ref_cdf {%d", ref_cdf[0]);
143 : for (i = 1; i < ref_nsymbs; ++i) fprintf(stderr, ", %d", ref_cdf[i]);
144 : fprintf(stderr, "} queue_r %d\n", queue_r);
145 : assert(0);
146 : }
147 : if (symb != ref_symb) {
148 : fprintf(
149 : stderr,
150 : "\n *** symb error, frame_idx_r %d symb %d ref_symb %d queue_r %d\n",
151 : frame_idx, symb, ref_symb, queue_r);
152 : assert(0);
153 : }
154 : }
155 : #endif
156 :
157 0 : return symb;
158 : }
159 :
160 : #ifdef __cplusplus
161 : } // extern "C"
162 : #endif
163 :
164 : #endif
|