[2/6] vp56: Change type of stride parameters to ptrdiff_t

Message ID 1472036543-32662-3-git-send-email-diego@biurrun.de
State New
Headers show

Commit Message

Diego Biurrun Aug. 24, 2016, 11:02 a.m.
This avoids SIMD-optimized functions having to sign-extend their
line size argument manually to be able to do pointer arithmetic.
---
 libavcodec/arm/vp6dsp_init_arm.c |  4 ++--
 libavcodec/vp56.h                |  4 ++--
 libavcodec/vp56dsp.c             |  3 ++-
 libavcodec/vp56dsp.h             | 10 ++++++----
 libavcodec/vp6.c                 |  8 ++++----
 libavcodec/vp6dsp.c              |  2 +-
 libavcodec/x86/vp6dsp.asm        |  2 +-
 libavcodec/x86/vp6dsp_init.c     |  4 ++--
 8 files changed, 20 insertions(+), 17 deletions(-)

Comments

Martin Storsjö Aug. 24, 2016, 11:12 a.m. | #1
On Wed, 24 Aug 2016, Diego Biurrun wrote:

> This avoids SIMD-optimized functions having to sign-extend their
> line size argument manually to be able to do pointer arithmetic.
> ---
> libavcodec/arm/vp6dsp_init_arm.c |  4 ++--
> libavcodec/vp56.h                |  4 ++--
> libavcodec/vp56dsp.c             |  3 ++-
> libavcodec/vp56dsp.h             | 10 ++++++----
> libavcodec/vp6.c                 |  8 ++++----
> libavcodec/vp6dsp.c              |  2 +-
> libavcodec/x86/vp6dsp.asm        |  2 +-
> libavcodec/x86/vp6dsp_init.c     |  4 ++--
> 8 files changed, 20 insertions(+), 17 deletions(-)
>
> diff --git a/libavcodec/x86/vp6dsp.asm b/libavcodec/x86/vp6dsp.asm
> index 80f8ca5..364d560 100644
> --- a/libavcodec/x86/vp6dsp.asm
> +++ b/libavcodec/x86/vp6dsp.asm
> @@ -115,7 +115,7 @@ SECTION .text
> %endmacro
>
> %macro vp6_filter_diag4 0
> -; void ff_vp6_filter_diag4_<opt>(uint8_t *dst, uint8_t *src, int stride,
> +; void ff_vp6_filter_diag4_<opt>(uint8_t *dst, uint8_t *src, ptrdiff_t stride,
> ;                                const int16_t h_weight[4], const int16_t v_weights[4])
> cglobal vp6_filter_diag4, 5, 7, 8
>     mov          r5, rsp         ; backup stack pointer

This patch does not remove the actual sign extension a few lines below 
here - not ok.

We really don't need to increase the amount of contradiction in the code 
by changing the parameter type, and even updating the comment in the asm 
as if the code were updated, but not actually updating it.

Also check if we have corresponding asm for other 64 bit arches for all 
the patches (e.g. aarch64) - I doubt it though.

// Martin

Patch

diff --git a/libavcodec/arm/vp6dsp_init_arm.c b/libavcodec/arm/vp6dsp_init_arm.c
index 4ec41ed..235b0b6 100644
--- a/libavcodec/arm/vp6dsp_init_arm.c
+++ b/libavcodec/arm/vp6dsp_init_arm.c
@@ -25,8 +25,8 @@ 
 #include "libavcodec/avcodec.h"
 #include "libavcodec/vp56dsp.h"
 
-void ff_vp6_edge_filter_hor_neon(uint8_t *yuv, int stride, int t);
-void ff_vp6_edge_filter_ver_neon(uint8_t *yuv, int stride, int t);
+void ff_vp6_edge_filter_hor_neon(uint8_t *yuv, ptrdiff_t stride, int t);
+void ff_vp6_edge_filter_ver_neon(uint8_t *yuv, ptrdiff_t stride, int t);
 
 av_cold void ff_vp6dsp_init_arm(VP56DSPContext *s, enum AVCodecID codec)
 {
diff --git a/libavcodec/vp56.h b/libavcodec/vp56.h
index f2ed770..52fe318 100644
--- a/libavcodec/vp56.h
+++ b/libavcodec/vp56.h
@@ -72,7 +72,7 @@  typedef struct VP56mv {
 typedef void (*VP56ParseVectorAdjustment)(VP56Context *s,
                                           VP56mv *vect);
 typedef void (*VP56Filter)(VP56Context *s, uint8_t *dst, uint8_t *src,
-                           int offset1, int offset2, int stride,
+                           int offset1, int offset2, ptrdiff_t stride,
                            VP56mv mv, int mask, int select, int luma);
 typedef void (*VP56ParseCoeff)(VP56Context *s);
 typedef void (*VP56DefaultModelsInit)(VP56Context *s);
@@ -178,7 +178,7 @@  struct vp56_context {
     int flip;  /* are we flipping ? */
     int frbi;  /* first row block index in MB */
     int srbi;  /* second row block index in MB */
-    int stride[4];  /* stride for each plan */
+    ptrdiff_t stride[4];  /* stride for each plan */
 
     const uint8_t *vp56_coord_div;
     VP56ParseVectorAdjustment parse_vector_adjustment;
diff --git a/libavcodec/vp56dsp.c b/libavcodec/vp56dsp.c
index 5e09d24..297534b 100644
--- a/libavcodec/vp56dsp.c
+++ b/libavcodec/vp56dsp.c
@@ -58,7 +58,8 @@  static int vp6_adjust(int v, int t)
 
 
 #define VP56_EDGE_FILTER(pfx, suf, pix_inc, line_inc)                   \
-static void pfx##_edge_filter_##suf(uint8_t *yuv, int stride, int t)    \
+static void pfx ## _edge_filter_ ## suf(uint8_t *yuv, ptrdiff_t stride, \
+                                        int t)                          \
 {                                                                       \
     int pix2_inc = 2 * pix_inc;                                         \
     int i, v;                                                           \
diff --git a/libavcodec/vp56dsp.h b/libavcodec/vp56dsp.h
index 389d359..d52ee66 100644
--- a/libavcodec/vp56dsp.h
+++ b/libavcodec/vp56dsp.h
@@ -21,18 +21,20 @@ 
 #ifndef AVCODEC_VP56DSP_H
 #define AVCODEC_VP56DSP_H
 
+#include <stddef.h>
 #include <stdint.h>
+
 #include "avcodec.h"
 
 typedef struct VP56DSPContext {
-    void (*edge_filter_hor)(uint8_t *yuv, int stride, int t);
-    void (*edge_filter_ver)(uint8_t *yuv, int stride, int t);
+    void (*edge_filter_hor)(uint8_t *yuv, ptrdiff_t stride, int t);
+    void (*edge_filter_ver)(uint8_t *yuv, ptrdiff_t stride, int t);
 
-    void (*vp6_filter_diag4)(uint8_t *dst, uint8_t *src, int stride,
+    void (*vp6_filter_diag4)(uint8_t *dst, uint8_t *src, ptrdiff_t stride,
                              const int16_t *h_weights,const int16_t *v_weights);
 } VP56DSPContext;
 
-void ff_vp6_filter_diag4_c(uint8_t *dst, uint8_t *src, int stride,
+void ff_vp6_filter_diag4_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride,
                            const int16_t *h_weights, const int16_t *v_weights);
 
 void ff_vp56dsp_init(VP56DSPContext *s, enum AVCodecID codec);
diff --git a/libavcodec/vp6.c b/libavcodec/vp6.c
index c48c2b8..aa0d09e 100644
--- a/libavcodec/vp6.c
+++ b/libavcodec/vp6.c
@@ -514,7 +514,7 @@  static void vp6_parse_coeff(VP56Context *s)
     }
 }
 
-static int vp6_block_variance(uint8_t *src, int stride)
+static int vp6_block_variance(uint8_t *src, ptrdiff_t stride)
 {
     int sum = 0, square_sum = 0;
     int y, x;
@@ -529,7 +529,7 @@  static int vp6_block_variance(uint8_t *src, int stride)
     return (16*square_sum - sum*sum) >> 8;
 }
 
-static void vp6_filter_hv4(uint8_t *dst, uint8_t *src, int stride,
+static void vp6_filter_hv4(uint8_t *dst, uint8_t *src, ptrdiff_t stride,
                            int delta, const int16_t *weights)
 {
     int x, y;
@@ -547,7 +547,7 @@  static void vp6_filter_hv4(uint8_t *dst, uint8_t *src, int stride,
 }
 
 static void vp6_filter_diag2(VP56Context *s, uint8_t *dst, uint8_t *src,
-                             int stride, int h_weight, int v_weight)
+                             ptrdiff_t stride, int h_weight, int v_weight)
 {
     uint8_t *tmp = s->edge_emu_buffer+16;
     s->h264chroma.put_h264_chroma_pixels_tab[0](tmp, src, stride, 9, h_weight, 0);
@@ -555,7 +555,7 @@  static void vp6_filter_diag2(VP56Context *s, uint8_t *dst, uint8_t *src,
 }
 
 static void vp6_filter(VP56Context *s, uint8_t *dst, uint8_t *src,
-                       int offset1, int offset2, int stride,
+                       int offset1, int offset2, ptrdiff_t stride,
                        VP56mv mv, int mask, int select, int luma)
 {
     int filter4 = 0;
diff --git a/libavcodec/vp6dsp.c b/libavcodec/vp6dsp.c
index 54a96ed..c9968f2 100644
--- a/libavcodec/vp6dsp.c
+++ b/libavcodec/vp6dsp.c
@@ -27,7 +27,7 @@ 
 #include "vp56dsp.h"
 
 
-void ff_vp6_filter_diag4_c(uint8_t *dst, uint8_t *src, int stride,
+void ff_vp6_filter_diag4_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride,
                            const int16_t *h_weights, const int16_t *v_weights)
 {
     int x, y;
diff --git a/libavcodec/x86/vp6dsp.asm b/libavcodec/x86/vp6dsp.asm
index 80f8ca5..364d560 100644
--- a/libavcodec/x86/vp6dsp.asm
+++ b/libavcodec/x86/vp6dsp.asm
@@ -115,7 +115,7 @@  SECTION .text
 %endmacro
 
 %macro vp6_filter_diag4 0
-; void ff_vp6_filter_diag4_<opt>(uint8_t *dst, uint8_t *src, int stride,
+; void ff_vp6_filter_diag4_<opt>(uint8_t *dst, uint8_t *src, ptrdiff_t stride,
 ;                                const int16_t h_weight[4], const int16_t v_weights[4])
 cglobal vp6_filter_diag4, 5, 7, 8
     mov          r5, rsp         ; backup stack pointer
diff --git a/libavcodec/x86/vp6dsp_init.c b/libavcodec/x86/vp6dsp_init.c
index 9bf4178..472e034 100644
--- a/libavcodec/x86/vp6dsp_init.c
+++ b/libavcodec/x86/vp6dsp_init.c
@@ -25,9 +25,9 @@ 
 #include "libavutil/x86/cpu.h"
 #include "libavcodec/vp56dsp.h"
 
-void ff_vp6_filter_diag4_mmx(uint8_t *dst, uint8_t *src, int stride,
+void ff_vp6_filter_diag4_mmx(uint8_t *dst, uint8_t *src, ptrdiff_t stride,
                              const int16_t *h_weights,const int16_t *v_weights);
-void ff_vp6_filter_diag4_sse2(uint8_t *dst, uint8_t *src, int stride,
+void ff_vp6_filter_diag4_sse2(uint8_t *dst, uint8_t *src, ptrdiff_t stride,
                               const int16_t *h_weights,const int16_t *v_weights);
 
 av_cold void ff_vp6dsp_init_x86(VP56DSPContext* c, enum AVCodecID codec)