This makes left_bits return useful data rather than overflowing, and also saves some 64-bit integer operations, which is still always a plus sadly.
Showing the changes to libavcodec (3 of 3 files). Show all
Unified · Split
| @@ -193,8 +193,8 @@ struct GetBitContext { · 192 unmodified lines | ||
| 193 | 193 | uint64_t buf_end; |
| 194 | 194 | |
| 195 | 195 | uint64_t bits; |
| 196 | − uint bits_valid; | |
| 197 | − uint size_in_bits; | |
| 196 | + int bits_valid; | |
| 197 | + int size_in_bits; | |
| 198 | 198 | }; |
| 199 | 199 | |
| 200 | 200 | #define LOAD64() \ |
| @@ -216,11 +216,11 @@ struct GetBitContext { · 15 unmodified lines | ||
| 216 | 216 | gb.bits_valid += 32; \ |
| 217 | 217 | } |
| 218 | 218 | |
| 219 | −void init_get_bits(inout GetBitContext gb, u8buf data, uint64_t len) | |
| 219 | +void init_get_bits(inout GetBitContext gb, u8buf data, int len) | |
| 220 | 220 | { |
| 221 | 221 | gb.buf = gb.buf_start = uint64_t(data); |
| 222 | 222 | gb.buf_end = uint64_t(data) + len; |
| 223 | − gb.size_in_bits = uint(len) * 8; | |
| 223 | + gb.size_in_bits = len * 8; | |
| 224 | 224 | |
| 225 | 225 | /* Preload */ |
| 226 | 226 | LOAD64() |
| @@ -237,7 +237,7 @@ bool get_bit(inout GetBitContext gb) · 10 unmodified lines | ||
| 237 | 237 | return val; |
| 238 | 238 | } |
| 239 | 239 | |
| 240 | −uint get_bits(inout GetBitContext gb, uint n) | |
| 240 | +uint get_bits(inout GetBitContext gb, int n) | |
| 241 | 241 | { |
| 242 | 242 | if (n == 0) |
| 243 | 243 | return 0; |
| @@ -251,7 +251,7 @@ uint get_bits(inout GetBitContext gb, uint n) · 7 unmodified lines | ||
| 251 | 251 | return val; |
| 252 | 252 | } |
| 253 | 253 | |
| 254 | −uint show_bits(inout GetBitContext gb, uint n) | |
| 254 | +uint show_bits(inout GetBitContext gb, int n) | |
| 255 | 255 | { |
| 256 | 256 | if (n > gb.bits_valid) |
| 257 | 257 | RELOAD32() |
| @@ -259,7 +259,7 @@ uint show_bits(inout GetBitContext gb, uint n) · 1 unmodified line | ||
| 259 | 259 | return uint(gb.bits >> (64 - n)); |
| 260 | 260 | } |
| 261 | 261 | |
| 262 | −void skip_bits(inout GetBitContext gb, uint n) | |
| 262 | +void skip_bits(inout GetBitContext gb, int n) | |
| 263 | 263 | { |
| 264 | 264 | if (n > gb.bits_valid) |
| 265 | 265 | RELOAD32() |
| @@ -268,12 +268,12 @@ void skip_bits(inout GetBitContext gb, uint n) · 2 unmodified lines | ||
| 268 | 268 | gb.bits_valid -= n; |
| 269 | 269 | } |
| 270 | 270 | |
| 271 | −uint tell_bits(in GetBitContext gb) | |
| 271 | +int tell_bits(in GetBitContext gb) | |
| 272 | 272 | { |
| 273 | − return uint(gb.buf - gb.buf_start) * 8 - gb.bits_valid; | |
| 273 | + return int(gb.buf - gb.buf_start) * 8 - gb.bits_valid; | |
| 274 | 274 | } |
| 275 | 275 | |
| 276 | −uint left_bits(in GetBitContext gb) | |
| 276 | +int left_bits(in GetBitContext gb) | |
| 277 | 277 | { |
| 278 | − return gb.size_in_bits - uint(gb.buf - gb.buf_start) * 8 + gb.bits_valid; | |
| 278 | + return gb.size_in_bits - int(gb.buf - gb.buf_start) * 8 + gb.bits_valid; | |
| 279 | 279 | } |
| @@ -107,7 +107,7 @@ void golomb_init(inout SliceContext sc) · 106 unmodified lines | ||
| 107 | 107 | |
| 108 | 108 | uint64_t ac_byte_count = sc.c.bytestream - sc.c.bytestream_start - 1; |
| 109 | 109 | init_get_bits(sc.gb, u8buf(sc.c.bytestream_start + ac_byte_count), |
| 110 | − sc.c.bytestream_end - sc.c.bytestream_start - ac_byte_count); | |
| 110 | + int(sc.c.bytestream_end - sc.c.bytestream_start - ac_byte_count)); | |
| 111 | 111 | } |
| 112 | 112 | |
| 113 | 113 | void main(void) |
| @@ -121,7 +121,7 @@ Symbol get_vlc_symbol(inout VlcState state, int v, int bits) · 120 unmodified lines | ||
| 121 | 121 | return set_sr_golomb(code, k, 12, bits); |
| 122 | 122 | } |
| 123 | 123 | |
| 124 | −uint get_ur_golomb(inout GetBitContext gb, uint k, int limit, int esc_len) | |
| 124 | +uint get_ur_golomb(inout GetBitContext gb, int k, int limit, int esc_len) | |
| 125 | 125 | { |
| 126 | 126 | for (uint i = 0; i < 12; i++) |
| 127 | 127 | if (get_bit(gb)) |
| @@ -130,7 +130,7 @@ uint get_ur_golomb(inout GetBitContext gb, uint k, int limit, int esc_len) · 2 unmodified lines | ||
| 130 | 130 | return get_bits(gb, esc_len) + 11; |
| 131 | 131 | } |
| 132 | 132 | |
| 133 | −int get_sr_golomb(inout GetBitContext gb, uint k, int limit, int esc_len) | |
| 133 | +int get_sr_golomb(inout GetBitContext gb, int k, int limit, int esc_len) | |
| 134 | 134 | { |
| 135 | 135 | int v = int(get_ur_golomb(gb, k, limit, esc_len)); |
| 136 | 136 | return (v >> 1) ^ -(v & 1); |