1
2
3
4
5 package vp8
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 const nPred = 10
46
47 const (
48 predDC = iota
49 predTM
50 predVE
51 predHE
52 predRD
53 predVR
54 predLD
55 predVL
56 predHD
57 predHU
58 predDCTop
59 predDCLeft
60 predDCTopLeft
61 )
62
63 func checkTopLeftPred(mbx, mby int, p uint8) uint8 {
64 if p != predDC {
65 return p
66 }
67 if mbx == 0 {
68 if mby == 0 {
69 return predDCTopLeft
70 }
71 return predDCLeft
72 }
73 if mby == 0 {
74 return predDCTop
75 }
76 return predDC
77 }
78
79 var predFunc4 = [...]func(*Decoder, int, int){
80 predFunc4DC,
81 predFunc4TM,
82 predFunc4VE,
83 predFunc4HE,
84 predFunc4RD,
85 predFunc4VR,
86 predFunc4LD,
87 predFunc4VL,
88 predFunc4HD,
89 predFunc4HU,
90 nil,
91 nil,
92 nil,
93 }
94
95 var predFunc8 = [...]func(*Decoder, int, int){
96 predFunc8DC,
97 predFunc8TM,
98 predFunc8VE,
99 predFunc8HE,
100 nil,
101 nil,
102 nil,
103 nil,
104 nil,
105 nil,
106 predFunc8DCTop,
107 predFunc8DCLeft,
108 predFunc8DCTopLeft,
109 }
110
111 var predFunc16 = [...]func(*Decoder, int, int){
112 predFunc16DC,
113 predFunc16TM,
114 predFunc16VE,
115 predFunc16HE,
116 nil,
117 nil,
118 nil,
119 nil,
120 nil,
121 nil,
122 predFunc16DCTop,
123 predFunc16DCLeft,
124 predFunc16DCTopLeft,
125 }
126
127 func predFunc4DC(z *Decoder, y, x int) {
128 sum := uint32(4)
129 for i := 0; i < 4; i++ {
130 sum += uint32(z.ybr[y-1][x+i])
131 }
132 for j := 0; j < 4; j++ {
133 sum += uint32(z.ybr[y+j][x-1])
134 }
135 avg := uint8(sum / 8)
136 for j := 0; j < 4; j++ {
137 for i := 0; i < 4; i++ {
138 z.ybr[y+j][x+i] = avg
139 }
140 }
141 }
142
143 func predFunc4TM(z *Decoder, y, x int) {
144 delta0 := -int32(z.ybr[y-1][x-1])
145 for j := 0; j < 4; j++ {
146 delta1 := delta0 + int32(z.ybr[y+j][x-1])
147 for i := 0; i < 4; i++ {
148 delta2 := delta1 + int32(z.ybr[y-1][x+i])
149 z.ybr[y+j][x+i] = uint8(clip(delta2, 0, 255))
150 }
151 }
152 }
153
154 func predFunc4VE(z *Decoder, y, x int) {
155 a := int32(z.ybr[y-1][x-1])
156 b := int32(z.ybr[y-1][x+0])
157 c := int32(z.ybr[y-1][x+1])
158 d := int32(z.ybr[y-1][x+2])
159 e := int32(z.ybr[y-1][x+3])
160 f := int32(z.ybr[y-1][x+4])
161 abc := uint8((a + 2*b + c + 2) / 4)
162 bcd := uint8((b + 2*c + d + 2) / 4)
163 cde := uint8((c + 2*d + e + 2) / 4)
164 def := uint8((d + 2*e + f + 2) / 4)
165 for j := 0; j < 4; j++ {
166 z.ybr[y+j][x+0] = abc
167 z.ybr[y+j][x+1] = bcd
168 z.ybr[y+j][x+2] = cde
169 z.ybr[y+j][x+3] = def
170 }
171 }
172
173 func predFunc4HE(z *Decoder, y, x int) {
174 s := int32(z.ybr[y+3][x-1])
175 r := int32(z.ybr[y+2][x-1])
176 q := int32(z.ybr[y+1][x-1])
177 p := int32(z.ybr[y+0][x-1])
178 a := int32(z.ybr[y-1][x-1])
179 ssr := uint8((s + 2*s + r + 2) / 4)
180 srq := uint8((s + 2*r + q + 2) / 4)
181 rqp := uint8((r + 2*q + p + 2) / 4)
182 apq := uint8((a + 2*p + q + 2) / 4)
183 for i := 0; i < 4; i++ {
184 z.ybr[y+0][x+i] = apq
185 z.ybr[y+1][x+i] = rqp
186 z.ybr[y+2][x+i] = srq
187 z.ybr[y+3][x+i] = ssr
188 }
189 }
190
191 func predFunc4RD(z *Decoder, y, x int) {
192 s := int32(z.ybr[y+3][x-1])
193 r := int32(z.ybr[y+2][x-1])
194 q := int32(z.ybr[y+1][x-1])
195 p := int32(z.ybr[y+0][x-1])
196 a := int32(z.ybr[y-1][x-1])
197 b := int32(z.ybr[y-1][x+0])
198 c := int32(z.ybr[y-1][x+1])
199 d := int32(z.ybr[y-1][x+2])
200 e := int32(z.ybr[y-1][x+3])
201 srq := uint8((s + 2*r + q + 2) / 4)
202 rqp := uint8((r + 2*q + p + 2) / 4)
203 qpa := uint8((q + 2*p + a + 2) / 4)
204 pab := uint8((p + 2*a + b + 2) / 4)
205 abc := uint8((a + 2*b + c + 2) / 4)
206 bcd := uint8((b + 2*c + d + 2) / 4)
207 cde := uint8((c + 2*d + e + 2) / 4)
208 z.ybr[y+0][x+0] = pab
209 z.ybr[y+0][x+1] = abc
210 z.ybr[y+0][x+2] = bcd
211 z.ybr[y+0][x+3] = cde
212 z.ybr[y+1][x+0] = qpa
213 z.ybr[y+1][x+1] = pab
214 z.ybr[y+1][x+2] = abc
215 z.ybr[y+1][x+3] = bcd
216 z.ybr[y+2][x+0] = rqp
217 z.ybr[y+2][x+1] = qpa
218 z.ybr[y+2][x+2] = pab
219 z.ybr[y+2][x+3] = abc
220 z.ybr[y+3][x+0] = srq
221 z.ybr[y+3][x+1] = rqp
222 z.ybr[y+3][x+2] = qpa
223 z.ybr[y+3][x+3] = pab
224 }
225
226 func predFunc4VR(z *Decoder, y, x int) {
227 r := int32(z.ybr[y+2][x-1])
228 q := int32(z.ybr[y+1][x-1])
229 p := int32(z.ybr[y+0][x-1])
230 a := int32(z.ybr[y-1][x-1])
231 b := int32(z.ybr[y-1][x+0])
232 c := int32(z.ybr[y-1][x+1])
233 d := int32(z.ybr[y-1][x+2])
234 e := int32(z.ybr[y-1][x+3])
235 ab := uint8((a + b + 1) / 2)
236 bc := uint8((b + c + 1) / 2)
237 cd := uint8((c + d + 1) / 2)
238 de := uint8((d + e + 1) / 2)
239 rqp := uint8((r + 2*q + p + 2) / 4)
240 qpa := uint8((q + 2*p + a + 2) / 4)
241 pab := uint8((p + 2*a + b + 2) / 4)
242 abc := uint8((a + 2*b + c + 2) / 4)
243 bcd := uint8((b + 2*c + d + 2) / 4)
244 cde := uint8((c + 2*d + e + 2) / 4)
245 z.ybr[y+0][x+0] = ab
246 z.ybr[y+0][x+1] = bc
247 z.ybr[y+0][x+2] = cd
248 z.ybr[y+0][x+3] = de
249 z.ybr[y+1][x+0] = pab
250 z.ybr[y+1][x+1] = abc
251 z.ybr[y+1][x+2] = bcd
252 z.ybr[y+1][x+3] = cde
253 z.ybr[y+2][x+0] = qpa
254 z.ybr[y+2][x+1] = ab
255 z.ybr[y+2][x+2] = bc
256 z.ybr[y+2][x+3] = cd
257 z.ybr[y+3][x+0] = rqp
258 z.ybr[y+3][x+1] = pab
259 z.ybr[y+3][x+2] = abc
260 z.ybr[y+3][x+3] = bcd
261 }
262
263 func predFunc4LD(z *Decoder, y, x int) {
264 a := int32(z.ybr[y-1][x+0])
265 b := int32(z.ybr[y-1][x+1])
266 c := int32(z.ybr[y-1][x+2])
267 d := int32(z.ybr[y-1][x+3])
268 e := int32(z.ybr[y-1][x+4])
269 f := int32(z.ybr[y-1][x+5])
270 g := int32(z.ybr[y-1][x+6])
271 h := int32(z.ybr[y-1][x+7])
272 abc := uint8((a + 2*b + c + 2) / 4)
273 bcd := uint8((b + 2*c + d + 2) / 4)
274 cde := uint8((c + 2*d + e + 2) / 4)
275 def := uint8((d + 2*e + f + 2) / 4)
276 efg := uint8((e + 2*f + g + 2) / 4)
277 fgh := uint8((f + 2*g + h + 2) / 4)
278 ghh := uint8((g + 2*h + h + 2) / 4)
279 z.ybr[y+0][x+0] = abc
280 z.ybr[y+0][x+1] = bcd
281 z.ybr[y+0][x+2] = cde
282 z.ybr[y+0][x+3] = def
283 z.ybr[y+1][x+0] = bcd
284 z.ybr[y+1][x+1] = cde
285 z.ybr[y+1][x+2] = def
286 z.ybr[y+1][x+3] = efg
287 z.ybr[y+2][x+0] = cde
288 z.ybr[y+2][x+1] = def
289 z.ybr[y+2][x+2] = efg
290 z.ybr[y+2][x+3] = fgh
291 z.ybr[y+3][x+0] = def
292 z.ybr[y+3][x+1] = efg
293 z.ybr[y+3][x+2] = fgh
294 z.ybr[y+3][x+3] = ghh
295 }
296
297 func predFunc4VL(z *Decoder, y, x int) {
298 a := int32(z.ybr[y-1][x+0])
299 b := int32(z.ybr[y-1][x+1])
300 c := int32(z.ybr[y-1][x+2])
301 d := int32(z.ybr[y-1][x+3])
302 e := int32(z.ybr[y-1][x+4])
303 f := int32(z.ybr[y-1][x+5])
304 g := int32(z.ybr[y-1][x+6])
305 h := int32(z.ybr[y-1][x+7])
306 ab := uint8((a + b + 1) / 2)
307 bc := uint8((b + c + 1) / 2)
308 cd := uint8((c + d + 1) / 2)
309 de := uint8((d + e + 1) / 2)
310 abc := uint8((a + 2*b + c + 2) / 4)
311 bcd := uint8((b + 2*c + d + 2) / 4)
312 cde := uint8((c + 2*d + e + 2) / 4)
313 def := uint8((d + 2*e + f + 2) / 4)
314 efg := uint8((e + 2*f + g + 2) / 4)
315 fgh := uint8((f + 2*g + h + 2) / 4)
316 z.ybr[y+0][x+0] = ab
317 z.ybr[y+0][x+1] = bc
318 z.ybr[y+0][x+2] = cd
319 z.ybr[y+0][x+3] = de
320 z.ybr[y+1][x+0] = abc
321 z.ybr[y+1][x+1] = bcd
322 z.ybr[y+1][x+2] = cde
323 z.ybr[y+1][x+3] = def
324 z.ybr[y+2][x+0] = bc
325 z.ybr[y+2][x+1] = cd
326 z.ybr[y+2][x+2] = de
327 z.ybr[y+2][x+3] = efg
328 z.ybr[y+3][x+0] = bcd
329 z.ybr[y+3][x+1] = cde
330 z.ybr[y+3][x+2] = def
331 z.ybr[y+3][x+3] = fgh
332 }
333
334 func predFunc4HD(z *Decoder, y, x int) {
335 s := int32(z.ybr[y+3][x-1])
336 r := int32(z.ybr[y+2][x-1])
337 q := int32(z.ybr[y+1][x-1])
338 p := int32(z.ybr[y+0][x-1])
339 a := int32(z.ybr[y-1][x-1])
340 b := int32(z.ybr[y-1][x+0])
341 c := int32(z.ybr[y-1][x+1])
342 d := int32(z.ybr[y-1][x+2])
343 sr := uint8((s + r + 1) / 2)
344 rq := uint8((r + q + 1) / 2)
345 qp := uint8((q + p + 1) / 2)
346 pa := uint8((p + a + 1) / 2)
347 srq := uint8((s + 2*r + q + 2) / 4)
348 rqp := uint8((r + 2*q + p + 2) / 4)
349 qpa := uint8((q + 2*p + a + 2) / 4)
350 pab := uint8((p + 2*a + b + 2) / 4)
351 abc := uint8((a + 2*b + c + 2) / 4)
352 bcd := uint8((b + 2*c + d + 2) / 4)
353 z.ybr[y+0][x+0] = pa
354 z.ybr[y+0][x+1] = pab
355 z.ybr[y+0][x+2] = abc
356 z.ybr[y+0][x+3] = bcd
357 z.ybr[y+1][x+0] = qp
358 z.ybr[y+1][x+1] = qpa
359 z.ybr[y+1][x+2] = pa
360 z.ybr[y+1][x+3] = pab
361 z.ybr[y+2][x+0] = rq
362 z.ybr[y+2][x+1] = rqp
363 z.ybr[y+2][x+2] = qp
364 z.ybr[y+2][x+3] = qpa
365 z.ybr[y+3][x+0] = sr
366 z.ybr[y+3][x+1] = srq
367 z.ybr[y+3][x+2] = rq
368 z.ybr[y+3][x+3] = rqp
369 }
370
371 func predFunc4HU(z *Decoder, y, x int) {
372 s := int32(z.ybr[y+3][x-1])
373 r := int32(z.ybr[y+2][x-1])
374 q := int32(z.ybr[y+1][x-1])
375 p := int32(z.ybr[y+0][x-1])
376 pq := uint8((p + q + 1) / 2)
377 qr := uint8((q + r + 1) / 2)
378 rs := uint8((r + s + 1) / 2)
379 pqr := uint8((p + 2*q + r + 2) / 4)
380 qrs := uint8((q + 2*r + s + 2) / 4)
381 rss := uint8((r + 2*s + s + 2) / 4)
382 sss := uint8(s)
383 z.ybr[y+0][x+0] = pq
384 z.ybr[y+0][x+1] = pqr
385 z.ybr[y+0][x+2] = qr
386 z.ybr[y+0][x+3] = qrs
387 z.ybr[y+1][x+0] = qr
388 z.ybr[y+1][x+1] = qrs
389 z.ybr[y+1][x+2] = rs
390 z.ybr[y+1][x+3] = rss
391 z.ybr[y+2][x+0] = rs
392 z.ybr[y+2][x+1] = rss
393 z.ybr[y+2][x+2] = sss
394 z.ybr[y+2][x+3] = sss
395 z.ybr[y+3][x+0] = sss
396 z.ybr[y+3][x+1] = sss
397 z.ybr[y+3][x+2] = sss
398 z.ybr[y+3][x+3] = sss
399 }
400
401 func predFunc8DC(z *Decoder, y, x int) {
402 sum := uint32(8)
403 for i := 0; i < 8; i++ {
404 sum += uint32(z.ybr[y-1][x+i])
405 }
406 for j := 0; j < 8; j++ {
407 sum += uint32(z.ybr[y+j][x-1])
408 }
409 avg := uint8(sum / 16)
410 for j := 0; j < 8; j++ {
411 for i := 0; i < 8; i++ {
412 z.ybr[y+j][x+i] = avg
413 }
414 }
415 }
416
417 func predFunc8TM(z *Decoder, y, x int) {
418 delta0 := -int32(z.ybr[y-1][x-1])
419 for j := 0; j < 8; j++ {
420 delta1 := delta0 + int32(z.ybr[y+j][x-1])
421 for i := 0; i < 8; i++ {
422 delta2 := delta1 + int32(z.ybr[y-1][x+i])
423 z.ybr[y+j][x+i] = uint8(clip(delta2, 0, 255))
424 }
425 }
426 }
427
428 func predFunc8VE(z *Decoder, y, x int) {
429 for j := 0; j < 8; j++ {
430 for i := 0; i < 8; i++ {
431 z.ybr[y+j][x+i] = z.ybr[y-1][x+i]
432 }
433 }
434 }
435
436 func predFunc8HE(z *Decoder, y, x int) {
437 for j := 0; j < 8; j++ {
438 for i := 0; i < 8; i++ {
439 z.ybr[y+j][x+i] = z.ybr[y+j][x-1]
440 }
441 }
442 }
443
444 func predFunc8DCTop(z *Decoder, y, x int) {
445 sum := uint32(4)
446 for j := 0; j < 8; j++ {
447 sum += uint32(z.ybr[y+j][x-1])
448 }
449 avg := uint8(sum / 8)
450 for j := 0; j < 8; j++ {
451 for i := 0; i < 8; i++ {
452 z.ybr[y+j][x+i] = avg
453 }
454 }
455 }
456
457 func predFunc8DCLeft(z *Decoder, y, x int) {
458 sum := uint32(4)
459 for i := 0; i < 8; i++ {
460 sum += uint32(z.ybr[y-1][x+i])
461 }
462 avg := uint8(sum / 8)
463 for j := 0; j < 8; j++ {
464 for i := 0; i < 8; i++ {
465 z.ybr[y+j][x+i] = avg
466 }
467 }
468 }
469
470 func predFunc8DCTopLeft(z *Decoder, y, x int) {
471 for j := 0; j < 8; j++ {
472 for i := 0; i < 8; i++ {
473 z.ybr[y+j][x+i] = 0x80
474 }
475 }
476 }
477
478 func predFunc16DC(z *Decoder, y, x int) {
479 sum := uint32(16)
480 for i := 0; i < 16; i++ {
481 sum += uint32(z.ybr[y-1][x+i])
482 }
483 for j := 0; j < 16; j++ {
484 sum += uint32(z.ybr[y+j][x-1])
485 }
486 avg := uint8(sum / 32)
487 for j := 0; j < 16; j++ {
488 for i := 0; i < 16; i++ {
489 z.ybr[y+j][x+i] = avg
490 }
491 }
492 }
493
494 func predFunc16TM(z *Decoder, y, x int) {
495 delta0 := -int32(z.ybr[y-1][x-1])
496 for j := 0; j < 16; j++ {
497 delta1 := delta0 + int32(z.ybr[y+j][x-1])
498 for i := 0; i < 16; i++ {
499 delta2 := delta1 + int32(z.ybr[y-1][x+i])
500 z.ybr[y+j][x+i] = uint8(clip(delta2, 0, 255))
501 }
502 }
503 }
504
505 func predFunc16VE(z *Decoder, y, x int) {
506 for j := 0; j < 16; j++ {
507 for i := 0; i < 16; i++ {
508 z.ybr[y+j][x+i] = z.ybr[y-1][x+i]
509 }
510 }
511 }
512
513 func predFunc16HE(z *Decoder, y, x int) {
514 for j := 0; j < 16; j++ {
515 for i := 0; i < 16; i++ {
516 z.ybr[y+j][x+i] = z.ybr[y+j][x-1]
517 }
518 }
519 }
520
521 func predFunc16DCTop(z *Decoder, y, x int) {
522 sum := uint32(8)
523 for j := 0; j < 16; j++ {
524 sum += uint32(z.ybr[y+j][x-1])
525 }
526 avg := uint8(sum / 16)
527 for j := 0; j < 16; j++ {
528 for i := 0; i < 16; i++ {
529 z.ybr[y+j][x+i] = avg
530 }
531 }
532 }
533
534 func predFunc16DCLeft(z *Decoder, y, x int) {
535 sum := uint32(8)
536 for i := 0; i < 16; i++ {
537 sum += uint32(z.ybr[y-1][x+i])
538 }
539 avg := uint8(sum / 16)
540 for j := 0; j < 16; j++ {
541 for i := 0; i < 16; i++ {
542 z.ybr[y+j][x+i] = avg
543 }
544 }
545 }
546
547 func predFunc16DCTopLeft(z *Decoder, y, x int) {
548 for j := 0; j < 16; j++ {
549 for i := 0; i < 16; i++ {
550 z.ybr[y+j][x+i] = 0x80
551 }
552 }
553 }
554
View as plain text