Merge commit '0d439fbede03854eac8a978cccf21a3425a3c82d'
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 27 May 2014 21:07:36 +0000 (23:07 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 27 May 2014 21:16:06 +0000 (23:16 +0200)
* commit '0d439fbede03854eac8a978cccf21a3425a3c82d':
  dsputil: Split off HuffYUV decoding bits into their own context

Conflicts:
configure
libavcodec/dsputil.c
libavcodec/dsputil.h
libavcodec/huffyuv.h
libavcodec/huffyuvdec.c
libavcodec/lagarith.c
libavcodec/vble.c
libavcodec/x86/Makefile
libavcodec/x86/dsputil.asm
libavcodec/x86/dsputil_init.c
libavcodec/x86/dsputil_mmx.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
22 files changed:
1  2 
configure
libavcodec/Makefile
libavcodec/dsputil.c
libavcodec/dsputil.h
libavcodec/huffyuv.c
libavcodec/huffyuv.h
libavcodec/huffyuvdec.c
libavcodec/huffyuvdsp.c
libavcodec/huffyuvdsp.h
libavcodec/lagarith.c
libavcodec/ppc/dsputil_altivec.c
libavcodec/ppc/huffyuvdsp_altivec.c
libavcodec/vble.c
libavcodec/x86/Makefile
libavcodec/x86/dsputil.asm
libavcodec/x86/dsputil_init.c
libavcodec/x86/dsputil_mmx.c
libavcodec/x86/dsputil_x86.h
libavcodec/x86/huffyuvdsp.asm
libavcodec/x86/huffyuvdsp.h
libavcodec/x86/huffyuvdsp_init.c
libavcodec/x86/huffyuvdsp_mmx.c

diff --cc configure
+++ b/configure
@@@ -1805,9 -1541,9 +1805,10 @@@ CONFIG_EXTRA=
      h264qpel
      hpeldsp
      huffman
+     huffyuvdsp
      intrax8
      lgplv3
 +    llviddsp
      lpc
      mpegaudio
      mpegaudiodsp
@@@ -2059,8 -1772,8 +2060,8 @@@ h263p_encoder_select="h263_encoder
  h264_decoder_select="cabac golomb h264chroma h264dsp h264pred h264qpel videodsp"
  h264_decoder_suggest="error_resilience"
  hevc_decoder_select="cabac dsputil golomb videodsp"
- huffyuv_decoder_select="dsputil llviddsp"
 -huffyuv_decoder_select="dsputil huffyuvdsp"
 -huffyuv_encoder_select="dsputil huffman"
++huffyuv_decoder_select="dsputil huffyuvdsp llviddsp"
 +huffyuv_encoder_select="dsputil huffman llviddsp"
  iac_decoder_select="imc_decoder"
  imc_decoder_select="dsputil fft mdct sinewin"
  indeo3_decoder_select="hpeldsp"
@@@ -54,12 -46,12 +54,13 @@@ OBJS-$(CONFIG_H264PRED)                
  OBJS-$(CONFIG_H264QPEL)                += h264qpel.o
  OBJS-$(CONFIG_HPELDSP)                 += hpeldsp.o
  OBJS-$(CONFIG_HUFFMAN)                 += huffman.o
+ OBJS-$(CONFIG_HUFFYUVDSP)              += huffyuvdsp.o
  OBJS-$(CONFIG_INTRAX8)                 += intrax8.o intrax8dsp.o
  OBJS-$(CONFIG_LIBXVID)                 += libxvid_rc.o
 +OBJS-$(CONFIG_LLVIDDSP)                += lossless_videodsp.o
  OBJS-$(CONFIG_LPC)                     += lpc.o
  OBJS-$(CONFIG_LSP)                     += lsp.o
 -OBJS-$(CONFIG_MDCT)                    += mdct_fixed.o mdct_float.o
 +OBJS-$(CONFIG_MDCT)                    += mdct_fixed.o mdct_float.o mdct_fixed_32.o
  OBJS-$(CONFIG_MPEGAUDIO)               += mpegaudio.o mpegaudiodata.o   \
                                            mpegaudiodecheader.o
  OBJS-$(CONFIG_MPEGAUDIODSP)            += mpegaudiodsp.o                \
@@@ -1780,20 -1663,7 +1780,7 @@@ void ff_set_cmp(DSPContext *c, me_cmp_f
      }
  }
  
