This patch introduces a new type, av_stride, which is set for any
representation of strides or linesize, including AVFrame and av_image_*
APIs. This is done in preparation of a future switch to ptrdiff_t, a
better suited type to represent this type of data, in a way that it is
atomically changed at the version bump.
---

This is a work in progress change that I was preparing and briefly discussed
on IRC today, based on suggestion by wm4. I wanted to share this early to
thread waters, as well as gather feedback on this approach. As a matter of
fact I haven't fully tested this yet, but if the idea is welcome, I will
extensively test it on Oracle.

The rationale of introducing this "temporary" type is to minimize impact on
downstream, allowing a long enough transition time to API users to change
their code. I say temporary because it is possible that in the very distant
future it would be nice to be able to just the standard type instead of a
custom one.

We considered other ideas, such as deprecating the current APIs and frame
fields and introducing setters and getters but they seemed less elegant and
more likely to induce annoying code breaks to our users.

Vittorio

 avtools/avconv_vda.c          |   2 +-
 avtools/avplay.c              |   2 +-
 libavcodec/avcodec.h          |   2 +-
 libavcodec/cinepakenc.c       |  42 +++++++-------
 libavcodec/decode.c           |   6 +-
 libavcodec/error_resilience.c |   8 +--
 libavcodec/ffv1dec.c          |   2 +-
 libavcodec/ffv1enc.c          |   2 +-
 libavcodec/internal.h         |   2 +-
 libavcodec/libvpxdec.c        |   7 ++-
 libavcodec/mmaldec.c          |   2 +-
 libavcodec/mpegvideoencdsp.c  |  12 ++--
 libavcodec/mpegvideoencdsp.h  |   4 +-
 libavcodec/nuv.c              |   2 +-
 libavcodec/omx.c              |   4 +-
 libavcodec/roqvideoenc.c      |   8 +--
 libavcodec/utils.c            |   2 +-
 libavfilter/drawutils.c       |   6 +-
 libavfilter/drawutils.h       |   7 ++-
 libavfilter/vf_framepack.c    |   2 +-
 libavfilter/vf_interlace.c    |   4 +-
 libavfilter/vf_showinfo.c     |   2 +-
 libavutil/avutil.h            |  13 ++++-
 libavutil/frame.c             |   4 +-
 libavutil/frame.h             |   2 +-
 libavutil/hwcontext_d3d11va.c |   4 +-
 libavutil/imgutils.c          |  27 ++++-----
 libavutil/imgutils.h          |  22 +++----
 libavutil/pixdesc.c           |   4 +-
 libavutil/pixdesc.h           |   5 +-
 libavutil/version.h           |   3 +
 libswscale/swscale.h          |   4 +-
 libswscale/swscale_internal.h |   4 +-
 libswscale/swscale_unscaled.c | 130 ++++++++++++++++++++----------------------
 libswscale/tests/swscale.c    |   6 +-
 libswscale/yuv2rgb.c          |   4 +-
 36 files changed, 191 insertions(+), 171 deletions(-)

diff --git a/avtools/avconv_vda.c b/avtools/avconv_vda.c
index d86076e79e..3f3156dbbc 100644
--- a/avtools/avconv_vda.c
+++ b/avtools/avconv_vda.c
@@ -34,7 +34,7 @@ static int vda_retrieve_data(AVCodecContext *s, AVFrame 
*frame)
     OSType pixel_format = CVPixelBufferGetPixelFormatType(pixbuf);
     CVReturn err;
     uint8_t *data[4] = { 0 };
-    int linesize[4] = { 0 };
+    av_stride linesize[4] = { 0 };
     int planes, ret, i;
 
     av_frame_unref(vda->tmp_frame);
