diff options
author | Diego Biurrun <diego@biurrun.de> | 2014-08-08 03:10:05 -0700 |
---|---|---|
committer | Diego Biurrun <diego@biurrun.de> | 2014-08-08 11:13:29 -0700 |
commit | 84d173d3de97c753234ab0c0b50551d51413d663 (patch) | |
tree | 4301eb885aac7e4c06340a1d831898e58301bc9a /libavcodec | |
parent | 6f1960ab71b4f18551243ce22d01913108265233 (diff) | |
download | ffmpeg-84d173d3de97c753234ab0c0b50551d51413d663.tar.gz |
xvididct: Ensure that the scantable permutation is always set correctly
This fixes cases where the scantable permuation would get overwritten by
the general idctdsp initialization.
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/x86/idctdsp_init.c | 6 | ||||
-rw-r--r-- | libavcodec/x86/xvididct_init.c | 15 | ||||
-rw-r--r-- | libavcodec/xvididct.c | 2 |
3 files changed, 10 insertions, 13 deletions
diff --git a/libavcodec/x86/idctdsp_init.c b/libavcodec/x86/idctdsp_init.c index a0d681afb5..853c6a3661 100644 --- a/libavcodec/x86/idctdsp_init.c +++ b/libavcodec/x86/idctdsp_init.c @@ -37,6 +37,8 @@ static const uint8_t simple_mmx_permutation[64] = { 0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F, }; +static const uint8_t idct_sse2_row_perm[8] = { 0, 4, 1, 5, 2, 6, 3, 7 }; + av_cold int ff_init_scantable_permutation_x86(uint8_t *idct_permutation, enum idct_permutation_type perm_type) { @@ -47,6 +49,10 @@ av_cold int ff_init_scantable_permutation_x86(uint8_t *idct_permutation, for (i = 0; i < 64; i++) idct_permutation[i] = simple_mmx_permutation[i]; return 1; + case FF_IDCT_PERM_SSE2: + for (i = 0; i < 64; i++) + idct_permutation[i] = (i & 0x38) | idct_sse2_row_perm[i & 7]; + return 1; } return 0; diff --git a/libavcodec/x86/xvididct_init.c b/libavcodec/x86/xvididct_init.c index 3112fb5e92..d5d8ac9630 100644 --- a/libavcodec/x86/xvididct_init.c +++ b/libavcodec/x86/xvididct_init.c @@ -25,17 +25,6 @@ #include "idct_xvid.h" #include "idctdsp.h" -static const uint8_t idct_sse2_row_perm[8] = { 0, 4, 1, 5, 2, 6, 3, 7 }; - -static av_cold void init_scantable_permutation_sse2(uint8_t *idct_permutation, - enum idct_permutation_type perm_type) -{ - int i; - - for (i = 0; i < 64; i++) - idct_permutation[i] = (i & 0x38) | idct_sse2_row_perm[i & 7]; -} - av_cold void ff_xvididct_init_x86(IDCTDSPContext *c) { int cpu_flags = av_get_cpu_flags(); @@ -44,12 +33,14 @@ av_cold void ff_xvididct_init_x86(IDCTDSPContext *c) c->idct_put = ff_idct_xvid_mmx_put; c->idct_add = ff_idct_xvid_mmx_add; c->idct = ff_idct_xvid_mmx; + c->perm_type = FF_IDCT_PERM_NONE; } if (INLINE_MMXEXT(cpu_flags)) { c->idct_put = ff_idct_xvid_mmxext_put; c->idct_add = ff_idct_xvid_mmxext_add; c->idct = ff_idct_xvid_mmxext; + c->perm_type = FF_IDCT_PERM_NONE; } if (INLINE_SSE2(cpu_flags)) { @@ -57,7 +48,5 @@ av_cold void ff_xvididct_init_x86(IDCTDSPContext *c) c->idct_add = ff_idct_xvid_sse2_add; c->idct = ff_idct_xvid_sse2; c->perm_type = FF_IDCT_PERM_SSE2; - - init_scantable_permutation_sse2(c->idct_permutation, c->perm_type); } } diff --git a/libavcodec/xvididct.c b/libavcodec/xvididct.c index 1453e51700..7e8edc2462 100644 --- a/libavcodec/xvididct.c +++ b/libavcodec/xvididct.c @@ -33,4 +33,6 @@ av_cold void ff_xvididct_init(IDCTDSPContext *c, AVCodecContext *avctx) if (ARCH_X86) ff_xvididct_init_x86(c); + + ff_init_scantable_permutation(c->idct_permutation, c->perm_type); } |