Merge commit 'c67b449bebbe0b35c73b203683e77a0a649bc765'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 23 Jun 2014 11:23:41 +0000 (13:23 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 23 Jun 2014 11:31:26 +0000 (13:31 +0200)
* commit 'c67b449bebbe0b35c73b203683e77a0a649bc765':
  dsputil: Split bswap*_buf() off into a separate context

Conflicts:
configure
libavcodec/4xm.c
libavcodec/ac3dec.c
libavcodec/ac3dec.h
libavcodec/apedec.c
libavcodec/eamad.c
libavcodec/flacenc.c
libavcodec/fraps.c
libavcodec/huffyuv.c
libavcodec/huffyuvdec.c
libavcodec/motionpixels.c
libavcodec/truemotion2.c
libavcodec/x86/Makefile
libavcodec/x86/dsputil_init.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
42 files changed:
1  2 
configure
libavcodec/4xm.c
libavcodec/Makefile
libavcodec/ac3dec.c
libavcodec/ac3dec.h
libavcodec/alsdec.c
libavcodec/apedec.c
libavcodec/asv.c
libavcodec/asv.h
libavcodec/asvdec.c
libavcodec/asvenc.c
libavcodec/bswapdsp.c
libavcodec/bswapdsp.h
libavcodec/cllc.c
libavcodec/dsputil.c
libavcodec/dsputil.h
libavcodec/eamad.c
libavcodec/eatqi.c
libavcodec/flacenc.c
libavcodec/fraps.c
libavcodec/hevc.c
libavcodec/hevc.h
libavcodec/huffyuv.c
libavcodec/huffyuv.h
libavcodec/huffyuvdec.c
libavcodec/huffyuvenc.c
libavcodec/imc.c
libavcodec/mdec.c
libavcodec/mimic.c
libavcodec/motionpixels.c
libavcodec/mpc.h
libavcodec/mpc7.c
libavcodec/rawdec.c
libavcodec/truemotion2.c
libavcodec/truespeech.c
libavcodec/utvideo.h
libavcodec/utvideodec.c
libavcodec/utvideoenc.c
libavcodec/x86/Makefile
libavcodec/x86/bswapdsp.asm
libavcodec/x86/bswapdsp_init.c
libavcodec/x86/dsputil_init.c

diff --cc configure
+++ b/configure
@@@ -1797,10 -1531,9 +1797,11 @@@ CONFIG_EXTRA=
      audio_frame_queue
      audiodsp
      blockdsp
+     bswapdsp
      cabac
      dsputil
 +    exif
 +    frame_thread_encoder
      gcrypt
      golomb
      gplv3
@@@ -2006,22 -1717,20 +2007,23 @@@ mpegvideoenc_select="dsputil mpegvideo 
  aac_decoder_select="mdct sinewin"
  aac_encoder_select="audio_frame_queue mdct sinewin"
  aac_latm_decoder_select="aac_decoder aac_latm_parser"
- ac3_decoder_select="mdct ac3dsp ac3_parser dsputil"
- ac3_fixed_decoder_select="mdct ac3dsp ac3_parser dsputil"
+ ac3_decoder_select="ac3_parser ac3dsp bswapdsp mdct"
++ac3_fixed_decoder_select="ac3_parser ac3dsp bswapdsp mdct"
  ac3_encoder_select="ac3dsp audiodsp dsputil mdct"
  ac3_fixed_encoder_select="ac3dsp audiodsp dsputil mdct"
  aic_decoder_select="dsputil golomb"
  alac_encoder_select="lpc"
- als_decoder_select="dsputil"
+ als_decoder_select="bswapdsp"
  amrnb_decoder_select="lsp"
  amrwb_decoder_select="lsp"
 -amv_decoder_select="sp5x_decoder"
 +amv_decoder_select="sp5x_decoder exif"
 +amv_encoder_select="aandcttables"
- ape_decoder_select="dsputil llauddsp"
- asv1_decoder_select="blockdsp dsputil"
- asv1_encoder_select="dsputil"
- asv2_decoder_select="blockdsp dsputil"
- asv2_encoder_select="dsputil"
++ape_decoder_select="bswapdsp llauddsp"
+ ape_decoder_select="bswapdsp"
+ asv1_decoder_select="blockdsp bswapdsp dsputil"
+ asv1_encoder_select="bswapdsp dsputil"
+ asv2_decoder_select="blockdsp bswapdsp dsputil"
+ asv2_encoder_select="bswapdsp dsputil"
  atrac1_decoder_select="mdct sinewin"
  atrac3_decoder_select="mdct"
  atrac3p_decoder_select="mdct sinewin"
@@@ -2041,30 -1748,29 +2043,30 @@@ dnxhd_decoder_select="blockdsp dsputil
  dnxhd_encoder_select="aandcttables blockdsp dsputil mpegvideoenc"
  dvvideo_decoder_select="dsputil"
  dvvideo_encoder_select="dsputil"
 -dxa_decoder_deps="zlib"
 +dxa_decoder_select="zlib"
  eac3_decoder_select="ac3_decoder"
  eac3_encoder_select="ac3_encoder"
- eamad_decoder_select="aandcttables blockdsp dsputil mpegvideo"
+ eamad_decoder_select="aandcttables blockdsp bswapdsp dsputil mpegvideo"
 -eatgq_decoder_select="aandcttables dsputil"
 +eatgq_decoder_select="aandcttables"
- eatqi_decoder_select="aandcttables blockdsp dsputil mpeg1video_decoder"
+ eatqi_decoder_select="aandcttables blockdsp bswapdsp dsputil mpeg1video_decoder"
 -exr_decoder_deps="zlib"
 +exr_decoder_select="zlib"
  ffv1_decoder_select="golomb rangecoder"
  ffv1_encoder_select="rangecoder"
  ffvhuff_decoder_select="huffyuv_decoder"
  ffvhuff_encoder_select="huffyuv_encoder"
  fic_decoder_select="golomb"
  flac_decoder_select="golomb"
- flac_encoder_select="dsputil golomb lpc"
+ flac_encoder_select="bswapdsp golomb lpc"
 -flashsv_decoder_deps="zlib"
 -flashsv_encoder_deps="zlib"
 -flashsv2_decoder_deps="zlib"
 +flashsv_decoder_select="zlib"
 +flashsv_encoder_select="zlib"
 +flashsv2_encoder_select="zlib"
 +flashsv2_decoder_select="zlib"
  flv_decoder_select="h263_decoder"
  flv_encoder_select="h263_encoder"
- fourxm_decoder_select="blockdsp dsputil"
- fraps_decoder_select="dsputil huffman"
+ fourxm_decoder_select="blockdsp bswapdsp"
+ fraps_decoder_select="bswapdsp huffman"
 -g2m_decoder_deps="zlib"
 -g2m_decoder_select="blockdsp dsputil"
 +g2m_decoder_select="blockdsp dsputil zlib"
 +g729_decoder_select="dsputil"
  h261_decoder_select="mpeg_er mpegvideo"
  h261_encoder_select="aandcttables mpegvideoenc"
  h263_decoder_select="error_resilience h263_parser h263dsp mpeg_er mpegvideo qpeldsp"
@@@ -2073,11 -1779,11 +2075,11 @@@ h263i_decoder_select="h263_decoder
  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 huffyuvdsp llviddsp"
- huffyuv_encoder_select="dsputil huffman huffyuvencdsp llviddsp"
+ hevc_decoder_select="bswapdsp cabac golomb videodsp"
 -huffyuv_decoder_select="bswapdsp huffyuvdsp"
 -huffyuv_encoder_select="bswapdsp huffman huffyuvencdsp"
++huffyuv_decoder_select="bswapdsp huffyuvdsp llviddsp"
++huffyuv_encoder_select="bswapdsp huffman huffyuvencdsp llviddsp"
  iac_decoder_select="imc_decoder"
- imc_decoder_select="dsputil fft mdct sinewin"
+ imc_decoder_select="bswapdsp fft mdct sinewin"
  indeo3_decoder_select="hpeldsp"
  interplay_video_decoder_select="hpeldsp"
  jpegls_decoder_select="golomb mjpeg_decoder"
@@@ -2088,8 -1794,8 +2090,8 @@@ ljpeg_encoder_select="aandcttables mpeg
  loco_decoder_select="golomb"
  mdec_decoder_select="blockdsp dsputil mpegvideo"
  metasound_decoder_select="lsp mdct sinewin"
- mimic_decoder_select="blockdsp dsputil hpeldsp"
+ mimic_decoder_select="blockdsp bswapdsp dsputil hpeldsp"
 -mjpeg_decoder_select="blockdsp dsputil hpeldsp"
 +mjpeg_decoder_select="blockdsp dsputil hpeldsp exif"
  mjpeg_encoder_select="aandcttables mpegvideoenc"
  mjpegb_decoder_select="mjpeg_decoder"
  mlp_decoder_select="mlp_parser"
@@@ -2159,13 -1859,13 +2161,13 @@@ theora_decoder_select="vp3_decoder
  thp_decoder_select="mjpeg_decoder"
  tiff_decoder_suggest="zlib"
  tiff_encoder_suggest="zlib"
 -truehd_decoder_select="mlp_decoder"
 +truehd_decoder_select="mlp_parser"
- truemotion2_decoder_select="dsputil"
- truespeech_decoder_select="dsputil"
+ truemotion2_decoder_select="bswapdsp"
+ truespeech_decoder_select="bswapdsp"
 -tscc_decoder_deps="zlib"
 +tscc_decoder_select="zlib"
  twinvq_decoder_select="mdct lsp sinewin"
- utvideo_decoder_select="dsputil"
- utvideo_encoder_select="dsputil huffman huffyuvencdsp"
+ utvideo_decoder_select="bswapdsp"
+ utvideo_encoder_select="bswapdsp huffman huffyuvencdsp"
  vble_decoder_select="huffyuvdsp"
  vc1_decoder_select="blockdsp error_resilience h263_decoder h264chroma h264qpel intrax8 mpeg_er qpeldsp"
  vc1image_decoder_select="vc1_decoder"
@@@ -456,12 -438,14 +456,12 @@@ static int decode_p_frame(FourXContext 
          return AVERROR_INVALIDDATA;
      }
  
 -    av_fast_malloc(&f->bitstream_buffer, &f->bitstream_buffer_size,
 -                   bitstream_size + FF_INPUT_BUFFER_PADDING_SIZE);
 +    av_fast_padded_malloc(&f->bitstream_buffer, &f->bitstream_buffer_size,
 +                          bitstream_size);
      if (!f->bitstream_buffer)
          return AVERROR(ENOMEM);
-     f->dsp.bswap_buf(f->bitstream_buffer, (const uint32_t*)(buf + extra),
-                      bitstream_size / 4);
+     f->bbdsp.bswap_buf(f->bitstream_buffer, (const uint32_t *) (buf + extra),
+                        bitstream_size / 4);
 -    memset((uint8_t*)f->bitstream_buffer + bitstream_size,
 -           0, FF_INPUT_BUFFER_PADDING_SIZE);
      init_get_bits(&f->gb, f->bitstream_buffer, 8 * bitstream_size);
  
      wordstream_offset = extra + bitstream_size;
@@@ -795,12 -761,14 +795,12 @@@ static int decode_i_frame(FourXContext 
  
      prestream_size = length + buf - prestream;
  
 -    av_fast_malloc(&f->bitstream_buffer, &f->bitstream_buffer_size,
 -                   prestream_size + FF_INPUT_BUFFER_PADDING_SIZE);
 +    av_fast_padded_malloc(&f->bitstream_buffer, &f->bitstream_buffer_size,
 +                          prestream_size);
      if (!f->bitstream_buffer)
          return AVERROR(ENOMEM);
-     f->dsp.bswap_buf(f->bitstream_buffer, (const uint32_t*)prestream,
-                      prestream_size / 4);
+     f->bbdsp.bswap_buf(f->bitstream_buffer, (const uint32_t *) prestream,
+                        prestream_size / 4);
 -    memset((uint8_t*)f->bitstream_buffer + prestream_size,
 -           0, FF_INPUT_BUFFER_PADDING_SIZE);
      init_get_bits(&f->pre_gb, f->bitstream_buffer, 8 * prestream_size);
  
      f->last_dc = 0 * 128 * 8 * 8;
@@@ -35,8 -30,8 +35,9 @@@ OBJS-$(CONFIG_AC3DSP)                  
  OBJS-$(CONFIG_AUDIO_FRAME_QUEUE)       += audio_frame_queue.o
  OBJS-$(CONFIG_AUDIODSP)                += audiodsp.o
  OBJS-$(CONFIG_BLOCKDSP)                += blockdsp.o
+ OBJS-$(CONFIG_BSWAPDSP)                += bswapdsp.o
  OBJS-$(CONFIG_CABAC)                   += cabac.o
 +OBJS-$(CONFIG_CRYSTALHD)               += crystalhd.o
  OBJS-$(CONFIG_DCT)                     += dct.o dct32_fixed.o dct32_float.o
  OBJS-$(CONFIG_DXVA2)                   += dxva2.o
  OBJS-$(CONFIG_DSPUTIL)                 += dsputil.o faanidct.o          \
@@@ -179,15 -180,9 +180,15 @@@ static av_cold int ac3_decode_init(AVCo
      ac3_tables_init();
      ff_mdct_init(&s->imdct_256, 8, 1, 1.0);
      ff_mdct_init(&s->imdct_512, 9, 1, 1.0);
 -    ff_kbd_window_init(s->window, 5.0, 256);
 +    AC3_RENAME(ff_kbd_window_init)(s->window, 5.0, 256);
-     ff_dsputil_init(&s->dsp, avctx);
+     ff_bswapdsp_init(&s->bdsp);
 +
 +#if (USE_FIXED)
 +    s->fdsp = avpriv_alloc_fixed_dsp(avctx->flags & CODEC_FLAG_BITEXACT);
 +#else
      avpriv_float_dsp_init(&s->fdsp, avctx->flags & CODEC_FLAG_BITEXACT);
 +#endif
 +
      ff_ac3dsp_init(&s->ac3dsp, avctx->flags & CODEC_FLAG_BITEXACT);
      ff_fmt_convert_init(&s->fmt_conv, avctx);
      av_lfg_init(&s->dith_state, 0);
@@@ -207,12 -200,8 +207,12 @@@ typedef struct AC3DecodeContext 
  ///@}
  
  ///@name Optimization
-     DSPContext dsp;                         ///< for optimization
+     BswapDSPContext bdsp;
 +#if USE_FIXED
 +    AVFixedDSPContext *fdsp;
 +#else
      AVFloatDSPContext fdsp;
 +#endif
      AC3DSPContext ac3dsp;
      FmtConvertContext fmt_conv;             ///< optimized conversion functions
  ///@}
Simple merge
@@@ -25,9 -25,9 +25,9 @@@
  #include "libavutil/avassert.h"
  #include "libavutil/channel_layout.h"
  #include "libavutil/opt.h"
 -#include "apedsp.h"
 +#include "lossless_audiodsp.h"
  #include "avcodec.h"
- #include "dsputil.h"
+ #include "bswapdsp.h"
  #include "bytestream.h"
  #include "internal.h"
  #include "get_bits.h"
@@@ -136,8 -136,8 +136,8 @@@ typedef struct APEPredictor 
  typedef struct APEContext {
      AVClass *class;                          ///< class for AVOptions
      AVCodecContext *avctx;
-     DSPContext dsp;
+     BswapDSPContext bdsp;
 -    APEDSPContext adsp;
 +    LLAudDSPContext adsp;
      int channels;
      int samples;                             ///< samples left to decode in current frame
      int bps;
@@@ -293,8 -305,16 +293,8 @@@ static av_cold int ape_decode_init(AVCo
          s->predictor_decode_stereo = predictor_decode_stereo_3950;
      }
  
-     ff_dsputil_init(&s->dsp, avctx);
 -    s->adsp.scalarproduct_and_madd_int16 = scalarproduct_and_madd_int16_c;
 -
 -    if (ARCH_ARM)
 -        ff_apedsp_init_arm(&s->adsp);
 -    if (ARCH_PPC)
 -        ff_apedsp_init_ppc(&s->adsp);
 -    if (ARCH_X86)
 -        ff_apedsp_init_x86(&s->adsp);
 -
+     ff_bswapdsp_init(&s->bdsp);
 +    ff_llauddsp_init(&s->adsp);
      avctx->channel_layout = (avctx->channels==2) ? AV_CH_LAYOUT_STEREO : AV_CH_LAYOUT_MONO;
  
      return 0;
@@@ -1440,10 -1449,11 +1440,11 @@@ static int ape_decode_frame(AVCodecCont
          }
          if (s->fileversion < 3950) // previous versions overread two bytes
              buf_size += 2;
 -        av_fast_malloc(&s->data, &s->data_size, buf_size);
 +        av_fast_padded_malloc(&s->data, &s->data_size, buf_size);
          if (!s->data)
              return AVERROR(ENOMEM);
-         s->dsp.bswap_buf((uint32_t*)s->data, (const uint32_t*)buf, buf_size >> 2);
+         s->bdsp.bswap_buf((uint32_t *) s->data, (const uint32_t *) buf,
+                           buf_size >> 2);
          memset(s->data + (buf_size & ~3), 0, buf_size & 3);
          s->ptr = s->data;
          s->data_end = s->data + buf_size;
Simple merge
Simple merge
Simple merge
Simple merge
index 0000000,6700cfd..a6e1ec0
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,56 +1,56 @@@
 - * 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 "libavutil/attributes.h"
+ #include "libavutil/bswap.h"
+ #include "bswapdsp.h"
+ static void bswap_buf(uint32_t *dst, const uint32_t *src, int w)
+ {
+     int i;
+     for (i = 0; i + 8 <= w; i += 8) {
+         dst[i + 0] = av_bswap32(src[i + 0]);
+         dst[i + 1] = av_bswap32(src[i + 1]);
+         dst[i + 2] = av_bswap32(src[i + 2]);
+         dst[i + 3] = av_bswap32(src[i + 3]);
+         dst[i + 4] = av_bswap32(src[i + 4]);
+         dst[i + 5] = av_bswap32(src[i + 5]);
+         dst[i + 6] = av_bswap32(src[i + 6]);
+         dst[i + 7] = av_bswap32(src[i + 7]);
+     }
+     for (; i < w; i++)
+         dst[i + 0] = av_bswap32(src[i + 0]);
+ }
+ static void bswap16_buf(uint16_t *dst, const uint16_t *src, int len)
+ {
+     while (len--)
+         *dst++ = av_bswap16(*src++);
+ }
+ av_cold void ff_bswapdsp_init(BswapDSPContext *c)
+ {
+     c->bswap_buf   = bswap_buf;
+     c->bswap16_buf = bswap16_buf;
+     if (ARCH_X86)
+         ff_bswapdsp_init_x86(c);
+ }
index 0000000,fd10a88..f167d77
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,32 +1,32 @@@
 - * 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_BSWAP_BUF_H
+ #define AVCODEC_BSWAP_BUF_H
+ #include <stdint.h>
+ typedef struct BswapDSPContext {
+     void (*bswap_buf)(uint32_t *dst, const uint32_t *src, int w);
+     void (*bswap16_buf)(uint16_t *dst, const uint16_t *src, int len);
+ } BswapDSPContext;
+ void ff_bswapdsp_init(BswapDSPContext *c);
+ void ff_bswapdsp_init_x86(BswapDSPContext *c);
+ #endif /* AVCODEC_BSWAP_BUF_H */
Simple merge
@@@ -1570,13 -1390,7 +1546,10 @@@ av_cold void ff_dsputil_init(DSPContex
      c->vsse[5] = vsse_intra8_c;
      c->nsse[0] = nsse16_c;
      c->nsse[1] = nsse8_c;
 +#if CONFIG_SNOW_DECODER || CONFIG_SNOW_ENCODER
 +    ff_dsputil_init_dwt(c);
 +#endif
  
-     c->bswap_buf   = bswap_buf;
-     c->bswap16_buf = bswap16_buf;
      c->try_8x8basis = try_8x8basis_c;
      c->add_8x8basis = add_8x8basis_c;
  
Simple merge
@@@ -297,8 -287,8 +300,9 @@@ static int decode_frame(AVCodecContext 
                            buf_end - buf);
      if (!s->bitstream_buf)
          return AVERROR(ENOMEM);
-     s->dsp.bswap16_buf(s->bitstream_buf, (const uint16_t*)buf, (buf_end-buf)/2);
+     s->bbdsp.bswap16_buf(s->bitstream_buf, (const uint16_t *) buf,
+                          (buf_end - buf) / 2);
 +    memset((uint8_t*)s->bitstream_buf + (buf_end-buf), 0, FF_INPUT_BUFFER_PADDING_SIZE);
      init_get_bits(&s->gb, s->bitstream_buf, 8*(buf_end-buf));
  
      for (s->mb_y=0; s->mb_y < (avctx->height+15)/16; s->mb_y++)
Simple merge
@@@ -25,8 -24,8 +25,8 @@@
  #include "libavutil/md5.h"
  #include "libavutil/opt.h"
  #include "avcodec.h"
- #include "dsputil.h"
+ #include "bswapdsp.h"
 -#include "get_bits.h"
 +#include "put_bits.h"
  #include "golomb.h"
  #include "internal.h"
  #include "lpc.h"
  #include "get_bits.h"
  #include "huffman.h"
  #include "bytestream.h"
- #include "dsputil.h"
+ #include "bswapdsp.h"
  #include "internal.h"
 +#include "thread.h"
  
  #define FPS_TAG MKTAG('F', 'P', 'S', 'x')
 +#define VLC_BITS 11
  
  /**
   * local variable storage
   */
  typedef struct FrapsContext {
      AVCodecContext *avctx;
 -    AVFrame *frame;
+     BswapDSPContext bdsp;
      uint8_t *tmpbuf;
      int tmpbuf_size;
-     DSPContext dsp;
  } FrapsContext;
  
  
@@@ -65,7 -64,13 +65,7 @@@ static av_cold int decode_init(AVCodecC
      s->avctx  = avctx;
      s->tmpbuf = NULL;
  
-     ff_dsputil_init(&s->dsp, avctx);
 -    s->frame = av_frame_alloc();
 -    if (!s->frame)
 -        return AVERROR(ENOMEM);
 -
+     ff_bswapdsp_init(&s->bdsp);
  
      return 0;
  }
@@@ -3005,10 -3044,9 +3005,10 @@@ static av_cold int hevc_init_context(AV
      if (!s->md5_ctx)
          goto fail;
  
-     ff_dsputil_init(&s->dsp, avctx);
+     ff_bswapdsp_init(&s->bdsp);
  
      s->context_initialized = 1;
 +    s->eos = 0;
  
      return 0;
  
  #include "libavutil/md5.h"
  
  #include "avcodec.h"
+ #include "bswapdsp.h"
  #include "cabac.h"
- #include "dsputil.h"
  #include "get_bits.h"
 +#include "hevcpred.h"
  #include "hevcdsp.h"
  #include "internal.h"
  #include "thread.h"
  #include "libavutil/mem.h"
  
  #include "avcodec.h"
- #include "dsputil.h"
+ #include "bswapdsp.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;
@@@ -75,8 -80,7 +75,8 @@@ av_cold void ff_huffyuv_common_init(AVC
      s->avctx = avctx;
      s->flags = avctx->flags;
  
-     ff_dsputil_init(&s->dsp, avctx);
+     ff_bswapdsp_init(&s->bdsp);
 +    ff_llviddsp_init(&s->llviddsp, avctx);
  
      s->width = avctx->width;
      s->height = avctx->height;
@@@ -76,18 -75,16 +76,18 @@@ typedef struct HYuvContext 
      int picture_number;
      int last_slice_end;
      uint8_t *temp[3];
 -    uint64_t stats[3][256];
 -    uint8_t len[3][256];
 -    uint32_t bits[3][256];
 +    uint16_t *temp16[3];                    ///< identical to temp but 16bit type
 +    uint64_t stats[4][MAX_VLC_N];
 +    uint8_t len[4][MAX_VLC_N];
 +    uint32_t bits[4][MAX_VLC_N];
      uint32_t pix_bgr_map[1<<VLC_BITS];
 -    VLC vlc[6];                             //Y,U,V,YY,YU,YV
 +    VLC vlc[8];                             //Y,U,V,A,YY,YU,YV,AA
      uint8_t *bitstream_buffer;
      unsigned int bitstream_buffer_size;
-     DSPContext dsp;
+     BswapDSPContext bdsp;
      HuffYUVDSPContext hdsp;
      HuffYUVEncDSPContext hencdsp;
 +    LLVidDSPContext llviddsp;
  } HYuvContext;
  
  void ff_huffyuv_common_init(AVCodecContext *s);
@@@ -867,11 -492,14 +867,11 @@@ static int decode_frame(AVCodecContext 
      if (!s->bitstream_buffer)
          return AVERROR(ENOMEM);
  
-     s->dsp.bswap_buf((uint32_t*)s->bitstream_buffer,
-                      (const uint32_t*)buf, buf_size / 4);
 -    memset(s->bitstream_buffer + buf_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
+     s->bdsp.bswap_buf((uint32_t *) s->bitstream_buffer,
+                       (const uint32_t *) buf, buf_size / 4);
  
 -    if (ff_thread_get_buffer(avctx, &frame, 0) < 0) {
 -        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
 -        return -1;
 -    }
 +    if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
 +        return ret;
  
      if (s->context) {
          table_size = read_huffman_tables(s, s->bitstream_buffer, buf_size);
Simple merge
  #include "libavutil/channel_layout.h"
  #include "libavutil/float_dsp.h"
  #include "libavutil/internal.h"
 +#include "libavutil/libm.h"
  #include "avcodec.h"
+ #include "bswapdsp.h"
  #include "get_bits.h"
- #include "dsputil.h"
  #include "fft.h"
  #include "internal.h"
  #include "sinewin.h"
@@@ -29,6 -29,6 +29,7 @@@
  
  #include "avcodec.h"
  #include "blockdsp.h"
++#include "bswapdsp.h"
  #include "mpegvideo.h"
  #include "mpeg12.h"
  #include "thread.h"
@@@ -36,6 -36,6 +37,7 @@@
  typedef struct MDECContext {
      AVCodecContext *avctx;
      BlockDSPContext bdsp;
++    BswapDSPContext bbdsp;
      DSPContext dsp;
      ThreadFrame frame;
      GetBitContext gb;
@@@ -172,12 -173,15 +174,12 @@@ static int decode_frame(AVCodecContext 
      frame.f->pict_type = AV_PICTURE_TYPE_I;
      frame.f->key_frame = 1;
  
 -    av_fast_malloc(&a->bitstream_buffer, &a->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
 +    av_fast_padded_malloc(&a->bitstream_buffer, &a->bitstream_buffer_size, buf_size);
      if (!a->bitstream_buffer)
          return AVERROR(ENOMEM);
-     a->dsp.bswap16_buf((uint16_t *)a->bitstream_buffer, (uint16_t *)buf, (buf_size + 1) / 2);
 -    for (i = 0; i < buf_size; i += 2) {
 -        a->bitstream_buffer[i]     = buf[i + 1];
 -        a->bitstream_buffer[i + 1] = buf[i];
 -    }
 -    init_get_bits(&a->gb, a->bitstream_buffer, buf_size * 8);
++    a->bbdsp.bswap16_buf((uint16_t *)a->bitstream_buffer, (uint16_t *)buf, (buf_size + 1) / 2);
 +    if ((ret = init_get_bits8(&a->gb, a->bitstream_buffer, buf_size)) < 0)
 +        return ret;
  
      /* skip over 4 preamble bytes in stream (typically 0xXX 0xXX 0x00 0x38) */
      skip_bits(&a->gb, 32);
@@@ -211,6 -215,6 +213,7 @@@ static av_cold int decode_init(AVCodecC
      a->avctx           = avctx;
  
      ff_blockdsp_init(&a->bdsp, avctx);
++    ff_bswapdsp_init(&a->bbdsp);
      ff_dsputil_init(&a->dsp, avctx);
      ff_mpeg12_init_vlcs();
      ff_init_scantable(a->dsp.idct_permutation, &a->scantable, ff_zigzag_direct);
Simple merge
@@@ -69,24 -69,13 +69,24 @@@ static av_cold int mp_decode_init(AVCod
      int w4 = (avctx->width  + 3) & ~3;
      int h4 = (avctx->height + 3) & ~3;
  
 +    if(avctx->extradata_size < 2){
 +        av_log(avctx, AV_LOG_ERROR, "extradata too small\n");
 +        return AVERROR_INVALIDDATA;
 +    }
 +
      motionpixels_tableinit();
      mp->avctx = avctx;
-     ff_dsputil_init(&mp->dsp, avctx);
+     ff_bswapdsp_init(&mp->bdsp);
 -    mp->changes_map = av_mallocz(avctx->width * h4);
 +    mp->changes_map = av_mallocz_array(avctx->width, h4);
      mp->offset_bits_len = av_log2(avctx->width * avctx->height) + 1;
 -    mp->vpt = av_mallocz(avctx->height * sizeof(YuvPixel));
 -    mp->hpt = av_mallocz(h4 * w4 / 16 * sizeof(YuvPixel));
 +    mp->vpt = av_mallocz_array(avctx->height, sizeof(YuvPixel));
 +    mp->hpt = av_mallocz_array(h4 / 4, w4 / 4 * sizeof(YuvPixel));
 +    if (!mp->changes_map || !mp->vpt || !mp->hpt) {
 +        av_freep(&mp->changes_map);
 +        av_freep(&mp->vpt);
 +        av_freep(&mp->hpt);
 +        return AVERROR(ENOMEM);
 +    }
      avctx->pix_fmt = AV_PIX_FMT_RGB555;
  
      mp->frame = av_frame_alloc();
@@@ -290,16 -268,20 +290,17 @@@ static int mp_decode_frame(AVCodecConte
      GetBitContext gb;
      int i, count1, count2, sz, ret;
  
 -    if ((ret = ff_reget_buffer(avctx, mp->frame)) < 0) {
 -        av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
 +    if ((ret = ff_reget_buffer(avctx, mp->frame)) < 0)
          return ret;
 -    }
  
      /* le32 bitstream msb first */
 -    av_fast_malloc(&mp->bswapbuf, &mp->bswapbuf_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
 +    av_fast_padded_malloc(&mp->bswapbuf, &mp->bswapbuf_size, buf_size);
      if (!mp->bswapbuf)
          return AVERROR(ENOMEM);
-     mp->dsp.bswap_buf((uint32_t *)mp->bswapbuf, (const uint32_t *)buf, buf_size / 4);
+     mp->bdsp.bswap_buf((uint32_t *) mp->bswapbuf, (const uint32_t *) buf,
+                        buf_size / 4);
      if (buf_size & 3)
          memcpy(mp->bswapbuf + (buf_size & ~3), buf + (buf_size & ~3), buf_size & 3);
 -    memset(mp->bswapbuf + buf_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
      init_get_bits(&gb, mp->bswapbuf, buf_size * 8);
  
      memset(mp->changes_map, 0, avctx->width * avctx->height);
Simple merge
Simple merge
   */
  
  #include "avcodec.h"
- #include "dsputil.h"
++#include "bswapdsp.h"
 +#include "get_bits.h"
  #include "internal.h"
  #include "raw.h"
 +#include "libavutil/avassert.h"
  #include "libavutil/buffer.h"
  #include "libavutil/common.h"
  #include "libavutil/intreadwrite.h"
@@@ -43,50 -38,59 +43,50 @@@ typedef struct RawVideoContext 
      int flip;
      int is_2_4_bpp; // 2 or 4 bpp raw in avi/mov
      int is_yuv2;
-     DSPContext dsp;
 +    int is_lt_16bpp; // 16bpp pixfmt and bits_per_coded_sample < 16
 +    int tff;
 +
++    BswapDSPContext bbdsp;
 +    void *bitstream_buf;
 +    unsigned int bitstream_buf_size;
  } RawVideoContext;
  
 -static const PixelFormatTag pix_fmt_bps_avi[] = {
 -    { AV_PIX_FMT_PAL8,    4 },
 -    { AV_PIX_FMT_PAL8,    8 },
 -    { AV_PIX_FMT_RGB444, 12 },
 -    { AV_PIX_FMT_RGB555, 15 },
 -    { AV_PIX_FMT_RGB555, 16 },
 -    { AV_PIX_FMT_BGR24,  24 },
 -    { AV_PIX_FMT_RGB32,  32 },
 -    { AV_PIX_FMT_NONE,    0 },
 +static const AVOption options[]={
 +{"top", "top field first", offsetof(RawVideoContext, tff), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 1, AV_OPT_FLAG_DECODING_PARAM|AV_OPT_FLAG_VIDEO_PARAM},
 +{NULL}
  };
  
 -static const PixelFormatTag pix_fmt_bps_mov[] = {
 -    { AV_PIX_FMT_MONOWHITE, 1 },
 -    { AV_PIX_FMT_PAL8,      2 },
 -    { AV_PIX_FMT_PAL8,      4 },
 -    { AV_PIX_FMT_PAL8,      8 },
 -    // FIXME swscale does not support 16 bit in .mov, sample 16bit.mov
 -    // http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html
 -    { AV_PIX_FMT_RGB555BE, 16 },
 -    { AV_PIX_FMT_RGB24,    24 },
 -    { AV_PIX_FMT_ARGB,     32 },
 -    { AV_PIX_FMT_MONOWHITE,33 },
 -    { AV_PIX_FMT_NONE,      0 },
 +static const AVClass rawdec_class = {
 +    .class_name = "rawdec",
 +    .option     = options,
 +    .version    = LIBAVUTIL_VERSION_INT,
  };
  
 -static enum AVPixelFormat find_pix_fmt(const PixelFormatTag *tags,
 -                                       unsigned int fourcc)
 +#if LIBAVCODEC_VERSION_MAJOR < 55
 +enum AVPixelFormat ff_find_pix_fmt(const PixelFormatTag *tags, unsigned int fourcc)
  {
 -    while (tags->pix_fmt >= 0) {
 -        if (tags->fourcc == fourcc)
 -            return tags->pix_fmt;
 -        tags++;
 -    }
 -    return AV_PIX_FMT_YUV420P;
 +    return avpriv_find_pix_fmt(tags, fourcc);
  }
 +#endif
  
  static av_cold int raw_init_decoder(AVCodecContext *avctx)
  {
      RawVideoContext *context = avctx->priv_data;
      const AVPixFmtDescriptor *desc;
  
-     ff_dsputil_init(&context->dsp, avctx);
 -    if (avctx->codec_tag == MKTAG('r', 'a', 'w', ' '))
 -        avctx->pix_fmt = find_pix_fmt(pix_fmt_bps_mov,
++    ff_bswapdsp_init(&context->bbdsp);
 +
 +    if (   avctx->codec_tag == MKTAG('r','a','w',' ')
 +        || avctx->codec_tag == MKTAG('N','O','1','6'))
 +        avctx->pix_fmt = avpriv_find_pix_fmt(avpriv_pix_fmt_bps_mov,
                                        avctx->bits_per_coded_sample);
      else if (avctx->codec_tag == MKTAG('W', 'R', 'A', 'W'))
 -        avctx->pix_fmt = find_pix_fmt(pix_fmt_bps_avi,
 +        avctx->pix_fmt = avpriv_find_pix_fmt(avpriv_pix_fmt_bps_avi,
                                        avctx->bits_per_coded_sample);
 -    else if (avctx->codec_tag)
 -        avctx->pix_fmt = find_pix_fmt(ff_raw_pix_fmt_tags, avctx->codec_tag);
 +    else if (avctx->codec_tag && (avctx->codec_tag & 0xFFFFFF) != MKTAG('B','I','T', 0))
 +        avctx->pix_fmt = avpriv_find_pix_fmt(ff_raw_pix_fmt_tags, avctx->codec_tag);
      else if (avctx->pix_fmt == AV_PIX_FMT_NONE && avctx->bits_per_coded_sample)
 -        avctx->pix_fmt = find_pix_fmt(pix_fmt_bps_avi,
 +        avctx->pix_fmt = avpriv_find_pix_fmt(avpriv_pix_fmt_bps_avi,
                                        avctx->bits_per_coded_sample);
  
      desc = av_pix_fmt_desc_get(avctx->pix_fmt);
@@@ -224,35 -183,10 +224,35 @@@ static int raw_decode(AVCodecContext *a
                  dst[4 * i + 2] = buf[i] >> 2 & 3;
                  dst[4 * i + 3] = buf[i]      & 3;
              }
 +            linesize_align = 16;
          }
          buf = dst;
-                 context->dsp.bswap16_buf(context->bitstream_buf, (const uint16_t*)buf, buf_size / 2);
 +    } else if (context->is_lt_16bpp) {
 +        uint8_t *dst = frame->buf[0]->data;
 +        int packed = (avctx->codec_tag & 0xFFFFFF) == MKTAG('B','I','T', 0);
 +        int swap   =  avctx->codec_tag >> 24;
 +
 +        if (packed && swap) {
 +            av_fast_padded_malloc(&context->bitstream_buf, &context->bitstream_buf_size, buf_size);
 +            if (!context->bitstream_buf)
 +                return AVERROR(ENOMEM);
 +            if (swap == 16)
-                 context->dsp.bswap_buf(context->bitstream_buf, (const uint32_t*)buf, buf_size / 4);
++                context->bbdsp.bswap16_buf(context->bitstream_buf, (const uint16_t*)buf, buf_size / 2);
 +            else if (swap == 32)
++                context->bbdsp.bswap_buf(context->bitstream_buf, (const uint32_t*)buf, buf_size / 4);
 +            else
 +                return AVERROR_INVALIDDATA;
 +            buf = context->bitstream_buf;
 +        }
 +
 +        if (desc->flags & AV_PIX_FMT_FLAG_BE)
 +            scale16be(avctx, dst, buf, buf_size, packed);
 +        else
 +            scale16le(avctx, dst, buf, buf_size, packed);
 +
 +        buf = dst;
      } else if (need_copy) {
 -        memcpy(frame->buf[0]->data, buf, FFMIN(buf_size, context->frame_size));
 +        memcpy(frame->buf[0]->data, buf, buf_size);
          buf = frame->buf[0]->data;
      }
  
@@@ -63,11 -63,8 +63,11 @@@ typedef struct TM2Context 
      AVFrame *pic;
  
      GetBitContext gb;
-     DSPContext dsp;
+     BswapDSPContext bdsp;
  
 +    uint8_t *buffer;
 +    int buffer_size;
 +
      /* TM2 streams */
      int *tokens[TM2_NUM_STREAMS];
      int tok_lens[TM2_NUM_STREAMS];
@@@ -886,12 -852,17 +886,13 @@@ static int decode_frame(AVCodecContext 
          return AVERROR(ENOMEM);
      }
  
 -    if ((ret = ff_reget_buffer(avctx, p)) < 0) {
 -        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
 -        av_free(swbuf);
 +    if ((ret = ff_reget_buffer(avctx, p)) < 0)
          return ret;
 -    }
  
-     l->dsp.bswap_buf((uint32_t*)l->buffer, (const uint32_t*)buf, buf_size >> 2);
 -    l->bdsp.bswap_buf((uint32_t *) swbuf, (const uint32_t *) buf,
++    l->bdsp.bswap_buf((uint32_t *) l->buffer, (const uint32_t *) buf,
+                       buf_size >> 2);
  
 -    if ((ret = tm2_read_header(l, swbuf)) < 0) {
 -        av_free(swbuf);
 +    if ((ret = tm2_read_header(l, l->buffer)) < 0) {
          return ret;
      }
  
@@@ -940,10 -910,10 +941,10 @@@ static av_cold int decode_init(AVCodecC
      if (!l->pic)
          return AVERROR(ENOMEM);
  
-     ff_dsputil_init(&l->dsp, avctx);
+     ff_bswapdsp_init(&l->bdsp);
  
 -    l->last  = av_malloc(4 * sizeof(*l->last)  * (w >> 2));
 -    l->clast = av_malloc(4 * sizeof(*l->clast) * (w >> 2));
 +    l->last  = av_malloc_array(w >> 2, 4 * sizeof(*l->last) );
 +    l->clast = av_malloc_array(w >> 2, 4 * sizeof(*l->clast));
  
      for (i = 0; i < TM2_NUM_STREAMS; i++) {
          l->tokens[i] = NULL;
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -3,7 -3,7 +3,8 @@@ OBJS                                   
  
  OBJS-$(CONFIG_AC3DSP)                  += x86/ac3dsp_init.o
  OBJS-$(CONFIG_AUDIODSP)                += x86/audiodsp_init.o
 +OBJS-$(CONFIG_BLOCKDSP)                += x86/blockdsp_mmx.o
+ OBJS-$(CONFIG_BSWAPDSP)                += x86/bswapdsp_init.o
  OBJS-$(CONFIG_DCT)                     += x86/dct_init.o
  OBJS-$(CONFIG_DSPUTIL)                 += x86/dsputil_init.o
  OBJS-$(CONFIG_ENCODERS)                += x86/dsputilenc_mmx.o          \
@@@ -71,15 -65,11 +72,15 @@@ YASM-OBJS                              
  
  YASM-OBJS-$(CONFIG_AC3DSP)             += x86/ac3dsp.o
  YASM-OBJS-$(CONFIG_AUDIODSP)           += x86/audiodsp.o
 +YASM-OBJS-$(CONFIG_BLOCKDSP)           += x86/blockdsp.o
+ YASM-OBJS-$(CONFIG_BSWAPDSP)           += x86/bswapdsp.o
  YASM-OBJS-$(CONFIG_DCT)                += x86/dct32.o
 +YASM-OBJS-$(CONFIG_DIRAC_DECODER)      += x86/diracdsp_mmx.o x86/diracdsp_yasm.o\
 +                                          x86/dwt_yasm.o
  YASM-OBJS-$(CONFIG_DNXHD_ENCODER)      += x86/dnxhdenc.o
- YASM-OBJS-$(CONFIG_DSPUTIL)            += x86/dsputil.o
  YASM-OBJS-$(CONFIG_ENCODERS)           += x86/dsputilenc.o
  YASM-OBJS-$(CONFIG_FFT)                += x86/fft.o
 +YASM-OBJS-$(CONFIG_FLAC_DECODER)       += x86/flacdsp.o
  YASM-OBJS-$(CONFIG_H263DSP)            += x86/h263_loopfilter.o
  YASM-OBJS-$(CONFIG_H264CHROMA)         += x86/h264_chromamc.o           \
                                            x86/h264_chromamc_10bit.o
index 0000000,17a6cb1..df02970
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,135 +1,190 @@@
 -;* This file is part of Libav.
+ ;******************************************************************************
+ ;* optimized bswap buffer functions
+ ;* Copyright (c) 2008 Loren Merritt
++;* Copyright (c) 2003-2013 Michael Niedermayer
++;* Copyright (c) 2013 Daniel Kang
+ ;*
 -;* 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_bswap32: db 3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13, 12
++cextern pb_80
++
+ SECTION_TEXT
+ ; %1 = aligned/unaligned
+ %macro BSWAP_LOOPS  1
+     mov      r3, r2
+     sar      r2, 3
+     jz       .left4_%1
+ .loop8_%1:
+     mov%1    m0, [r1 +  0]
+     mov%1    m1, [r1 + 16]
+ %if cpuflag(ssse3)
+     pshufb   m0, m2
+     pshufb   m1, m2
+     mov%1    [r0 +  0], m0
+     mov%1    [r0 + 16], m1
+ %else
+     pshuflw  m0, m0, 10110001b
+     pshuflw  m1, m1, 10110001b
+     pshufhw  m0, m0, 10110001b
+     pshufhw  m1, m1, 10110001b
+     mova     m2, m0
+     mova     m3, m1
+     psllw    m0, 8
+     psllw    m1, 8
+     psrlw    m2, 8
+     psrlw    m3, 8
+     por      m2, m0
+     por      m3, m1
+     mov%1    [r0 +  0], m2
+     mov%1    [r0 + 16], m3
+ %endif
+     add      r0, 32
+     add      r1, 32
+     dec      r2
+     jnz      .loop8_%1
+ .left4_%1:
+     mov      r2, r3
+     and      r3, 4
+     jz       .left
+     mov%1    m0, [r1]
+ %if cpuflag(ssse3)
+     pshufb   m0, m2
+     mov%1    [r0], m0
+ %else
+     pshuflw  m0, m0, 10110001b
+     pshufhw  m0, m0, 10110001b
+     mova     m2, m0
+     psllw    m0, 8
+     psrlw    m2, 8
+     por      m2, m0
+     mov%1    [r0], m2
+ %endif
+     add      r1, 16
+     add      r0, 16
+ %endmacro
+ ; void ff_bswap_buf(uint32_t *dst, const uint32_t *src, int w);
+ %macro BSWAP32_BUF 0
+ %if cpuflag(ssse3)
+ cglobal bswap32_buf, 3,4,3
+     mov      r3, r1
+     mova     m2, [pb_bswap32]
+ %else
+ cglobal bswap32_buf, 3,4,5
+     mov      r3, r1
+ %endif
++    or       r3, r0
+     and      r3, 15
+     jz       .start_align
+     BSWAP_LOOPS  u
+     jmp      .left
+ .start_align:
+     BSWAP_LOOPS  a
+ .left:
+ %if cpuflag(ssse3)
+     mov      r3, r2
+     and      r2, 2
+     jz       .left1
+     movq     m0, [r1]
+     pshufb   m0, m2
+     movq     [r0], m0
+     add      r1, 8
+     add      r0, 8
+ .left1:
+     and      r3, 1
+     jz       .end
+     mov      r2d, [r1]
+     bswap    r2d
+     mov      [r0], r2d
+ %else
+     and      r2, 3
+     jz       .end
+ .loop2:
+     mov      r3d, [r1]
+     bswap    r3d
+     mov      [r0], r3d
+     add      r1, 4
+     add      r0, 4
+     dec      r2
+     jnz      .loop2
+ %endif
+ .end:
+     RET
+ %endmacro
+ INIT_XMM sse2
+ BSWAP32_BUF
+ INIT_XMM ssse3
+ BSWAP32_BUF
++
++;--------------------------------------------------------------------------
++;void ff_put_signed_pixels_clamped(const int16_t *block, uint8_t *pixels,
++;                                  int line_size)
++;--------------------------------------------------------------------------
++
++%macro PUT_SIGNED_PIXELS_CLAMPED_HALF 1
++    mova     m1, [blockq+mmsize*0+%1]
++    mova     m2, [blockq+mmsize*2+%1]
++%if mmsize == 8
++    mova     m3, [blockq+mmsize*4+%1]
++    mova     m4, [blockq+mmsize*6+%1]
++%endif
++    packsswb m1, [blockq+mmsize*1+%1]
++    packsswb m2, [blockq+mmsize*3+%1]
++%if mmsize == 8
++    packsswb m3, [blockq+mmsize*5+%1]
++    packsswb m4, [blockq+mmsize*7+%1]
++%endif
++    paddb    m1, m0
++    paddb    m2, m0
++%if mmsize == 8
++    paddb    m3, m0
++    paddb    m4, m0
++    movq     [pixelsq+lsizeq*0], m1
++    movq     [pixelsq+lsizeq*1], m2
++    movq     [pixelsq+lsizeq*2], m3
++    movq     [pixelsq+lsize3q ], m4
++%else
++    movq     [pixelsq+lsizeq*0], m1
++    movhps   [pixelsq+lsizeq*1], m1
++    movq     [pixelsq+lsizeq*2], m2
++    movhps   [pixelsq+lsize3q ], m2
++%endif
++%endmacro
++
++%macro PUT_SIGNED_PIXELS_CLAMPED 1
++cglobal put_signed_pixels_clamped, 3, 4, %1, block, pixels, lsize, lsize3
++    mova     m0, [pb_80]
++    lea      lsize3q, [lsizeq*3]
++    PUT_SIGNED_PIXELS_CLAMPED_HALF 0
++    lea      pixelsq, [pixelsq+lsizeq*4]
++    PUT_SIGNED_PIXELS_CLAMPED_HALF 64
++    RET
++%endmacro
++
++INIT_MMX mmx
++PUT_SIGNED_PIXELS_CLAMPED 0
++INIT_XMM sse2
++PUT_SIGNED_PIXELS_CLAMPED 3
index 0000000,ba40f2d..c042e56
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,37 +1,37 @@@
 - * 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 "libavutil/attributes.h"
+ #include "libavutil/cpu.h"
+ #include "libavutil/x86/cpu.h"
+ #include "libavcodec/bswapdsp.h"
+ void ff_bswap32_buf_sse2(uint32_t *dst, const uint32_t *src, int w);
+ void ff_bswap32_buf_ssse3(uint32_t *dst, const uint32_t *src, int w);
+ av_cold void ff_bswapdsp_init_x86(BswapDSPContext *c)
+ {
+     int cpu_flags = av_get_cpu_flags();
+     if (EXTERNAL_SSE2(cpu_flags))
+         c->bswap_buf = ff_bswap32_buf_sse2;
+     if (EXTERNAL_SSSE3(cpu_flags))
+         c->bswap_buf = ff_bswap32_buf_ssse3;
+ }
@@@ -94,21 -80,8 +91,12 @@@ static av_cold void dsputil_init_sse2(D
          c->idct_permutation_type = FF_SSE2_IDCT_PERM;
      }
  #endif /* HAVE_SSE2_INLINE */
-     c->bswap_buf = ff_bswap32_buf_sse2;
 +
 +#if HAVE_SSE2_EXTERNAL
 +    c->put_signed_pixels_clamped = ff_put_signed_pixels_clamped_sse2;
 +#endif /* HAVE_SSE2_EXTERNAL */
  }
  
- static av_cold void dsputil_init_ssse3(DSPContext *c, AVCodecContext *avctx,
-                                        int cpu_flags, unsigned high_bit_depth)
- {
- #if HAVE_SSSE3_EXTERNAL
-     c->bswap_buf = ff_bswap32_buf_ssse3;
- #endif /* HAVE_SSSE3_EXTERNAL */
- }
  av_cold void ff_dsputil_init_x86(DSPContext *c, AVCodecContext *avctx,
                                   unsigned high_bit_depth)
  {