diff options
Diffstat (limited to 'lib/rbcodec/codecs/libffmpegFLAC/golomb.h')
-rw-r--r-- | lib/rbcodec/codecs/libffmpegFLAC/golomb.h | 77 |
1 files changed, 47 insertions, 30 deletions
diff --git a/lib/rbcodec/codecs/libffmpegFLAC/golomb.h b/lib/rbcodec/codecs/libffmpegFLAC/golomb.h index 197b78ee1c..68d2558e1d 100644 --- a/lib/rbcodec/codecs/libffmpegFLAC/golomb.h +++ b/lib/rbcodec/codecs/libffmpegFLAC/golomb.h | |||
@@ -33,49 +33,69 @@ | |||
33 | /** | 33 | /** |
34 | * read unsigned golomb rice code (jpegls). | 34 | * read unsigned golomb rice code (jpegls). |
35 | */ | 35 | */ |
36 | static inline int get_ur_golomb_jpegls(GetBitContext *gb, int k, int limit, int esc_len){ | 36 | static inline int get_ur_golomb_jpegls(GetBitContext *gb, int k, int limit, |
37 | int esc_len) | ||
38 | { | ||
37 | unsigned int buf; | 39 | unsigned int buf; |
38 | int log; | 40 | int log; |
39 | 41 | ||
40 | OPEN_READER(re, gb); | 42 | OPEN_READER(re, gb); |
41 | UPDATE_CACHE(re, gb); | 43 | UPDATE_CACHE(re, gb); |
42 | buf=GET_CACHE(re, gb); | 44 | buf = GET_CACHE(re, gb); |
45 | |||
46 | log = av_log2(buf); | ||
43 | 47 | ||
44 | log= av_log2(buf); | 48 | if (log - k >= 32 - MIN_CACHE_BITS + (MIN_CACHE_BITS == 32) && |
45 | 49 | 32 - log < limit) { | |
46 | if(log - k >= 32-MIN_CACHE_BITS+(MIN_CACHE_BITS==32) && 32-log < limit){ | ||
47 | buf >>= log - k; | 50 | buf >>= log - k; |
48 | buf += (30-log)<<k; | 51 | buf += (30U - log) << k; |
49 | LAST_SKIP_BITS(re, gb, 32 + k - log); | 52 | LAST_SKIP_BITS(re, gb, 32 + k - log); |
50 | CLOSE_READER(re, gb); | 53 | CLOSE_READER(re, gb); |
51 | 54 | ||
52 | return buf; | 55 | return buf; |
53 | }else{ | 56 | } else { |
54 | int i; | 57 | int i; |
55 | for(i=0; SHOW_UBITS(re, gb, 1) == 0; i++){ | 58 | for (i = 0; i + MIN_CACHE_BITS <= limit && SHOW_UBITS(re, gb, MIN_CACHE_BITS) == 0; i += MIN_CACHE_BITS) { |
56 | LAST_SKIP_BITS(re, gb, 1); | 59 | if (gb->size_in_bits <= (signed) re_index) { |
60 | CLOSE_READER(re, gb); | ||
61 | return -1; | ||
62 | } | ||
63 | LAST_SKIP_BITS(re, gb, MIN_CACHE_BITS); | ||
57 | UPDATE_CACHE(re, gb); | 64 | UPDATE_CACHE(re, gb); |
58 | } | 65 | } |
59 | SKIP_BITS(re, gb, 1); | 66 | for (; i < limit && SHOW_UBITS(re, gb, 1) == 0; i++) { |
67 | SKIP_BITS(re, gb, 1); | ||
68 | } | ||
69 | LAST_SKIP_BITS(re, gb, 1); | ||
70 | UPDATE_CACHE(re, gb); | ||
60 | 71 | ||
61 | if(i < limit - 1){ | 72 | if (i < limit - 1) { |
62 | if(k){ | 73 | if (k) { |
63 | buf = SHOW_UBITS(re, gb, k); | 74 | if (k > MIN_CACHE_BITS - 1) { |
64 | LAST_SKIP_BITS(re, gb, k); | 75 | buf = SHOW_UBITS(re, gb, 16) << (k-16); |
65 | }else{ | 76 | LAST_SKIP_BITS(re, gb, 16); |
66 | buf=0; | 77 | UPDATE_CACHE(re, gb); |
78 | buf |= SHOW_UBITS(re, gb, k-16); | ||
79 | LAST_SKIP_BITS(re, gb, k-16); | ||
80 | } else { | ||
81 | buf = SHOW_UBITS(re, gb, k); | ||
82 | LAST_SKIP_BITS(re, gb, k); | ||
83 | } | ||
84 | } else { | ||
85 | buf = 0; | ||
67 | } | 86 | } |
68 | 87 | ||
69 | CLOSE_READER(re, gb); | 88 | buf += ((int32_t)i << k); |
70 | return buf + (i<<k); | 89 | } else if (i == limit - 1) { |
71 | }else if(i == limit - 1){ | ||
72 | buf = SHOW_UBITS(re, gb, esc_len); | 90 | buf = SHOW_UBITS(re, gb, esc_len); |
73 | LAST_SKIP_BITS(re, gb, esc_len); | 91 | LAST_SKIP_BITS(re, gb, esc_len); |
74 | CLOSE_READER(re, gb); | 92 | |
75 | 93 | buf ++; | |
76 | return buf + 1; | 94 | } else { |
77 | }else | 95 | buf = -1; |
78 | return -1; | 96 | } |
97 | CLOSE_READER(re, gb); | ||
98 | return buf; | ||
79 | } | 99 | } |
80 | } | 100 | } |
81 | 101 | ||
@@ -103,8 +123,5 @@ static inline unsigned int get_ur_golomb_shorten(GetBitContext *gb, int k){ | |||
103 | static inline int get_sr_golomb_shorten(GetBitContext* gb, int k) | 123 | static inline int get_sr_golomb_shorten(GetBitContext* gb, int k) |
104 | { | 124 | { |
105 | int uvar = get_ur_golomb_jpegls(gb, k + 1, INT_MAX, 0); | 125 | int uvar = get_ur_golomb_jpegls(gb, k + 1, INT_MAX, 0); |
106 | if (uvar & 1) | 126 | return (uvar >> 1) ^ -(uvar & 1); |
107 | return ~(uvar >> 1); | ||
108 | else | ||
109 | return uvar >> 1; | ||
110 | } | 127 | } |