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