Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 16 Sep 2012 12:48:45 +0000 (14:48 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 16 Sep 2012 12:55:00 +0000 (14:55 +0200)
* qatar/master:
  mpegvideo: drop unnecessary arguments to hpel_motion()
  mpegvideo: drop 'inline' from some functions
  nellymoserdec: drop support for s16 output.
  bmpdec: only initialize palette for pal8.
  build: Properly remove object files while cleaning
  flacdsp: arm optimised lpc filter
  compat/vsnprintf: return number of bytes required on truncation.

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
common.mak
libavcodec/arm/flacdsp_arm.S
libavcodec/arm/flacdsp_init_arm.c
libavcodec/bmp.c
libavcodec/flacdsp.c
libavcodec/flacdsp.h
libavcodec/mpegvideo_motion.c
libavcodec/nellymoserdec.c
libavutil/arm/asm.S

diff --combined common.mak
@@@ -5,77 -5,6 +5,77 @@@
  # first so "all" becomes default target
  all: all-yes
  
 +ifndef SUBDIR
 +
 +ifndef V
 +Q      = @
 +ECHO   = printf "$(1)\t%s\n" $(2)
 +BRIEF  = CC CXX HOSTCC HOSTLD AS YASM AR LD STRIP CP
 +SILENT = DEPCC DEPHOSTCC DEPAS DEPYASM RANLIB RM
 +
 +MSG    = $@
 +M      = @$(call ECHO,$(TAG),$@);
 +$(foreach VAR,$(BRIEF), \
 +    $(eval override $(VAR) = @$$(call ECHO,$(VAR),$$(MSG)); $($(VAR))))
 +$(foreach VAR,$(SILENT),$(eval override $(VAR) = @$($(VAR))))
 +$(eval INSTALL = @$(call ECHO,INSTALL,$$(^:$(SRC_DIR)/%=%)); $(INSTALL))
 +endif
 +
 +ALLFFLIBS = avcodec avdevice avfilter avformat avresample avutil postproc swscale swresample
 +
 +# NASM requires -I path terminated with /
 +IFLAGS     := -I. -I$(SRC_PATH)/
 +CPPFLAGS   := $(IFLAGS) $(CPPFLAGS)
 +CFLAGS     += $(ECFLAGS)
 +CCFLAGS     = $(CPPFLAGS) $(CFLAGS)
 +ASFLAGS    := $(CPPFLAGS) $(ASFLAGS)
 +CXXFLAGS   += $(CPPFLAGS) $(CFLAGS)
 +YASMFLAGS  += $(IFLAGS:%=%/) -I$(SRC_PATH)/libavutil/x86/ -Pconfig.asm
 +
 +HOSTCCFLAGS = $(IFLAGS) $(HOSTCFLAGS)
 +LDFLAGS    := $(ALLFFLIBS:%=$(LD_PATH)lib%) $(LDFLAGS)
 +
 +define COMPILE
 +       $(call $(1)DEP,$(1))
 +       $($(1)) $($(1)FLAGS) $($(1)_DEPFLAGS) $($(1)_C) $($(1)_O) $<
 +endef
 +
 +COMPILE_C = $(call COMPILE,CC)
 +COMPILE_CXX = $(call COMPILE,CXX)
 +COMPILE_S = $(call COMPILE,AS)
 +
 +%.o: %.c
 +      $(COMPILE_C)
 +
 +%.o: %.cpp
 +      $(COMPILE_CXX)
 +
 +%.s: %.c
 +      $(CC) $(CPPFLAGS) $(CFLAGS) -S -o $@ $<
 +
 +%.o: %.S
 +      $(COMPILE_S)
 +
 +%.h.c:
 +      $(Q)echo '#include "$*.h"' >$@
 +
 +%.ver: %.v
 +      $(Q)sed 's/$$MAJOR/$($(basename $(@F))_VERSION_MAJOR)/' $^ > $@
 +
 +%.c %.h: TAG = GEN
 +
 +# Dummy rule to stop make trying to rebuild removed or renamed headers
 +%.h:
 +      @:
 +
 +# Disable suffix rules.  Most of the builtin rules are suffix rules,
 +# so this saves some time on slow systems.
 +.SUFFIXES:
 +
 +# Do not delete intermediate files from chains of implicit rules
 +$(OBJS):
 +endif
 +
  include $(SRC_PATH)/arch.mak
  
  OBJS      += $(OBJS-yes)
@@@ -115,13 -44,15 +115,16 @@@ $(HOSTPROGS): %$(HOSTEXESUF): %.
  $(OBJS):     | $(sort $(dir $(OBJS)))
  $(HOSTOBJS): | $(sort $(dir $(HOSTOBJS)))
  $(TESTOBJS): | $(sort $(dir $(TESTOBJS)))
 +$(HOBJS):    | $(sort $(dir $(HOBJS)))
  $(TOOLOBJS): | tools
  
 -OBJDIRS := $(OBJDIRS) $(dir $(OBJS) $(HOSTOBJS) $(TESTOBJS))
 +OBJDIRS := $(OBJDIRS) $(dir $(OBJS) $(HOSTOBJS) $(TESTOBJS) $(HOBJS))
  
 -CLEANSUFFIXES     = *.d *.o *~ *.h.c *.map *.ver
 +CLEANSUFFIXES     = *.d *.o *~ *.h.c *.map *.ver *.ho *.gcno *.gcda
  DISTCLEANSUFFIXES = *.pc
  LIBSUFFIXES       = *.a *.lib *.so *.so.* *.dylib *.dll *.def *.dll.a
  
+ clean::
+       $(RM) $(OBJS) $(OBJS:.o=.d)
  -include $(wildcard $(OBJS:.o=.d) $(HOSTOBJS:.o=.d) $(TESTOBJS:.o=.d) $(HOBJS:.o=.d))
index 0000000,d4441da..f8861c5
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,146 +1,146 @@@
 - * This file is part of Libav.
+ /*
+  * Copyright (c) 2012 Mans Rullgard <mans@mansr.com>
+  *
 - * 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/arm/asm.S"
+ function flac_lpc_16_1_arm
+         ldr             r12, [sp]
+         push            {r4, lr}
+         ldr             r1,  [r1]
+         subs            r12, r12, #2
+         ldr             lr,  [r0], #4
+         beq             2f
+         it              lt
+         poplt           {r4, pc}
+ 1:
+         mul             r4,  lr,  r1
+         ldm             r0,  {r2, lr}
+         add_sh          r2,  r2,  r4,  asr r3
+         mul             r4,  r2,  r1
+         subs            r12, r12, #2
+         add_sh          lr,  lr,  r4,  asr r3
+         stm             r0!, {r2, lr}
+         bgt             1b
+         it              lt
+         poplt           {r4, pc}
+ 2:
+         mul             r4,  lr,  r1
+         ldr             r2,  [r0]
+         add_sh          r2,  r2,  r4,  asr r3
+         str             r2,  [r0]
+         pop             {r4, pc}
+ endfunc
+ function flac_lpc_16_2_arm
+         ldr             r12, [sp]
+         subs            r12, r12, r2
+         it              le
+         bxle            lr
+         push            {r4-r9, lr}
+         ldm             r0!, {r6, r7}
+         ldm             r1,  {r8, r9}
+         subs            r12, r12, #1
+         beq             2f
+ 1:
+         mul             r4,  r6,  r8
+         mul             r5,  r7,  r8
+         mla             r4,  r7,  r9,  r4
+         ldm             r0,  {r6, r7}
+         add_sh          r6,  r6,  r4,  asr r3
+         mla             r5,  r6,  r9,  r5
+         add_sh          r7,  r7,  r5,  asr r3
+         stm             r0!, {r6, r7}
+         subs            r12, r12, #2
+         bgt             1b
+         it              lt
+         poplt           {r4-r9, pc}
+ 2:
+         mul             r4,  r6,  r8
+         mla             r4,  r7,  r9,  r4
+         ldr             r5,  [r0]
+         add_sh          r5,  r5,  r4,  asr r3
+         str             r5,  [r0]
+         pop             {r4-r9, pc}
+ endfunc
+ function ff_flac_lpc_16_arm, export=1
+         cmp             r2,  #2
+         blt             flac_lpc_16_1_arm
+         beq             flac_lpc_16_2_arm
+         ldr             r12, [sp]
+         subs            r12, r12, r2
+         it              le
+         bxle            lr
+         push            {r4-r9, lr}
+         subs            r12, r12, #1
+         beq             3f
+ 1:
+         sub             lr,  r2,  #2
+         mov             r4,  #0
+         mov             r5,  #0
+         ldr             r7,  [r0], #4
+         ldr             r9,  [r1], #4
+ 2:
+         mla             r4,  r7,  r9,  r4
+         ldm             r0!, {r6, r7}
+         mla             r5,  r6,  r9,  r5
+         ldm             r1!, {r8, r9}
+         mla             r4,  r6,  r8,  r4
+         subs            lr,  lr,  #2
+         mla             r5,  r7,  r8,  r5
+         bgt             2b
+         blt             6f
+         mla             r4,  r7,  r9,  r4
+         ldr             r7,  [r0], #4
+         mla             r5,  r7,  r9,  r5
+         ldr             r9,  [r1], #4
+ 6:
+         mla             r4,  r7,  r9,  r4
+         ldm             r0,  {r6, r7}
+         add_sh          r6,  r6,  r4,  asr r3
+         mla             r5,  r6,  r9,  r5
+         add_sh          r7,  r7,  r5,  asr r3
+         stm             r0!, {r6, r7}
+         sub             r0,  r0,  r2,  lsl #2
+         sub             r1,  r1,  r2,  lsl #2
+         subs            r12, r12, #2
+         bgt             1b
+         it              lt
+         poplt           {r4-r9, pc}
+ 3:
+         mov             r4,  #0
+ 4:
+         ldr             r5,  [r1], #4
+         ldr             r6,  [r0], #4
+         mla             r4,  r5,  r6,  r4
+         subs            r2,  r2,  #1
+         bgt             4b
+         ldr             r5,  [r0]
+         add_sh          r5,  r5,  r4,  asr r3
+         str             r5,  [r0]
+         pop             {r4-r9, pc}
+ endfunc
index 0000000,0530cf7..9b93942
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,32 +1,32 @@@
 - * This file is part of Libav.
+ /*
+  * Copyright (c) 2012 Mans Rullgard <mans@mansr.com>
+  *
 - * 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 "libavcodec/flacdsp.h"
+ #include "config.h"
+ void ff_flac_lpc_16_arm(int32_t *samples, const int coeffs[32], int order,
+                         int qlevel, int len);
+ av_cold void ff_flacdsp_init_arm(FLACDSPContext *c, enum AVSampleFormat fmt,
+                                  int bps)
+ {
+     if (bps <= 16)
+         c->lpc = ff_flac_lpc_16_arm;
+ }
diff --combined libavcodec/bmp.c
@@@ -2,20 -2,20 +2,20 @@@
   * BMP image format decoder
   * Copyright (c) 2005 Mans Rullgard
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * 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.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * 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 Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
@@@ -49,7 -49,6 +49,7 @@@ static int bmp_decode_frame(AVCodecCont
      unsigned int ihsize;
      int i, j, n, linesize;
      uint32_t rgb[3];
 +    uint32_t alpha = 0;
      uint8_t *ptr;
      int dsize;
      const uint8_t *buf0 = buf;
@@@ -94,8 -93,7 +94,8 @@@
      }
  
      switch(ihsize){
 -    case  40: // windib v3
 +    case  40: // windib
 +    case  56: // windib v3
      case  64: // OS/2 v2
      case 108: // windib v4
      case 124: // windib v5
  
      depth = bytestream_get_le16(&buf);
  
 -    if(ihsize == 40)
 +    if(ihsize == 40 || ihsize == 64 || ihsize == 56)
          comp = bytestream_get_le32(&buf);
      else
          comp = BMP_RGB;
          rgb[0] = bytestream_get_le32(&buf);
          rgb[1] = bytestream_get_le32(&buf);
          rgb[2] = bytestream_get_le32(&buf);
 +        if (ihsize >= 108)
 +            alpha = bytestream_get_le32(&buf);
      }
  
      avctx->width = width;
      switch(depth){
      case 32:
          if(comp == BMP_BITFIELDS){
 -            rgb[0] = (rgb[0] >> 15) & 3;
 -            rgb[1] = (rgb[1] >> 15) & 3;
 -            rgb[2] = (rgb[2] >> 15) & 3;
 -
 -            if(rgb[0] + rgb[1] + rgb[2] != 3 ||
 -               rgb[0] == rgb[1] || rgb[0] == rgb[2] || rgb[1] == rgb[2]){
 -                break;
 +            if (rgb[0] == 0xFF000000 && rgb[1] == 0x00FF0000 && rgb[2] == 0x0000FF00)
 +                avctx->pix_fmt = alpha ? PIX_FMT_ABGR : PIX_FMT_0BGR;
 +            else if (rgb[0] == 0x00FF0000 && rgb[1] == 0x0000FF00 && rgb[2] == 0x000000FF)
 +                avctx->pix_fmt = alpha ? PIX_FMT_BGRA : PIX_FMT_BGR0;
 +            else if (rgb[0] == 0x0000FF00 && rgb[1] == 0x00FF0000 && rgb[2] == 0xFF000000)
 +                avctx->pix_fmt = alpha ? PIX_FMT_ARGB : PIX_FMT_0RGB;
 +            else if (rgb[0] == 0x000000FF && rgb[1] == 0x0000FF00 && rgb[2] == 0x00FF0000)
 +                avctx->pix_fmt = alpha ? PIX_FMT_RGBA : PIX_FMT_RGB0;
 +            else {
 +                av_log(avctx, AV_LOG_ERROR, "Unknown bitfields %0X %0X %0X\n", rgb[0], rgb[1], rgb[2]);
 +                return AVERROR(EINVAL);
              }
          } else {
 -            rgb[0] = 2;
 -            rgb[1] = 1;
 -            rgb[2] = 0;
 +            avctx->pix_fmt = PIX_FMT_BGRA;
          }
 -
 -        avctx->pix_fmt = PIX_FMT_BGR24;
          break;
      case 24:
          avctx->pix_fmt = PIX_FMT_BGR24;
      dsize = buf_size - hsize;
  
      /* Line size in file multiple of 4 */
 -    n = ((avctx->width * depth) / 8 + 3) & ~3;
 +    n = ((avctx->width * depth + 31) / 8) & ~3;
  
      if(n * avctx->height > dsize && comp != BMP_RLE4 && comp != BMP_RLE8){
          av_log(avctx, AV_LOG_ERROR, "not enough data (%d < %d)\n",
      if(comp == BMP_RLE4 || comp == BMP_RLE8)
          memset(p->data[0], 0, avctx->height * p->linesize[0]);
  
-     if(depth == 4 || depth == 8)
-         memset(p->data[1], 0, 1024);
      if(height > 0){
          ptr = p->data[0] + (avctx->height - 1) * p->linesize[0];
          linesize = -p->linesize[0];
  
      if(avctx->pix_fmt == PIX_FMT_PAL8){
          int colors = 1 << depth;
+         memset(p->data[1], 0, 1024);
          if(ihsize >= 36){
              int t;
              buf = buf0 + 46;
          buf = buf0 + 14 + ihsize; //palette location
          if((hsize-ihsize-14) < (colors << 2)){ // OS/2 bitmap, 3 bytes per palette entry
              for(i = 0; i < colors; i++)
 -                ((uint32_t*)p->data[1])[i] = bytestream_get_le24(&buf);
 +                ((uint32_t*)p->data[1])[i] = (0xff<<24) | bytestream_get_le24(&buf);
          }else{
              for(i = 0; i < colors; i++)
 -                ((uint32_t*)p->data[1])[i] = bytestream_get_le32(&buf);
 +                ((uint32_t*)p->data[1])[i] = 0xFFU << 24 | bytestream_get_le32(&buf);
          }
          buf = buf0 + hsize;
      }
              break;
          case 8:
          case 24:
 +        case 32:
              for(i = 0; i < avctx->height; i++){
                  memcpy(ptr, buf, n);
                  buf += n;
                  ptr += linesize;
              }
              break;
 -        case 32:
 -            for(i = 0; i < avctx->height; i++){
 -                const uint8_t *src = buf;
 -                uint8_t *dst = ptr;
 -
 -                for(j = 0; j < avctx->width; j++){
 -                    dst[0] = src[rgb[2]];
 -                    dst[1] = src[rgb[1]];
 -                    dst[2] = src[rgb[0]];
 -                    dst += 3;
 -                    src += 4;
 -                }
 -
 -                buf += n;
 -                ptr += linesize;
 -            }
 -            break;
          default:
              av_log(avctx, AV_LOG_ERROR, "BMP decoder is broken\n");
              return -1;
diff --combined libavcodec/flacdsp.c
@@@ -1,26 -1,27 +1,27 @@@
  /*
   * Copyright (c) 2012 Mans Rullgard <mans@mansr.com>
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * 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.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * 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 Libav; if not, write to the Free Software
 + * 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/attributes.h"
  #include "libavutil/samplefmt.h"
  #include "flacdsp.h"
+ #include "config.h"
  
  #define SAMPLE_SIZE 16
  #define PLANAR 0
@@@ -119,4 -120,7 +120,7 @@@ av_cold void ff_flacdsp_init(FLACDSPCon
          c->decorrelate[3] = flac_decorrelate_ms_c_16p;
          break;
      }
+     if (ARCH_ARM)
+         ff_flacdsp_init_arm(c, fmt, bps);
  }
diff --combined libavcodec/flacdsp.h
@@@ -1,18 -1,18 +1,18 @@@
  /*
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * 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.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * 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 Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
@@@ -30,5 -30,6 +30,6 @@@ typedef struct FLACDSPContext 
  } FLACDSPContext;
  
  void ff_flacdsp_init(FLACDSPContext *c, enum AVSampleFormat fmt, int bps);
+ void ff_flacdsp_init_arm(FLACDSPContext *c, enum AVSampleFormat fmt, int bps);
  
  #endif /* AVCODEC_FLACDSP_H */
@@@ -4,25 -4,24 +4,25 @@@
   *
   * 4MV & hq & B-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * 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.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * 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 Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
  #include <string.h>
 +#include "libavutil/avassert.h"
  #include "avcodec.h"
  #include "dsputil.h"
  #include "mpegvideo.h"
@@@ -30,9 -29,9 +30,9 @@@
  #include "msmpeg4.h"
  #include <limits.h>
  
- static inline void gmc1_motion(MpegEncContext *s,
-                                uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
-                                uint8_t **ref_picture)
+ static void gmc1_motion(MpegEncContext *s,
+                         uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
+                         uint8_t **ref_picture)
  {
      uint8_t *ptr;
      int offset, src_x, src_y, linesize, uvlinesize;
      return;
  }
  
- static inline void gmc_motion(MpegEncContext *s,
-                                uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
-                                uint8_t **ref_picture)
+ static void gmc_motion(MpegEncContext *s,
+                        uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
+                        uint8_t **ref_picture)
  {
      uint8_t *ptr;
      int linesize, uvlinesize;
  
  static inline int hpel_motion(MpegEncContext *s,
                                    uint8_t *dest, uint8_t *src,
-                                   int field_based, int field_select,
                                    int src_x, int src_y,
-                                   int width, int height, int stride,
-                                   int h_edge_pos, int v_edge_pos,
-                                   int w, int h, op_pixels_func *pix_op,
+                                   op_pixels_func *pix_op,
                                    int motion_x, int motion_y)
  {
      int dxy;
      src_y += motion_y >> 1;
  
      /* WARNING: do no forget half pels */
-     src_x = av_clip(src_x, -16, width); //FIXME unneeded for emu?
-     if (src_x == width)
+     src_x = av_clip(src_x, -16, s->width); //FIXME unneeded for emu?
+     if (src_x == s->width)
          dxy &= ~1;
-     src_y = av_clip(src_y, -16, height);
-     if (src_y == height)
+     src_y = av_clip(src_y, -16, s->height);
+     if (src_y == s->height)
          dxy &= ~2;
-     src += src_y * stride + src_x;
+     src += src_y * s->linesize + src_x;
  
      if(s->unrestricted_mv && (s->flags&CODEC_FLAG_EMU_EDGE)){
-         if(   (unsigned)src_x > FFMAX(h_edge_pos - (motion_x&1) - w, 0)
-            || (unsigned)src_y > FFMAX(v_edge_pos - (motion_y&1) - h, 0)){
-             s->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
-                              src_x, src_y<<field_based, h_edge_pos, s->v_edge_pos);
+         if(   (unsigned)src_x > FFMAX(s->h_edge_pos - (motion_x&1) - 8, 0)
+            || (unsigned)src_y > FFMAX(s->v_edge_pos - (motion_y&1) - 8, 0)){
+             s->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, 9, 9,
+                              src_x, src_y, s->h_edge_pos, s->v_edge_pos);
              src= s->edge_emu_buffer;
              emu=1;
          }
      }
-     if(field_select)
-         src += s->linesize;
-     pix_op[dxy](dest, src, stride, h);
+     pix_op[dxy](dest, src, s->linesize, 8);
      return emu;
  }
  
@@@ -440,18 -434,16 +435,16 @@@ static inline void obmc_motion(MpegEncC
      int i;
      uint8_t *ptr[5];
  
 -    assert(s->quarter_sample==0);
 +    av_assert2(s->quarter_sample==0);
  
      for(i=0; i<5; i++){
          if(i && mv[i][0]==mv[MID][0] && mv[i][1]==mv[MID][1]){
              ptr[i]= ptr[MID];
          }else{
              ptr[i]= s->obmc_scratchpad + 8*(i&1) + s->linesize*8*(i>>1);
-             hpel_motion(s, ptr[i], src, 0, 0,
+             hpel_motion(s, ptr[i], src,
                          src_x, src_y,
-                         s->width, s->height, s->linesize,
-                         s->h_edge_pos, s->v_edge_pos,
-                         8, 8, pix_op,
+                         pix_op,
                          mv[i][0], mv[i][1]);
          }
      }
@@@ -554,11 -546,12 +547,12 @@@ static inline void qpel_motion(MpegEncC
  /**
   * h263 chroma 4mv motion compensation.
   */
- static inline void chroma_4mv_motion(MpegEncContext *s,
-                                      uint8_t *dest_cb, uint8_t *dest_cr,
-                                      uint8_t **ref_picture,
-                                      op_pixels_func *pix_op,
-                                      int mx, int my){
+ static void chroma_4mv_motion(MpegEncContext *s,
+                               uint8_t *dest_cb, uint8_t *dest_cr,
+                               uint8_t **ref_picture,
+                               op_pixels_func *pix_op,
+                               int mx, int my)
+ {
      int dxy, emu=0, src_x, src_y, offset;
      uint8_t *ptr;
  
@@@ -650,7 -643,7 +644,7 @@@ static av_always_inline void MPV_motion
          const int mot_stride= s->b8_stride;
          const int mot_xy= mb_x*2 + mb_y*2*mot_stride;
  
 -        assert(!s->mb_skipped);
 +        av_assert2(!s->mb_skipped);
  
          memcpy(mv_cache[1][1], s->current_picture.f.motion_val[0][mot_xy             ], sizeof(int16_t) * 4);
          memcpy(mv_cache[2][1], s->current_picture.f.motion_val[0][mot_xy + mot_stride], sizeof(int16_t) * 4);
          }else{
              for(i=0;i<4;i++) {
                  hpel_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
-                             ref_picture[0], 0, 0,
+                             ref_picture[0],
                              mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
-                             s->width, s->height, s->linesize,
-                             s->h_edge_pos, s->v_edge_pos,
-                             8, 8, pix_op[1],
+                             pix_op[1],
                              s->mv[dir][i][0], s->mv[dir][i][1]);
  
                  mx += s->mv[dir][i][0];
              }
          }
      break;
 -    default: assert(0);
 +    default: av_assert2(0);
      }
  }
  
  typedef struct NellyMoserDecodeContext {
      AVCodecContext* avctx;
      AVFrame         frame;
-     float          *float_buf;
      AVLFG           random_state;
      GetBitContext   gb;
      float           scale_bias;
      DSPContext      dsp;
      FFTContext      imdct_ctx;
-     FmtConvertContext fmt_conv;
      DECLARE_ALIGNED(32, float, imdct_buf)[2][NELLY_BUF_LEN];
      float          *imdct_out;
      float          *imdct_prev;
@@@ -124,19 -122,8 +122,8 @@@ static av_cold int decode_init(AVCodecC
  
      ff_dsputil_init(&s->dsp, avctx);
  
-     if (avctx->request_sample_fmt == AV_SAMPLE_FMT_FLT) {
-         s->scale_bias = 1.0/(32768*8);
-         avctx->sample_fmt = AV_SAMPLE_FMT_FLT;
-     } else {
-         s->scale_bias = 1.0/(1*8);
-         avctx->sample_fmt = AV_SAMPLE_FMT_S16;
-         ff_fmt_convert_init(&s->fmt_conv, avctx);
-         s->float_buf = av_mallocz(NELLY_SAMPLES * sizeof(*s->float_buf));
-         if (!s->float_buf) {
-             av_log(avctx, AV_LOG_ERROR, "error allocating float buffer\n");
-             return AVERROR(ENOMEM);
-         }
-     }
+     s->scale_bias = 1.0/(32768*8);
+     avctx->sample_fmt = AV_SAMPLE_FMT_FLT;
  
      /* Generate overlap window */
      if (!ff_sine_128[127])
@@@ -154,20 -141,16 +141,19 @@@ static int decode_tag(AVCodecContext *a
                        int *got_frame_ptr, AVPacket *avpkt)
  {
      const uint8_t *buf = avpkt->data;
 +    const uint8_t *side=av_packet_get_side_data(avpkt, 'F', NULL);
      int buf_size = avpkt->size;
      NellyMoserDecodeContext *s = avctx->priv_data;
      int blocks, i, ret;
-     int16_t *samples_s16;
      float   *samples_flt;
  
      blocks     = buf_size / NELLY_BLOCK_LEN;
 +
      if (blocks <= 0) {
          av_log(avctx, AV_LOG_ERROR, "Packet is too small\n");
          return AVERROR_INVALIDDATA;
      }
 +
      if (buf_size % NELLY_BLOCK_LEN) {
          av_log(avctx, AV_LOG_WARNING, "Leftover bytes: %d.\n",
                 buf_size % NELLY_BLOCK_LEN);
       * 22050 Hz - 4
       * 44100 Hz - 8
       */
 +    if(side && blocks>1 && avctx->sample_rate%11025==0 && (1<<((side[0]>>2)&3)) == blocks)
 +        avctx->sample_rate= 11025*(blocks/2);
  
      /* get output buffer */
      s->frame.nb_samples = NELLY_SAMPLES * blocks;
          av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
          return ret;
      }
-     samples_s16 = (int16_t *)s->frame.data[0];
      samples_flt = (float   *)s->frame.data[0];
  
      for (i=0 ; i<blocks ; i++) {
-         if (avctx->sample_fmt == AV_SAMPLE_FMT_FLT) {
-             nelly_decode_block(s, buf, samples_flt);
-             samples_flt += NELLY_SAMPLES;
-         } else {
-             nelly_decode_block(s, buf, s->float_buf);
-             s->fmt_conv.float_to_int16(samples_s16, s->float_buf, NELLY_SAMPLES);
-             samples_s16 += NELLY_SAMPLES;
-         }
+         nelly_decode_block(s, buf, samples_flt);
+         samples_flt += NELLY_SAMPLES;
          buf += NELLY_BLOCK_LEN;
      }
  
  static av_cold int decode_end(AVCodecContext * avctx) {
      NellyMoserDecodeContext *s = avctx->priv_data;
  
-     av_freep(&s->float_buf);
      ff_mdct_end(&s->imdct_ctx);
  
      return 0;
@@@ -229,6 -202,5 +207,5 @@@ AVCodec ff_nellymoser_decoder = 
      .capabilities   = CODEC_CAP_DR1 | CODEC_CAP_PARAM_CHANGE,
      .long_name      = NULL_IF_CONFIG_SMALL("Nellymoser Asao"),
      .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLT,
-                                                       AV_SAMPLE_FMT_S16,
                                                        AV_SAMPLE_FMT_NONE },
  };
diff --combined libavutil/arm/asm.S
@@@ -1,20 -1,20 +1,20 @@@
  /*
   * Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * 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.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * 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 Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
@@@ -186,6 -186,12 +186,12 @@@ ELF     .size   \name, . - \nam
  #endif
  .endm
  
+ .macro  add_sh          rd,  rn,  rm,  sh:vararg
+ A       add             \rd, \rn, \rm, \sh
+ T       mov             \rm, \rm, \sh
+ T       add             \rd, \rn, \rm
+ .endm
  .macro  ldr_pre         rt,  rn,  rm:vararg
  A       ldr             \rt, [\rn, \rm]!
  T       add             \rn, \rn, \rm