tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

bitreader_buffer.c (3781B)


      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 #include <assert.h>
     13 #include <stdint.h>
     14 
     15 #include "config/aom_config.h"
     16 
     17 #include "aom_dsp/bitreader_buffer.h"
     18 #include "aom_dsp/recenter.h"
     19 #include "aom_ports/bitops.h"
     20 
     21 size_t aom_rb_bytes_read(const struct aom_read_bit_buffer *rb) {
     22  return (rb->bit_offset + 7) >> 3;
     23 }
     24 
     25 int aom_rb_read_bit(struct aom_read_bit_buffer *rb) {
     26  const uint32_t off = rb->bit_offset;
     27  const uint32_t p = off >> 3;
     28  const int q = 7 - (int)(off & 0x7);
     29  if (rb->bit_buffer + p < rb->bit_buffer_end) {
     30    const int bit = (rb->bit_buffer[p] >> q) & 1;
     31    rb->bit_offset = off + 1;
     32    return bit;
     33  } else {
     34    if (rb->error_handler) rb->error_handler(rb->error_handler_data);
     35    return 0;
     36  }
     37 }
     38 
     39 int aom_rb_read_literal(struct aom_read_bit_buffer *rb, int bits) {
     40  assert(bits <= 31);
     41  int value = 0, bit;
     42  for (bit = bits - 1; bit >= 0; bit--) value |= aom_rb_read_bit(rb) << bit;
     43  return value;
     44 }
     45 
     46 #if CONFIG_AV1_DECODER
     47 uint32_t aom_rb_read_unsigned_literal(struct aom_read_bit_buffer *rb,
     48                                      int bits) {
     49  assert(bits <= 32);
     50  uint32_t value = 0;
     51  int bit;
     52  for (bit = bits - 1; bit >= 0; bit--)
     53    value |= (uint32_t)aom_rb_read_bit(rb) << bit;
     54  return value;
     55 }
     56 
     57 int aom_rb_read_inv_signed_literal(struct aom_read_bit_buffer *rb, int bits) {
     58  const int nbits = sizeof(unsigned) * 8 - bits - 1;
     59  const unsigned value = (unsigned)aom_rb_read_literal(rb, bits + 1) << nbits;
     60  return ((int)value) >> nbits;
     61 }
     62 #endif  // CONFIG_AV1_DECODER
     63 
     64 uint32_t aom_rb_read_uvlc(struct aom_read_bit_buffer *rb) {
     65  int leading_zeros = 0;
     66  while (leading_zeros < 32 && !aom_rb_read_bit(rb)) ++leading_zeros;
     67  // Maximum 32 bits.
     68  if (leading_zeros == 32) return UINT32_MAX;  // Error.
     69  const uint32_t base = (1u << leading_zeros) - 1;
     70  const uint32_t value = aom_rb_read_literal(rb, leading_zeros);
     71  return base + value;
     72 }
     73 
     74 #if CONFIG_AV1_DECODER
     75 static uint16_t aom_rb_read_primitive_quniform(struct aom_read_bit_buffer *rb,
     76                                               uint16_t n) {
     77  if (n <= 1) return 0;
     78  const int l = get_msb(n) + 1;
     79  const int m = (1 << l) - n;
     80  const int v = aom_rb_read_literal(rb, l - 1);
     81  return v < m ? v : (v << 1) - m + aom_rb_read_bit(rb);
     82 }
     83 
     84 static uint16_t aom_rb_read_primitive_subexpfin(struct aom_read_bit_buffer *rb,
     85                                                uint16_t n, uint16_t k) {
     86  int i = 0;
     87  int mk = 0;
     88 
     89  while (1) {
     90    int b = (i ? k + i - 1 : k);
     91    int a = (1 << b);
     92 
     93    if (n <= mk + 3 * a) {
     94      return aom_rb_read_primitive_quniform(rb, n - mk) + mk;
     95    }
     96 
     97    if (!aom_rb_read_bit(rb)) {
     98      return aom_rb_read_literal(rb, b) + mk;
     99    }
    100 
    101    i = i + 1;
    102    mk += a;
    103  }
    104 
    105  assert(0);
    106  return 0;
    107 }
    108 
    109 static uint16_t aom_rb_read_primitive_refsubexpfin(
    110    struct aom_read_bit_buffer *rb, uint16_t n, uint16_t k, uint16_t ref) {
    111  return inv_recenter_finite_nonneg(n, ref,
    112                                    aom_rb_read_primitive_subexpfin(rb, n, k));
    113 }
    114 
    115 int16_t aom_rb_read_signed_primitive_refsubexpfin(
    116    struct aom_read_bit_buffer *rb, uint16_t n, uint16_t k, int16_t ref) {
    117  ref += n - 1;
    118  const uint16_t scaled_n = (n << 1) - 1;
    119  return aom_rb_read_primitive_refsubexpfin(rb, scaled_n, k, ref) - n + 1;
    120 }
    121 #endif  // CONFIG_AV1_DECODER