summaryrefslogtreecommitdiff
path: root/lib/rbcodec/codecs/libffmpegFLAC/golomb.h
diff options
context:
space:
mode:
authorWilliam Wilgus <wilgus.william@gmail.com>2021-03-02 13:26:38 -0500
committerWilliam Wilgus <me.theuser@yahoo.com>2021-03-02 23:48:05 +0000
commita01721948883d45bc73577a6c8185a5a630ef237 (patch)
tree6e18cff3af0dd4365efab656abfd0c1820f039ce /lib/rbcodec/codecs/libffmpegFLAC/golomb.h
parent7d78958f9d52cf7de921738fb063cdf9a5012699 (diff)
downloadrockbox-a01721948883d45bc73577a6c8185a5a630ef237.tar.gz
rockbox-a01721948883d45bc73577a6c8185a5a630ef237.zip
Nudge flac towards upstream FS#13266
Some flac encoded files contain junk that our decoder picked up upstream has some sign and overflow fixes too Change-Id: I5857b2fe56906a48f04944cdfee8fe2306f2c3fd
Diffstat (limited to 'lib/rbcodec/codecs/libffmpegFLAC/golomb.h')
-rw-r--r--lib/rbcodec/codecs/libffmpegFLAC/golomb.h77
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 */
36static inline int get_ur_golomb_jpegls(GetBitContext *gb, int k, int limit, int esc_len){ 36static 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){
103static inline int get_sr_golomb_shorten(GetBitContext* gb, int k) 123static 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}