• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_AOM_DSP_DAALABOOLREADER_H_
13 #define AOM_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   uint8_t allow_update_cdf;
38 };
39 
40 typedef struct daala_reader daala_reader;
41 
42 int aom_daala_reader_init(daala_reader *r, const uint8_t *buffer, int size);
43 const uint8_t *aom_daala_reader_find_begin(daala_reader *r);
44 const uint8_t *aom_daala_reader_find_end(daala_reader *r);
45 uint32_t aom_daala_reader_tell(const daala_reader *r);
46 uint32_t aom_daala_reader_tell_frac(const daala_reader *r);
47 // Returns true if the reader has tried to decode more data from the buffer
48 // than was actually provided.
49 int aom_daala_reader_has_overflowed(const daala_reader *r);
50 
aom_daala_read(daala_reader * r,int prob)51 static INLINE int aom_daala_read(daala_reader *r, int prob) {
52   int bit;
53   int p = (0x7FFFFF - (prob << 15) + prob) >> 8;
54 #if CONFIG_BITSTREAM_DEBUG
55 /*{
56   const int queue_r = bitstream_queue_get_read();
57   const int frame_idx = bitstream_queue_get_frame_read();
58   if (frame_idx == 0 && queue_r == 0) {
59     fprintf(stderr, "\n *** bitstream queue at frame_idx_r %d queue_r %d\n",
60             frame_idx, queue_r);
61   }
62 }*/
63 #endif
64 
65   bit = od_ec_decode_bool_q15(&r->ec, p);
66 
67 #if CONFIG_BITSTREAM_DEBUG
68   {
69     int i;
70     int ref_bit, ref_nsymbs;
71     aom_cdf_prob ref_cdf[16];
72     const int queue_r = bitstream_queue_get_read();
73     const int frame_idx = bitstream_queue_get_frame_read();
74     bitstream_queue_pop(&ref_bit, ref_cdf, &ref_nsymbs);
75     if (ref_nsymbs != 2) {
76       fprintf(stderr,
77               "\n *** [bit] nsymbs error, frame_idx_r %d nsymbs %d ref_nsymbs "
78               "%d queue_r %d\n",
79               frame_idx, 2, ref_nsymbs, queue_r);
80       assert(0);
81     }
82     if ((ref_nsymbs != 2) || (ref_cdf[0] != (aom_cdf_prob)p) ||
83         (ref_cdf[1] != 32767)) {
84       fprintf(stderr,
85               "\n *** [bit] cdf error, frame_idx_r %d cdf {%d, %d} ref_cdf {%d",
86               frame_idx, p, 32767, ref_cdf[0]);
87       for (i = 1; i < ref_nsymbs; ++i) fprintf(stderr, ", %d", ref_cdf[i]);
88       fprintf(stderr, "} queue_r %d\n", queue_r);
89       assert(0);
90     }
91     if (bit != ref_bit) {
92       fprintf(stderr,
93               "\n *** [bit] symb error, frame_idx_r %d symb %d ref_symb %d "
94               "queue_r %d\n",
95               frame_idx, bit, ref_bit, queue_r);
96       assert(0);
97     }
98   }
99 #endif
100 
101   return bit;
102 }
103 
daala_read_symbol(daala_reader * r,const aom_cdf_prob * cdf,int nsymbs)104 static INLINE int daala_read_symbol(daala_reader *r, const aom_cdf_prob *cdf,
105                                     int nsymbs) {
106   int symb;
107   assert(cdf != NULL);
108   symb = od_ec_decode_cdf_q15(&r->ec, cdf, nsymbs);
109 
110 #if CONFIG_BITSTREAM_DEBUG
111   {
112     int i;
113     int cdf_error = 0;
114     int ref_symb, ref_nsymbs;
115     aom_cdf_prob ref_cdf[16];
116     const int queue_r = bitstream_queue_get_read();
117     const int frame_idx = bitstream_queue_get_frame_read();
118     bitstream_queue_pop(&ref_symb, ref_cdf, &ref_nsymbs);
119     if (nsymbs != ref_nsymbs) {
120       fprintf(stderr,
121               "\n *** nsymbs error, frame_idx_r %d nsymbs %d ref_nsymbs %d "
122               "queue_r %d\n",
123               frame_idx, nsymbs, ref_nsymbs, queue_r);
124       cdf_error = 0;
125       assert(0);
126     } else {
127       for (i = 0; i < nsymbs; ++i)
128         if (cdf[i] != ref_cdf[i]) cdf_error = 1;
129     }
130     if (cdf_error) {
131       fprintf(stderr, "\n *** cdf error, frame_idx_r %d cdf {%d", frame_idx,
132               cdf[0]);
133       for (i = 1; i < nsymbs; ++i) fprintf(stderr, ", %d", cdf[i]);
134       fprintf(stderr, "} ref_cdf {%d", ref_cdf[0]);
135       for (i = 1; i < ref_nsymbs; ++i) fprintf(stderr, ", %d", ref_cdf[i]);
136       fprintf(stderr, "} queue_r %d\n", queue_r);
137       assert(0);
138     }
139     if (symb != ref_symb) {
140       fprintf(
141           stderr,
142           "\n *** symb error, frame_idx_r %d symb %d ref_symb %d queue_r %d\n",
143           frame_idx, symb, ref_symb, queue_r);
144       assert(0);
145     }
146   }
147 #endif
148 
149   return symb;
150 }
151 
152 #ifdef __cplusplus
153 }  // extern "C"
154 #endif
155 
156 #endif  // AOM_AOM_DSP_DAALABOOLREADER_H_
157