- static void add_bytes_c(uint8_t *dst, uint8_t *src, int w)
- {
-     long i;
-     for (i = 0; i <= w - (int) sizeof(long); i += sizeof(long)) {
-         long a = *(long *) (src + i);
-         long b = *(long *) (dst + i);
-         *(long *) (dst + i) = ((a & pb_7f) + (b & pb_7f)) ^ ((a ^ b) & pb_80);
-     }
-     for (; i < w; i++)
-         dst[i + 0] += src[i + 0];
- }
 -static void diff_bytes_c(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w)
 +static void diff_bytes_c(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int w)
  {
      long i;
  
@@@ -188,12 -186,9 +188,9 @@@ typedef struct DSPContext 
      me_cmp_func pix_abs[2][4];
  
      /* HuffYUV specific */
-     void (*add_bytes)(uint8_t *dst /* align 16 */,
-                       uint8_t *src /* align 16 */,
-                       int w);
      void (*diff_bytes)(uint8_t *dst /* align 16 */,
 -                       uint8_t *src1 /* align 16 */,
 -                       uint8_t *src2 /* align 1 */,
 +                       const uint8_t *src1 /* align 16 */,
 +                       const uint8_t *src2 /* align 1 */,
                         int w);
      /**
       * Subtract HuffYUV's variant of median prediction.
  #include "libavutil/mem.h"
  
  #include "avcodec.h"
+ #include "dsputil.h"
  #include "huffyuv.h"
  
 -int ff_huffyuv_generate_bits_table(uint32_t *dst, const uint8_t *len_table)
 +int ff_huffyuv_generate_bits_table(uint32_t *dst, const uint8_t *len_table, int n)
  {
      int len, index;
      uint32_t bits = 0;
@@@ -34,8 -34,8 +34,9 @@@
  #include "avcodec.h"
  #include "dsputil.h"
  #include "get_bits.h"
+ #include "huffyuvdsp.h"
  #include "put_bits.h"
 +#include "lossless_videodsp.h"
  
  #define VLC_BITS 11
  
@@@ -95,7 -82,7 +96,8 @@@ typedef struct HYuvContext 
      uint8_t *bitstream_buffer;
      unsigned int bitstream_buffer_size;
      DSPContext dsp;
+     HuffYUVDSPContext hdsp;
 +    LLVidDSPContext llviddsp;
  } HYuvContext;
  
  void ff_huffyuv_common_init(AVCodecContext *s);
@@@ -33,8 -31,8 +33,9 @@@
  #include "avcodec.h"
  #include "get_bits.h"
  #include "huffyuv.h"
+ #include "huffyuvdsp.h"
  #include "thread.h"
 +#include "libavutil/pixdesc.h"
  
  #define classic_shift_luma_table_size 42
  static const unsigned char classic_shift_luma[classic_shift_luma_table_size + FF_INPUT_BUFFER_PADDING_SIZE] = {
@@@ -265,9 -239,11 +266,10 @@@ static av_cold int decode_init(AVCodecC
  {
      HYuvContext *s = avctx->priv_data;
  
 -    ff_huffyuv_common_init(avctx);
+     ff_huffyuvdsp_init(&s->hdsp);
 -    memset(s->vlc, 0, 3 * sizeof(VLC));
 +    memset(s->vlc, 0, 4 * sizeof(VLC));
  
 -    s->interlaced = s->height > 288;
 +    s->interlaced = avctx->height > 288;
  
      s->bgr32 = 1;
  
@@@ -743,32 -472,6 +745,32 @@@ static void draw_slice(HYuvContext *s, 
      s->last_slice_end = y + h;
  }
  
-         return s->dsp.add_hfyu_left_prediction(dst, src, w, acc);
 +static int left_prediction(HYuvContext *s, uint8_t *dst, const uint8_t *src, int w, int acc)
 +{
 +    if (s->bps <= 8) {
-         s->dsp.add_bytes(dst, src, w);
++        return s->hdsp.add_hfyu_left_pred(dst, src, w, acc);
 +    } else {
 +        return s->llviddsp.add_hfyu_left_prediction_int16((      uint16_t *)dst, (const uint16_t *)src, s->n-1, w, acc);
 +    }
 +}
 +
 +static void add_bytes(HYuvContext *s, uint8_t *dst, uint8_t *src, int w)
 +{
 +    if (s->bps <= 8) {
-         s->dsp.add_hfyu_median_prediction(dst, src, diff, w, left, left_top);
++        s->hdsp.add_bytes(dst, src, w);
 +    } else {
 +        s->llviddsp.add_int16((uint16_t*)dst, (const uint16_t*)src, s->n - 1, w);
 +    }
 +}
 +
 +static void add_median_prediction(HYuvContext *s, uint8_t *dst, const uint8_t *src, const uint8_t *diff, int w, int *left, int *left_top)
 +{
 +    if (s->bps <= 8) {
++        s->hdsp.add_hfyu_median_pred(dst, src, diff, w, left, left_top);
 +    } else {
 +        s->llviddsp.add_hfyu_median_prediction_int16((uint16_t *)dst, (const uint16_t *)src, (const uint16_t *)diff, s->n-1, w, left, left_top);
 +    }
 +}
  static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
                          AVPacket *avpkt)
  {
index 0000000,b5a714d..a0e5444
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,132 +1,132 @@@
 - * 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 <stdint.h>
+ #include "config.h"
+ #include "libavutil/attributes.h"
+ #include "mathops.h"
+ #include "huffyuvdsp.h"
+ // 0x7f7f7f7f or 0x7f7f7f7f7f7f7f7f or whatever, depending on the cpu's native arithmetic size
+ #define pb_7f (~0UL / 255 * 0x7f)
+ #define pb_80 (~0UL / 255 * 0x80)
+ static void add_bytes_c(uint8_t *dst, uint8_t *src, int w)
+ {
+     long i;
+     for (i = 0; i <= w - (int) sizeof(long); i += sizeof(long)) {
+         long a = *(long *) (src + i);
+         long b = *(long *) (dst + i);
+         *(long *) (dst + i) = ((a & pb_7f) + (b & pb_7f)) ^ ((a ^ b) & pb_80);
+     }
+     for (; i < w; i++)
+         dst[i + 0] += src[i + 0];
+ }
+ static void add_hfyu_median_pred_c(uint8_t *dst, const uint8_t *src1,
+                                    const uint8_t *diff, int w,
+                                    int *left, int *left_top)
+ {
+     int i;
+     uint8_t l, lt;
+     l  = *left;
+     lt = *left_top;
+     for (i = 0; i < w; i++) {
+         l      = mid_pred(l, src1[i], (l + src1[i] - lt) & 0xFF) + diff[i];
+         lt     = src1[i];
+         dst[i] = l;
+     }
+     *left     = l;
+     *left_top = lt;
+ }
+ static int add_hfyu_left_pred_c(uint8_t *dst, const uint8_t *src, int w,
+                                 int acc)
+ {
+     int i;
+     for (i = 0; i < w - 1; i++) {
+         acc   += src[i];
+         dst[i] = acc;
+         i++;
+         acc   += src[i];
+         dst[i] = acc;
+     }
+     for (; i < w; i++) {
+         acc   += src[i];
+         dst[i] = acc;
+     }
+     return acc;
+ }
+ #if HAVE_BIGENDIAN
+ #define B 3
+ #define G 2
+ #define R 1
+ #define A 0
+ #else
+ #define B 0
+ #define G 1
+ #define R 2
+ #define A 3
+ #endif
+ static void add_hfyu_left_pred_bgr32_c(uint8_t *dst, const uint8_t *src,
+                                        int w, int *red, int *green,
+                                        int *blue, int *alpha)
+ {
+     int i, r = *red, g = *green, b = *blue, a = *alpha;
+     for (i = 0; i < w; i++) {
+         b += src[4 * i + B];
+         g += src[4 * i + G];
+         r += src[4 * i + R];
+         a += src[4 * i + A];
+         dst[4 * i + B] = b;
+         dst[4 * i + G] = g;
+         dst[4 * i + R] = r;
+         dst[4 * i + A] = a;
+     }
+     *red   = r;
+     *green = g;
+     *blue  = b;
+     *alpha = a;
+ }
+ #undef B
+ #undef G
+ #undef R
+ #undef A
+ av_cold void ff_huffyuvdsp_init(HuffYUVDSPContext *c)
+ {
+     c->add_bytes                = add_bytes_c;
+     c->add_hfyu_median_pred     = add_hfyu_median_pred_c;
+     c->add_hfyu_left_pred       = add_hfyu_left_pred_c;
+     c->add_hfyu_left_pred_bgr32 = add_hfyu_left_pred_bgr32_c;
+     if (ARCH_X86)
+         ff_huffyuvdsp_init_x86(c);
+ }
index 0000000,5e84e3a..e08a96b
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,41 +1,41 @@@
 - * 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_HUFFYUVDSP_H
+ #define AVCODEC_HUFFYUVDSP_H
+ #include <stdint.h>
+ typedef struct HuffYUVDSPContext {
+     void (*add_bytes)(uint8_t *dst /* align 16 */, uint8_t *src /* align 16 */,
+                       int w);
+     void (*add_hfyu_median_pred)(uint8_t *dst, const uint8_t *top,
+                                  const uint8_t *diff, int w,
+                                  int *left, int *left_top);
+     int (*add_hfyu_left_pred)(uint8_t *dst, const uint8_t *src,
+                               int w, int left);
+     void (*add_hfyu_left_pred_bgr32)(uint8_t *dst, const uint8_t *src,
+                                      int w, int *red, int *green,
+                                      int *blue, int *alpha);
+ } HuffYUVDSPContext;
+ void ff_huffyuvdsp_init(HuffYUVDSPContext *c);
+ void ff_huffyuvdsp_init_ppc(HuffYUVDSPContext *c);
+ void ff_huffyuvdsp_init_x86(HuffYUVDSPContext *c);
+ #endif /* AVCODEC_HUFFYUVDSP_H */
@@@ -259,9 -251,11 +259,8 @@@ static void lag_pred_line(LagarithConte
      int L, TL;
  
      if (!line) {
 -        int i, align_width = (width - 1) & ~31;
          /* Left prediction only for first line */
-         L = l->dsp.add_hfyu_left_prediction(buf, buf,
-                                             width, 0);
 -        L = l->hdsp.add_hfyu_left_pred(buf + 1, buf + 1, align_width, buf[0]);
 -        for (i = align_width + 1; i < width; i++)
 -            buf[i] += buf[i - 1];
++        L = l->hdsp.add_hfyu_left_pred(buf, buf, width, 0);
      } else {
          /* Left pixel is actually prev_row[width] */
          L = buf[width - stride - 1];
@@@ -287,12 -281,18 +286,12 @@@ static void lag_pred_line_yuy2(Lagarith
      int L, TL;
  
      if (!line) {
 -        int i, align_width;
 -        if (is_luma) {
 -            buf++;
 -            width--;
 -        }
 -
 -        align_width = (width - 1) & ~31;
 -        l->hdsp.add_hfyu_left_pred(buf + 1, buf + 1, align_width, buf[0]);
 -
 -        for (i = align_width + 1; i < width; i++)
 -            buf[i] += buf[i - 1];
 -
 +        L= buf[0];
 +        if (is_luma)
 +            buf[0] = 0;
-         l->dsp.add_hfyu_left_prediction(buf, buf, width, 0);
++        l->hdsp.add_hfyu_left_pred(buf, buf, width, 0);
 +        if (is_luma)
 +            buf[0] = L;
          return;
      }
      if (line == 1) {
Simple merge
index 0000000,7ff871b..ff2bd87
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,57 +1,57 @@@
 - * This file is part of Libav.
+ /*
+  * Copyright (c) 2002 Brian Foley
+  * Copyright (c) 2002 Dieter Shirley
+  * Copyright (c) 2003-2004 Romain Dolbeau <romain@dolbeau.org>
+  *
 - * 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"
+ #if HAVE_ALTIVEC_H
+ #include <altivec.h>
+ #endif
+ #include "libavutil/attributes.h"
+ #include "libavutil/ppc/types_altivec.h"
+ #include "libavutil/ppc/util_altivec.h"
+ #include "libavcodec/huffyuvdsp.h"
+ #if HAVE_ALTIVEC
+ static void add_bytes_altivec(uint8_t *dst, uint8_t *src, int w)
+ {
+     register int i;
+     register vector unsigned char vdst, vsrc;
+     /* dst and src are 16 bytes-aligned (guaranteed). */
+     for (i = 0; i + 15 < w; i += 16) {
+         vdst = vec_ld(i, (unsigned char *) dst);
+         vsrc = vec_ld(i, (unsigned char *) src);
+         vdst = vec_add(vsrc, vdst);
+         vec_st(vdst, i, (unsigned char *) dst);
+     }
+     /* If w is not a multiple of 16. */
+     for (; i < w; i++)
+         dst[i] = src[i];
+ }
+ #endif /* HAVE_ALTIVEC */
+ av_cold void ff_huffyuvdsp_init_ppc(HuffYUVDSPContext *c)
+ {
+ #if HAVE_ALTIVEC
+     c->add_bytes = add_bytes_altivec;
+ #endif /* HAVE_ALTIVEC */
+ }
  
  typedef struct {
      AVCodecContext *avctx;
-     DSPContext dsp;
+     HuffYUVDSPContext hdsp;
  
      int            size;
 -    uint8_t        *val; /* First holds the lengths of vlc symbols and then their values */
 +    uint8_t        *val; ///< This array first holds the lengths of vlc symbols and then their value.
  } VBLEContext;
  
 -static uint8_t vble_read_reverse_unary(GetBitContext *gb)
 -{
 -    /* At most we need to read 9 bits total to get indices up to 8 */
 -    uint8_t val = show_bits(gb, 8);
 -
 -    if (val) {
 -        val = 7 - av_log2_16bit(ff_reverse[val]);
 -        skip_bits(gb, val + 1);
 -        return val;
 -    } else {
 -        skip_bits(gb, 8);
 -        if (get_bits1(gb))
 -            return 8;
 -    }
 -
 -    /* Return something larger than 8 on error */
 -    return UINT8_MAX;
 -}
 -
  static int vble_unpack(VBLEContext *ctx, GetBitContext *gb)
  {
      int i;
@@@ -16,9 -13,8 +15,10 @@@ OBJS-$(CONFIG_H264CHROMA)              
  OBJS-$(CONFIG_H264DSP)                 += x86/h264dsp_init.o
  OBJS-$(CONFIG_H264PRED)                += x86/h264_intrapred_init.o
  OBJS-$(CONFIG_H264QPEL)                += x86/h264_qpel.o
 +OBJS-$(CONFIG_HEVC_DECODER)            += x86/hevcdsp_init.o
  OBJS-$(CONFIG_HPELDSP)                 += x86/hpeldsp_init.o
 +OBJS-$(CONFIG_LLVIDDSP)                += x86/lossless_videodsp_init.o
+ OBJS-$(CONFIG_HUFFYUVDSP)              += x86/huffyuvdsp_init.o
  OBJS-$(CONFIG_LPC)                     += x86/lpc.o
  OBJS-$(CONFIG_MPEGAUDIODSP)            += x86/mpegaudiodsp.o
  OBJS-$(CONFIG_MPEGVIDEO)               += x86/mpegvideo.o
@@@ -53,10 -45,11 +53,11 @@@ MMX-OBJS-$(CONFIG_DSPUTIL)             
                                            x86/idct_mmx_xvid.o           \
                                            x86/idct_sse2_xvid.o          \
                                            x86/simple_idct.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_HUFFYUVDSP)          += x86/huffyuvdsp_mmx.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             \
@@@ -89,11 -79,9 +90,12 @@@ YASM-OBJS-$(CONFIG_H264QPEL)           
                                            x86/h264_qpel_10bit.o         \
                                            x86/fpel.o                    \
                                            x86/qpel.o
 +YASM-OBJS-$(CONFIG_HEVC_DECODER)       += x86/hevc_mc.o                 \
 +                                          x86/hevc_deblock.o
  YASM-OBJS-$(CONFIG_HPELDSP)            += x86/fpel.o                    \
                                            x86/hpeldsp.o
+ YASM-OBJS-$(CONFIG_HUFFYUVDSP)         += x86/huffyuvdsp.o
 +YASM-OBJS-$(CONFIG_LLVIDDSP)           += x86/lossless_videodsp.o
  YASM-OBJS-$(CONFIG_MPEGAUDIODSP)       += x86/imdct36.o
  YASM-OBJS-$(CONFIG_VIDEODSP)           += x86/videodsp.o
  YASM-OBJS-$(CONFIG_VP3DSP)             += x86/vp3dsp.o
  %include "libavutil/x86/x86util.asm"
  
  SECTION_RODATA
- pb_f: times 16 db 15
- pb_zzzzzzzz77777777: times 8 db -1
- pb_7: times 8 db 7
- pb_zzzz3333zzzzbbbb: db -1,-1,-1,-1,3,3,3,3,-1,-1,-1,-1,11,11,11,11
- pb_zz11zz55zz99zzdd: db -1,-1,1,1,-1,-1,5,5,-1,-1,9,9,-1,-1,13,13
  pb_bswap32: db 3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13, 12
  
 +cextern pb_80
 +
  SECTION_TEXT
  
  %macro SCALARPRODUCT 0
@@@ -530,14 -518,28 +521,12 @@@ static av_cold void dsputil_init_mmx(DS
      c->add_pixels_clamped        = ff_add_pixels_clamped_mmx;
  
      if (!high_bit_depth) {
 -        c->clear_block  = ff_clear_block_mmx;
 -        c->clear_blocks = ff_clear_blocks_mmx;
          c->draw_edges   = ff_draw_edges_mmx;
 -
 -        switch (avctx->idct_algo) {
 -        case FF_IDCT_AUTO:
 -        case 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->idct_permutation_type = FF_SIMPLE_IDCT_PERM;
 -            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 CONFIG_VIDEODSP && (ARCH_X86_32 || !HAVE_YASM)
      c->gmc = ff_gmc_mmx;
-     c->add_bytes = ff_add_bytes_mmx;
 +#endif
  #endif /* HAVE_MMX_INLINE */
  
  #if HAVE_MMX_EXTERNAL
@@@ -653,31 -640,8 +634,26 @@@ av_cold void ff_dsputil_init_x86(DSPCon
  {
      int cpu_flags = av_get_cpu_flags();
  
- #if HAVE_7REGS && HAVE_INLINE_ASM
-     if (HAVE_MMX && cpu_flags & AV_CPU_FLAG_CMOV)
-         c->add_hfyu_median_prediction = ff_add_hfyu_median_prediction_cmov;
- #endif
 -    if (X86_MMX(cpu_flags))
 +    if (X86_MMX(cpu_flags)) {
 +#if HAVE_INLINE_ASM
 +        const int idct_algo = avctx->idct_algo;
 +
 +        if (avctx->lowres == 0 && !high_bit_depth) {
 +            if (idct_algo == FF_IDCT_AUTO || 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->idct_permutation_type = FF_SIMPLE_IDCT_PERM;
 +            } else if (idct_algo == 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;
 +            }
 +        }
 +#endif /* HAVE_INLINE_ASM */
 +
          dsputil_init_mmx(c, avctx, cpu_flags, high_bit_depth);
 +    }
  
      if (X86_MMXEXT(cpu_flags))
          dsputil_init_mmxext(c, avctx, cpu_flags, high_bit_depth);
@@@ -134,31 -166,61 +134,6 @@@ void ff_add_pixels_clamped_mmx(const in
      } while (--i);
  }
  
- void ff_add_bytes_mmx(uint8_t *dst, uint8_t *src, int w)
- {
-     x86_reg i = 0;
 -#define CLEAR_BLOCKS(name, n)                           \
 -void name(int16_t *blocks)                              \
 -{                                                       \
 -    __asm__ volatile (                                  \
 -        "pxor %%mm7, %%mm7              \n\t"           \
 -        "mov     %1,        %%"REG_a"   \n\t"           \
 -        "1:                             \n\t"           \
 -        "movq %%mm7,   (%0, %%"REG_a")  \n\t"           \
 -        "movq %%mm7,  8(%0, %%"REG_a")  \n\t"           \
 -        "movq %%mm7, 16(%0, %%"REG_a")  \n\t"           \
 -        "movq %%mm7, 24(%0, %%"REG_a")  \n\t"           \
 -        "add    $32, %%"REG_a"          \n\t"           \
 -        "js      1b                     \n\t"           \
 -        :: "r"(((uint8_t *) blocks) + 128 * n),         \
 -           "i"(-128 * n)                                \
 -        : "%"REG_a);                                    \
 -}
 -CLEAR_BLOCKS(ff_clear_blocks_mmx, 6)
 -CLEAR_BLOCKS(ff_clear_block_mmx, 1)
--
 -void ff_clear_block_sse(int16_t *block)
 -{
--    __asm__ volatile (
-         "jmp          2f                \n\t"
-         "1:                             \n\t"
-         "movq   (%1, %0), %%mm0         \n\t"
-         "movq   (%2, %0), %%mm1         \n\t"
-         "paddb     %%mm0, %%mm1         \n\t"
-         "movq      %%mm1, (%2, %0)      \n\t"
-         "movq  8(%1, %0), %%mm0         \n\t"
-         "movq  8(%2, %0), %%mm1         \n\t"
-         "paddb     %%mm0, %%mm1         \n\t"
-         "movq      %%mm1, 8(%2, %0)     \n\t"
-         "add         $16, %0            \n\t"
-         "2:                             \n\t"
-         "cmp          %3, %0            \n\t"
-         "js           1b                \n\t"
-         : "+r" (i)
-         : "r" (src), "r" (dst), "r" ((x86_reg) w - 15));
 -        "xorps  %%xmm0, %%xmm0          \n"
 -        "movaps %%xmm0,    (%0)         \n"
 -        "movaps %%xmm0,  16(%0)         \n"
 -        "movaps %%xmm0,  32(%0)         \n"
 -        "movaps %%xmm0,  48(%0)         \n"
 -        "movaps %%xmm0,  64(%0)         \n"
 -        "movaps %%xmm0,  80(%0)         \n"
 -        "movaps %%xmm0,  96(%0)         \n"
 -        "movaps %%xmm0, 112(%0)         \n"
 -        :: "r" (block)
 -        : "memory");
 -}
--
-     for (; i < w; i++)
-         dst[i + 0] += src[i + 0];
 -void ff_clear_blocks_sse(int16_t *blocks)
 -{
 -    __asm__ volatile (
 -        "xorps  %%xmm0, %%xmm0              \n"
 -        "mov        %1,         %%"REG_a"   \n"
 -        "1:                                 \n"
 -        "movaps %%xmm0,    (%0, %%"REG_a")  \n"
 -        "movaps %%xmm0,  16(%0, %%"REG_a")  \n"
 -        "movaps %%xmm0,  32(%0, %%"REG_a")  \n"
 -        "movaps %%xmm0,  48(%0, %%"REG_a")  \n"
 -        "movaps %%xmm0,  64(%0, %%"REG_a")  \n"
 -        "movaps %%xmm0,  80(%0, %%"REG_a")  \n"
 -        "movaps %%xmm0,  96(%0, %%"REG_a")  \n"
 -        "movaps %%xmm0, 112(%0, %%"REG_a")  \n"
 -        "add      $128,         %%"REG_a"   \n"
 -        "js         1b                      \n"
 -        :: "r"(((uint8_t *) blocks) + 128 * 6), "i"(-128 * 6)
 -        : "%"REG_a);
--}
  
  /* Draw the edges of width 'w' of an image of size width, height
   * this MMX version can only handle w == 8 || w == 16. */
Simple merge
index 0000000,436abc8..f183ebe
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,165 +1,165 @@@
 -;* This file is part of Libav.
+ ;******************************************************************************
+ ;* SIMD-optimized HuffYUV functions
+ ;* Copyright (c) 2008 Loren Merritt
+ ;*
 -;* 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 "libavutil/x86/x86util.asm"
+ SECTION_RODATA
+ pb_f: times 16 db 15
+ pb_zzzzzzzz77777777: times 8 db -1
+ pb_7: times 8 db 7
+ pb_zzzz3333zzzzbbbb: db -1,-1,-1,-1,3,3,3,3,-1,-1,-1,-1,11,11,11,11
+ pb_zz11zz55zz99zzdd: db -1,-1,1,1,-1,-1,5,5,-1,-1,9,9,-1,-1,13,13
+ SECTION_TEXT
+ ; void ff_add_hfyu_median_pred_mmxext(uint8_t *dst, const uint8_t *top,
+ ;                                     const uint8_t *diff, int w,
+ ;                                     int *left, int *left_top)
+ INIT_MMX mmxext
+ cglobal add_hfyu_median_pred, 6,6,0, dst, top, diff, w, left, left_top
+     movq    mm0, [topq]
+     movq    mm2, mm0
+     movd    mm4, [left_topq]
+     psllq   mm2, 8
+     movq    mm1, mm0
+     por     mm4, mm2
+     movd    mm3, [leftq]
+     psubb   mm0, mm4 ; t-tl
+     add    dstq, wq
+     add    topq, wq
+     add   diffq, wq
+     neg      wq
+     jmp .skip
+ .loop:
+     movq    mm4, [topq+wq]
+     movq    mm0, mm4
+     psllq   mm4, 8
+     por     mm4, mm1
+     movq    mm1, mm0 ; t
+     psubb   mm0, mm4 ; t-tl
+ .skip:
+     movq    mm2, [diffq+wq]
+ %assign i 0
+ %rep 8
+     movq    mm4, mm0
+     paddb   mm4, mm3 ; t-tl+l
+     movq    mm5, mm3
+     pmaxub  mm3, mm1
+     pminub  mm5, mm1
+     pminub  mm3, mm4
+     pmaxub  mm3, mm5 ; median
+     paddb   mm3, mm2 ; +residual
+ %if i==0
+     movq    mm7, mm3
+     psllq   mm7, 56
+ %else
+     movq    mm6, mm3
+     psrlq   mm7, 8
+     psllq   mm6, 56
+     por     mm7, mm6
+ %endif
+ %if i<7
+     psrlq   mm0, 8
+     psrlq   mm1, 8
+     psrlq   mm2, 8
+ %endif
+ %assign i i+1
+ %endrep
+     movq [dstq+wq], mm7
+     add      wq, 8
+     jl .loop
+     movzx   r2d, byte [dstq-1]
+     mov [leftq], r2d
+     movzx   r2d, byte [topq-1]
+     mov [left_topq], r2d
+     RET
+ %macro ADD_HFYU_LEFT_LOOP 2 ; %1 = dst_is_aligned, %2 = src_is_aligned
+     add     srcq, wq
+     add     dstq, wq
+     neg     wq
+ %%.loop:
+ %if %2
+     mova    m1, [srcq+wq]
+ %else
+     movu    m1, [srcq+wq]
+ %endif
+     mova    m2, m1
+     psllw   m1, 8
+     paddb   m1, m2
+     mova    m2, m1
+     pshufb  m1, m3
+     paddb   m1, m2
+     pshufb  m0, m5
+     mova    m2, m1
+     pshufb  m1, m4
+     paddb   m1, m2
+ %if mmsize == 16
+     mova    m2, m1
+     pshufb  m1, m6
+     paddb   m1, m2
+ %endif
+     paddb   m0, m1
+ %if %1
+     mova    [dstq+wq], m0
+ %else
+     movq    [dstq+wq], m0
+     movhps  [dstq+wq+8], m0
+ %endif
+     add     wq, mmsize
+     jl %%.loop
+     mov     eax, mmsize-1
+     sub     eax, wd
+     movd    m1, eax
+     pshufb  m0, m1
+     movd    eax, m0
+     RET
+ %endmacro
+ ; int ff_add_hfyu_left_pred(uint8_t *dst, const uint8_t *src, int w, int left)
+ INIT_MMX ssse3
+ cglobal add_hfyu_left_pred, 3,3,7, dst, src, w, left
+ .skip_prologue:
+     mova    m5, [pb_7]
+     mova    m4, [pb_zzzz3333zzzzbbbb]
+     mova    m3, [pb_zz11zz55zz99zzdd]
+     movd    m0, leftm
+     psllq   m0, 56
+     ADD_HFYU_LEFT_LOOP 1, 1
+ INIT_XMM sse4
+ cglobal add_hfyu_left_pred, 3,3,7, dst, src, w, left
+     mova    m5, [pb_f]
+     mova    m6, [pb_zzzzzzzz77777777]
+     mova    m4, [pb_zzzz3333zzzzbbbb]
+     mova    m3, [pb_zz11zz55zz99zzdd]
+     movd    m0, leftm
+     pslldq  m0, 15
+     test    srcq, 15
+     jnz .src_unaligned
+     test    dstq, 15
+     jnz .dst_unaligned
+     ADD_HFYU_LEFT_LOOP 1, 1
+ .dst_unaligned:
+     ADD_HFYU_LEFT_LOOP 0, 1
+ .src_unaligned:
+     ADD_HFYU_LEFT_LOOP 0, 0
index 0000000,6be3e5a..269126a
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,30 +1,30 @@@
 - * 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_X86_HUFFYUVDSP_H
+ #define AVCODEC_X86_HUFFYUVDSP_H
+ #include <stdint.h>
+ void ff_add_bytes_mmx(uint8_t *dst, uint8_t *src, int w);
+ void ff_add_hfyu_median_pred_cmov(uint8_t *dst, const uint8_t *top,
+                                   const uint8_t *diff, int w,
+                                   int *left, int *left_top);
+ #endif /* AVCODEC_X86_HUFFYUVDSP_H */
index 0000000,20c7cb1..5b8497a
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/asm.h"
+ #include "libavutil/x86/cpu.h"
+ #include "libavcodec/huffyuvdsp.h"
+ void ff_add_bytes_mmx(uint8_t *dst, uint8_t *src, int w);
+ void ff_add_hfyu_median_pred_cmov(uint8_t *dst, const uint8_t *top,
+                                   const uint8_t *diff, int w,
+                                   int *left, int *left_top);
+ void ff_add_hfyu_median_pred_mmxext(uint8_t *dst, const uint8_t *top,
+                                     const uint8_t *diff, int w,
+                                     int *left, int *left_top);
+ int  ff_add_hfyu_left_pred_ssse3(uint8_t *dst, const uint8_t *src,
+                                  int w, int left);
+ int  ff_add_hfyu_left_pred_sse4(uint8_t *dst, const uint8_t *src,
+                                 int w, int left);
+ av_cold void ff_huffyuvdsp_init_x86(HuffYUVDSPContext *c)
+ {
+     int cpu_flags = av_get_cpu_flags();
+ #if HAVE_7REGS && HAVE_INLINE_ASM
+     if (cpu_flags & AV_CPU_FLAG_CMOV)
+         c->add_hfyu_median_pred = ff_add_hfyu_median_pred_cmov;
+ #endif
+     if (INLINE_MMX(cpu_flags))
+         c->add_bytes = ff_add_bytes_mmx;
+     if (EXTERNAL_MMXEXT(cpu_flags)) {
+         /* slower than cmov version on AMD */
+         if (!(cpu_flags & AV_CPU_FLAG_3DNOW))
+             c->add_hfyu_median_pred = ff_add_hfyu_median_pred_mmxext;
+     }
+     if (EXTERNAL_SSSE3(cpu_flags)) {
+         c->add_hfyu_left_pred = ff_add_hfyu_left_pred_ssse3;
+         if (cpu_flags & AV_CPU_FLAG_SSE4) // not really SSE4, just slow on Conroe
+             c->add_hfyu_left_pred = ff_add_hfyu_left_pred_sse4;
+     }
+ }
Simple merge