diff options
author | Ronald S. Bultje <rsbultje@gmail.com> | 2014-01-25 06:54:15 +0400 |
---|---|---|
committer | Clément Bœsch <u@pkh.me> | 2014-02-09 21:07:14 +0400 |
commit | 0c30c8ddc1383547f66065286a90ff559e063a8f (patch) | |
tree | 002362298c51caeddc6492e7725fd90e5dcbccde /libavcodec | |
parent | cdfcd061260176c39ac353fb0a5091d750f6fc11 (diff) |
vp9: faster skip-block coefficient blanking.
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/vp9.c | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/libavcodec/vp9.c b/libavcodec/vp9.c index 8419c446d6..01cf4e9023 100644 --- a/libavcodec/vp9.c +++ b/libavcodec/vp9.c @@ -2773,13 +2773,34 @@ static void decode_b(AVCodecContext *ctx, int row, int col, if (!b->skip) { decode_coeffs(ctx); } else { - int pl; + int row7 = s->row7; - memset(&s->above_y_nnz_ctx[col * 2], 0, w4 * 2); - memset(&s->left_y_nnz_ctx[(row & 7) << 1], 0, h4 * 2); - for (pl = 0; pl < 2; pl++) { - memset(&s->above_uv_nnz_ctx[pl][col], 0, w4); - memset(&s->left_uv_nnz_ctx[pl][row & 7], 0, h4); +#define SPLAT_ZERO_CTX(v, n) \ + switch (n) { \ + case 1: v = 0; break; \ + case 2: AV_ZERO16(&v); break; \ + case 4: AV_ZERO32(&v); break; \ + case 8: AV_ZERO64(&v); break; \ + case 16: AV_ZERO128(&v); break; \ + } +#define SPLAT_ZERO_YUV(dir, var, off, n) \ + do { \ + SPLAT_ZERO_CTX(s->dir##_y_##var[off * 2], n * 2); \ + SPLAT_ZERO_CTX(s->dir##_uv_##var[0][off], n); \ + SPLAT_ZERO_CTX(s->dir##_uv_##var[1][off], n); \ + } while (0) + + switch (w4) { + case 1: SPLAT_ZERO_YUV(above, nnz_ctx, col, 1); break; + case 2: SPLAT_ZERO_YUV(above, nnz_ctx, col, 2); break; + case 4: SPLAT_ZERO_YUV(above, nnz_ctx, col, 4); break; + case 8: SPLAT_ZERO_YUV(above, nnz_ctx, col, 8); break; + } + switch (h4) { + case 1: SPLAT_ZERO_YUV(left, nnz_ctx, row7, 1); break; + case 2: SPLAT_ZERO_YUV(left, nnz_ctx, row7, 2); break; + case 4: SPLAT_ZERO_YUV(left, nnz_ctx, row7, 4); break; + case 8: SPLAT_ZERO_YUV(left, nnz_ctx, row7, 8); break; } } if (s->pass == 1) { |