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 | uint64_t buf_end; | 193 | uint64_t buf_end; |
| 194 | 194 | ||
| 195 | uint64_t bits; | 195 | uint64_t bits; |
| 196 | uint bits_valid; | 196 | int bits_valid; |
| 197 | uint size_in_bits; | 197 | int size_in_bits; |
| 198 | }; | 198 | }; |
| 199 | 199 | ||
| 200 | #define LOAD64() \ | 200 | #define LOAD64() \ |
| @@ -216,11 +216,11 @@ struct GetBitContext { · 15 unmodified lines | |||
| 216 | gb.bits_valid += 32; \ | 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 | gb.buf = gb.buf_start = uint64_t(data); | 221 | gb.buf = gb.buf_start = uint64_t(data); |
| 222 | gb.buf_end = uint64_t(data) + len; | 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 | /* Preload */ | 225 | /* Preload */ |
| 226 | LOAD64() | 226 | LOAD64() |
| @@ -237,7 +237,7 @@ bool get_bit(inout GetBitContext gb) · 10 unmodified lines | |||
| 237 | return val; | 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 | if (n == 0) | 242 | if (n == 0) |
| 243 | return 0; | 243 | return 0; |
| @@ -251,7 +251,7 @@ uint get_bits(inout GetBitContext gb, uint n) · 7 unmodified lines | |||
| 251 | return val; | 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 | if (n > gb.bits_valid) | 256 | if (n > gb.bits_valid) |
| 257 | RELOAD32() | 257 | RELOAD32() |
| @@ -259,7 +259,7 @@ uint show_bits(inout GetBitContext gb, uint n) · 1 unmodified line | |||
| 259 | return uint(gb.bits >> (64 - n)); | 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 | if (n > gb.bits_valid) | 264 | if (n > gb.bits_valid) |
| 265 | RELOAD32() | 265 | RELOAD32() |
| @@ -268,12 +268,12 @@ void skip_bits(inout GetBitContext gb, uint n) · 2 unmodified lines | |||
| 268 | gb.bits_valid -= n; | 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 | uint64_t ac_byte_count = sc.c.bytestream - sc.c.bytestream_start - 1; | 108 | uint64_t ac_byte_count = sc.c.bytestream - sc.c.bytestream_start - 1; |
| 109 | init_get_bits(sc.gb, u8buf(sc.c.bytestream_start + ac_byte_count), | 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 | void main(void) | 113 | void main(void) |
| @@ -121,7 +121,7 @@ Symbol get_vlc_symbol(inout VlcState state, int v, int bits) · 120 unmodified lines | |||
| 121 | return set_sr_golomb(code, k, 12, bits); | 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 | for (uint i = 0; i < 12; i++) | 126 | for (uint i = 0; i < 12; i++) |
| 127 | if (get_bit(gb)) | 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 | return get_bits(gb, esc_len) + 11; | 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 | int v = int(get_ur_golomb(gb, k, limit, esc_len)); | 135 | int v = int(get_ur_golomb(gb, k, limit, esc_len)); |
| 136 | return (v >> 1) ^ -(v & 1); | 136 | return (v >> 1) ^ -(v & 1); |