diff --git a/avtools/avplay.c b/avtools/avplay.c
index b6dbc52cf7..3392bd34c2 100644
--- a/avtools/avplay.c
+++ b/avtools/avplay.c
@@ -1312,7 +1312,7 @@ static int queue_picture(PlayerState *is, AVFrame 
*src_frame, double pts, int64_
     /* if the frame is not skipped, then display it */
     if (vp->bmp) {
         uint8_t *data[4];
-        int linesize[4];
+        av_stride linesize[4];
 
         /* get a pointer on the bitmap */
         SDL_LockYUVOverlay (vp->bmp);
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 7eaa0c9277..c4f5168676 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -3203,7 +3203,7 @@ typedef struct AVSubtitleRect {
      * Can be set for text/ass as well once they are rendered.
      */
     uint8_t *data[4];
-    int linesize[4];
+    av_stride linesize[4];
 
     enum AVSubtitleType type;
 
diff --git a/libavcodec/cinepakenc.c b/libavcodec/cinepakenc.c
index c323bde30f..f8d5f0cbe6 100644
--- a/libavcodec/cinepakenc.c
+++ b/libavcodec/cinepakenc.c
@@ -444,8 +444,8 @@ static int encode_codebook(CinepakEncContext *s, int 
*codebook, int size,
 
 // sets out to the sub picture starting at (x,y) in in
 static void get_sub_picture(CinepakEncContext *s, int x, int y,
-                            uint8_t * in_data[4], int  in_linesize[4],
-                            uint8_t *out_data[4], int out_linesize[4])
+                            uint8_t * in_data[4], av_stride  in_linesize[4],
+                            uint8_t *out_data[4], av_stride out_linesize[4])
 {
     out_data[0]     = in_data[0] + x + y * in_linesize[0];
     out_linesize[0] = in_linesize[0];
@@ -461,7 +461,7 @@ static void get_sub_picture(CinepakEncContext *s, int x, 
int y,
 
 // decodes the V1 vector in mb into the 4x4 MB pointed to by data
 static void decode_v1_vector(CinepakEncContext *s, uint8_t *data[4],
-                             int linesize[4], int v1_vector, strip_info *info)
+                             av_stride linesize[4], int v1_vector, strip_info 
*info)
 {
     int entry_size = s->pix_fmt == AV_PIX_FMT_RGB24 ? 6 : 4;
 
@@ -500,7 +500,7 @@ static void decode_v1_vector(CinepakEncContext *s, uint8_t 
*data[4],
 
 // decodes the V4 vectors in mb into the 4x4 MB pointed to by data
 static void decode_v4_vector(CinepakEncContext *s, uint8_t *data[4],
-                             int linesize[4], int *v4_vector, strip_info *info)
+                             av_stride linesize[4], int *v4_vector, strip_info 
*info)
 {
     int i, x, y, entry_size = s->pix_fmt == AV_PIX_FMT_RGB24 ? 6 : 4;
 
@@ -520,8 +520,8 @@ static void decode_v4_vector(CinepakEncContext *s, uint8_t 
*data[4],
 }
 
 static void copy_mb(CinepakEncContext *s,
-                    uint8_t *a_data[4], int a_linesize[4],
-                    uint8_t *b_data[4], int b_linesize[4])
+                    uint8_t *a_data[4], av_stride a_linesize[4],
+                    uint8_t *b_data[4], av_stride b_linesize[4])
 {
     int y, p;
 
@@ -539,8 +539,8 @@ static void copy_mb(CinepakEncContext *s,
 }
 
 static int encode_mode(CinepakEncContext *s, int h,
-                       uint8_t *scratch_data[4], int scratch_linesize[4],
-                       uint8_t *last_data[4], int last_linesize[4],
+                       uint8_t *scratch_data[4], av_stride scratch_linesize[4],
+                       uint8_t *last_data[4], av_stride last_linesize[4],
                        strip_info *info, unsigned char *buf)
 {
     int x, y, z, flags, bits, temp_size, header_ofs, ret = 0, mb_count = s->w 
* h / MB_AREA;
@@ -548,7 +548,7 @@ static int encode_mode(CinepakEncContext *s, int h,
     unsigned char temp[64]; // 32/2 = 16 V4 blocks at 4 B each -> 64 B
     mb_info *mb;
     uint8_t *sub_scratch_data[4] = { 0 }, *sub_last_data[4] = { 0 };
-    int sub_scratch_linesize[4] = { 0 }, sub_last_linesize[4] = { 0 };
+    av_stride sub_scratch_linesize[4] = { 0 }, sub_last_linesize[4] = { 0 };
 
     // encode codebooks
     ////// MacOS vintage decoder compatibility dictates the presence of
@@ -684,8 +684,8 @@ static int encode_mode(CinepakEncContext *s, int h,
 
 // computes distortion of 4x4 MB in b compared to a
 static int compute_mb_distortion(CinepakEncContext *s,
-                                 uint8_t *a_data[4], int a_linesize[4],
-                                 uint8_t *b_data[4], int b_linesize[4])
+                                 uint8_t *a_data[4], av_stride a_linesize[4],
+                                 uint8_t *b_data[4], av_stride b_linesize[4])
 {
     int x, y, p, d, ret = 0;
 
@@ -711,7 +711,7 @@ static int compute_mb_distortion(CinepakEncContext *s,
 // return the possibly adjusted size of the codebook
 #define CERTAIN(x) ((x) != ENC_UNCERTAIN)
 static int quantize(CinepakEncContext *s, int h, uint8_t *data[4],
-                    int linesize[4], int v1mode, strip_info *info,
+                    av_stride linesize[4], int v1mode, strip_info *info,
                     mb_encoding encoding)
 {
     int x, y, i, j, k, x2, y2, x3, y3, plane, shift, mbn;
@@ -721,7 +721,7 @@ static int quantize(CinepakEncContext *s, int h, uint8_t 
*data[4],
     int64_t total_error = 0;
     uint8_t vq_pict_buf[(MB_AREA * 3) / 2];
     uint8_t     *sub_data[4],     *vq_data[4];
-    int      sub_linesize[4],  vq_linesize[4];
+    av_stride sub_linesize[4], vq_linesize[4];
 
     for (mbn = i = y = 0; y < h; y += MB_SIZE) {
         for (x = 0; x < s->w; x += MB_SIZE, ++mbn) {
@@ -826,13 +826,13 @@ static int quantize(CinepakEncContext *s, int h, uint8_t 
*data[4],
 }
 
 static void calculate_skip_errors(CinepakEncContext *s, int h,
-                                  uint8_t *last_data[4], int last_linesize[4],
-                                  uint8_t *data[4], int linesize[4],
+                                  uint8_t *last_data[4], av_stride 
last_linesize[4],
+                                  uint8_t *data[4], av_stride linesize[4],
                                   strip_info *info)
 {
     int x, y, i;
     uint8_t *sub_last_data    [4], *sub_pict_data    [4];
-    int      sub_last_linesize[4],  sub_pict_linesize[4];
+    av_stride sub_last_linesize[4], sub_pict_linesize[4];
 
     for (i = y = 0; y < h; y += MB_SIZE)
         for (x = 0; x < s->w; x += MB_SIZE, i++) {
@@ -867,9 +867,9 @@ static void write_strip_header(CinepakEncContext *s, int y, 
int h, int keyframe,
 }
 
 static int rd_strip(CinepakEncContext *s, int y, int h, int keyframe,
-                    uint8_t *last_data[4], int last_linesize[4],
-                    uint8_t *data[4], int linesize[4],
-                    uint8_t *scratch_data[4], int scratch_linesize[4],
+                    uint8_t *last_data[4], av_stride last_linesize[4],
+                    uint8_t *data[4], av_stride linesize[4],
+                    uint8_t *scratch_data[4], av_stride scratch_linesize[4],
                     unsigned char *buf, int64_t *best_score)
 {
     int64_t score = 0;
@@ -1003,7 +1003,7 @@ static int rd_frame(CinepakEncContext *s, const AVFrame 
*frame,
 {
     int num_strips, strip, i, y, nexty, size, temp_size, best_size;
     uint8_t *last_data    [4], *data    [4], *scratch_data    [4];
-    int      last_linesize[4],  linesize[4],  scratch_linesize[4];
+    av_stride last_linesize[4], linesize[4], scratch_linesize[4];
     int64_t best_score = 0, score, score_temp;
     int best_nstrips;
 
@@ -1087,7 +1087,7 @@ static int rd_frame(CinepakEncContext *s, const AVFrame 
*frame,
                                 data, linesize);
             else
                 get_sub_picture(s, 0, y,
-                                (uint8_t **)frame->data, (int 
*)frame->linesize,
+                                (uint8_t **)frame->data, (av_stride 
*)frame->linesize,
                                 data, linesize);
             get_sub_picture(s, 0, y,
                             s->last_frame->data, s->last_frame->linesize,
diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index 12a95d4221..1b490eab26 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -982,7 +982,7 @@ static int update_frame_pool(AVCodecContext *avctx, AVFrame 
*frame)
     switch (avctx->codec_type) {
     case AVMEDIA_TYPE_VIDEO: {
         uint8_t *data[4];
-        int linesize[4];
+        av_stride linesize[4];
         int size[4] = { 0 };
         int w = frame->width;
         int h = frame->height;
@@ -1036,17 +1036,19 @@ static int update_frame_pool(AVCodecContext *avctx, 
AVFrame *frame)
         int ch     = av_get_channel_layout_nb_channels(frame->channel_layout);
         int planar = av_sample_fmt_is_planar(frame->format);
         int planes = planar ? ch : 1;
+        int stride;
 
         if (pool->format == frame->format && pool->planes == planes &&
             pool->channels == ch && frame->nb_samples == pool->samples)
             return 0;
 
         av_buffer_pool_uninit(&pool->pools[0]);
-        ret = av_samples_get_buffer_size(&pool->linesize[0], ch,
+        ret = av_samples_get_buffer_size(&stride, ch,
                                          frame->nb_samples, frame->format, 0);
         if (ret < 0)
             goto fail;
 
+        pool->linesize[0] = stride;
         pool->pools[0] = av_buffer_pool_init(pool->linesize[0], NULL);
         if (!pool->pools[0]) {
             ret = AVERROR(ENOMEM);
diff --git a/libavcodec/error_resilience.c b/libavcodec/error_resilience.c
index 54b7b3cc0f..610e38c394 100644
--- a/libavcodec/error_resilience.c
+++ b/libavcodec/error_resilience.c
@@ -58,7 +58,7 @@ static void set_mv_strides(ERContext *s, ptrdiff_t *mv_step, 
ptrdiff_t *stride)
 static void put_dc(ERContext *s, uint8_t *dest_y, uint8_t *dest_cb,
                    uint8_t *dest_cr, int mb_x, int mb_y)
 {
-    int *linesize = s->cur_pic.f->linesize;
+    av_stride *linesize = s->cur_pic.f->linesize;
     int dc, dcu, dcv, y, i;
     for (i = 0; i < 4; i++) {
         dc = s->dc_val[0][mb_x * 2 + (i &  1) + (mb_y * 2 + (i >> 1)) * 
s->b8_stride];
@@ -575,7 +575,7 @@ skip_mean_and_median:
 skip_last_mv:
 
                     for (j = 0; j < pred_count; j++) {
-                        int *linesize = s->cur_pic.f->linesize;
+                        av_stride *linesize = s->cur_pic.f->linesize;
                         int score = 0;
                         uint8_t *src = s->cur_pic.f->data[0] +
                                        mb_x * 16 + mb_y * 16 * linesize[0];
@@ -695,7 +695,7 @@ static int is_intra_more_likely(ERContext *s)
                 continue;
 
             if (s->cur_pic.f->pict_type == AV_PICTURE_TYPE_I) {
-                int *linesize = s->cur_pic.f->linesize;
+                av_stride *linesize = s->cur_pic.f->linesize;
                 uint8_t *mb_ptr      = s->cur_pic.f->data[0] +
                                        mb_x * 16 + mb_y * 16 * linesize[0];
                 uint8_t *last_mb_ptr = s->last_pic.f->data[0] +
@@ -815,7 +815,7 @@ void ff_er_add_slice(ERContext *s, int startx, int starty,
 
 void ff_er_frame_end(ERContext *s)
 {
-    int *linesize = s->cur_pic.f->linesize;
+    av_stride *linesize = s->cur_pic.f->linesize;
     int i, mb_x, mb_y, error, error_type, dc_error, mv_error, ac_error;
     int distance;
     int threshold_part[4] = { 100, 100, 100 };
diff --git a/libavcodec/ffv1dec.c b/libavcodec/ffv1dec.c
index 07e66b9dbb..9e472208a6 100644
--- a/libavcodec/ffv1dec.c
+++ b/libavcodec/ffv1dec.c
@@ -206,7 +206,7 @@ static void decode_plane(FFV1Context *s, uint8_t *src,
 }
 
 static void decode_rgb_frame(FFV1Context *s, uint8_t *src[3], int w, int h,
-                             int stride[3])
+                             av_stride stride[3])
 {
     int x, y, p;
     int16_t *sample[4][2];
diff --git a/libavcodec/ffv1enc.c b/libavcodec/ffv1enc.c
index c5088bb545..b4b3d7d59e 100644
--- a/libavcodec/ffv1enc.c
+++ b/libavcodec/ffv1enc.c
@@ -287,7 +287,7 @@ static void encode_plane(FFV1Context *s, uint8_t *src, int 
w, int h,
 }
 
 static void encode_rgb_frame(FFV1Context *s, const uint8_t *src[3],
-                             int w, int h, const int stride[3])
+                             int w, int h, const av_stride stride[3])
 {
     int x, y, p, i;
     const int ring_size = s->context_model ? 3 : 2;
diff --git a/libavcodec/internal.h b/libavcodec/internal.h
index a619e977f6..73e63f5a6c 100644
--- a/libavcodec/internal.h
+++ b/libavcodec/internal.h
@@ -92,7 +92,7 @@ typedef struct FramePool {
     int format;
     int width, height;
     int stride_align[AV_NUM_DATA_POINTERS];
-    int linesize[4];
+    av_stride linesize[4];
     int planes;
     int channels;
     int samples;
diff --git a/libavcodec/libvpxdec.c b/libavcodec/libvpxdec.c
index 84806702fb..dd89878581 100644
--- a/libavcodec/libvpxdec.c
+++ b/libavcodec/libvpxdec.c
@@ -66,7 +66,7 @@ static int vp8_decode(AVCodecContext *avctx,
     AVFrame *picture = data;
     const void *iter = NULL;
     struct vpx_image *img;
-    int ret;
+    int i, ret;
 
     if (vpx_codec_decode(&ctx->decoder, avpkt->data, avpkt->size, NULL, 0) !=
         VPX_CODEC_OK) {
@@ -81,6 +81,7 @@ static int vp8_decode(AVCodecContext *avctx,
     }
 
     if ((img = vpx_codec_get_frame(&ctx->decoder, &iter))) {
+        av_stride strides[4];
         avctx->pix_fmt = ff_vpx_imgfmt_to_pixfmt(img->fmt);
         if (avctx->pix_fmt == AV_PIX_FMT_NONE) {
             av_log(avctx, AV_LOG_ERROR, "Unsupported output colorspace (%d)\n",
@@ -98,7 +99,9 @@ static int vp8_decode(AVCodecContext *avctx,
         if ((ret = ff_get_buffer(avctx, picture, 0)) < 0)
             return ret;
         av_image_copy(picture->data, picture->linesize, (const uint8_t **) 
img->planes,
-                      img->stride, avctx->pix_fmt, img->d_w, img->d_h);
+                      strides, avctx->pix_fmt, img->d_w, img->d_h);
+        for (i = 0; i < 4; i++)
+            img->stride[i] = strides[i];
 #if VPX_IMAGE_ABI_VERSION >= 4
         switch (img->range) {
         case VPX_CR_STUDIO_RANGE:
diff --git a/libavcodec/mmaldec.c b/libavcodec/mmaldec.c
index 504e765d07..4770a3b7e5 100644
--- a/libavcodec/mmaldec.c
+++ b/libavcodec/mmaldec.c
@@ -621,7 +621,7 @@ static int ffmal_copy_frame(AVCodecContext *avctx,  AVFrame 
*frame,
         int w = FFALIGN(avctx->width, 32);
         int h = FFALIGN(avctx->height, 16);
         uint8_t *src[4];
-        int linesize[4];
+        av_stride linesize[4];
 
         if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
             goto done;
diff --git a/libavcodec/mpegvideoencdsp.c b/libavcodec/mpegvideoencdsp.c
index 279d233fbc..5847ed19d9 100644
--- a/libavcodec/mpegvideoencdsp.c
+++ b/libavcodec/mpegvideoencdsp.c
@@ -142,8 +142,8 @@ static void draw_edges_8_c(uint8_t *buf, int wrap, int 
width, int height,
 }
 
 /* 2x2 -> 1x1 */
-static void shrink22(uint8_t *dst, int dst_wrap,
-                     const uint8_t *src, int src_wrap,
+static void shrink22(uint8_t *dst, av_stride dst_wrap,
+                     const uint8_t *src, av_stride src_wrap,
                      int width, int height)
 {
     int w;
@@ -175,8 +175,8 @@ static void shrink22(uint8_t *dst, int dst_wrap,
 }
 
 /* 4x4 -> 1x1 */
-static void shrink44(uint8_t *dst, int dst_wrap,
-                     const uint8_t *src, int src_wrap,
+static void shrink44(uint8_t *dst, av_stride dst_wrap,
+                     const uint8_t *src, av_stride src_wrap,
                      int width, int height)
 {
     int w;
@@ -206,8 +206,8 @@ static void shrink44(uint8_t *dst, int dst_wrap,
 }
 
 /* 8x8 -> 1x1 */
-static void shrink88(uint8_t *dst, int dst_wrap,
-                     const uint8_t *src, int src_wrap,
+static void shrink88(uint8_t *dst, av_stride dst_wrap,
+                     const uint8_t *src, av_stride src_wrap,
                      int width, int height)
 {
     int w, i;
diff --git a/libavcodec/mpegvideoencdsp.h b/libavcodec/mpegvideoencdsp.h
index 91a292a296..0f78392fa8 100644
--- a/libavcodec/mpegvideoencdsp.h
+++ b/libavcodec/mpegvideoencdsp.h
@@ -37,8 +37,8 @@ typedef struct MpegvideoEncDSPContext {
     int (*pix_sum)(uint8_t *pix, int line_size);
     int (*pix_norm1)(uint8_t *pix, int line_size);
 
-    void (*shrink[4])(uint8_t *dst, int dst_wrap, const uint8_t *src,
-                      int src_wrap, int width, int height);
+    void (*shrink[4])(uint8_t *dst, av_stride dst_wrap, const uint8_t *src,
+                      av_stride src_wrap, int width, int height);
 
     void (*draw_edges)(uint8_t *buf, int wrap, int width, int height,
                        int w, int h, int sides);
diff --git a/libavcodec/nuv.c b/libavcodec/nuv.c
index 92c1fdaf90..4d965645f3 100644
--- a/libavcodec/nuv.c
+++ b/libavcodec/nuv.c
@@ -75,7 +75,7 @@ static const uint8_t fallback_cquant[] = {
 static void copy_frame(AVFrame *f, const uint8_t *src, int width, int height)
 {
     uint8_t *src_data[4];
-    int src_linesize[4];
+    av_stride src_linesize[4];
     av_image_fill_arrays(src_data, src_linesize, src,
                          f->format, width, height, 1);
     av_image_copy(f->data, f->linesize, src_data, src_linesize,
diff --git a/libavcodec/omx.c b/libavcodec/omx.c
index f43e92ae88..b99c1af191 100644
--- a/libavcodec/omx.c
+++ b/libavcodec/omx.c
@@ -728,7 +728,7 @@ static int omx_encode_frame(AVCodecContext *avctx, AVPacket 
*pkt,
 
     if (frame) {
         uint8_t *dst[4];
-        int linesize[4];
+        av_stride linesize[4];
         int need_copy;
         buffer = get_buffer(&s->input_mutex, &s->input_cond,
                             &s->num_free_in_buffers, s->free_in_buffers, 1);
@@ -737,7 +737,7 @@ static int omx_encode_frame(AVCodecContext *avctx, AVPacket 
*pkt,
 
         if (s->input_zerocopy) {
             uint8_t *src[4] = { NULL };
-            int src_linesize[4];
+            av_stride src_linesize[4];
             av_image_fill_arrays(src, src_linesize, frame->data[0], 
avctx->pix_fmt, s->stride, s->plane_size, 1);
             if (frame->linesize[0] == src_linesize[0] &&
                 frame->linesize[1] == src_linesize[1] &&
diff --git a/libavcodec/roqvideoenc.c b/libavcodec/roqvideoenc.c
index 6421ccc856..2686cbe46c 100644
--- a/libavcodec/roqvideoenc.c
+++ b/libavcodec/roqvideoenc.c
@@ -127,7 +127,7 @@ static inline int eval_sse(const uint8_t *a, const uint8_t 
*b, int count)
 // FIXME Could use DSPContext.sse, but it is not so speed critical (used
 // just for motion estimation).
 static int block_sse(uint8_t * const *buf1, uint8_t * const *buf2, int x1, int 
y1,
-                     int x2, int y2, const int *stride1, const int *stride2, 
int size)
+                     int x2, int y2, const av_stride *stride1, const av_stride 
*stride2, int size)
 {
     int i, k;
     int sse=0;
@@ -268,7 +268,7 @@ static void get_frame_mb(const AVFrame *frame, int x, int 
y, uint8_t mb[], int d
     int i, j, cp;
 
     for (cp=0; cp<3; cp++) {
-        int stride = frame->linesize[cp];
+        av_stride stride = frame->linesize[cp];
         for (i=0; i<dim; i++)
             for (j=0; j<dim; j++)
                 *mb++ = frame->data[cp][(y+i)*stride + x + j];
@@ -742,13 +742,13 @@ static void reconstruct_and_encode_image(RoqContext *enc, 
RoqTempdata *tempData,
  * Create a single YUV cell from a 2x2 section of the image
  */
 static inline void frame_block_to_cell(uint8_t *block, uint8_t * const *data,
-                                       int top, int left, const int *stride)
+                                       int top, int left, const av_stride 
*stride)
 {
     int i, j, u=0, v=0;
 
     for (i=0; i<2; i++)
         for (j=0; j<2; j++) {
-            int x = (top+i)*stride[0] + left + j;
+            av_stride x = (top+i)*stride[0] + left + j;
             *block++ = data[0][x];
             x = (top+i)*stride[1] + left + j;
             u       += data[1][x];
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index ba3457664a..ec52f58b0e 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -301,7 +301,7 @@ int avcodec_fill_audio_frame(AVFrame *frame, int 
nb_channels,
         frame->extended_data = frame->data;
     }
 
-    if ((ret = av_samples_fill_arrays(frame->extended_data, 
&frame->linesize[0],
+    if ((ret = av_samples_fill_arrays(frame->extended_data, 
(int*)&frame->linesize[0],
                                       buf, nb_channels, frame->nb_samples,
                                       sample_fmt, align)) < 0) {
         if (frame->extended_data != frame->data)
diff --git a/libavfilter/drawutils.c b/libavfilter/drawutils.c
index e837760459..06776d9580 100644
--- a/libavfilter/drawutils.c
+++ b/libavfilter/drawutils.c
@@ -79,7 +79,7 @@ int ff_fill_line_with_color(uint8_t *line[4], int 
pixel_step[4], int w, uint8_t
     return 0;
 }
 
-void ff_draw_rectangle(uint8_t *dst[4], int dst_linesize[4],
+void ff_draw_rectangle(uint8_t *dst[4], av_stride dst_linesize[4],
                        uint8_t *src[4], int pixelstep[4],
                        int hsub, int vsub, int x, int y, int w, int h)
 {
@@ -99,8 +99,8 @@ void ff_draw_rectangle(uint8_t *dst[4], int dst_linesize[4],
     }
 }
 
-void ff_copy_rectangle(uint8_t *dst[4], int dst_linesize[4],
-                       uint8_t *src[4], int src_linesize[4], int pixelstep[4],
+void ff_copy_rectangle(uint8_t *dst[4], av_stride dst_linesize[4],
+                       uint8_t *src[4], av_stride src_linesize[4], int 
pixelstep[4],
                        int hsub, int vsub, int x, int y, int y2, int w, int h)
 {
     int i, plane;
diff --git a/libavfilter/drawutils.h b/libavfilter/drawutils.h
index 73f482e83e..e74e0171dd 100644
--- a/libavfilter/drawutils.h
+++ b/libavfilter/drawutils.h
@@ -25,6 +25,7 @@
  */
 
 #include <stdint.h>
+#include "libavutil/avutil.h"
 #include "libavutil/pixfmt.h"
 
 int ff_fill_line_with_color(uint8_t *line[4], int pixel_step[4], int w,
@@ -32,12 +33,12 @@ int ff_fill_line_with_color(uint8_t *line[4], int 
pixel_step[4], int w,
                             enum AVPixelFormat pix_fmt, uint8_t rgba_color[4],
                             int *is_packed_rgba, uint8_t rgba_map[4]);
 
-void ff_draw_rectangle(uint8_t *dst[4], int dst_linesize[4],
+void ff_draw_rectangle(uint8_t *dst[4], av_stride dst_linesize[4],
                        uint8_t *src[4], int pixelstep[4],
                        int hsub, int vsub, int x, int y, int w, int h);
 
-void ff_copy_rectangle(uint8_t *dst[4], int dst_linesize[4],
-                       uint8_t *src[4], int src_linesize[4], int pixelstep[4],
+void ff_copy_rectangle(uint8_t *dst[4], av_stride dst_linesize[4],
+                       uint8_t *src[4], av_stride src_linesize[4], int 
pixelstep[4],
                        int hsub, int vsub, int x, int y, int y2, int w, int h);
 
 #endif /* AVFILTER_DRAWUTILS_H */
diff --git a/libavfilter/vf_framepack.c b/libavfilter/vf_framepack.c
index 64457b4501..fce25400dc 100644
--- a/libavfilter/vf_framepack.c
+++ b/libavfilter/vf_framepack.c
@@ -218,7 +218,7 @@ static void vertical_frame_pack(AVFilterLink *outlink,
     for (i = 0; i < 2; i++) {
         const uint8_t *src[4];
         uint8_t *dst[4];
-        int linesizes[4];
+        av_stride linesizes[4];
         int sub_h = s->input_views[i]->height >> s->pix_desc->log2_chroma_h;
 
         src[0] = s->input_views[i]->data[0];
diff --git a/libavfilter/vf_interlace.c b/libavfilter/vf_interlace.c
index ac435d768a..d15d188b29 100644
--- a/libavfilter/vf_interlace.c
+++ b/libavfilter/vf_interlace.c
@@ -153,8 +153,8 @@ static void copy_picture_field(InterlaceContext *s,
             dstp += dst_frame->linesize[plane];
         }
         if (lowpass) {
-            int srcp_linesize = src_frame->linesize[plane] * 2;
-            int dstp_linesize = dst_frame->linesize[plane] * 2;
+            av_stride srcp_linesize = src_frame->linesize[plane] * 2;
+            av_stride dstp_linesize = dst_frame->linesize[plane] * 2;
             for (j = lines; j > 0; j--) {
                 const uint8_t *srcp_above = srcp - src_frame->linesize[plane];
                 const uint8_t *srcp_below = srcp + src_frame->linesize[plane];
diff --git a/libavfilter/vf_showinfo.c b/libavfilter/vf_showinfo.c
index d5605e6922..250e9546e0 100644
--- a/libavfilter/vf_showinfo.c
+++ b/libavfilter/vf_showinfo.c
@@ -106,7 +106,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame 
*frame)
     for (plane = 0; frame->data[plane] && plane < 4; plane++) {
         uint8_t *data = frame->data[plane];
         int h = plane == 1 || plane == 2 ? inlink->h >> vsub : inlink->h;
-        int linesize = av_image_get_linesize(frame->format, frame->width, 
plane);
+        av_stride linesize = av_image_get_linesize(frame->format, 
frame->width, plane);
         if (linesize < 0)
             return linesize;
 
diff --git a/libavutil/avutil.h b/libavutil/avutil.h
index 2339fe3c9c..582554a6a4 100644
--- a/libavutil/avutil.h
+++ b/libavutil/avutil.h
@@ -262,6 +262,18 @@ enum AVMediaType {
  * @{
  */
 
+#include "version.h"
+
+/**
+ * Safe type defining the correct C type for linesize/stride/pitch arrays,
+ * and pointer offsets.
+ */
+#if FF_API_STRIDE_TYPE
+#define av_stride int
+#else
+#define av_stride ptrdiff_t
+#endif
+
 enum AVPictureType {
     AV_PICTURE_TYPE_I = 1, ///< Intra
     AV_PICTURE_TYPE_P,     ///< Predicted
@@ -287,7 +299,6 @@ char av_get_picture_type_char(enum AVPictureType pict_type);
 
 #include "error.h"
 #include "rational.h"
-#include "version.h"
 #include "macros.h"
 
 /**
diff --git a/libavutil/frame.c b/libavutil/frame.c
index db3897c299..ea1cad65fa 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -146,11 +146,13 @@ static int get_audio_buffer(AVFrame *frame, int align)
     int ret, i;
 
     if (!frame->linesize[0]) {
-        ret = av_samples_get_buffer_size(&frame->linesize[0], channels,
+        int stride;
+        ret = av_samples_get_buffer_size(&stride, channels,
                                          frame->nb_samples, frame->format,
                                          align);
         if (ret < 0)
             return ret;
+        frame->linesize[0] = stride;
     }
 
     if (planes > AV_NUM_DATA_POINTERS) {
diff --git a/libavutil/frame.h b/libavutil/frame.h
index ff3fe46dd6..659ba6af2c 100644
--- a/libavutil/frame.h
+++ b/libavutil/frame.h
@@ -162,7 +162,7 @@ typedef struct AVFrame {
      * @note The linesize may be larger than the size of usable data -- there
      * may be extra padding present for performance reasons.
      */
-    int linesize[AV_NUM_DATA_POINTERS];
+    av_stride linesize[AV_NUM_DATA_POINTERS];
 
     /**
      * pointers to the data planes/channels.
diff --git a/libavutil/hwcontext_d3d11va.c b/libavutil/hwcontext_d3d11va.c
index 0a8cc5bc21..d7f0d36e9b 100644
--- a/libavutil/hwcontext_d3d11va.c
+++ b/libavutil/hwcontext_d3d11va.c
@@ -323,7 +323,7 @@ static int d3d11va_create_staging_texture(AVHWFramesContext 
*ctx)
     return 0;
 }
 
-static void fill_texture_ptrs(uint8_t *data[4], int linesize[4],
+static void fill_texture_ptrs(uint8_t *data[4], av_stride linesize[4],
                               AVHWFramesContext *ctx,
                               D3D11_TEXTURE2D_DESC *desc,
                               D3D11_MAPPED_SUBRESOURCE *map)
@@ -352,7 +352,7 @@ static int d3d11va_transfer_data(AVHWFramesContext *ctx, 
AVFrame *dst,
     int w = FFMIN(dst->width,  src->width);
     int h = FFMIN(dst->height, src->height);
     uint8_t *map_data[4];
-    int map_linesize[4];
+    av_stride map_linesize[4];
     D3D11_TEXTURE2D_DESC desc;
     D3D11_MAPPED_SUBRESOURCE map;
     HRESULT hr;
diff --git a/libavutil/imgutils.c b/libavutil/imgutils.c
index 662962252b..0872f00e40 100644
--- a/libavutil/imgutils.c
+++ b/libavutil/imgutils.c
@@ -49,7 +49,7 @@ void av_image_fill_max_pixsteps(int max_pixsteps[4], int 
max_pixstep_comps[4],
     }
 }
 
-int av_image_get_linesize(enum AVPixelFormat pix_fmt, int width, int plane)
+av_stride av_image_get_linesize(enum AVPixelFormat pix_fmt, int width, int 
plane)
 {
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
     int max_step     [4];       /* max pixel step for each plane */
@@ -67,7 +67,7 @@ int av_image_get_linesize(enum AVPixelFormat pix_fmt, int 
width, int plane)
     return max_step[plane] * (((width + (1 << s) - 1)) >> s);
 }
 
-int av_image_fill_linesizes(int linesizes[4], enum AVPixelFormat pix_fmt, int 
width)
+int av_image_fill_linesizes(av_stride linesizes[4], enum AVPixelFormat 
pix_fmt, int width)
 {
     int i;
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
@@ -99,7 +99,7 @@ int av_image_fill_linesizes(int linesizes[4], enum 
AVPixelFormat pix_fmt, int wi
 }
 
 int av_image_fill_pointers(uint8_t *data[4], enum AVPixelFormat pix_fmt, int 
height,
-                           uint8_t *ptr, const int linesizes[4])
+                           uint8_t *ptr, const av_stride linesizes[4])
 {
     int i, total_size, size[4] = { 0 }, has_plane[4] = { 0 };
 
@@ -180,7 +180,7 @@ int avpriv_set_systematic_pal2(uint32_t pal[256], enum 
AVPixelFormat pix_fmt)
     return 0;
 }
 
-int av_image_alloc(uint8_t *pointers[4], int linesizes[4],
+int av_image_alloc(uint8_t *pointers[4], av_stride linesizes[4],
                    int w, int h, enum AVPixelFormat pix_fmt, int align)
 {
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
@@ -288,8 +288,8 @@ static void image_copy_plane_uc_from(uint8_t       *dst, 
ptrdiff_t dst_linesize,
         image_copy_plane(dst, dst_linesize, src, src_linesize, bytewidth, 
height);
 }
 
-void av_image_copy_plane(uint8_t       *dst, int dst_linesize,
-                         const uint8_t *src, int src_linesize,
+void av_image_copy_plane(uint8_t       *dst, av_stride dst_linesize,
+                         const uint8_t *src, av_stride src_linesize,
                          int bytewidth, int height)
 {
     image_copy_plane(dst, dst_linesize, src, src_linesize, bytewidth, height);
@@ -332,8 +332,8 @@ static void image_copy(uint8_t *dst_data[4], const 
ptrdiff_t dst_linesizes[4],
     }
 }
 
-void av_image_copy(uint8_t *dst_data[4], int dst_linesizes[4],
-                   const uint8_t *src_data[4], const int src_linesizes[4],
+void av_image_copy(uint8_t *dst_data[4], av_stride dst_linesizes[4],
+                   const uint8_t *src_data[4], const av_stride 
src_linesizes[4],
                    enum AVPixelFormat pix_fmt, int width, int height)
 {
     ptrdiff_t dst_linesizes1[4], src_linesizes1[4];
@@ -356,7 +356,7 @@ void av_image_copy_uc_from(uint8_t *dst_data[4], const 
ptrdiff_t dst_linesizes[4
                width, height, image_copy_plane_uc_from);
 }
 
-int av_image_fill_arrays(uint8_t *dst_data[4], int dst_linesize[4],
+int av_image_fill_arrays(uint8_t *dst_data[4], av_stride dst_linesize[4],
                          const uint8_t *src, enum AVPixelFormat pix_fmt,
                          int width, int height, int align)
 {
@@ -380,7 +380,7 @@ int av_image_get_buffer_size(enum AVPixelFormat pix_fmt,
                              int width, int height, int align)
 {
     uint8_t *data[4];
-    int linesize[4];
+    av_stride linesize[4];
     int ret;
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
     if (!desc)
@@ -400,11 +400,12 @@ int av_image_get_buffer_size(enum AVPixelFormat pix_fmt,
 
 int av_image_copy_to_buffer(uint8_t *dst, int dst_size,
                             const uint8_t * const src_data[4],
-                            const int src_linesize[4],
+                            const av_stride src_linesize[4],
                             enum AVPixelFormat pix_fmt,
                             int width, int height, int align)
 {
-    int i, j, nb_planes = 0, linesize[4];
+    int i, j, nb_planes = 0;
+    av_stride linesize[4];
     int size = av_image_get_buffer_size(pix_fmt, width, height, align);
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
 
@@ -549,7 +550,7 @@ int av_image_fill_black(uint8_t *dst_data[4], const 
ptrdiff_t dst_linesize[4],
         // (Multiple pixels happen e.g. with AV_PIX_FMT_UYVY422.)
         int w = clear_block_size[comp.plane] / comp.step;
         uint8_t *c_data[4];
-        const int c_linesize[4] = {0};
+        const av_stride c_linesize[4] = {0};
         uint16_t src_array[MAX_BLOCK_SIZE];
         uint16_t src = 0;
         int x;
diff --git a/libavutil/imgutils.h b/libavutil/imgutils.h
index ae2e6287eb..7599fe006b 100644
--- a/libavutil/imgutils.h
+++ b/libavutil/imgutils.h
@@ -56,7 +56,7 @@ void av_image_fill_max_pixsteps(int max_pixsteps[4], int 
max_pixstep_comps[4],
  *
  * @return the computed size in bytes
  */
-int av_image_get_linesize(enum AVPixelFormat pix_fmt, int width, int plane);
+av_stride av_image_get_linesize(enum AVPixelFormat pix_fmt, int width, int 
plane);
 
 /**
  * Fill plane linesizes for an image with pixel format pix_fmt and
@@ -65,7 +65,7 @@ int av_image_get_linesize(enum AVPixelFormat pix_fmt, int 
width, int plane);
  * @param linesizes array to be filled with the linesize for each plane
  * @return >= 0 in case of success, a negative error code otherwise
  */
-int av_image_fill_linesizes(int linesizes[4], enum AVPixelFormat pix_fmt, int 
width);
+int av_image_fill_linesizes(av_stride linesizes[4], enum AVPixelFormat 
pix_fmt, int width);
 
 /**
  * Fill plane data pointers for an image with pixel format pix_fmt and
@@ -79,7 +79,7 @@ int av_image_fill_linesizes(int linesizes[4], enum 
AVPixelFormat pix_fmt, int wi
  * error code in case of failure
  */
 int av_image_fill_pointers(uint8_t *data[4], enum AVPixelFormat pix_fmt, int 
height,
-                           uint8_t *ptr, const int linesizes[4]);
+                           uint8_t *ptr, const av_stride linesizes[4]);
 
 /**
  * Allocate an image with size w and h and pixel format pix_fmt, and
@@ -91,7 +91,7 @@ int av_image_fill_pointers(uint8_t *data[4], enum 
AVPixelFormat pix_fmt, int hei
  * @return the size in bytes required for the image buffer, a negative
  * error code in case of failure
  */
-int av_image_alloc(uint8_t *pointers[4], int linesizes[4],
+int av_image_alloc(uint8_t *pointers[4], av_stride linesizes[4],
                    int w, int h, enum AVPixelFormat pix_fmt, int align);
 
 /**
@@ -103,8 +103,8 @@ int av_image_alloc(uint8_t *pointers[4], int linesizes[4],
  * @param dst_linesize linesize for the image plane in dst
  * @param src_linesize linesize for the image plane in src
  */
-void av_image_copy_plane(uint8_t       *dst, int dst_linesize,
-                         const uint8_t *src, int src_linesize,
+void av_image_copy_plane(uint8_t       *dst, av_stride dst_linesize,
+                         const uint8_t *src, av_stride src_linesize,
                          int bytewidth, int height);
 
 /**
@@ -113,8 +113,8 @@ void av_image_copy_plane(uint8_t       *dst, int 
dst_linesize,
  * @param dst_linesizes linesizes for the image in dst_data
  * @param src_linesizes linesizes for the image in src_data
  */
-void av_image_copy(uint8_t *dst_data[4], int dst_linesizes[4],
-                   const uint8_t *src_data[4], const int src_linesizes[4],
+void av_image_copy(uint8_t *dst_data[4], av_stride dst_linesizes[4],
+                   const uint8_t *src_data[4], const av_stride 
src_linesizes[4],
                    enum AVPixelFormat pix_fmt, int width, int height);
 
 /**
@@ -127,7 +127,7 @@ void av_image_copy(uint8_t *dst_data[4], int 
dst_linesizes[4],
  * by the CPU architecture.
  *
  * @note The linesize parameters have the type ptrdiff_t here, while they are
- *       int for av_image_copy().
+ *       int for av_image_copy() (at least until av_stride type is updated).
  * @note On x86, the linesizes currently need to be aligned to the cacheline
  *       size (i.e. 64) to get improved performance.
  */
@@ -161,7 +161,7 @@ void av_image_copy_uc_from(uint8_t *dst_data[4],       
const ptrdiff_t dst_lines
  * @return the size in bytes required for src, a negative error code
  * in case of failure
  */
-int av_image_fill_arrays(uint8_t *dst_data[4], int dst_linesize[4],
+int av_image_fill_arrays(uint8_t *dst_data[4], av_stride dst_linesize[4],
                          const uint8_t *src,
                          enum AVPixelFormat pix_fmt, int width, int height, 
int align);
 
@@ -195,7 +195,7 @@ int av_image_get_buffer_size(enum AVPixelFormat pix_fmt, 
int width, int height,
  * (error code) on error
  */
 int av_image_copy_to_buffer(uint8_t *dst, int dst_size,
-                            const uint8_t * const src_data[4], const int 
src_linesize[4],
+                            const uint8_t * const src_data[4], const av_stride 
src_linesize[4],
                             enum AVPixelFormat pix_fmt, int width, int height, 
int align);
 
 /**
diff --git a/libavutil/pixdesc.c b/libavutil/pixdesc.c
index 957f99fdaa..4d0e051365 100644
--- a/libavutil/pixdesc.c
+++ b/libavutil/pixdesc.c
@@ -31,7 +31,7 @@
 #include "version.h"
 
 void av_read_image_line(uint16_t *dst,
-                        const uint8_t *data[4], const int linesize[4],
+                        const uint8_t *data[4], const av_stride linesize[4],
                         const AVPixFmtDescriptor *desc,
                         int x, int y, int c, int w,
                         int read_pal_component)
@@ -79,7 +79,7 @@ void av_read_image_line(uint16_t *dst,
 }
 
 void av_write_image_line(const uint16_t *src,
-                         uint8_t *data[4], const int linesize[4],
+                         uint8_t *data[4], const av_stride linesize[4],
                          const AVPixFmtDescriptor *desc,
                          int x, int y, int c, int w)
 {
diff --git a/libavutil/pixdesc.h b/libavutil/pixdesc.h
index 4e8a29e607..65b0cd2bb7 100644
--- a/libavutil/pixdesc.h
+++ b/libavutil/pixdesc.h
@@ -25,6 +25,7 @@
 #include <inttypes.h>
 
 #include "attributes.h"
+#include "avutil.h"
 #include "pixfmt.h"
 
 typedef struct AVComponentDescriptor {
@@ -176,7 +177,7 @@ typedef struct AVPixFmtDescriptor {
  * data[0]. The behavior is undefined if the format is not paletted.
  */
 void av_read_image_line(uint16_t *dst, const uint8_t *data[4],
-                        const int linesize[4], const AVPixFmtDescriptor *desc,
+                        const av_stride linesize[4], const AVPixFmtDescriptor 
*desc,
                         int x, int y, int c, int w, int read_pal_component);
 
 /**
@@ -194,7 +195,7 @@ void av_read_image_line(uint16_t *dst, const uint8_t 
*data[4],
  * values to write to the image line
  */
 void av_write_image_line(const uint16_t *src, uint8_t *data[4],
-                         const int linesize[4], const AVPixFmtDescriptor *desc,
+                         const av_stride linesize[4], const AVPixFmtDescriptor 
*desc,
                          int x, int y, int c, int w);
 
 /**
diff --git a/libavutil/version.h b/libavutil/version.h
index 4a9fffef43..e7884811aa 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -96,6 +96,9 @@
 #ifndef FF_API_CRYPTO_SIZE_T
 #define FF_API_CRYPTO_SIZE_T            (LIBAVUTIL_VERSION_MAJOR < 57)
 #endif
+#ifndef FF_API_STRIDE_TYPE
+#define FF_API_STRIDE_TYPE              (LIBAVUTIL_VERSION_MAJOR < 57)
+#endif
 
 
 /**
diff --git a/libswscale/swscale.h b/libswscale/swscale.h
index 68ca100542..d2d392a74e 100644
--- a/libswscale/swscale.h
+++ b/libswscale/swscale.h
@@ -205,8 +205,8 @@ struct SwsContext *sws_getContext(int srcW, int srcH, enum 
AVPixelFormat srcForm
  * @return          the height of the output slice
  */
 int sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[],
-              const int srcStride[], int srcSliceY, int srcSliceH,
-              uint8_t *const dst[], const int dstStride[]);
+              const av_stride srcStride[], int srcSliceY, int srcSliceH,
+              uint8_t *const dst[], const av_stride dstStride[]);
 
 /**
  * @param inv_table the yuv2rgb coefficients, normally ff_yuv2rgb_coeffs[x]
diff --git a/libswscale/swscale_internal.h b/libswscale/swscale_internal.h
index adfe1708e1..480f40a33f 100644
--- a/libswscale/swscale_internal.h
+++ b/libswscale/swscale_internal.h
@@ -56,8 +56,8 @@
 struct SwsContext;
 
 typedef int (*SwsFunc)(struct SwsContext *context, const uint8_t *src[],
-                       int srcStride[], int srcSliceY, int srcSliceH,
-                       uint8_t *dst[], int dstStride[]);
+                       av_stride srcStride[], int srcSliceY, int srcSliceH,
+                       uint8_t *dst[], av_stride dstStride[]);
 
 /**
  * Write one line of horizontally scaled data to planar output
diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c
index f130ac58cb..87a94720e9 100644
--- a/libswscale/swscale_unscaled.c
+++ b/libswscale/swscale_unscaled.c
@@ -86,7 +86,7 @@ DECLARE_ALIGNED(8, static const uint8_t, 
dither_8x8_256)[8][8] = {
 #define RV ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
 #define RU (-(int) (0.169 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
 
-static void fillPlane(uint8_t *plane, int stride, int width, int height, int y,
+static void fillPlane(uint8_t *plane, av_stride stride, int width, int height, 
int y,
                       uint8_t val)
 {
     int i;
@@ -97,7 +97,7 @@ static void fillPlane(uint8_t *plane, int stride, int width, 
int height, int y,
     }
 }
 
-static void fill_plane9or10(uint8_t *plane, int stride, int width,
+static void fill_plane9or10(uint8_t *plane, av_stride stride, int width,
                             int height, int y, uint8_t val,
                             const int dst_depth, const int big_endian)
 {
@@ -118,9 +118,9 @@ static void fill_plane9or10(uint8_t *plane, int stride, int 
width,
     }
 }
 
-static void copyPlane(const uint8_t *src, int srcStride,
+static void copyPlane(const uint8_t *src, av_stride srcStride,
                       int srcSliceY, int srcSliceH, int width,
-                      uint8_t *dst, int dstStride)
+                      uint8_t *dst, av_stride dstStride)
 {
     dst += dstStride * srcSliceY;
     if (dstStride == srcStride && srcStride > 0) {
@@ -136,9 +136,9 @@ static void copyPlane(const uint8_t *src, int srcStride,
 }
 
 static int planarToNv12Wrapper(SwsContext *c, const uint8_t *src[],
-                               int srcStride[], int srcSliceY,
+                               av_stride srcStride[], int srcSliceY,
                                int srcSliceH, uint8_t *dstParam[],
-                               int dstStride[])
+                               av_stride dstStride[])
 {
     uint8_t *dst = dstParam[1] + dstStride[1] * srcSliceY / 2;
 
@@ -156,9 +156,9 @@ static int planarToNv12Wrapper(SwsContext *c, const uint8_t 
*src[],
 }
 
 static int nv12ToPlanarWrapper(SwsContext *c, const uint8_t *src[],
-                               int srcStride[], int srcSliceY,
+                               av_stride srcStride[], int srcSliceY,
                                int srcSliceH, uint8_t *dstParam[],
-                               int dstStride[])
+                               av_stride dstStride[])
 {
     uint8_t *dst1 = dstParam[1] + dstStride[1] * srcSliceY / 2;
     uint8_t *dst2 = dstParam[2] + dstStride[2] * srcSliceY / 2;
@@ -177,8 +177,8 @@ static int nv12ToPlanarWrapper(SwsContext *c, const uint8_t 
*src[],
 }
 
 static int planarToYuy2Wrapper(SwsContext *c, const uint8_t *src[],
-                               int srcStride[], int srcSliceY, int srcSliceH,
-                               uint8_t *dstParam[], int dstStride[])
+                               av_stride srcStride[], int srcSliceY, int 
srcSliceH,
+                               uint8_t *dstParam[], av_stride dstStride[])
 {
     uint8_t *dst = dstParam[0] + dstStride[0] * srcSliceY;
 
@@ -189,8 +189,8 @@ static int planarToYuy2Wrapper(SwsContext *c, const uint8_t 
*src[],
 }
 
 static int planarToUyvyWrapper(SwsContext *c, const uint8_t *src[],
-                               int srcStride[], int srcSliceY, int srcSliceH,
-                               uint8_t *dstParam[], int dstStride[])
+                               av_stride srcStride[], int srcSliceY, int 
srcSliceH,
+                               uint8_t *dstParam[], av_stride dstStride[])
 {
     uint8_t *dst = dstParam[0] + dstStride[0] * srcSliceY;
 
@@ -201,8 +201,8 @@ static int planarToUyvyWrapper(SwsContext *c, const uint8_t 
*src[],
 }
 
 static int yuv422pToYuy2Wrapper(SwsContext *c, const uint8_t *src[],
-                                int srcStride[], int srcSliceY, int srcSliceH,
-                                uint8_t *dstParam[], int dstStride[])
+                                av_stride srcStride[], int srcSliceY, int 
srcSliceH,
+                                uint8_t *dstParam[], av_stride dstStride[])
 {
     uint8_t *dst = dstParam[0] + dstStride[0] * srcSliceY;
 
@@ -213,8 +213,8 @@ static int yuv422pToYuy2Wrapper(SwsContext *c, const 
uint8_t *src[],
 }
 
 static int yuv422pToUyvyWrapper(SwsContext *c, const uint8_t *src[],
-                                int srcStride[], int srcSliceY, int srcSliceH,
-                                uint8_t *dstParam[], int dstStride[])
+                                av_stride srcStride[], int srcSliceY, int 
srcSliceH,
+                                uint8_t *dstParam[], av_stride dstStride[])
 {
     uint8_t *dst = dstParam[0] + dstStride[0] * srcSliceY;
 
@@ -225,8 +225,8 @@ static int yuv422pToUyvyWrapper(SwsContext *c, const 
uint8_t *src[],
 }
 
 static int yuyvToYuv420Wrapper(SwsContext *c, const uint8_t *src[],
-                               int srcStride[], int srcSliceY, int srcSliceH,
-                               uint8_t *dstParam[], int dstStride[])
+                               av_stride srcStride[], int srcSliceY, int 
srcSliceH,
+                               uint8_t *dstParam[], av_stride dstStride[])
 {
     uint8_t *ydst = dstParam[0] + dstStride[0] * srcSliceY;
     uint8_t *udst = dstParam[1] + dstStride[1] * srcSliceY / 2;
@@ -242,8 +242,8 @@ static int yuyvToYuv420Wrapper(SwsContext *c, const uint8_t 
*src[],
 }
 
 static int yuyvToYuv422Wrapper(SwsContext *c, const uint8_t *src[],
-                               int srcStride[], int srcSliceY, int srcSliceH,
-                               uint8_t *dstParam[], int dstStride[])
+                               av_stride srcStride[], int srcSliceY, int 
srcSliceH,
+                               uint8_t *dstParam[], av_stride dstStride[])
 {
     uint8_t *ydst = dstParam[0] + dstStride[0] * srcSliceY;
     uint8_t *udst = dstParam[1] + dstStride[1] * srcSliceY;
@@ -256,8 +256,8 @@ static int yuyvToYuv422Wrapper(SwsContext *c, const uint8_t 
*src[],
 }
 
 static int uyvyToYuv420Wrapper(SwsContext *c, const uint8_t *src[],
-                               int srcStride[], int srcSliceY, int srcSliceH,
-                               uint8_t *dstParam[], int dstStride[])
+                               av_stride srcStride[], int srcSliceY, int 
srcSliceH,
+                               uint8_t *dstParam[], av_stride dstStride[])
 {
     uint8_t *ydst = dstParam[0] + dstStride[0] * srcSliceY;
     uint8_t *udst = dstParam[1] + dstStride[1] * srcSliceY / 2;
@@ -273,8 +273,8 @@ static int uyvyToYuv420Wrapper(SwsContext *c, const uint8_t 
*src[],
 }
 
 static int uyvyToYuv422Wrapper(SwsContext *c, const uint8_t *src[],
-                               int srcStride[], int srcSliceY, int srcSliceH,
-                               uint8_t *dstParam[], int dstStride[])
+                               av_stride srcStride[], int srcSliceY, int 
srcSliceH,
+                               uint8_t *dstParam[], av_stride dstStride[])
 {
     uint8_t *ydst = dstParam[0] + dstStride[0] * srcSliceY;
     uint8_t *udst = dstParam[1] + dstStride[1] * srcSliceY;
@@ -318,15 +318,15 @@ static void gray8aToPacked24(const uint8_t *src, uint8_t 
*dst, int num_pixels,
 }
 
 static int packed_16bpc_bswap(SwsContext *c, const uint8_t *src[],
-                              int srcStride[], int srcSliceY, int srcSliceH,
-                              uint8_t *dst[], int dstStride[])
+                              av_stride srcStride[], int srcSliceY, int 
srcSliceH,
+                              uint8_t *dst[], av_stride dstStride[])
 {
     int i, j;
-    int srcstr = srcStride[0] >> 1;
-    int dststr = dstStride[0] >> 1;
+    av_stride srcstr = srcStride[0] >> 1;
+    av_stride dststr = dstStride[0] >> 1;
     uint16_t       *dstPtr =       (uint16_t *) dst[0];
     const uint16_t *srcPtr = (const uint16_t *) src[0];
-    int min_stride         = FFMIN(srcstr, dststr);
+    av_stride min_stride = FFMIN(srcstr, dststr);
 
     for (i = 0; i < srcSliceH; i++) {
         for (j = 0; j < min_stride; j++) {
@@ -339,9 +339,9 @@ static int packed_16bpc_bswap(SwsContext *c, const uint8_t 
*src[],
     return srcSliceH;
 }
 
-static int palToRgbWrapper(SwsContext *c, const uint8_t *src[], int 
srcStride[],
+static int palToRgbWrapper(SwsContext *c, const uint8_t *src[], av_stride 
srcStride[],
                            int srcSliceY, int srcSliceH, uint8_t *dst[],
-                           int dstStride[])
+                           av_stride dstStride[])
 {
     const enum AVPixelFormat srcFormat = c->srcFormat;
     const enum AVPixelFormat dstFormat = c->dstFormat;
@@ -385,8 +385,8 @@ static int palToRgbWrapper(SwsContext *c, const uint8_t 
*src[], int srcStride[],
     return srcSliceH;
 }
 
-static void gbr24ptopacked24(const uint8_t *src[], int srcStride[],
-                             uint8_t *dst, int dstStride, int srcSliceH,
+static void gbr24ptopacked24(const uint8_t *src[], av_stride srcStride[],
+                             uint8_t *dst, av_stride dstStride, int srcSliceH,
                              int width)
 {
     int x, h, i;
@@ -403,8 +403,8 @@ static void gbr24ptopacked24(const uint8_t *src[], int 
srcStride[],
     }
 }
 
-static void gbr24ptopacked32(const uint8_t *src[], int srcStride[],
-                             uint8_t *dst, int dstStride, int srcSliceH,
+static void gbr24ptopacked32(const uint8_t *src[], av_stride srcStride[],
+                             uint8_t *dst, av_stride dstStride, int srcSliceH,
                              int alpha_first, int width)
 {
     int x, h, i;
@@ -433,14 +433,14 @@ static void gbr24ptopacked32(const uint8_t *src[], int 
srcStride[],
 }
 
 static int planarRgbToRgbWrapper(SwsContext *c, const uint8_t *src[],
-                                 int srcStride[], int srcSliceY, int srcSliceH,
-                                 uint8_t *dst[], int dstStride[])
+                                 av_stride srcStride[], int srcSliceY, int 
srcSliceH,
+                                 uint8_t *dst[], av_stride dstStride[])
 {
     int alpha_first = 0;
     const uint8_t *src102[] = { src[1], src[0], src[2] };
     const uint8_t *src201[] = { src[2], src[0], src[1] };
-    int stride102[] = { srcStride[1], srcStride[0], srcStride[2] };
-    int stride201[] = { srcStride[2], srcStride[0], srcStride[1] };
+    av_stride stride102[] = { srcStride[1], srcStride[0], srcStride[2] };
+    av_stride stride201[] = { srcStride[2], srcStride[0], srcStride[1] };
 
     if (c->srcFormat != AV_PIX_FMT_GBRP) {
         av_log(c, AV_LOG_ERROR, "unsupported planar RGB conversion %s -> %s\n",
@@ -489,9 +489,9 @@ static int planarRgbToRgbWrapper(SwsContext *c, const 
uint8_t *src[],
 }
 
 static int planarRgbToplanarRgbWrapper(SwsContext *c,
-                                       const uint8_t *src[], int srcStride[],
+                                       const uint8_t *src[], av_stride 
srcStride[],
                                        int srcSliceY, int srcSliceH,
-                                       uint8_t *dst[], int dstStride[])
+                                       uint8_t *dst[], av_stride dstStride[])
 {
     copyPlane(src[0], srcStride[0], srcSliceY, srcSliceH, c->srcW,
               dst[0], dstStride[0]);
@@ -505,8 +505,8 @@ static int planarRgbToplanarRgbWrapper(SwsContext *c,
     return srcSliceH;
 }
 
-static void packedtogbr24p(const uint8_t *src, int srcStride,
-                           uint8_t *dst[], int dstStride[], int srcSliceH,
+static void packedtogbr24p(const uint8_t *src, av_stride srcStride,
+                           uint8_t *dst[], av_stride dstStride[], int 
srcSliceH,
                            int alpha_first, int inc_size, int width)
 {
     uint8_t *dest[3];
@@ -535,12 +535,12 @@ static void packedtogbr24p(const uint8_t *src, int 
srcStride,
 }
 
 static int rgbToPlanarRgbWrapper(SwsContext *c, const uint8_t *src[],
-                                 int srcStride[], int srcSliceY, int srcSliceH,
-                                 uint8_t *dst[], int dstStride[])
+                                 av_stride srcStride[], int srcSliceY, int 
srcSliceH,
+                                 uint8_t *dst[], av_stride dstStride[])
 {
     int alpha_first = 0;
-    int stride102[] = { dstStride[1], dstStride[0], dstStride[2] };
-    int stride201[] = { dstStride[2], dstStride[0], dstStride[1] };
+    av_stride stride102[] = { dstStride[1], dstStride[0], dstStride[2] };
+    av_stride stride201[] = { dstStride[2], dstStride[0], dstStride[1] };
     uint8_t *dst102[] = { dst[1] + srcSliceY * dstStride[1],
                           dst[0] + srcSliceY * dstStride[0],
                           dst[2] + srcSliceY * dstStride[2] };
@@ -666,9 +666,9 @@ static rgbConvFn findRgbConvFn(SwsContext *c)
 }
 
 /* {RGB,BGR}{15,16,24,32,32_1} -> {RGB,BGR}{15,16,24,32} */
-static int rgbToRgbWrapper(SwsContext *c, const uint8_t *src[], int 
srcStride[],
+static int rgbToRgbWrapper(SwsContext *c, const uint8_t *src[], av_stride 
srcStride[],
                            int srcSliceY, int srcSliceH, uint8_t *dst[],
-                           int dstStride[])
+                           av_stride dstStride[])
 
 {
     const enum AVPixelFormat srcFormat = c->srcFormat;
@@ -710,8 +710,8 @@ static int rgbToRgbWrapper(SwsContext *c, const uint8_t 
*src[], int srcStride[],
 }
 
 static int bgr24ToYv12Wrapper(SwsContext *c, const uint8_t *src[],
-                              int srcStride[], int srcSliceY, int srcSliceH,
-                              uint8_t *dst[], int dstStride[])
+                              av_stride srcStride[], int srcSliceY, int 
srcSliceH,
+                              uint8_t *dst[], av_stride dstStride[])
 {
     rgb24toyv12(
         src[0],
@@ -726,8 +726,8 @@ static int bgr24ToYv12Wrapper(SwsContext *c, const uint8_t 
*src[],
 }
 
 static int yvu9ToYv12Wrapper(SwsContext *c, const uint8_t *src[],
-                             int srcStride[], int srcSliceY, int srcSliceH,
-                             uint8_t *dst[], int dstStride[])
+                             av_stride srcStride[], int srcSliceY, int 
srcSliceH,
+                             uint8_t *dst[], av_stride dstStride[])
 {
     copyPlane(src[0], srcStride[0], srcSliceY, srcSliceH, c->srcW,
               dst[0], dstStride[0]);
@@ -743,8 +743,8 @@ static int yvu9ToYv12Wrapper(SwsContext *c, const uint8_t 
*src[],
 
 /* unscaled copy like stuff (assumes nearly identical formats) */
 static int packedCopyWrapper(SwsContext *c, const uint8_t *src[],
-                             int srcStride[], int srcSliceY, int srcSliceH,
-                             uint8_t *dst[], int dstStride[])
+                             av_stride srcStride[], int srcSliceY, int 
srcSliceH,
+                             uint8_t *dst[], av_stride dstStride[])
 {
     if (dstStride[0] == srcStride[0] && srcStride[0] > 0)
         memcpy(dst[0] + dstStride[0] * srcSliceY, src[0], srcSliceH * 
dstStride[0]);
@@ -791,8 +791,8 @@ static int packedCopyWrapper(SwsContext *c, const uint8_t 
*src[],
     }
 
 static int planarCopyWrapper(SwsContext *c, const uint8_t *src[],
-                             int srcStride[], int srcSliceY, int srcSliceH,
-                             uint8_t *dst[], int dstStride[])
+                             av_stride srcStride[], int srcSliceY, int 
srcSliceH,
+                             uint8_t *dst[], av_stride dstStride[])
 {
     const AVPixFmtDescriptor *desc_src = av_pix_fmt_desc_get(c->srcFormat);
     const AVPixFmtDescriptor *desc_dst = av_pix_fmt_desc_get(c->dstFormat);
@@ -1210,9 +1210,9 @@ static void reset_ptr(const uint8_t *src[], enum 
AVPixelFormat format)
  */
 int attribute_align_arg sws_scale(struct SwsContext *c,
                                   const uint8_t * const srcSlice[],
-                                  const int srcStride[], int srcSliceY,
+                                  const av_stride srcStride[], int srcSliceY,
                                   int srcSliceH, uint8_t *const dst[],
-                                  const int dstStride[])
+                                  const av_stride dstStride[])
 {
     int i;
     const uint8_t *src2[4] = { srcSlice[0], srcSlice[1], srcSlice[2], 
srcSlice[3] };
@@ -1299,10 +1299,8 @@ int attribute_align_arg sws_scale(struct SwsContext *c,
     // copy strides, so they can safely be modified
     if (c->sliceDir == 1) {
         // slices go from top to bottom
-        int srcStride2[4] = { srcStride[0], srcStride[1], srcStride[2],
-                              srcStride[3] };
-        int dstStride2[4] = { dstStride[0], dstStride[1], dstStride[2],
-                              dstStride[3] };
+        av_stride srcStride2[4] = { srcStride[0], srcStride[1], srcStride[2], 
srcStride[3] };
+        av_stride dstStride2[4] = { dstStride[0], dstStride[1], dstStride[2], 
dstStride[3] };
 
         reset_ptr(src2, c->srcFormat);
         reset_ptr((const uint8_t **) dst2, c->dstFormat);
@@ -1315,10 +1313,8 @@ int attribute_align_arg sws_scale(struct SwsContext *c,
                           dstStride2);
     } else {
         // slices go from bottom to top => we flip the image internally
-        int srcStride2[4] = { -srcStride[0], -srcStride[1], -srcStride[2],
-                              -srcStride[3] };
-        int dstStride2[4] = { -dstStride[0], -dstStride[1], -dstStride[2],
-                              -dstStride[3] };
+        av_stride srcStride2[4] = { -srcStride[0], -srcStride[1], 
-srcStride[2], -srcStride[3] };
+        av_stride dstStride2[4] = { -dstStride[0], -dstStride[1], 
-dstStride[2], -dstStride[3] };
 
         src2[0] += (srcSliceH - 1) * srcStride[0];
         if (!usePal(c->srcFormat))
diff --git a/libswscale/tests/swscale.c b/libswscale/tests/swscale.c
index ece0757f7b..bf508307c8 100644
--- a/libswscale/tests/swscale.c
+++ b/libswscale/tests/swscale.c
@@ -79,7 +79,7 @@ struct Results {
 
 // test by ref -> src -> dst -> out & compare out against ref
 // ref & out are YV12
-static int doTest(const uint8_t * const ref[4], int refStride[4], int w, int h,
+static int doTest(const uint8_t * const ref[4], av_stride refStride[4], int w, 
int h,
                   enum AVPixelFormat srcFormat, enum AVPixelFormat dstFormat,
                   int srcW, int srcH, int dstW, int dstH, int flags,
                   struct Results *r)
@@ -90,10 +90,10 @@ static int doTest(const uint8_t * const ref[4], int 
refStride[4], int w, int h,
     static enum AVPixelFormat cur_srcFormat;
     static int cur_srcW, cur_srcH;
     static const uint8_t *src[4];
-    static int srcStride[4];
+    static av_stride srcStride[4];
     uint8_t *dst[4] = { 0 };
     uint8_t *out[4] = { 0 };
-    int dstStride[4];
+    av_stride dstStride[4];
     int i;
     uint64_t ssdY, ssdU = 0, ssdV = 0, ssdA = 0;
     struct SwsContext *dstContext = NULL, *outContext = NULL;
diff --git a/libswscale/yuv2rgb.c b/libswscale/yuv2rgb.c
index fca324299d..32067d94cf 100644
--- a/libswscale/yuv2rgb.c
+++ b/libswscale/yuv2rgb.c
@@ -125,8 +125,8 @@ const int *sws_getCoefficients(int colorspace)
 
 #define YUV2RGBFUNC(func_name, dst_type, alpha)                             \
     static int func_name(SwsContext *c, const uint8_t *src[],               \
-                         int srcStride[], int srcSliceY, int srcSliceH,     \
-                         uint8_t *dst[], int dstStride[])                   \
+                         av_stride srcStride[], int srcSliceY, int srcSliceH, \
+                         uint8_t *dst[], av_stride dstStride[])             \
     {                                                                       \
         int y;                                                              \
                                                                             \
-- 
2.14.2

_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to