Merge commit '57f09608e1600d1cf1679885a46f5004d522d68f'
authorMichael Niedermayer <michaelni@gmx.at>
Sat, 22 Mar 2014 22:26:23 +0000 (23:26 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Sat, 22 Mar 2014 22:26:23 +0000 (23:26 +0100)
* commit '57f09608e1600d1cf1679885a46f5004d522d68f':
  dsputil: Move thirdpel-related bits into their own context

Conflicts:
libavcodec/svq3.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
12 files changed:
1  2 
configure
doc/optimization.txt
libavcodec/Makefile
libavcodec/dsputil.c
libavcodec/dsputil.h
libavcodec/h264qpel_template.c
libavcodec/hpel_template.c
libavcodec/hpeldsp_template.c
libavcodec/svq3.c
libavcodec/tpel_template.c
libavcodec/tpeldsp.c
libavcodec/tpeldsp.h

diff --cc configure
Simple merge
Simple merge
@@@ -74,8 -64,8 +74,9 @@@ OBJS-$(CONFIG_MPEGVIDEOENC)            
  OBJS-$(CONFIG_RANGECODER)              += rangecoder.o
  RDFT-OBJS-$(CONFIG_HARDCODED_TABLES)   += sin_tables.o
  OBJS-$(CONFIG_RDFT)                    += rdft.o $(RDFT-OBJS-yes)
 +OBJS-$(CONFIG_SHARED)                  += log2_tab.o
  OBJS-$(CONFIG_SINEWIN)                 += sinewin.o
+ OBJS-$(CONFIG_TPELDSP)                 += tpeldsp.o
  OBJS-$(CONFIG_VAAPI)                   += vaapi.o
  OBJS-$(CONFIG_VDPAU)                   += vdpau.o
  OBJS-$(CONFIG_VIDEODSP)                += videodsp.o
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -54,7 -54,7 +54,8 @@@
  #include "golomb.h"
  #include "hpeldsp.h"
  #include "rectangle.h"
+ #include "tpeldsp.h"
 +#include "vdpau_internal.h"
  
  #if CONFIG_ZLIB
  #include <zlib.h>
@@@ -879,17 -873,20 +881,19 @@@ static av_cold int svq3_decode_init(AVC
      s->last_pic = av_mallocz(sizeof(*s->last_pic));
      s->next_pic = av_mallocz(sizeof(*s->next_pic));
      if (!s->next_pic || !s->last_pic || !s->cur_pic) {
 -        av_freep(&s->cur_pic);
 -        av_freep(&s->last_pic);
 -        av_freep(&s->next_pic);
 -        return AVERROR(ENOMEM);
 +        ret = AVERROR(ENOMEM);
 +        goto fail;
      }
  
 -    if (ff_h264_decode_init(avctx) < 0)
 -        return -1;
 +    if ((ret = ff_h264_decode_init(avctx)) < 0)
 +        goto fail;
  
      ff_hpeldsp_init(&s->hdsp, avctx->flags);
+     ff_tpeldsp_init(&s->tdsp);
      h->flags           = avctx->flags;
      h->is_complex      = 1;
 +    h->sps.chroma_format_idc = 1;
      h->picture_structure = PICT_FRAME;
      avctx->pix_fmt     = AV_PIX_FMT_YUVJ420P;
      avctx->color_range = AVCOL_RANGE_JPEG;
index 0000000,f07679a..6e25025
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,80 +1,80 @@@
 - * 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 <stddef.h>
+ #include <stdint.h>
+ #include "libavutil/intreadwrite.h"
+ #include "pixels.h"
+ #include "rnd_avg.h"
+ #include "bit_depth_template.c"
+ #define DEF_TPEL(OPNAME, OP)                                            \
+ static inline void FUNCC(OPNAME ## _pixels2)(uint8_t *block,            \
+                                              const uint8_t *pixels,     \
+                                              ptrdiff_t line_size,       \
+                                              int h)                     \
+ {                                                                       \
+     int i;                                                              \
+     for (i = 0; i < h; i++) {                                           \
+         OP(*((pixel2 *) block), AV_RN2P(pixels));                       \
+         pixels += line_size;                                            \
+         block  += line_size;                                            \
+     }                                                                   \
+ }                                                                       \
+                                                                         \
+ static inline void FUNCC(OPNAME ## _pixels4)(uint8_t *block,            \
+                                              const uint8_t *pixels,     \
+                                              ptrdiff_t line_size,       \
+                                              int h)                     \
+ {                                                                       \
+     int i;                                                              \
+     for (i = 0; i < h; i++) {                                           \
+         OP(*((pixel4 *) block), AV_RN4P(pixels));                       \
+         pixels += line_size;                                            \
+         block  += line_size;                                            \
+     }                                                                   \
+ }                                                                       \
+                                                                         \
+ static inline void FUNCC(OPNAME ## _pixels8)(uint8_t *block,            \
+                                              const uint8_t *pixels,     \
+                                              ptrdiff_t line_size,       \
+                                              int h)                     \
+ {                                                                       \
+     int i;                                                              \
+     for (i = 0; i < h; i++) {                                           \
+         OP(*((pixel4 *) block), AV_RN4P(pixels));                       \
+         OP(*((pixel4 *) (block + 4 * sizeof(pixel))),                   \
+            AV_RN4P(pixels + 4 * sizeof(pixel)));                        \
+         pixels += line_size;                                            \
+         block  += line_size;                                            \
+     }                                                                   \
+ }                                                                       \
+                                                                         \
+ CALL_2X_PIXELS(FUNCC(OPNAME ## _pixels16),                              \
+                FUNCC(OPNAME ## _pixels8),                               \
+                8 * sizeof(pixel))
+ #define op_avg(a, b) a = rnd_avg_pixel4(a, b)
+ #define op_put(a, b) a = b
+ DEF_TPEL(avg, op_avg)
+ DEF_TPEL(put, op_put)
+ #undef op_avg
+ #undef op_put
index 0000000,6a16813..b5af72c
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,333 +1,333 @@@
 - * This file is part of Libav.
+ /*
+  * thirdpel DSP functions
+  *
 - * 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
+  */
+ /**
+  * @file
+  * thirdpel DSP functions
+  */
+ #include <stdint.h>
+ #include "libavutil/attributes.h"
+ #include "tpeldsp.h"
+ #define BIT_DEPTH 8
+ #include "tpel_template.c"
+ static inline void put_tpel_pixels_mc00_c(uint8_t *dst, const uint8_t *src,
+                                           int stride, int width, int height)
+ {
+     switch (width) {
+     case 2:
+         put_pixels2_8_c(dst, src, stride, height);
+         break;
+     case 4:
+         put_pixels4_8_c(dst, src, stride, height);
+         break;
+     case 8:
+         put_pixels8_8_c(dst, src, stride, height);
+         break;
+     case 16:
+         put_pixels16_8_c(dst, src, stride, height);
+         break;
+     }
+ }
+ static inline void put_tpel_pixels_mc10_c(uint8_t *dst, const uint8_t *src,
+                                           int stride, int width, int height)
+ {
+     int i, j;
+     for (i = 0; i < height; i++) {
+         for (j = 0; j < width; j++)
+             dst[j] = ((2 * src[j] + src[j + 1] + 1) *
+                       683) >> 11;
+         src += stride;
+         dst += stride;
+     }
+ }
+ static inline void put_tpel_pixels_mc20_c(uint8_t *dst, const uint8_t *src,
+                                           int stride, int width, int height)
+ {
+     int i, j;
+     for (i = 0; i < height; i++) {
+         for (j = 0; j < width; j++)
+             dst[j] = ((src[j] + 2 * src[j + 1] + 1) *
+                       683) >> 11;
+         src += stride;
+         dst += stride;
+     }
+ }
+ static inline void put_tpel_pixels_mc01_c(uint8_t *dst, const uint8_t *src,
+                                           int stride, int width, int height)
+ {
+     int i, j;
+     for (i = 0; i < height; i++) {
+         for (j = 0; j < width; j++)
+             dst[j] = ((2 * src[j] + src[j + stride] + 1) *
+                       683) >> 11;
+         src += stride;
+         dst += stride;
+     }
+ }
+ static inline void put_tpel_pixels_mc11_c(uint8_t *dst, const uint8_t *src,
+                                           int stride, int width, int height)
+ {
+     int i, j;
+     for (i = 0; i < height; i++) {
+         for (j = 0; j < width; j++)
+             dst[j] = ((4 * src[j]          + 3 * src[j + 1] +
+                        3 * src[j + stride] + 2 * src[j + stride + 1] + 6) *
+                       2731) >> 15;
+         src += stride;
+         dst += stride;
+     }
+ }
+ static inline void put_tpel_pixels_mc12_c(uint8_t *dst, const uint8_t *src,
+                                           int stride, int width, int height)
+ {
+     int i, j;
+     for (i = 0; i < height; i++) {
+         for (j = 0; j < width; j++)
+             dst[j] = ((3 * src[j]          + 2 * src[j + 1] +
+                        4 * src[j + stride] + 3 * src[j + stride + 1] + 6) *
+                       2731) >> 15;
+         src += stride;
+         dst += stride;
+     }
+ }
+ static inline void put_tpel_pixels_mc02_c(uint8_t *dst, const uint8_t *src,
+                                           int stride, int width, int height)
+ {
+     int i, j;
+     for (i = 0; i < height; i++) {
+         for (j = 0; j < width; j++)
+             dst[j] = ((src[j] + 2 * src[j + stride] + 1) *
+                       683) >> 11;
+         src += stride;
+         dst += stride;
+     }
+ }
+ static inline void put_tpel_pixels_mc21_c(uint8_t *dst, const uint8_t *src,
+                                           int stride, int width, int height)
+ {
+     int i, j;
+     for (i = 0; i < height; i++) {
+         for (j = 0; j < width; j++)
+             dst[j] = ((3 * src[j]          + 4 * src[j + 1] +
+                        2 * src[j + stride] + 3 * src[j + stride + 1] + 6) *
+                       2731) >> 15;
+         src += stride;
+         dst += stride;
+     }
+ }
+ static inline void put_tpel_pixels_mc22_c(uint8_t *dst, const uint8_t *src,
+                                           int stride, int width, int height)
+ {
+     int i, j;
+     for (i = 0; i < height; i++) {
+         for (j = 0; j < width; j++)
+             dst[j] = ((2 * src[j]          + 3 * src[j + 1] +
+                        3 * src[j + stride] + 4 * src[j + stride + 1] + 6) *
+                       2731) >> 15;
+         src += stride;
+         dst += stride;
+     }
+ }
+ static inline void avg_tpel_pixels_mc00_c(uint8_t *dst, const uint8_t *src,
+                                           int stride, int width, int height)
+ {
+     switch (width) {
+     case 2:
+         avg_pixels2_8_c(dst, src, stride, height);
+         break;
+     case 4:
+         avg_pixels4_8_c(dst, src, stride, height);
+         break;
+     case 8:
+         avg_pixels8_8_c(dst, src, stride, height);
+         break;
+     case 16:
+         avg_pixels16_8_c(dst, src, stride, height);
+         break;
+     }
+ }
+ static inline void avg_tpel_pixels_mc10_c(uint8_t *dst, const uint8_t *src,
+                                           int stride, int width, int height)
+ {
+     int i, j;
+     for (i = 0; i < height; i++) {
+         for (j = 0; j < width; j++)
+             dst[j] = (dst[j] +
+                       (((2 * src[j] + src[j + 1] + 1) *
+                         683) >> 11) + 1) >> 1;
+         src += stride;
+         dst += stride;
+     }
+ }
+ static inline void avg_tpel_pixels_mc20_c(uint8_t *dst, const uint8_t *src,
+                                           int stride, int width, int height)
+ {
+     int i, j;
+     for (i = 0; i < height; i++) {
+         for (j = 0; j < width; j++)
+             dst[j] = (dst[j] +
+                       (((src[j] + 2 * src[j + 1] + 1) *
+                         683) >> 11) + 1) >> 1;
+         src += stride;
+         dst += stride;
+     }
+ }
+ static inline void avg_tpel_pixels_mc01_c(uint8_t *dst, const uint8_t *src,
+                                           int stride, int width, int height)
+ {
+     int i, j;
+     for (i = 0; i < height; i++) {
+         for (j = 0; j < width; j++)
+             dst[j] = (dst[j] +
+                       (((2 * src[j] + src[j + stride] + 1) *
+                         683) >> 11) + 1) >> 1;
+         src += stride;
+         dst += stride;
+     }
+ }
+ static inline void avg_tpel_pixels_mc11_c(uint8_t *dst, const uint8_t *src,
+                                           int stride, int width, int height)
+ {
+     int i, j;
+     for (i = 0; i < height; i++) {
+         for (j = 0; j < width; j++)
+             dst[j] = (dst[j] +
+                       (((4 * src[j]          + 3 * src[j + 1] +
+                          3 * src[j + stride] + 2 * src[j + stride + 1] + 6) *
+                         2731) >> 15) + 1) >> 1;
+         src += stride;
+         dst += stride;
+     }
+ }
+ static inline void avg_tpel_pixels_mc12_c(uint8_t *dst, const uint8_t *src,
+                                           int stride, int width, int height)
+ {
+     int i, j;
+     for (i = 0; i < height; i++) {
+         for (j = 0; j < width; j++)
+             dst[j] = (dst[j] +
+                       (((3 * src[j]          + 2 * src[j + 1] +
+                          4 * src[j + stride] + 3 * src[j + stride + 1] + 6) *
+                         2731) >> 15) + 1) >> 1;
+         src += stride;
+         dst += stride;
+     }
+ }
+ static inline void avg_tpel_pixels_mc02_c(uint8_t *dst, const uint8_t *src,
+                                           int stride, int width, int height)
+ {
+     int i, j;
+     for (i = 0; i < height; i++) {
+         for (j = 0; j < width; j++)
+             dst[j] = (dst[j] +
+                       (((src[j] + 2 * src[j + stride] + 1) *
+                         683) >> 11) + 1) >> 1;
+         src += stride;
+         dst += stride;
+     }
+ }
+ static inline void avg_tpel_pixels_mc21_c(uint8_t *dst, const uint8_t *src,
+                                           int stride, int width, int height)
+ {
+     int i, j;
+     for (i = 0; i < height; i++) {
+         for (j = 0; j < width; j++)
+             dst[j] = (dst[j] +
+                       (((3 * src[j]          + 4 * src[j + 1] +
+                          2 * src[j + stride] + 3 * src[j + stride + 1] + 6) *
+                         2731) >> 15) + 1) >> 1;
+         src += stride;
+         dst += stride;
+     }
+ }
+ static inline void avg_tpel_pixels_mc22_c(uint8_t *dst, const uint8_t *src,
+                                           int stride, int width, int height)
+ {
+     int i, j;
+     for (i = 0; i < height; i++) {
+         for (j = 0; j < width; j++)
+             dst[j] = (dst[j] +
+                       (((2 * src[j]          + 3 * src[j + 1] +
+                          3 * src[j + stride] + 4 * src[j + stride + 1] + 6) *
+                         2731) >> 15) + 1) >> 1;
+         src += stride;
+         dst += stride;
+     }
+ }
+ av_cold void ff_tpeldsp_init(TpelDSPContext *c)
+ {
+     c->put_tpel_pixels_tab[ 0] = put_tpel_pixels_mc00_c;
+     c->put_tpel_pixels_tab[ 1] = put_tpel_pixels_mc10_c;
+     c->put_tpel_pixels_tab[ 2] = put_tpel_pixels_mc20_c;
+     c->put_tpel_pixels_tab[ 4] = put_tpel_pixels_mc01_c;
+     c->put_tpel_pixels_tab[ 5] = put_tpel_pixels_mc11_c;
+     c->put_tpel_pixels_tab[ 6] = put_tpel_pixels_mc21_c;
+     c->put_tpel_pixels_tab[ 8] = put_tpel_pixels_mc02_c;
+     c->put_tpel_pixels_tab[ 9] = put_tpel_pixels_mc12_c;
+     c->put_tpel_pixels_tab[10] = put_tpel_pixels_mc22_c;
+     c->avg_tpel_pixels_tab[ 0] = avg_tpel_pixels_mc00_c;
+     c->avg_tpel_pixels_tab[ 1] = avg_tpel_pixels_mc10_c;
+     c->avg_tpel_pixels_tab[ 2] = avg_tpel_pixels_mc20_c;
+     c->avg_tpel_pixels_tab[ 4] = avg_tpel_pixels_mc01_c;
+     c->avg_tpel_pixels_tab[ 5] = avg_tpel_pixels_mc11_c;
+     c->avg_tpel_pixels_tab[ 6] = avg_tpel_pixels_mc21_c;
+     c->avg_tpel_pixels_tab[ 8] = avg_tpel_pixels_mc02_c;
+     c->avg_tpel_pixels_tab[ 9] = avg_tpel_pixels_mc12_c;
+     c->avg_tpel_pixels_tab[10] = avg_tpel_pixels_mc22_c;
+ }
index 0000000,9c67d60..3732f17
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,59 +1,59 @@@
 - * This file is part of Libav.
+ /*
+  * thirdpel DSP functions
+  *
 - * 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
+  */
+ /**
+  * @file
+  * thirdpel DSP functions
+  */
+ #ifndef AVCODEC_TPELDSP_H
+ #define AVCODEC_TPELDSP_H
+ #include <stdint.h>
+ /* add and put pixel (decoding) */
+ // blocksizes for hpel_pixels_func are 8x4,8x8 16x8 16x16
+ // h for hpel_pixels_func is limited to {width/2, width} but never larger
+ // than 16 and never smaller than 4
+ typedef void (*tpel_mc_func)(uint8_t *block /* align width (8 or 16) */,
+                              const uint8_t *pixels /* align 1 */,
+                              int line_size, int w, int h);
+ /**
+  * thirdpel DSP context
+  */
+ typedef struct TpelDSPContext {
+     /**
+      * Thirdpel motion compensation with rounding (a + b + 1) >> 1.
+      * this is an array[12] of motion compensation functions for the
+      * 9 thirdpel positions<br>
+      * *pixels_tab[xthirdpel + 4 * ythirdpel]
+      * @param block destination where the result is stored
+      * @param pixels source
+      * @param line_size number of bytes in a horizontal line of block
+      * @param h height
+      */
+     tpel_mc_func put_tpel_pixels_tab[11]; // FIXME individual func ptr per width?
+     tpel_mc_func avg_tpel_pixels_tab[11]; // FIXME individual func ptr per width?
+ } TpelDSPContext;
+ void ff_tpeldsp_init(TpelDSPContext *c);
+ #endif /* AVCODEC_TPELDSP_H */