xref: /aosp_15_r20/external/libaom/aom_dsp/entenc.c (revision 77c1e3ccc04c968bd2bc212e87364f250e820521)
1 /*
2  * Copyright (c) 2001-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 #include <stdlib.h>
13 #include <string.h>
14 #include <math.h>
15 #include <assert.h>
16 #include "aom_dsp/entenc.h"
17 #include "aom_dsp/prob.h"
18 
19 #if OD_MEASURE_EC_OVERHEAD
20 #if !defined(M_LOG2E)
21 #define M_LOG2E (1.4426950408889634073599246810019)
22 #endif
23 #define OD_LOG2(x) (M_LOG2E * log(x))
24 #endif  // OD_MEASURE_EC_OVERHEAD
25 
26 /*A range encoder.
27   See entdec.c and the references for implementation details \cite{Mar79,MNW98}.
28 
29   @INPROCEEDINGS{Mar79,
30    author="Martin, G.N.N.",
31    title="Range encoding: an algorithm for removing redundancy from a digitised
32     message",
33    booktitle="Video \& Data Recording Conference",
34    year=1979,
35    address="Southampton",
36    month=Jul,
37    URL="http://www.compressconsult.com/rangecoder/rngcod.pdf.gz"
38   }
39   @ARTICLE{MNW98,
40    author="Alistair Moffat and Radford Neal and Ian H. Witten",
41    title="Arithmetic Coding Revisited",
42    journal="{ACM} Transactions on Information Systems",
43    year=1998,
44    volume=16,
45    number=3,
46    pages="256--294",
47    month=Jul,
48    URL="http://researchcommons.waikato.ac.nz/bitstream/handle/10289/78/content.pdf"
49   }*/
50 
51 /*Takes updated low and range values, renormalizes them so that
52    32768 <= rng < 65536 (flushing bytes from low to the output buffer if
53    necessary), and stores them back in the encoder context.
54   low: The new value of low.
55   rng: The new value of the range.*/
od_ec_enc_normalize(od_ec_enc * enc,od_ec_enc_window low,unsigned rng)56 static void od_ec_enc_normalize(od_ec_enc *enc, od_ec_enc_window low,
57                                 unsigned rng) {
58   int d;
59   int c;
60   int s;
61   if (enc->error) return;
62   c = enc->cnt;
63   assert(rng <= 65535U);
64   /*The number of leading zeros in the 16-bit binary representation of rng.*/
65   d = 16 - OD_ILOG_NZ(rng);
66   s = c + d;
67 
68   /* We flush every time "low" cannot safely and efficiently accommodate any
69      more data. Overall, c must not exceed 63 at the time of byte flush out. To
70      facilitate this, "s" cannot exceed 56-bits because we have to keep 1 byte
71      for carry. Also, we need to subtract 16 because we want to keep room for
72      the next symbol worth "d"-bits (max 15). An alternate condition would be if
73      (e < d), where e = number of leading zeros in "low", indicating there is
74      not enough rooom to accommodate "rng" worth of "d"-bits in "low". However,
75      this approach needs additional computations: (i) compute "e", (ii) push
76      the leading 0x00's as a special case.
77   */
78   if (s >= 40) {  // 56 - 16
79     unsigned char *out = enc->buf;
80     uint32_t storage = enc->storage;
81     uint32_t offs = enc->offs;
82     if (offs + 8 > storage) {
83       storage = 2 * storage + 8;
84       out = (unsigned char *)realloc(out, sizeof(*out) * storage);
85       if (out == NULL) {
86         enc->error = -1;
87         return;
88       }
89       enc->buf = out;
90       enc->storage = storage;
91     }
92     // Need to add 1 byte here since enc->cnt always counts 1 byte less
93     // (enc->cnt = -9) to ensure correct operation
94     uint8_t num_bytes_ready = (s >> 3) + 1;
95 
96     // Update "c" to contain the number of non-ready bits in "low". Since "low"
97     // has 64-bit capacity, we need to add the (64 - 40) cushion bits and take
98     // off the number of ready bits.
99     c += 24 - (num_bytes_ready << 3);
100 
101     // Prepare "output" and update "low"
102     uint64_t output = low >> c;
103     low = low & (((uint64_t)1 << c) - 1);
104 
105     // Prepare data and carry mask
106     uint64_t mask = (uint64_t)1 << (num_bytes_ready << 3);
107     uint64_t carry = output & mask;
108 
109     mask = mask - 0x01;
110     output = output & mask;
111 
112     // Write data in a single operation
113     write_enc_data_to_out_buf(out, offs, output, carry, &enc->offs,
114                               num_bytes_ready);
115 
116     // Update state of the encoder: enc->cnt to contain the number of residual
117     // bits
118     s = c + d - 24;
119   }
120   enc->low = low << d;
121   enc->rng = rng << d;
122   enc->cnt = s;
123 }
124 
125 /*Initializes the encoder.
126   size: The initial size of the buffer, in bytes.*/
od_ec_enc_init(od_ec_enc * enc,uint32_t size)127 void od_ec_enc_init(od_ec_enc *enc, uint32_t size) {
128   od_ec_enc_reset(enc);
129   enc->buf = (unsigned char *)malloc(sizeof(*enc->buf) * size);
130   enc->storage = size;
131   if (size > 0 && enc->buf == NULL) {
132     enc->storage = 0;
133     enc->error = -1;
134   }
135 }
136 
137 /*Reinitializes the encoder.*/
od_ec_enc_reset(od_ec_enc * enc)138 void od_ec_enc_reset(od_ec_enc *enc) {
139   enc->offs = 0;
140   enc->low = 0;
141   enc->rng = 0x8000;
142   /*This is initialized to -9 so that it crosses zero after we've accumulated
143      one byte + one carry bit.*/
144   enc->cnt = -9;
145   enc->error = 0;
146 #if OD_MEASURE_EC_OVERHEAD
147   enc->entropy = 0;
148   enc->nb_symbols = 0;
149 #endif
150 }
151 
152 /*Frees the buffers used by the encoder.*/
od_ec_enc_clear(od_ec_enc * enc)153 void od_ec_enc_clear(od_ec_enc *enc) { free(enc->buf); }
154 
155 /*Encodes a symbol given its frequency in Q15.
156   fl: CDF_PROB_TOP minus the cumulative frequency of all symbols that come
157   before the one to be encoded.
158   fh: CDF_PROB_TOP minus the cumulative frequency of all symbols up to and
159   including the one to be encoded.*/
od_ec_encode_q15(od_ec_enc * enc,unsigned fl,unsigned fh,int s,int nsyms)160 static void od_ec_encode_q15(od_ec_enc *enc, unsigned fl, unsigned fh, int s,
161                              int nsyms) {
162   od_ec_enc_window l;
163   unsigned r;
164   unsigned u;
165   unsigned v;
166   l = enc->low;
167   r = enc->rng;
168   assert(32768U <= r);
169   assert(fh <= fl);
170   assert(fl <= 32768U);
171   assert(7 - EC_PROB_SHIFT >= 0);
172   const int N = nsyms - 1;
173   if (fl < CDF_PROB_TOP) {
174     u = ((r >> 8) * (uint32_t)(fl >> EC_PROB_SHIFT) >> (7 - EC_PROB_SHIFT)) +
175         EC_MIN_PROB * (N - (s - 1));
176     v = ((r >> 8) * (uint32_t)(fh >> EC_PROB_SHIFT) >> (7 - EC_PROB_SHIFT)) +
177         EC_MIN_PROB * (N - (s + 0));
178     l += r - u;
179     r = u - v;
180   } else {
181     r -= ((r >> 8) * (uint32_t)(fh >> EC_PROB_SHIFT) >> (7 - EC_PROB_SHIFT)) +
182          EC_MIN_PROB * (N - (s + 0));
183   }
184   od_ec_enc_normalize(enc, l, r);
185 #if OD_MEASURE_EC_OVERHEAD
186   enc->entropy -= OD_LOG2((double)(OD_ICDF(fh) - OD_ICDF(fl)) / CDF_PROB_TOP.);
187   enc->nb_symbols++;
188 #endif
189 }
190 
191 /*Encode a single binary value.
192   val: The value to encode (0 or 1).
193   f: The probability that the val is one, scaled by 32768.*/
od_ec_encode_bool_q15(od_ec_enc * enc,int val,unsigned f)194 void od_ec_encode_bool_q15(od_ec_enc *enc, int val, unsigned f) {
195   od_ec_enc_window l;
196   unsigned r;
197   unsigned v;
198   assert(0 < f);
199   assert(f < 32768U);
200   l = enc->low;
201   r = enc->rng;
202   assert(32768U <= r);
203   v = ((r >> 8) * (uint32_t)(f >> EC_PROB_SHIFT) >> (7 - EC_PROB_SHIFT));
204   v += EC_MIN_PROB;
205   if (val) l += r - v;
206   r = val ? v : r - v;
207   od_ec_enc_normalize(enc, l, r);
208 #if OD_MEASURE_EC_OVERHEAD
209   enc->entropy -= OD_LOG2((double)(val ? f : (32768 - f)) / 32768.);
210   enc->nb_symbols++;
211 #endif
212 }
213 
214 /*Encodes a symbol given a cumulative distribution function (CDF) table in Q15.
215   s: The index of the symbol to encode.
216   icdf: 32768 minus the CDF, such that symbol s falls in the range
217          [s > 0 ? (32768 - icdf[s - 1]) : 0, 32768 - icdf[s]).
218         The values must be monotonically decreasing, and icdf[nsyms - 1] must
219          be 0.
220   nsyms: The number of symbols in the alphabet.
221          This should be at most 16.*/
od_ec_encode_cdf_q15(od_ec_enc * enc,int s,const uint16_t * icdf,int nsyms)222 void od_ec_encode_cdf_q15(od_ec_enc *enc, int s, const uint16_t *icdf,
223                           int nsyms) {
224   (void)nsyms;
225   assert(s >= 0);
226   assert(s < nsyms);
227   assert(icdf[nsyms - 1] == OD_ICDF(CDF_PROB_TOP));
228   od_ec_encode_q15(enc, s > 0 ? icdf[s - 1] : OD_ICDF(0), icdf[s], s, nsyms);
229 }
230 
231 /*Overwrites a few bits at the very start of an existing stream, after they
232    have already been encoded.
233   This makes it possible to have a few flags up front, where it is easy for
234    decoders to access them without parsing the whole stream, even if their
235    values are not determined until late in the encoding process, without having
236    to buffer all the intermediate symbols in the encoder.
237   In order for this to work, at least nbits bits must have already been encoded
238    using probabilities that are an exact power of two.
239   The encoder can verify the number of encoded bits is sufficient, but cannot
240    check this latter condition.
241   val: The bits to encode (in the least nbits significant bits).
242        They will be decoded in order from most-significant to least.
243   nbits: The number of bits to overwrite.
244          This must be no more than 8.*/
od_ec_enc_patch_initial_bits(od_ec_enc * enc,unsigned val,int nbits)245 void od_ec_enc_patch_initial_bits(od_ec_enc *enc, unsigned val, int nbits) {
246   int shift;
247   unsigned mask;
248   assert(nbits >= 0);
249   assert(nbits <= 8);
250   assert(val < 1U << nbits);
251   shift = 8 - nbits;
252   mask = ((1U << nbits) - 1) << shift;
253   if (enc->offs > 0) {
254     /*The first byte has been finalized.*/
255     enc->buf[0] = (unsigned char)((enc->buf[0] & ~mask) | val << shift);
256   } else if (9 + enc->cnt + (enc->rng == 0x8000) > nbits) {
257     /*The first byte has yet to be output.*/
258     enc->low = (enc->low & ~((od_ec_enc_window)mask << (16 + enc->cnt))) |
259                (od_ec_enc_window)val << (16 + enc->cnt + shift);
260   } else {
261     /*The encoder hasn't even encoded _nbits of data yet.*/
262     enc->error = -1;
263   }
264 }
265 
266 #if OD_MEASURE_EC_OVERHEAD
267 #include <stdio.h>
268 #endif
269 
270 /*Indicates that there are no more symbols to encode.
271   All remaining output bytes are flushed to the output buffer.
272   od_ec_enc_reset() should be called before using the encoder again.
273   bytes: Returns the size of the encoded data in the returned buffer.
274   Return: A pointer to the start of the final buffer, or NULL if there was an
275            encoding error.*/
od_ec_enc_done(od_ec_enc * enc,uint32_t * nbytes)276 unsigned char *od_ec_enc_done(od_ec_enc *enc, uint32_t *nbytes) {
277   unsigned char *out;
278   uint32_t storage;
279   uint32_t offs;
280   od_ec_enc_window m;
281   od_ec_enc_window e;
282   od_ec_enc_window l;
283   int c;
284   int s;
285   if (enc->error) return NULL;
286 #if OD_MEASURE_EC_OVERHEAD
287   {
288     uint32_t tell;
289     /* Don't count the 1 bit we lose to raw bits as overhead. */
290     tell = od_ec_enc_tell(enc) - 1;
291     fprintf(stderr, "overhead: %f%%\n",
292             100 * (tell - enc->entropy) / enc->entropy);
293     fprintf(stderr, "efficiency: %f bits/symbol\n",
294             (double)tell / enc->nb_symbols);
295   }
296 #endif
297 
298   l = enc->low;
299   c = enc->cnt;
300   s = 10;
301   m = 0x3FFF;
302   e = ((l + m) & ~m) | (m + 1);
303   s += c;
304   offs = enc->offs;
305 
306   /*Make sure there's enough room for the entropy-coded bits.*/
307   out = enc->buf;
308   storage = enc->storage;
309   const int s_bits = (s + 7) >> 3;
310   int b = OD_MAXI(s_bits, 0);
311   if (offs + b > storage) {
312     storage = offs + b;
313     out = (unsigned char *)realloc(out, sizeof(*out) * storage);
314     if (out == NULL) {
315       enc->error = -1;
316       return NULL;
317     }
318     enc->buf = out;
319     enc->storage = storage;
320   }
321 
322   /*We output the minimum number of bits that ensures that the symbols encoded
323      thus far will be decoded correctly regardless of the bits that follow.*/
324   if (s > 0) {
325     uint64_t n;
326     n = ((uint64_t)1 << (c + 16)) - 1;
327     do {
328       assert(offs < storage);
329       uint16_t val = (uint16_t)(e >> (c + 16));
330       out[offs] = (unsigned char)(val & 0x00FF);
331       if (val & 0x0100) {
332         assert(offs > 0);
333         propagate_carry_bwd(out, offs - 1);
334       }
335       offs++;
336 
337       e &= n;
338       s -= 8;
339       c -= 8;
340       n >>= 8;
341     } while (s > 0);
342   }
343   *nbytes = offs;
344 
345   return out;
346 }
347 
348 /*Returns the number of bits "used" by the encoded symbols so far.
349   This same number can be computed in either the encoder or the decoder, and is
350    suitable for making coding decisions.
351   Warning: The value returned by this function can decrease compared to an
352    earlier call, even after encoding more data, if there is an encoding error
353    (i.e., a failure to allocate enough space for the output buffer).
354   Return: The number of bits.
355           This will always be slightly larger than the exact value (e.g., all
356            rounding error is in the positive direction).*/
od_ec_enc_tell(const od_ec_enc * enc)357 int od_ec_enc_tell(const od_ec_enc *enc) {
358   /*The 10 here counteracts the offset of -9 baked into cnt, and adds 1 extra
359      bit, which we reserve for terminating the stream.*/
360   return (enc->cnt + 10) + enc->offs * 8;
361 }
362 
363 /*Returns the number of bits "used" by the encoded symbols so far.
364   This same number can be computed in either the encoder or the decoder, and is
365    suitable for making coding decisions.
366   Warning: The value returned by this function can decrease compared to an
367    earlier call, even after encoding more data, if there is an encoding error
368    (i.e., a failure to allocate enough space for the output buffer).
369   Return: The number of bits scaled by 2**OD_BITRES.
370           This will always be slightly larger than the exact value (e.g., all
371            rounding error is in the positive direction).*/
od_ec_enc_tell_frac(const od_ec_enc * enc)372 uint32_t od_ec_enc_tell_frac(const od_ec_enc *enc) {
373   return od_ec_tell_frac(od_ec_enc_tell(enc), enc->rng);
374 }
375