The spec specified indices in the order [x][y], but our code follows the traditional C convention of [y][x]. This was not correctly account for when calculating the base index of the grain database access.
Unified · Split
| @@ -259,11 +259,11 @@ int ff_h274_apply_film_grain(AVFrame *out_frame, const AVFrame *in_frame, · 258 unmodified lines | |||
| 259 | // only advanced in 16x16 blocks, so use a nested loop | 259 | // only advanced in 16x16 blocks, so use a nested loop |
| 260 | for (int y = 0; y < height; y += 16) { | 260 | for (int y = 0; y < height; y += 16) { |
| 261 | for (int x = 0; x < width; x += 16) { | 261 | for (int x = 0; x < width; x += 16) { |
| 262 | uint16_t y_offset = (seed >> 16) % 52; | 262 | uint16_t x_offset = (seed >> 16) % 52; |
| 263 | uint16_t x_offset = (seed & 0xFFFF) % 56; | 263 | uint16_t y_offset = (seed & 0xFFFF) % 56; |
| 264 | const int invert = (seed & 0x1); | 264 | const int invert = (seed & 0x1); |
| 265 | y_offset &= 0xFFFC; | 265 | x_offset &= 0xFFFC; |
| 266 | x_offset &= 0xFFF8; | 266 | y_offset &= 0xFFF8; |
| 267 | prng_shift(&seed); | 267 | prng_shift(&seed); |
| 268 | 268 | ||
| 269 | for (int yy = 0; yy < 16 && y+yy < height; yy += 8) { | 269 | for (int yy = 0; yy < 16 && y+yy < height; yy += 8) { |