pura-webp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,495 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pura
4
+ module Webp
5
+ module VP8Tables
6
+ # Zigzag scan order for 4x4 blocks (Section 13.1)
7
+ ZIGZAG = [0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15].freeze
8
+
9
+ # Coefficient band mapping (Section 13.3)
10
+ BANDS = [0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7].freeze
11
+
12
+ # DC quantization lookup table (Section 14.1)
13
+ DC_QLOOKUP = [
14
+ 4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17,
15
+ 18, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 28,
16
+ 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43,
17
+ 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58,
18
+ 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
19
+ 75, 76, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
20
+ 91, 93, 95, 96, 98, 100, 101, 102, 104, 106, 108, 110, 112, 114,
21
+ 116, 118, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 143,
22
+ 145, 148, 151, 154, 157
23
+ ].freeze
24
+
25
+ # AC quantization lookup table (Section 14.1)
26
+ AC_QLOOKUP = [
27
+ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
28
+ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
29
+ 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
30
+ 52, 53, 54, 55, 56, 57, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76,
31
+ 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106,
32
+ 108, 110, 112, 114, 116, 119, 122, 125, 128, 131, 134, 137, 140,
33
+ 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 177, 181,
34
+ 185, 189, 193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 234,
35
+ 239, 245, 249, 254, 259, 264, 269, 274, 279, 284
36
+ ].freeze
37
+
38
+ # Category extra bit probabilities for coefficient decoding
39
+ CAT_PROBS = [
40
+ [159].freeze, # CAT1
41
+ [165, 145].freeze, # CAT2
42
+ [173, 148, 140].freeze, # CAT3
43
+ [176, 155, 140, 135].freeze, # CAT4
44
+ [180, 157, 141, 134, 130].freeze, # CAT5
45
+ [254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129].freeze # CAT6
46
+ ].freeze
47
+
48
+ # Category base values
49
+ CAT_BASE = [5, 7, 11, 19, 35, 67].freeze
50
+
51
+ # Keyframe Y mode probabilities (Section 12.1)
52
+ KF_YMODE_PROB = [145, 156, 163, 128].freeze
53
+
54
+ # Keyframe UV mode probabilities
55
+ KF_UV_MODE_PROB = [142, 114, 183].freeze
56
+
57
+ # Keyframe sub-block mode probabilities [above_mode][left_mode][9 probs]
58
+ # From RFC 6386 Section 12.1
59
+ KF_BMODE_PROB = [
60
+ # above = B_DC_PRED (0)
61
+ [
62
+ [231, 120, 48, 89, 115, 113, 120, 152, 112],
63
+ [152, 179, 64, 126, 170, 118, 46, 70, 95],
64
+ [175, 69, 143, 80, 85, 82, 72, 155, 103],
65
+ [56, 58, 10, 171, 218, 189, 17, 13, 152],
66
+ [114, 26, 17, 163, 44, 195, 21, 10, 173],
67
+ [121, 24, 80, 195, 26, 62, 44, 64, 85],
68
+ [144, 71, 10, 38, 171, 213, 144, 34, 26],
69
+ [170, 46, 55, 19, 136, 160, 33, 206, 71],
70
+ [63, 20, 8, 114, 114, 208, 12, 9, 226],
71
+ [81, 40, 11, 96, 182, 84, 29, 16, 36]
72
+ ],
73
+ # above = B_TM_PRED (1)
74
+ [
75
+ [134, 183, 89, 137, 98, 101, 106, 165, 148],
76
+ [72, 187, 100, 130, 157, 111, 32, 75, 80],
77
+ [66, 102, 167, 99, 74, 62, 40, 234, 128],
78
+ [41, 53, 9, 178, 241, 141, 26, 8, 107],
79
+ [74, 43, 26, 146, 73, 166, 49, 23, 157],
80
+ [65, 38, 105, 160, 51, 52, 31, 115, 128],
81
+ [104, 79, 12, 27, 217, 255, 87, 17, 7],
82
+ [87, 68, 71, 44, 114, 51, 15, 186, 23],
83
+ [47, 41, 14, 110, 182, 183, 21, 17, 194],
84
+ [66, 45, 25, 102, 197, 189, 23, 18, 22]
85
+ ],
86
+ # above = B_VE_PRED (2)
87
+ [
88
+ [88, 88, 147, 150, 42, 46, 45, 196, 205],
89
+ [43, 97, 183, 117, 85, 38, 35, 179, 61],
90
+ [39, 53, 200, 87, 26, 21, 43, 232, 171],
91
+ [56, 34, 51, 104, 114, 102, 29, 93, 77],
92
+ [39, 28, 85, 171, 58, 165, 90, 98, 64],
93
+ [34, 22, 116, 206, 23, 34, 43, 166, 73],
94
+ [107, 54, 32, 26, 51, 1, 81, 43, 31],
95
+ [68, 25, 106, 22, 64, 171, 36, 225, 114],
96
+ [34, 19, 21, 102, 132, 188, 16, 76, 124],
97
+ [62, 18, 78, 95, 85, 57, 50, 48, 51]
98
+ ],
99
+ # above = B_HE_PRED (3)
100
+ [
101
+ [43, 72, 64, 176, 209, 35, 47, 30, 152],
102
+ [29, 151, 108, 68, 219, 22, 32, 59, 77],
103
+ [34, 48, 72, 132, 88, 14, 25, 143, 83],
104
+ [15, 69, 14, 247, 248, 122, 0, 2, 231],
105
+ [17, 47, 22, 124, 154, 127, 41, 5, 172],
106
+ [14, 57, 67, 106, 146, 20, 32, 9, 218],
107
+ [16, 29, 8, 48, 218, 247, 127, 6, 6],
108
+ [60, 26, 43, 31, 153, 92, 9, 113, 19],
109
+ [13, 36, 16, 140, 185, 101, 1, 5, 237],
110
+ [11, 51, 29, 115, 213, 30, 10, 4, 142]
111
+ ],
112
+ # above = B_LD_PRED (4)
113
+ [
114
+ [75, 32, 12, 51, 192, 255, 160, 43, 51],
115
+ [44, 25, 29, 93, 236, 174, 43, 32, 73],
116
+ [38, 21, 52, 81, 47, 244, 113, 125, 77],
117
+ [35, 42, 12, 111, 229, 149, 58, 8, 75],
118
+ [24, 6, 4, 97, 78, 239, 85, 5, 116],
119
+ [34, 14, 21, 159, 33, 143, 35, 11, 166],
120
+ [21, 5, 3, 53, 73, 255, 181, 6, 10],
121
+ [42, 1, 22, 38, 141, 200, 24, 134, 26],
122
+ [24, 15, 2, 78, 178, 225, 4, 2, 162],
123
+ [29, 20, 12, 65, 218, 134, 48, 8, 38]
124
+ ],
125
+ # above = B_RD_PRED (5)
126
+ [
127
+ [56, 21, 101, 111, 57, 25, 32, 99, 2],
128
+ [42, 29, 145, 81, 85, 14, 27, 98, 133],
129
+ [23, 16, 165, 56, 17, 0, 27, 227, 1],
130
+ [16, 55, 36, 86, 226, 0, 18, 7, 105],
131
+ [14, 7, 37, 176, 14, 196, 66, 9, 109],
132
+ [14, 13, 132, 187, 25, 14, 22, 128, 2],
133
+ [28, 7, 18, 48, 28, 244, 98, 6, 3],
134
+ [36, 4, 55, 30, 26, 148, 13, 180, 12],
135
+ [11, 9, 12, 141, 73, 150, 1, 2, 216],
136
+ [32, 12, 37, 93, 71, 39, 32, 15, 116]
137
+ ],
138
+ # above = B_VR_PRED (6)
139
+ [
140
+ [134, 51, 36, 127, 171, 142, 148, 37, 43],
141
+ [60, 109, 51, 115, 151, 101, 59, 36, 60],
142
+ [75, 44, 64, 83, 47, 43, 46, 157, 165],
143
+ [17, 28, 12, 214, 218, 77, 6, 1, 205],
144
+ [48, 10, 10, 109, 73, 220, 44, 2, 139],
145
+ [28, 14, 72, 135, 35, 45, 24, 28, 188],
146
+ [67, 27, 7, 63, 135, 235, 130, 14, 13],
147
+ [82, 12, 29, 24, 127, 155, 12, 132, 17],
148
+ [22, 8, 2, 83, 143, 196, 3, 1, 228],
149
+ [45, 16, 10, 77, 196, 160, 41, 11, 19]
150
+ ],
151
+ # above = B_VL_PRED (7)
152
+ [
153
+ [57, 44, 73, 68, 114, 190, 40, 182, 66],
154
+ [46, 21, 62, 70, 180, 102, 21, 108, 26],
155
+ [41, 34, 91, 53, 52, 134, 46, 248, 101],
156
+ [35, 24, 18, 82, 226, 104, 20, 45, 60],
157
+ [27, 7, 12, 118, 57, 229, 53, 25, 91],
158
+ [25, 10, 38, 162, 19, 75, 12, 54, 160],
159
+ [21, 3, 6, 55, 57, 250, 96, 6, 13],
160
+ [30, 4, 41, 29, 130, 149, 10, 207, 26],
161
+ [12, 11, 3, 86, 146, 193, 3, 6, 202],
162
+ [26, 9, 11, 79, 169, 138, 13, 3, 53]
163
+ ],
164
+ # above = B_HD_PRED (8)
165
+ [
166
+ [57, 35, 33, 100, 240, 129, 20, 16, 119],
167
+ [47, 38, 42, 121, 223, 66, 13, 22, 97],
168
+ [22, 23, 31, 106, 87, 68, 18, 141, 99],
169
+ [16, 57, 19, 146, 237, 94, 1, 3, 205],
170
+ [16, 11, 8, 119, 107, 211, 28, 2, 151],
171
+ [13, 24, 41, 106, 150, 48, 14, 7, 211],
172
+ [27, 9, 3, 52, 88, 246, 117, 8, 7],
173
+ [43, 7, 25, 31, 173, 114, 4, 108, 13],
174
+ [10, 14, 8, 120, 170, 117, 0, 2, 237],
175
+ [17, 29, 16, 95, 220, 48, 12, 5, 88]
176
+ ],
177
+ # above = B_HU_PRED (9)
178
+ [
179
+ [47, 47, 22, 89, 220, 186, 64, 51, 48],
180
+ [38, 21, 26, 120, 239, 122, 14, 20, 76],
181
+ [30, 38, 41, 92, 43, 72, 32, 178, 74],
182
+ [16, 51, 11, 162, 255, 106, 12, 3, 188],
183
+ [24, 6, 4, 109, 105, 234, 56, 3, 84],
184
+ [20, 17, 52, 107, 107, 59, 19, 9, 208],
185
+ [24, 7, 3, 47, 75, 249, 131, 11, 5],
186
+ [35, 6, 38, 24, 132, 117, 10, 118, 28],
187
+ [15, 11, 3, 87, 179, 185, 1, 2, 226],
188
+ [21, 14, 12, 70, 215, 116, 14, 4, 37]
189
+ ]
190
+ ].freeze
191
+
192
+ # B_PRED sub-block mode tree
193
+ # Each pair: [left_branch, right_branch], negative values are leaf nodes (-mode)
194
+ BMODE_TREE = [
195
+ # idx 0: prob[0] → 0: B_DC_PRED, 1: go to 2
196
+ 0, 2, # -B_DC_PRED=0, next=2
197
+ # idx 2: prob[1] → 0: B_TM_PRED, 1: go to 4
198
+ -1, 4, # -B_TM_PRED=1, next=4
199
+ # idx 4: prob[2] → 0: B_VE_PRED, 1: go to 6
200
+ -2, 6, # -B_VE_PRED=2, next=6
201
+ # idx 6: prob[3] → 0: go to 8, 1: go to 12
202
+ 8, 12,
203
+ # idx 8: prob[4] → 0: B_HE_PRED, 1: go to 10
204
+ -3, 10, # -B_HE_PRED=3, next=10
205
+ # idx 10: prob[5] → 0: B_RD_PRED, 1: B_VR_PRED
206
+ -5, -6, # -B_RD_PRED=5, -B_VR_PRED=6
207
+ # idx 12: prob[6] → 0: B_LD_PRED, 1: go to 14
208
+ -4, 14, # -B_LD_PRED=4, next=14
209
+ # idx 14: prob[7] → 0: B_VL_PRED, 1: go to 16
210
+ -7, 16, # -B_VL_PRED=7, next=16
211
+ # idx 16: prob[8] → 0: B_HD_PRED, 1: B_HU_PRED
212
+ -8, -9 # -B_HD_PRED=8, -B_HU_PRED=9
213
+ ].freeze
214
+
215
+ # Default coefficient probabilities [block_type][band][ctx][prob]
216
+ # From RFC 6386, Section 13.5
217
+ # Block types: 0=Y_after_Y2, 1=Y_no_Y2, 2=UV, 3=Y2
218
+ DEFAULT_COEFF_PROBS = [
219
+ # Block type 0: Y after Y2
220
+ [
221
+ [[128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],
222
+ [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],
223
+ [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128]],
224
+ [[253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128],
225
+ [189, 129, 242, 255, 227, 213, 255, 219, 128, 128, 128],
226
+ [106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128]],
227
+ [[1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128],
228
+ [181, 133, 238, 254, 211, 236, 255, 255, 128, 128, 128],
229
+ [78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128]],
230
+ [[1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128],
231
+ [184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128],
232
+ [77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128]],
233
+ [[1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128],
234
+ [170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128],
235
+ [37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128]],
236
+ [[1, 204, 254, 255, 245, 255, 128, 128, 128, 128, 128],
237
+ [207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128],
238
+ [102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128]],
239
+ [[1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128],
240
+ [177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128],
241
+ [80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128]],
242
+ [[1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],
243
+ [246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],
244
+ [255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128]]
245
+ ],
246
+ # Block type 1: Y no Y2 (B_PRED mode)
247
+ [
248
+ [[198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62],
249
+ [131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1],
250
+ [68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128]],
251
+ [[1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128],
252
+ [184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128],
253
+ [81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128]],
254
+ [[1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128],
255
+ [99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128],
256
+ [23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128]],
257
+ [[1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128],
258
+ [109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128],
259
+ [44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128]],
260
+ [[1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128],
261
+ [94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128],
262
+ [22, 100, 174, 245, 186, 161, 255, 199, 128, 128, 128]],
263
+ [[1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128],
264
+ [124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128],
265
+ [35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128]],
266
+ [[1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128],
267
+ [121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128],
268
+ [45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128]],
269
+ [[1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128],
270
+ [203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128],
271
+ [137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128]]
272
+ ],
273
+ # Block type 2: UV
274
+ [
275
+ [[253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128],
276
+ [175, 13, 224, 243, 193, 185, 249, 198, 255, 255, 128],
277
+ [73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128]],
278
+ [[1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128],
279
+ [239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128],
280
+ [155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128]],
281
+ [[1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128],
282
+ [201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128],
283
+ [69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128]],
284
+ [[1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128],
285
+ [223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128],
286
+ [141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128]],
287
+ [[1, 16, 248, 255, 255, 128, 128, 128, 128, 128, 128],
288
+ [190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128],
289
+ [149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128]],
290
+ [[1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128],
291
+ [247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128],
292
+ [240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128]],
293
+ [[1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128],
294
+ [213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128],
295
+ [55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128]],
296
+ [[128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],
297
+ [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],
298
+ [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128]]
299
+ ],
300
+ # Block type 3: Y2 (DC block)
301
+ [
302
+ [[202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255],
303
+ [126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128],
304
+ [61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128]],
305
+ [[1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128],
306
+ [166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128],
307
+ [39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128]],
308
+ [[1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128],
309
+ [124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128],
310
+ [24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128]],
311
+ [[1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128],
312
+ [149, 150, 226, 252, 216, 205, 255, 171, 128, 128, 128],
313
+ [28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128]],
314
+ [[1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128],
315
+ [123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128],
316
+ [20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128]],
317
+ [[1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128],
318
+ [168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128],
319
+ [47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128]],
320
+ [[1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128],
321
+ [141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128],
322
+ [42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128]],
323
+ [[1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],
324
+ [244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],
325
+ [238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128]]
326
+ ]
327
+ ].freeze
328
+
329
+ # Coefficient probability update probabilities (Section 13.4)
330
+ COEFF_UPDATE_PROBS = [
331
+ [
332
+ [[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
333
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
334
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]],
335
+ [[176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255],
336
+ [223, 241, 252, 255, 255, 255, 255, 255, 255, 255, 255],
337
+ [249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255]],
338
+ [[255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255],
339
+ [234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],
340
+ [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]],
341
+ [[255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255],
342
+ [239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],
343
+ [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255]],
344
+ [[255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],
345
+ [251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],
346
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]],
347
+ [[255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],
348
+ [251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],
349
+ [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255]],
350
+ [[255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255],
351
+ [250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255],
352
+ [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]],
353
+ [[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
354
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
355
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]]
356
+ ],
357
+ [
358
+ [[217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
359
+ [225, 252, 241, 253, 255, 255, 254, 255, 255, 255, 255],
360
+ [234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255]],
361
+ [[255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],
362
+ [223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],
363
+ [238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255]],
364
+ [[255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],
365
+ [249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],
366
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]],
367
+ [[255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255],
368
+ [247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],
369
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]],
370
+ [[255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],
371
+ [252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
372
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]],
373
+ [[255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],
374
+ [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
375
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]],
376
+ [[255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255],
377
+ [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
378
+ [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]],
379
+ [[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
380
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
381
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]]
382
+ ],
383
+ [
384
+ [[186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255],
385
+ [234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255],
386
+ [251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255]],
387
+ [[255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],
388
+ [236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],
389
+ [251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255]],
390
+ [[255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],
391
+ [254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],
392
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]],
393
+ [[255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],
394
+ [254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],
395
+ [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]],
396
+ [[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
397
+ [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
398
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]],
399
+ [[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
400
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
401
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]],
402
+ [[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
403
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
404
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]],
405
+ [[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
406
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
407
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]]
408
+ ],
409
+ [
410
+ [[248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
411
+ [250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255],
412
+ [248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255]],
413
+ [[255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],
414
+ [246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],
415
+ [252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255]],
416
+ [[255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255],
417
+ [248, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255],
418
+ [253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255]],
419
+ [[255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],
420
+ [245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],
421
+ [253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255]],
422
+ [[255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255],
423
+ [252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],
424
+ [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255]],
425
+ [[255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255],
426
+ [249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],
427
+ [255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255]],
428
+ [[255, 255, 253, 255, 255, 255, 255, 255, 255, 255, 255],
429
+ [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
430
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]],
431
+ [[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
432
+ [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
433
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]]
434
+ ]
435
+ ].freeze
436
+
437
+ # Prediction mode constants
438
+ DC_PRED = 0
439
+ V_PRED = 1
440
+ H_PRED = 2
441
+ TM_PRED = 3
442
+ B_PRED = 4
443
+
444
+ # Sub-block prediction modes
445
+ B_DC_PRED = 0
446
+ B_TM_PRED = 1
447
+ B_VE_PRED = 2
448
+ B_HE_PRED = 3
449
+ B_LD_PRED = 4
450
+ B_RD_PRED = 5
451
+ B_VR_PRED = 6
452
+ B_VL_PRED = 7
453
+ B_HD_PRED = 8
454
+ B_HU_PRED = 9
455
+ # DC quantizer lookup (from VP8 spec Table 14.1)
456
+ DC_QUANT = [
457
+ 4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17,
458
+ 18, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 28,
459
+ 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43,
460
+ 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58,
461
+ 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
462
+ 75, 76, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
463
+ 91, 93, 95, 96, 98, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118,
464
+ 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 143, 145, 148, 151, 154, 157
465
+ ].freeze
466
+
467
+ # AC quantizer lookup (from VP8 spec Table 14.2)
468
+ AC_QUANT = [
469
+ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
470
+ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
471
+ 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
472
+ 52, 53, 54, 55, 56, 57, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76,
473
+ 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108,
474
+ 110, 112, 114, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149, 152,
475
+ 155, 158, 161, 164, 167, 170, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209,
476
+ 213, 217, 221, 225, 229, 234, 239, 245, 249, 254, 259, 264, 269, 274, 279, 284
477
+ ].freeze
478
+
479
+ def self.default_coeff_probs
480
+ # Deep copy of COEFF_UPDATE_PROBS structure as default token probs
481
+ # Using the standard default coefficient probabilities
482
+ [
483
+ # Type 0: Y after Y2
484
+ Array.new(8) { Array.new(3) { [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128] } },
485
+ # Type 1: Y2
486
+ Array.new(8) { Array.new(3) { [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128] } },
487
+ # Type 2: UV
488
+ Array.new(8) { Array.new(3) { [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128] } },
489
+ # Type 3: Y
490
+ Array.new(8) { Array.new(3) { [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128] } }
491
+ ]
492
+ end
493
+ end
494
+ end
495
+ end
data/lib/pura-webp.rb ADDED
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "pura/webp/version"
4
+ require_relative "pura/webp/image"
5
+ require_relative "pura/webp/bool_decoder"
6
+ require_relative "pura/webp/vp8_tables"
7
+ require_relative "pura/webp/decoder"
8
+ require_relative "pura/webp/encoder"
9
+
10
+ module Pura
11
+ module Webp
12
+ def self.decode(input)
13
+ Decoder.decode(input)
14
+ end
15
+
16
+ def self.encode(image, output_path)
17
+ Encoder.encode(image, output_path)
18
+ end
19
+ end
20
+ end
metadata ADDED
@@ -0,0 +1,79 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pura-webp
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - komagata
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: minitest
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '5.0'
19
+ type: :development
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '5.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: rake
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '13.0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '13.0'
40
+ description: A pure Ruby WebP decoder and encoder with zero C extension dependencies.
41
+ Supports VP8 lossy decoding and VP8L lossless encoding.
42
+ executables: []
43
+ extensions: []
44
+ extra_rdoc_files: []
45
+ files:
46
+ - LICENSE
47
+ - README.md
48
+ - lib/pura-webp.rb
49
+ - lib/pura/webp/bool_decoder.rb
50
+ - lib/pura/webp/decoder.rb
51
+ - lib/pura/webp/encoder.rb
52
+ - lib/pura/webp/image.rb
53
+ - lib/pura/webp/version.rb
54
+ - lib/pura/webp/vp8_tables.rb
55
+ homepage: https://github.com/komagata/pura-webp
56
+ licenses:
57
+ - MIT
58
+ metadata:
59
+ homepage_uri: https://github.com/komagata/pura-webp
60
+ source_code_uri: https://github.com/komagata/pura-webp
61
+ changelog_uri: https://github.com/komagata/pura-webp/blob/main/CHANGELOG.md
62
+ rdoc_options: []
63
+ require_paths:
64
+ - lib
65
+ required_ruby_version: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: 3.0.0
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ requirements: []
76
+ rubygems_version: 3.6.9
77
+ specification_version: 4
78
+ summary: Pure Ruby WebP decoder/encoder
79
+ test_files: []