predfunc.go (13006B)
1 // Copyright 2011 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package vp8 6 7 // This file implements the predicition functions, as specified in chapter 12. 8 // 9 // For each macroblock (of 1x16x16 luma and 2x8x8 chroma coefficients), the 10 // luma values are either predicted as one large 16x16 region or 16 separate 11 // 4x4 regions. The chroma values are always predicted as one 8x8 region. 12 // 13 // For 4x4 regions, the target block's predicted values (Xs) are a function of 14 // its previously-decoded top and left border values, as well as a number of 15 // pixels from the top-right: 16 // 17 // a b c d e f g h 18 // p X X X X 19 // q X X X X 20 // r X X X X 21 // s X X X X 22 // 23 // The predictor modes are: 24 // - DC: all Xs = (b + c + d + e + p + q + r + s + 4) / 8. 25 // - TM: the first X = (b + p - a), the second X = (c + p - a), and so on. 26 // - VE: each X = the weighted average of its column's top value and that 27 // value's neighbors, i.e. averages of abc, bcd, cde or def. 28 // - HE: similar to VE except rows instead of columns, and the final row is 29 // an average of r, s and s. 30 // - RD, VR, LD, VL, HD, HU: these diagonal modes ("Right Down", "Vertical 31 // Right", etc) are more complicated and are described in section 12.3. 32 // All Xs are clipped to the range [0, 255]. 33 // 34 // For 8x8 and 16x16 regions, the target block's predicted values are a 35 // function of the top and left border values without the top-right overhang, 36 // i.e. without the 8x8 or 16x16 equivalent of f, g and h. Furthermore: 37 // - There are no diagonal predictor modes, only DC, TM, VE and HE. 38 // - The DC mode has variants for macroblocks in the top row and/or left 39 // column, i.e. for macroblocks with mby == 0 || mbx == 0. 40 // - The VE and HE modes take only the column top or row left values; they do 41 // not smooth that top/left value with its neighbors. 42 43 // nPred is the number of predictor modes, not including the Top/Left versions 44 // of the DC predictor mode. 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 }