[FFmpeg-cvslog] vp9dsp: add DC only versions for idct/idct.
Clément Bœsch
git at videolan.org
Sat Apr 8 15:25:24 EEST 2017
ffmpeg | branch: master | Clément Bœsch <u at pkh.me> | Fri Nov 22 20:16:09 2013 +0100| [c4c5f5386c83bb8d66f8d67cd8533c8697f06d04] | committer: Martin Storsjö
vp9dsp: add DC only versions for idct/idct.
before:
time ./avconv -v 0 -nostats -threads 1 -i sintel_vp9_500kbps.webm -f null -
real 0m11.125s
user 0m11.059s
sys 0m0.050s
time ./avconv -v 0 -nostats -threads 1 -i sintel_vp9_500kbps.webm -f null -
real 0m10.944s
user 0m10.819s
sys 0m0.064s
after:
time ./avconv -v 0 -nostats -threads 1 -i sintel_vp9_500kbps.webm -f null -
real 0m8.153s
user 0m8.034s
sys 0m0.050s
time ./avconv -v 0 -nostats -threads 1 -i sintel_vp9_500kbps.webm -f null -
real 0m8.038s
user 0m7.980s
sys 0m0.039s
Signed-off-by: Martin Storsjö <martin at martin.st>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=c4c5f5386c83bb8d66f8d67cd8533c8697f06d04
---
libavcodec/vp9dsp.c | 32 ++++++++++++++++++++++++--------
1 file changed, 24 insertions(+), 8 deletions(-)
diff --git a/libavcodec/vp9dsp.c b/libavcodec/vp9dsp.c
index 73006fa..7f86394 100644
--- a/libavcodec/vp9dsp.c
+++ b/libavcodec/vp9dsp.c
@@ -944,7 +944,7 @@ static av_cold void vp9dsp_intrapred_init(VP9DSPContext *dsp)
#undef init_intra_pred
}
-#define itxfm_wrapper(type_a, type_b, sz, bits) \
+#define itxfm_wrapper(type_a, type_b, sz, bits, has_dconly) \
static void \
type_a ## _ ## type_b ## _ ## sz ## x ## sz ## _add_c(uint8_t *dst, \
ptrdiff_t stride, \
@@ -953,6 +953,22 @@ type_a ## _ ## type_b ## _ ## sz ## x ## sz ## _add_c(uint8_t *dst, \
{ \
int i, j; \
int16_t tmp[sz * sz], out[sz]; \
+ \
+ if (has_dconly && eob == 1) { \
+ const int t = (((block[0] * 11585 + (1 << 13)) >> 14) \
+ * 11585 + (1 << 13)) >> 14; \
+ block[0] = 0; \
+ for (i = 0; i < sz; i++) { \
+ for (j = 0; j < sz; j++) \
+ dst[j * stride] = \
+ av_clip_uint8(dst[j * stride] + \
+ (bits ? (t + (1 << (bits - 1))) >> bits \
+ : t)); \
+ dst++; \
+ } \
+ return; \
+ } \
+ \
for (i = 0; i < sz; i++) \
type_a ## sz ## _1d(tmp + i * sz, block + i, sz, 0); \
memset(block, 0, sz * sz * sizeof(*block)); \
@@ -967,11 +983,11 @@ type_a ## _ ## type_b ## _ ## sz ## x ## sz ## _add_c(uint8_t *dst, \
} \
}
-#define itxfm_wrap(sz, bits) \
- itxfm_wrapper(idct, idct, sz, bits) \
- itxfm_wrapper(iadst, idct, sz, bits) \
- itxfm_wrapper(idct, iadst, sz, bits) \
- itxfm_wrapper(iadst, iadst, sz, bits)
+#define itxfm_wrap(sz, bits) \
+ itxfm_wrapper(idct, idct, sz, bits, 1) \
+ itxfm_wrapper(iadst, idct, sz, bits, 0) \
+ itxfm_wrapper(idct, iadst, sz, bits, 0) \
+ itxfm_wrapper(iadst, iadst, sz, bits, 0)
#define IN(x) in[x * stride]
@@ -1490,7 +1506,7 @@ static av_always_inline void idct32_1d(int16_t *out, const int16_t *in,
out[31] = t0 - t31;
}
-itxfm_wrapper(idct, idct, 32, 6)
+itxfm_wrapper(idct, idct, 32, 6, 1)
static av_always_inline void iwht4_1d(int16_t *out, const int16_t *in,
ptrdiff_t stride, int pass)
@@ -1523,7 +1539,7 @@ static av_always_inline void iwht4_1d(int16_t *out, const int16_t *in,
out[3] = t3;
}
-itxfm_wrapper(iwht, iwht, 4, 0)
+itxfm_wrapper(iwht, iwht, 4, 0, 0)
#undef IN
#undef itxfm_wrapper
More information about the ffmpeg-cvslog
mailing list