Merge commit 'a786c8259dafeca9744252230b5d78f67810770c'
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 1 Aug 2014 13:38:24 +0000 (15:38 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 1 Aug 2014 14:21:52 +0000 (16:21 +0200)
* commit 'a786c8259dafeca9744252230b5d78f67810770c':
  idct: Split off Xvid IDCT

Conflicts:
libavcodec/Makefile
libavcodec/mpeg4videodec.c
libavcodec/x86/Makefile
libavcodec/x86/idctdsp_init.c

This split is somewhat restructured leaving the xvid IDCT available
outside mpeg4 if manually selected.

The code also could not be merged unchanged as it conflicted with a
bugfix in FFmpeg

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/Makefile
libavcodec/idctdsp.c
libavcodec/mpeg4videodec.c
libavcodec/x86/Makefile
libavcodec/x86/dct-test.c
libavcodec/x86/idctdsp_init.c
libavcodec/x86/xvididct_init.c
libavcodec/xvididct.c
libavcodec/xvididct.h

@@@ -324,7 -272,7 +324,8 @@@ OBJS-$(CONFIG_MPEG1VIDEO_DECODER)      
  OBJS-$(CONFIG_MPEG1VIDEO_ENCODER)      += mpeg12enc.o mpeg12.o
  OBJS-$(CONFIG_MPEG2VIDEO_DECODER)      += mpeg12dec.o mpeg12.o mpeg12data.o
  OBJS-$(CONFIG_MPEG2VIDEO_ENCODER)      += mpeg12enc.o mpeg12.o
+ OBJS-$(CONFIG_MPEG4_DECODER)           += xvididct.o
 +OBJS-$(CONFIG_MPL2_DECODER)            += mpl2dec.o ass.o
  OBJS-$(CONFIG_MSMPEG4V1_DECODER)       += msmpeg4dec.o msmpeg4.o msmpeg4data.o
  OBJS-$(CONFIG_MSMPEG4V2_DECODER)       += msmpeg4dec.o msmpeg4.o msmpeg4data.o
  OBJS-$(CONFIG_MSMPEG4V2_ENCODER)       += msmpeg4enc.o msmpeg4.o msmpeg4data.o
@@@ -24,6 -24,6 +24,7 @@@
  #include "faanidct.h"
  #include "idctdsp.h"
  #include "simple_idct.h"
++#include "xvididct.h"
  
  av_cold void ff_init_scantable(uint8_t *permutation, ScanTable *st,
                                 const uint8_t *src_scantable)
@@@ -299,8 -185,6 +300,11 @@@ av_cold void ff_idctdsp_init(IDCTDSPCon
      c->put_signed_pixels_clamped = put_signed_pixels_clamped_c;
      c->add_pixels_clamped        = add_pixels_clamped_c;
  
++    if (CONFIG_MPEG4_DECODER && avctx->idct_algo == FF_IDCT_XVIDMMX)
++        ff_xvididct_init(c, avctx);
++
 +    if (ARCH_ALPHA)
 +        ff_idctdsp_init_alpha(c, avctx, high_bit_depth);
      if (ARCH_ARM)
          ff_idctdsp_init_arm(c, avctx, high_bit_depth);
      if (ARCH_PPC)
@@@ -2132,91 -2067,9 +2133,93 @@@ int ff_mpeg4_workaround_bugs(AVCodecCon
          ctx->divx_build   = -1;
      }
  
 -    if (CONFIG_MPEG4_DECODER && ctx->xvid_build >= 0)
 -        ff_xvididct_init(&s->idsp, s->avctx);
 +    if (s->workaround_bugs & FF_BUG_AUTODETECT) {
 +        if (s->codec_tag == AV_RL32("XVIX"))
 +            s->workaround_bugs |= FF_BUG_XVID_ILACE;
 +
 +        if (s->codec_tag == AV_RL32("UMP4"))
 +            s->workaround_bugs |= FF_BUG_UMP4;
 +
 +        if (ctx->divx_version >= 500 && ctx->divx_build < 1814)
 +            s->workaround_bugs |= FF_BUG_QPEL_CHROMA;
 +
 +        if (ctx->divx_version > 502 && ctx->divx_build < 1814)
 +            s->workaround_bugs |= FF_BUG_QPEL_CHROMA2;
 +
 +        if (ctx->xvid_build <= 3U)
 +            s->padding_bug_score = 256 * 256 * 256 * 64;
 +
 +        if (ctx->xvid_build <= 1U)
 +            s->workaround_bugs |= FF_BUG_QPEL_CHROMA;
 +
 +        if (ctx->xvid_build <= 12U)
 +            s->workaround_bugs |= FF_BUG_EDGE;
 +
 +        if (ctx->xvid_build <= 32U)
 +            s->workaround_bugs |= FF_BUG_DC_CLIP;
 +
 +#define SET_QPEL_FUNC(postfix1, postfix2)                           \
 +    s->qdsp.put_        ## postfix1 = ff_put_        ## postfix2;   \
 +    s->qdsp.put_no_rnd_ ## postfix1 = ff_put_no_rnd_ ## postfix2;   \
 +    s->qdsp.avg_        ## postfix1 = ff_avg_        ## postfix2;
 +
 +        if (ctx->lavc_build < 4653U)
 +            s->workaround_bugs |= FF_BUG_STD_QPEL;
 +
 +        if (ctx->lavc_build < 4655U)
 +            s->workaround_bugs |= FF_BUG_DIRECT_BLOCKSIZE;
 +
 +        if (ctx->lavc_build < 4670U)
 +            s->workaround_bugs |= FF_BUG_EDGE;
 +
 +        if (ctx->lavc_build <= 4712U)
 +            s->workaround_bugs |= FF_BUG_DC_CLIP;
 +
 +        if (ctx->divx_version >= 0)
 +            s->workaround_bugs |= FF_BUG_DIRECT_BLOCKSIZE;
 +        if (ctx->divx_version == 501 && ctx->divx_build == 20020416)
 +            s->padding_bug_score = 256 * 256 * 256 * 64;
 +
 +        if (ctx->divx_version < 500U)
 +            s->workaround_bugs |= FF_BUG_EDGE;
 +
 +        if (ctx->divx_version >= 0)
 +            s->workaround_bugs |= FF_BUG_HPEL_CHROMA;
 +    }
 +
 +    if (s->workaround_bugs & FF_BUG_STD_QPEL) {
 +        SET_QPEL_FUNC(qpel_pixels_tab[0][5], qpel16_mc11_old_c)
 +        SET_QPEL_FUNC(qpel_pixels_tab[0][7], qpel16_mc31_old_c)
 +        SET_QPEL_FUNC(qpel_pixels_tab[0][9], qpel16_mc12_old_c)
 +        SET_QPEL_FUNC(qpel_pixels_tab[0][11], qpel16_mc32_old_c)
 +        SET_QPEL_FUNC(qpel_pixels_tab[0][13], qpel16_mc13_old_c)
 +        SET_QPEL_FUNC(qpel_pixels_tab[0][15], qpel16_mc33_old_c)
 +
 +        SET_QPEL_FUNC(qpel_pixels_tab[1][5], qpel8_mc11_old_c)
 +        SET_QPEL_FUNC(qpel_pixels_tab[1][7], qpel8_mc31_old_c)
 +        SET_QPEL_FUNC(qpel_pixels_tab[1][9], qpel8_mc12_old_c)
 +        SET_QPEL_FUNC(qpel_pixels_tab[1][11], qpel8_mc32_old_c)
 +        SET_QPEL_FUNC(qpel_pixels_tab[1][13], qpel8_mc13_old_c)
 +        SET_QPEL_FUNC(qpel_pixels_tab[1][15], qpel8_mc33_old_c)
 +    }
 +
 +    if (avctx->debug & FF_DEBUG_BUGS)
 +        av_log(s->avctx, AV_LOG_DEBUG,
 +               "bugs: %X lavc_build:%d xvid_build:%d divx_version:%d divx_build:%d %s\n",
 +               s->workaround_bugs, ctx->lavc_build, ctx->xvid_build,
 +               ctx->divx_version, ctx->divx_build, s->divx_packed ? "p" : "");
 +
 +#if HAVE_MMX
-     if (s->codec_id == AV_CODEC_ID_MPEG4 && ctx->xvid_build >= 0 &&
++    if (CONFIG_MPEG4_DECODER && ctx->xvid_build >= 0 &&
++        s->codec_id == AV_CODEC_ID_MPEG4 &&
 +        avctx->idct_algo == FF_IDCT_AUTO &&
 +        (av_get_cpu_flags() & AV_CPU_FLAG_MMX)) {
 +        avctx->idct_algo = FF_IDCT_XVIDMMX;
 +        ff_dct_common_init(s);
 +        return 1;
 +    }
 +#endif
      return 0;
  }
  
@@@ -40,9 -37,9 +40,10 @@@ OBJS-$(CONFIG_DCA_DECODER)             
  OBJS-$(CONFIG_DNXHD_ENCODER)           += x86/dnxhdenc_init.o
  OBJS-$(CONFIG_HEVC_DECODER)            += x86/hevcdsp_init.o
  OBJS-$(CONFIG_MLP_DECODER)             += x86/mlpdsp.o
+ OBJS-$(CONFIG_MPEG4_DECODER)           += x86/xvididct_init.o
  OBJS-$(CONFIG_PNG_DECODER)             += x86/pngdsp_init.o
  OBJS-$(CONFIG_PRORES_DECODER)          += x86/proresdsp_init.o
 +OBJS-$(CONFIG_PRORES_LGPL_DECODER)     += x86/proresdsp_init.o
  OBJS-$(CONFIG_RV30_DECODER)            += x86/rv34dsp_init.o
  OBJS-$(CONFIG_RV40_DECODER)            += x86/rv34dsp_init.o            \
                                            x86/rv40dsp_init.o
@@@ -56,17 -51,17 +57,17 @@@ OBJS-$(CONFIG_VP6_DECODER)             
  OBJS-$(CONFIG_VP7_DECODER)             += x86/vp8dsp_init.o
  OBJS-$(CONFIG_VP8_DECODER)             += x86/vp8dsp_init.o
  OBJS-$(CONFIG_VP9_DECODER)             += x86/vp9dsp_init.o
 +OBJS-$(CONFIG_WEBP_DECODER)            += x86/vp8dsp_init.o
  
 -MMX-OBJS-$(CONFIG_AUDIODSP)            += x86/audiodsp_mmx.o
 -MMX-OBJS-$(CONFIG_HPELDSP)             += x86/fpel_mmx.o                \
 -                                          x86/hpeldsp_mmx.o
 +MMX-OBJS-$(CONFIG_DIRAC_DECODER)       += x86/dirac_dwt.o
  MMX-OBJS-$(CONFIG_FDCTDSP)             += x86/fdct.o
  MMX-OBJS-$(CONFIG_IDCTDSP)             += x86/idctdsp_mmx.o             \
-                                           x86/idct_mmx_xvid.o           \
-                                           x86/idct_sse2_xvid.o          \
                                            x86/simple_idct.o
 -MMX-OBJS-$(CONFIG_QPELDSP)             += x86/fpel_mmx.o
  
+ MMX-OBJS-$(CONFIG_MPEG4_DECODER)       += x86/idct_mmx_xvid.o           \
+                                           x86/idct_sse2_xvid.o
 +MMX-OBJS-$(CONFIG_SNOW_DECODER)        += x86/snowdsp.o
 +MMX-OBJS-$(CONFIG_SNOW_ENCODER)        += x86/snowdsp.o
  MMX-OBJS-$(CONFIG_VC1_DECODER)         += x86/vc1dsp_mmx.o
  
  YASM-OBJS                              += x86/deinterlace.o             \
@@@ -66,10 -48,8 +69,11 @@@ static const struct algo idct_tab_arch[
  #endif
  #if HAVE_SSE2_INLINE
      { "XVID-SSE2",   ff_idct_xvid_sse2,   FF_IDCT_PERM_SSE2,   AV_CPU_FLAG_SSE2,   1 },
 +#if ARCH_X86_64 && HAVE_YASM
 +    { "PR-SSE2",     ff_prores_idct_put_10_sse2_wrap, FF_IDCT_PERM_TRANSPOSE, AV_CPU_FLAG_SSE2, 1 },
 +#endif
  #endif
+ #endif /* CONFIG_MPEG4_DECODER */
      { 0 }
  };
  
@@@ -66,47 -59,16 +59,23 @@@ av_cold void ff_idctdsp_init_x86(IDCTDS
  
      if (INLINE_MMX(cpu_flags)) {
          c->put_pixels_clamped        = ff_put_pixels_clamped_mmx;
 -        c->put_signed_pixels_clamped = ff_put_signed_pixels_clamped_mmx;
          c->add_pixels_clamped        = ff_add_pixels_clamped_mmx;
  
-         if (avctx->lowres == 0 && !high_bit_depth) {
-             switch (avctx->idct_algo) {
-             case FF_IDCT_AUTO:
-             case FF_IDCT_SIMPLEAUTO:
-             case FF_IDCT_SIMPLEMMX:
+         if (!high_bit_depth &&
++            avctx->lowres == 0 &&
+             (avctx->idct_algo == FF_IDCT_AUTO ||
++             avctx->idct_algo == FF_IDCT_SIMPLEAUTO ||
+              avctx->idct_algo == FF_IDCT_SIMPLEMMX)) {
                  c->idct_put  = ff_simple_idct_put_mmx;
                  c->idct_add  = ff_simple_idct_add_mmx;
                  c->idct      = ff_simple_idct_mmx;
                  c->perm_type = FF_IDCT_PERM_SIMPLE;
-                 break;
-             case FF_IDCT_XVIDMMX:
-                 c->idct_put  = ff_idct_xvid_mmx_put;
-                 c->idct_add  = ff_idct_xvid_mmx_add;
-                 c->idct      = ff_idct_xvid_mmx;
-                 break;
-             }
          }
      }
-     if (INLINE_MMXEXT(cpu_flags)) {
-         if (!high_bit_depth && avctx->idct_algo == FF_IDCT_XVIDMMX && avctx->lowres == 0) {
-             c->idct_put = ff_idct_xvid_mmxext_put;
-             c->idct_add = ff_idct_xvid_mmxext_add;
-             c->idct     = ff_idct_xvid_mmxext;
-         }
-     }
-     if (INLINE_SSE2(cpu_flags)) {
-         if (!high_bit_depth && avctx->idct_algo == FF_IDCT_XVIDMMX && avctx->lowres == 0) {
-             c->idct_put  = ff_idct_xvid_sse2_put;
-             c->idct_add  = ff_idct_xvid_sse2_add;
-             c->idct      = ff_idct_xvid_sse2;
-             c->perm_type = FF_IDCT_PERM_SSE2;
-         }
-     }
 +    if (EXTERNAL_MMX(cpu_flags)) {
 +        c->put_signed_pixels_clamped = ff_put_signed_pixels_clamped_mmx;
 +    }
 +    if (EXTERNAL_SSE2(cpu_flags)) {
 +        c->put_signed_pixels_clamped = ff_put_signed_pixels_clamped_sse2;
 +    }
  }
index 0000000,3112fb5..2ea4810
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,63 +1,63 @@@
 - * This file is part of Libav.
+ /*
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * FFmpeg is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU Lesser General Public
+  * License as published by the Free Software Foundation; either
+  * version 2.1 of the License, or (at your option) any later version.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * FFmpeg is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  * Lesser General Public License for more details.
+  *
+  * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ #include "config.h"
+ #include "libavutil/attributes.h"
+ #include "libavutil/cpu.h"
+ #include "libavutil/x86/cpu.h"
+ #include "libavcodec/idctdsp.h"
+ #include "libavcodec/xvididct.h"
+ #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();
+     if (INLINE_MMX(cpu_flags)) {
+         c->idct_put  = ff_idct_xvid_mmx_put;
+         c->idct_add  = ff_idct_xvid_mmx_add;
+         c->idct      = ff_idct_xvid_mmx;
+     }
+     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;
+     }
+     if (INLINE_SSE2(cpu_flags)) {
+         c->idct_put  = ff_idct_xvid_sse2_put;
+         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);
+     }
+ }
index 0000000,1453e51..36f65a6
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,36 +1,36 @@@
 - * This file is part of Libav.
+ /*
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * FFmpeg is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU Lesser General Public
+  * License as published by the Free Software Foundation; either
+  * version 2.1 of the License, or (at your option) any later version.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * FFmpeg is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  * Lesser General Public License for more details.
+  *
+  * You should have received a copy of the GNU Lesser General Public
 -    if (high_bit_depth ||
++ * License along with FFmpeg; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ #include "config.h"
+ #include "libavutil/attributes.h"
+ #include "avcodec.h"
+ #include "idctdsp.h"
+ #include "xvididct.h"
+ av_cold void ff_xvididct_init(IDCTDSPContext *c, AVCodecContext *avctx)
+ {
+     const unsigned high_bit_depth = avctx->bits_per_raw_sample > 8;
++    if (high_bit_depth || avctx->lowres ||
+         !(avctx->idct_algo == FF_IDCT_AUTO ||
+           avctx->idct_algo == FF_IDCT_XVIDMMX))
+         return;
+     if (ARCH_X86)
+         ff_xvididct_init_x86(c);
+ }
index 0000000,a688bc8..6678329
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,29 +1,29 @@@
 - * This file is part of Libav.
+ /*
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * FFmpeg is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU Lesser General Public
+  * License as published by the Free Software Foundation; either
+  * version 2.1 of the License, or (at your option) any later version.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * FFmpeg is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  * Lesser General Public License for more details.
+  *
+  * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ #ifndef AVCODEC_XVIDIDCT_H
+ #define AVCODEC_XVIDIDCT_H
+ #include "avcodec.h"
+ #include "idctdsp.h"
+ void ff_xvididct_init(IDCTDSPContext *c, AVCodecContext *avctx);
+ void ff_xvididct_init_x86(IDCTDSPContext *c);
+ #endif /* AVCODEC_XVIDIDCT_H */