Merge commit '15b4f494fc6bddb8178fdb5aed18b420efc75e22'
authorJames Almer <jamrial@gmail.com>
Tue, 21 Mar 2017 18:57:07 +0000 (15:57 -0300)
committerJames Almer <jamrial@gmail.com>
Tue, 21 Mar 2017 18:57:07 +0000 (15:57 -0300)
* commit '15b4f494fc6bddb8178fdb5aed18b420efc75e22':
  mss*: Change type of array stride parameters to ptrdiff_t

Merged-by: James Almer <jamrial@gmail.com>
1  2 
libavcodec/mss12.c
libavcodec/mss12.h
libavcodec/mss2.c
libavcodec/mss2dsp.c
libavcodec/mss2dsp.h
libavcodec/mss3.c
libavcodec/mss34dsp.c
libavcodec/mss34dsp.h
libavcodec/mss4.c

diff --combined libavcodec/mss12.c
@@@ -1,20 -1,20 +1,20 @@@
  /*
   * Copyright (c) 2012 Konstantin Shishkov
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
@@@ -197,7 -197,7 +197,7 @@@ static av_always_inline int decode_pixe
  }
  
  static int decode_pixel_in_context(ArithCoder *acoder, PixContext *pctx,
-                                    uint8_t *src, int stride, int x, int y,
+                                    uint8_t *src, ptrdiff_t stride, int x, int y,
                                     int has_right)
  {
      uint8_t neighbours[4];
  }
  
  static int decode_region(ArithCoder *acoder, uint8_t *dst, uint8_t *rgb_pic,
-                          int x, int y, int width, int height, int stride,
-                          int rgb_stride, PixContext *pctx, const uint32_t *pal)
+                          int x, int y, int width, int height, ptrdiff_t stride,
+                          ptrdiff_t rgb_stride, PixContext *pctx,
+                          const uint32_t *pal)
  {
      int i, j, p;
      uint8_t *rgb_dst = rgb_pic + x * 3 + y * rgb_stride;
@@@ -368,8 -369,8 +369,8 @@@ static int motion_compensation(MSS12Con
  }
  
  static int decode_region_masked(MSS12Context const *c, ArithCoder *acoder,
-                                 uint8_t *dst, int stride, uint8_t *mask,
-                                 int mask_stride, int x, int y,
+                                 uint8_t *dst, ptrdiff_t stride, uint8_t *mask,
+                                 ptrdiff_t mask_stride, int x, int y,
                                  int width, int height,
                                  PixContext *pctx)
  {
@@@ -450,7 -451,7 +451,7 @@@ static int decode_pivot(SliceContext *s
          val = acoder->get_number(acoder, (base + 1) / 2 - 2) + 3;
      }
  
 -    if (val >= base)
 +    if ((unsigned)val >= base)
          return -1;
  
      return inv ? base - val : val;
@@@ -466,8 -467,8 +467,8 @@@ static int decode_region_intra(SliceCon
  
      if (!mode) {
          int i, j, pix, rgb_pix;
-         int stride       = c->pal_stride;
-         int rgb_stride   = c->rgb_stride;
+         ptrdiff_t stride     = c->pal_stride;
+         ptrdiff_t rgb_stride = c->rgb_stride;
          uint8_t *dst     = c->pal_pic + x     + y * stride;
          uint8_t *rgb_dst = c->rgb_pic + x * 3 + y * rgb_stride;
  
@@@ -581,17 -582,22 +582,17 @@@ av_cold int ff_mss12_decode_init(MSS12C
          return AVERROR_INVALIDDATA;
      }
  
 -    avctx->coded_width  = AV_RB32(avctx->extradata + 20);
 -    avctx->coded_height = AV_RB32(avctx->extradata + 24);
 +    avctx->coded_width  = FFMAX(AV_RB32(avctx->extradata + 20), avctx->width);
 +    avctx->coded_height = FFMAX(AV_RB32(avctx->extradata + 24), avctx->height);
      if (avctx->coded_width > 4096 || avctx->coded_height > 4096) {
          av_log(avctx, AV_LOG_ERROR, "Frame dimensions %dx%d too large",
                 avctx->coded_width, avctx->coded_height);
          return AVERROR_INVALIDDATA;
      }
 -    if (avctx->width || avctx->height) {
 -        if (avctx->width  <= 0 || avctx->width > avctx->coded_width ||
 -            avctx->height <= 0 || avctx->height > avctx->coded_height) {
 -            av_log(avctx, AV_LOG_ERROR, "Invalid display dimensions\n");
 -            return AVERROR_INVALIDDATA;
 -        }
 -    } else {
 -        avctx->width  = avctx->coded_width;
 -        avctx->height = avctx->coded_height;
 +    if (avctx->coded_width < 1 || avctx->coded_height < 1) {
 +        av_log(avctx, AV_LOG_ERROR, "Frame dimensions %dx%d too small",
 +               avctx->coded_width, avctx->coded_height);
 +        return AVERROR_INVALIDDATA;
      }
  
      av_log(avctx, AV_LOG_DEBUG, "Encoder version %"PRIu32".%"PRIu32"\n",
      }
  
      for (i = 0; i < 256; i++)
 -        c->pal[i] = AV_RB24(avctx->extradata + 52 +
 +        c->pal[i] = 0xFFU << 24 | AV_RB24(avctx->extradata + 52 +
                              (version ? 8 : 0) + i * 3);
  
      c->mask_stride = FFALIGN(avctx->width, 16);
 -    c->mask        = av_malloc(c->mask_stride * avctx->height);
 +    c->mask        = av_malloc_array(c->mask_stride, avctx->height);
      if (!c->mask) {
          av_log(avctx, AV_LOG_ERROR, "Cannot allocate mask plane\n");
          return AVERROR(ENOMEM);
diff --combined libavcodec/mss12.h
@@@ -1,20 -1,20 +1,20 @@@
  /*
   * Copyright (c) 2012 Konstantin Shishkov
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
@@@ -77,12 -77,12 +77,12 @@@ typedef struct MSS12Context 
      uint32_t       pal[256];
      uint8_t        *pal_pic;
      uint8_t        *last_pal_pic;
-     int            pal_stride;
+     ptrdiff_t      pal_stride;
      uint8_t        *mask;
-     int            mask_stride;
+     ptrdiff_t      mask_stride;
      uint8_t        *rgb_pic;
      uint8_t        *last_rgb_pic;
-     int            rgb_stride;
+     ptrdiff_t      rgb_stride;
      int            free_colours;
      int            keyframe;
      int            mvX, mvY;
@@@ -99,8 -99,8 +99,8 @@@ int ff_mss12_decode_init(MSS12Context *
                           SliceContext *sc1, SliceContext *sc2);
  int ff_mss12_decode_end(MSS12Context *ctx);
  
 -#define ARITH_GET_BIT(VERSION)                                          \
 -static int arith ## VERSION ## _get_bit(ArithCoder *c)                  \
 +#define ARITH_GET_BIT(prefix)                                           \
 +static int prefix ## _get_bit(ArithCoder *c)                            \
  {                                                                       \
      int range = c->high - c->low + 1;                                   \
      int bit   = 2 * c->value - c->low >= c->high;                       \
      else                                                                \
          c->high = c->low + (range >> 1) - 1;                            \
                                                                          \
 -    arith ## VERSION ## _normalise(c);                                  \
 +    prefix ## _normalise(c);                                            \
                                                                          \
      return bit;                                                         \
  }
  
 -#define ARITH_GET_MODEL_SYM(VERSION)                                    \
 -static int arith ## VERSION ## _get_model_sym(ArithCoder *c, Model *m)  \
 +#define ARITH_GET_MODEL_SYM(prefix)                                     \
 +static int prefix ## _get_model_sym(ArithCoder *c, Model *m)            \
  {                                                                       \
      int idx, val;                                                       \
                                                                          \
 -    idx = arith ## VERSION ## _get_prob(c, m->cum_prob);                \
 +    idx = prefix ## _get_prob(c, m->cum_prob);                          \
                                                                          \
      val = m->idx2sym[idx];                                              \
      ff_mss12_model_update(m, idx);                                      \
                                                                          \
 -    arith ## VERSION ## _normalise(c);                                  \
 +    prefix ## _normalise(c);                                            \
                                                                          \
      return val;                                                         \
  }
diff --combined libavcodec/mss2.c
@@@ -1,20 -1,20 +1,20 @@@
  /*
   * Microsoft Screen 2 (aka Windows Media Video V9 Screen) decoder
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
@@@ -52,13 -52,13 +52,13 @@@ static void arith2_normalise(ArithCode
              c->value ^= 0x8000;
              c->low   ^= 0x8000;
          }
 -        c->high  = c->high  << 8 & 0xFFFFFF | 0xFF;
 -        c->value = c->value << 8 & 0xFFFFFF | bytestream2_get_byte(c->gbc.gB);
 -        c->low   = c->low   << 8 & 0xFFFFFF;
 +        c->high  = (uint16_t)c->high  << 8  | 0xFF;
 +        c->value = (uint16_t)c->value << 8  | bytestream2_get_byte(c->gbc.gB);
 +        c->low   = (uint16_t)c->low   << 8;
      }
  }
  
 -ARITH_GET_BIT(2)
 +ARITH_GET_BIT(arith2)
  
  /* L. Stuiver and A. Moffat: "Piecewise Integer Mapping for Arithmetic Coding."
   * In Proc. 8th Data Compression Conference (DCC '98), pp. 3-12, Mar. 1998 */
@@@ -131,7 -131,7 +131,7 @@@ static int arith2_get_prob(ArithCoder *
      return i;
  }
  
 -ARITH_GET_MODEL_SYM(2)
 +ARITH_GET_MODEL_SYM(arith2)
  
  static int arith2_get_consumed_bytes(ArithCoder *c)
  {
@@@ -174,7 -174,7 +174,7 @@@ static int decode_pal_v2(MSS12Context *
      return 1 + ncol * 3;
  }
  
- static int decode_555(GetByteContext *gB, uint16_t *dst, int stride,
+ static int decode_555(GetByteContext *gB, uint16_t *dst, ptrdiff_t stride,
                        int keyframe, int w, int h)
  {
      int last_symbol = 0, repeat = 0, prev_avail = 0;
                      last_symbol = b << 8 | bytestream2_get_byte(gB);
                  else if (b > 129) {
                      repeat = 0;
 -                    while (b-- > 130)
 +                    while (b-- > 130) {
 +                        if (repeat >= (INT_MAX >> 8) - 1) {
 +                            av_log(NULL, AV_LOG_ERROR, "repeat overflow\n");
 +                            return AVERROR_INVALIDDATA;
 +                        }
                          repeat = (repeat << 8) + bytestream2_get_byte(gB) + 1;
 +                    }
                      if (last_symbol == -2) {
                          int skip = FFMIN((unsigned)repeat, dst + w - p);
                          repeat -= skip;
      return 0;
  }
  
- static int decode_rle(GetBitContext *gb, uint8_t *pal_dst, int pal_stride,
-                       uint8_t *rgb_dst, int rgb_stride, uint32_t *pal,
+ static int decode_rle(GetBitContext *gb, uint8_t *pal_dst, ptrdiff_t pal_stride,
+                       uint8_t *rgb_dst, ptrdiff_t rgb_stride, uint32_t *pal,
                        int keyframe, int kf_slipt, int slice, int w, int h)
  {
      uint8_t bits[270] = { 0 };
      if (next_code != 1 << current_length)
          return AVERROR_INVALIDDATA;
  
 -    if (i = init_vlc(&vlc, 9, alphabet_size, bits, 1, 1, codes, 4, 4, 0))
 +    if ((i = init_vlc(&vlc, 9, alphabet_size, bits, 1, 1, codes, 4, 4, 0)) < 0)
          return i;
  
      /* frame decode */
@@@ -386,8 -381,7 +386,8 @@@ static int decode_wmv9(AVCodecContext *
  
      ff_mpeg_flush(avctx);
  
 -    init_get_bits(&s->gb, buf, buf_size * 8);
 +    if ((ret = init_get_bits8(&s->gb, buf, buf_size)) < 0)
 +        return ret;
  
      s->loop_filter = avctx->skip_loop_filter < AVDISCARD_ALL;
  
  
      ff_vc1_decode_blocks(v);
  
 -    ff_er_frame_end(&s->er);
 +    if (v->end_mb_x == s->mb_width && s->end_mb_y == s->mb_height) {
 +        ff_er_frame_end(&s->er);
 +    } else {
 +        av_log(v->s.avctx, AV_LOG_WARNING,
 +               "disabling error correction due to block count mismatch %dx%d != %dx%d\n",
 +               v->end_mb_x, s->end_mb_y, s->mb_width, s->mb_height);
 +    }
  
      ff_mpv_frame_end(s);
  
  
      if (v->respic == 3) {
          ctx->dsp.upsample_plane(f->data[0], f->linesize[0], w,      h);
 -        ctx->dsp.upsample_plane(f->data[1], f->linesize[1], w >> 1, h >> 1);
 -        ctx->dsp.upsample_plane(f->data[2], f->linesize[2], w >> 1, h >> 1);
 +        ctx->dsp.upsample_plane(f->data[1], f->linesize[1], w+1 >> 1, h+1 >> 1);
 +        ctx->dsp.upsample_plane(f->data[2], f->linesize[2], w+1 >> 1, h+1 >> 1);
      } else if (v->respic)
          avpriv_request_sample(v->s.avctx,
                                "Asymmetric WMV9 rectangle subsampling");
@@@ -488,8 -476,7 +488,8 @@@ static int mss2_decode_frame(AVCodecCon
      Rectangle wmv9rects[MAX_WMV9_RECTANGLES], *r;
      int used_rects = 0, i, implicit_rect = 0, av_uninit(wmv9_mask);
  
 -    init_get_bits(&gb, buf, buf_size * 8);
 +    if ((ret = init_get_bits8(&gb, buf, buf_size)) < 0)
 +        return ret;
  
      if (keyframe = get_bits1(&gb))
          skip_bits(&gb, 7);
      if (c->mvX < 0 || c->mvY < 0) {
          FFSWAP(uint8_t *, c->pal_pic, c->last_pal_pic);
  
 -        if ((ret = ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0) {
 -            av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
 +        if ((ret = ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0)
              return ret;
 -        }
  
          if (ctx->last_pic->data[0]) {
              av_assert0(frame->linesize[0] == ctx->last_pic->linesize[0]);
              return AVERROR_INVALIDDATA;
          }
      } else {
 -        if ((ret = ff_reget_buffer(avctx, ctx->last_pic)) < 0) {
 -            av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
 +        if ((ret = ff_reget_buffer(avctx, ctx->last_pic)) < 0)
              return ret;
 -        }
          if ((ret = av_frame_ref(frame, ctx->last_pic)) < 0)
              return ret;
  
                  ff_mss12_slicecontext_reset(&ctx->sc[1]);
          }
          if (is_rle) {
 -            init_get_bits(&gb, buf, buf_size * 8);
 +            if ((ret = init_get_bits8(&gb, buf, buf_size)) < 0)
 +                return ret;
              if (ret = decode_rle(&gb, c->pal_pic, c->pal_stride,
                                   c->rgb_pic, c->rgb_stride, c->pal, keyframe,
                                   ctx->split_position, 0,
@@@ -826,11 -816,10 +826,11 @@@ static av_cold int mss2_decode_init(AVC
      c->avctx = avctx;
      if (ret = ff_mss12_decode_init(c, 1, &ctx->sc[0], &ctx->sc[1]))
          return ret;
 +    ctx->last_pic   = av_frame_alloc();
      c->pal_stride   = c->mask_stride;
      c->pal_pic      = av_mallocz(c->pal_stride * avctx->height);
      c->last_pal_pic = av_mallocz(c->pal_stride * avctx->height);
 -    if (!c->pal_pic || !c->last_pal_pic) {
 +    if (!c->pal_pic || !c->last_pal_pic || !ctx->last_pic) {
          mss2_decode_end(avctx);
          return AVERROR(ENOMEM);
      }
      avctx->pix_fmt = c->free_colours == 127 ? AV_PIX_FMT_RGB555
                                              : AV_PIX_FMT_RGB24;
  
 -    ctx->last_pic = av_frame_alloc();
 -    if (!ctx->last_pic) {
 -        mss2_decode_end(avctx);
 -        return AVERROR(ENOMEM);
 -    }
  
      return 0;
  }
diff --combined libavcodec/mss2dsp.c
@@@ -1,20 -1,20 +1,20 @@@
  /*
   * Microsoft Screen 2 (aka Windows Media Video V9 Screen) decoder
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
  #include "libavutil/common.h"
  
  static av_always_inline void mss2_blit_wmv9_template(uint8_t *dst,
-                                                      int dst_stride,
+                                                      ptrdiff_t dst_stride,
                                                       int gray,
                                                       int use_mask,
                                                       int maskcolor,
                                                       const uint8_t *mask,
-                                                      int mask_stride,
+                                                      ptrdiff_t mask_stride,
                                                       const uint8_t *srcy,
-                                                      int srcy_stride,
+                                                      ptrdiff_t srcy_stride,
                                                       const uint8_t *srcu,
                                                       const uint8_t *srcv,
-                                                      int srcuv_stride,
+                                                      ptrdiff_t srcuv_stride,
                                                       int w, int h)
  {
      int i, j, k, r = -1;
      }
  }
  
- static void mss2_blit_wmv9_c(uint8_t *dst, int dst_stride,
-                              const uint8_t *srcy, int srcy_stride,
+ static void mss2_blit_wmv9_c(uint8_t *dst, ptrdiff_t dst_stride,
+                              const uint8_t *srcy, ptrdiff_t srcy_stride,
                               const uint8_t *srcu, const uint8_t *srcv,
-                              int srcuv_stride, int w, int h)
+                              ptrdiff_t srcuv_stride, int w, int h)
  {
      mss2_blit_wmv9_template(dst, dst_stride, 0, 0,
                              0, NULL, 0,
                              w, h);
  }
  
- static void mss2_blit_wmv9_masked_c(uint8_t *dst, int dst_stride,
+ static void mss2_blit_wmv9_masked_c(uint8_t *dst, ptrdiff_t dst_stride,
                                      int maskcolor, const uint8_t *mask,
-                                     int mask_stride,
-                                     const uint8_t *srcy, int srcy_stride,
+                                     ptrdiff_t mask_stride,
+                                     const uint8_t *srcy, ptrdiff_t srcy_stride,
                                      const uint8_t *srcu, const uint8_t *srcv,
-                                     int srcuv_stride, int w, int h)
+                                     ptrdiff_t srcuv_stride, int w, int h)
  {
      mss2_blit_wmv9_template(dst, dst_stride, 0, 1,
                              maskcolor, mask, mask_stride,
@@@ -90,9 -90,9 +90,9 @@@
                              w, h);
  }
  
- static void mss2_gray_fill_masked_c(uint8_t *dst, int dst_stride,
+ static void mss2_gray_fill_masked_c(uint8_t *dst, ptrdiff_t dst_stride,
                                      int maskcolor, const uint8_t *mask,
-                                     int mask_stride, int w, int h)
+                                     ptrdiff_t mask_stride, int w, int h)
  {
      mss2_blit_wmv9_template(dst, dst_stride, 1, 1,
                              maskcolor, mask, mask_stride,
                              w, h);
  }
  
- static void upsample_plane_c(uint8_t *plane, int plane_stride, int w, int h)
+ static void upsample_plane_c(uint8_t *plane, ptrdiff_t plane_stride, int w, int h)
  {
      uint8_t *src1, *src2, *dst1, *dst2, *p, a, b;
      int i, j;
  
 +    if(!w || !h)
 +        return;
 +
      w += (w & 1);
      h += (h & 1);
  
diff --combined libavcodec/mss2dsp.h
@@@ -1,20 -1,20 +1,20 @@@
  /*
   * Microsoft Screen 2 (aka Windows Media Video V9 Screen) decoder
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
  #ifndef AVCODEC_MSS2DSP_H
  #define AVCODEC_MSS2DSP_H
  
+ #include <stddef.h>
  #include <stdint.h>
  
  typedef struct MSS2DSPContext {
-     void (*mss2_blit_wmv9)(uint8_t *dst, int dst_stride,
-                            const uint8_t *srcy, int srcy_stride,
+     void (*mss2_blit_wmv9)(uint8_t *dst, ptrdiff_t dst_stride,
+                            const uint8_t *srcy, ptrdiff_t srcy_stride,
                             const uint8_t *srcu, const uint8_t *srcv,
-                            int srcuv_stride, int w, int h);
-     void (*mss2_blit_wmv9_masked)(uint8_t *dst, int dst_stride,
+                            ptrdiff_t srcuv_stride, int w, int h);
+     void (*mss2_blit_wmv9_masked)(uint8_t *dst, ptrdiff_t dst_stride,
                                    int maskcolor, const uint8_t *mask,
-                                   int mask_stride,
-                                   const uint8_t *srcy, int srcy_stride,
+                                   ptrdiff_t mask_stride,
+                                   const uint8_t *srcy, ptrdiff_t srcy_stride,
                                    const uint8_t *srcu, const uint8_t *srcv,
-                                   int srcuv_stride, int w, int h);
-     void (*mss2_gray_fill_masked)(uint8_t *dst, int dst_stride,
+                                   ptrdiff_t srcuv_stride, int w, int h);
+     void (*mss2_gray_fill_masked)(uint8_t *dst, ptrdiff_t dst_stride,
                                    int maskcolor, const uint8_t *mask,
-                                   int mask_stride, int w, int h);
-     void (*upsample_plane)(uint8_t *plane, int plane_stride, int w, int h);
+                                   ptrdiff_t mask_stride, int w, int h);
+     void (*upsample_plane)(uint8_t *plane, ptrdiff_t plane_stride,
+                            int w, int h);
  } MSS2DSPContext;
  
  void ff_mss2dsp_init(MSS2DSPContext *dsp);
diff --combined libavcodec/mss3.c
@@@ -2,20 -2,20 +2,20 @@@
   * Microsoft Screen 3 (aka Microsoft ATC Screen) decoder
   * Copyright (c) 2012 Konstantin Shishkov
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
@@@ -91,7 -91,7 +91,7 @@@ typedef struct ImageBlockCoder 
  
  typedef struct DCTBlockCoder {
      int      *prev_dc;
-     int      prev_dc_stride;
+     ptrdiff_t prev_dc_stride;
      int      prev_dc_height;
      int      quality;
      uint16_t qmat[64];
@@@ -296,7 -296,7 +296,7 @@@ static void rac_normalise(RangeCoder *c
              c->low |= *c->src++;
          } else if (!c->low) {
              c->got_error = 1;
 -            return;
 +            c->low = 1;
          }
          if (c->range >= RAC_BOTTOM)
              return;
@@@ -450,7 -450,7 +450,7 @@@ static int decode_coeff(RangeCoder *c, 
  }
  
  static void decode_fill_block(RangeCoder *c, FillBlockCoder *fc,
-                               uint8_t *dst, int stride, int block_size)
+                               uint8_t *dst, ptrdiff_t stride, int block_size)
  {
      int i;
  
  }
  
  static void decode_image_block(RangeCoder *c, ImageBlockCoder *ic,
-                                uint8_t *dst, int stride, int block_size)
+                                uint8_t *dst, ptrdiff_t stride, int block_size)
  {
      int i, j;
      int vec_size;
@@@ -557,7 -557,7 +557,7 @@@ static int decode_dct(RangeCoder *c, DC
  }
  
  static void decode_dct_block(RangeCoder *c, DCTBlockCoder *bc,
-                              uint8_t *dst, int stride, int block_size,
+                              uint8_t *dst, ptrdiff_t stride, int block_size,
                               int *block, int mb_x, int mb_y)
  {
      int i, j;
  }
  
  static void decode_haar_block(RangeCoder *c, HaarBlockCoder *hc,
-                               uint8_t *dst, int stride, int block_size,
-                               int *block)
+                               uint8_t *dst, ptrdiff_t stride,
+                               int block_size, int *block)
  {
      const int hsize = block_size >> 1;
      int A, B, C, D, t1, t2, t3, t4;
@@@ -731,8 -731,10 +731,8 @@@ static int mss3_decode_frame(AVCodecCon
          return buf_size;
      c->got_error = 0;
  
 -    if ((ret = ff_reget_buffer(avctx, c->pic)) < 0) {
 -        av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
 +    if ((ret = ff_reget_buffer(avctx, c->pic)) < 0)
          return ret;
 -    }
      c->pic->key_frame = keyframe;
      c->pic->pict_type = keyframe ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P;
      if (!bytestream2_get_bytes_left(&gb)) {
@@@ -838,7 -840,6 +838,7 @@@ static av_cold int mss3_decode_init(AVC
                                              b_width * b_height);
          if (!c->dct_coder[i].prev_dc) {
              av_log(avctx, AV_LOG_ERROR, "Cannot allocate buffer\n");
 +            av_frame_free(&c->pic);
              while (i >= 0) {
                  av_freep(&c->dct_coder[i].prev_dc);
                  i--;
diff --combined libavcodec/mss34dsp.c
@@@ -2,20 -2,20 +2,20 @@@
   * Common stuff for some Microsoft Screen codecs
   * Copyright (C) 2012 Konstantin Shishkov
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
@@@ -84,10 -84,10 +84,10 @@@ void ff_mss34_gen_quant_mat(uint16_t *q
      blk[6 * step] = (-(t3 + t7) + t8 + tA) >> shift;                \
      blk[7 * step] = (-(t1 + t6) + t9 + tB) >> shift;                \
  
 -#define SOP_ROW(a) ((a) << 16) + 0x2000
 -#define SOP_COL(a) ((a + 32) << 16)
 +#define SOP_ROW(a) (((a) << 16) + 0x2000)
 +#define SOP_COL(a) (((a) + 32) << 16)
  
- void ff_mss34_dct_put(uint8_t *dst, int stride, int *block)
+ void ff_mss34_dct_put(uint8_t *dst, ptrdiff_t stride, int *block)
  {
      int i, j;
      int *ptr;
diff --combined libavcodec/mss34dsp.h
@@@ -2,26 -2,27 +2,27 @@@
   * Common stuff for some Microsoft Screen codecs
   * Copyright (C) 2012 Konstantin Shishkov
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
  #ifndef AVCODEC_MSS34DSP_H
  #define AVCODEC_MSS34DSP_H
  
+ #include <stddef.h>
  #include <stdint.h>
  
  /**
@@@ -40,6 -41,6 +41,6 @@@ void ff_mss34_gen_quant_mat(uint16_t *q
   * @param stride  output plane stride
   * @param block   block to transform and output
   */
- void ff_mss34_dct_put(uint8_t *dst, int stride, int *block);
+ void ff_mss34_dct_put(uint8_t *dst, ptrdiff_t stride, int *block);
  
  #endif /* AVCODEC_MSS34DSP_H */
diff --combined libavcodec/mss4.c
@@@ -2,20 -2,20 +2,20 @@@
   * Microsoft Screen 4 (aka Microsoft Expression Encoder Screen) decoder
   * Copyright (c) 2012 Konstantin Shishkov
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
@@@ -125,7 -125,7 +125,7 @@@ static const uint8_t mss4_vec_entry_vlc
  #define MAX_ENTRIES  162
  
  typedef struct MSS4Context {
 -    AVFrame   *pic;
 +    AVFrame    *pic;
  
      VLC        dc_vlc[2], ac_vlc[2];
      VLC        vec_entry_vlc[2];
      uint16_t   quant_mat[2][64];
  
      int        *prev_dc[3];
-     int        dc_stride[3];
+     ptrdiff_t  dc_stride[3];
      int        dc_cache[4][4];
  
      int        prev_vec[3][4];
@@@ -363,7 -363,7 +363,7 @@@ static int get_value_cached(GetBitConte
      return prev[component];
  }
  
 -#define MKVAL(vals)  (vals[0] | (vals[1] << 3) | (vals[2] << 6))
 +#define MKVAL(vals)  ((vals)[0] | ((vals)[1] << 3) | ((vals)[2] << 6))
  
  /* Image mode - the hardest to comprehend MSS4 coding mode.
   *
@@@ -553,8 -553,10 +553,8 @@@ static int mss4_decode_frame(AVCodecCon
          return AVERROR_INVALIDDATA;
      }
  
 -    if ((ret = ff_reget_buffer(avctx, c->pic)) < 0) {
 -        av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
 +    if ((ret = ff_reget_buffer(avctx, c->pic)) < 0)
          return ret;
 -    }
      c->pic->key_frame = (frame_type == INTRA_FRAME);
      c->pic->pict_type = (frame_type == INTRA_FRAME) ? AV_PICTURE_TYPE_I
                                                     : AV_PICTURE_TYPE_P;
              ff_mss34_gen_quant_mat(c->quant_mat[i], quality, !i);
      }
  
 -    init_get_bits(&gb, buf + HEADER_SIZE, (buf_size - HEADER_SIZE) * 8);
 +    if ((ret = init_get_bits8(&gb, buf + HEADER_SIZE, buf_size - HEADER_SIZE)) < 0)
 +        return ret;
  
      mb_width  = FFALIGN(width,  16) >> 4;
      mb_height = FFALIGN(height, 16) >> 4;
@@@ -651,7 -652,7 +651,7 @@@ static av_cold int mss4_decode_init(AVC
      }
      for (i = 0; i < 3; i++) {
          c->dc_stride[i] = FFALIGN(avctx->width, 16) >> (2 + !!i);
 -        c->prev_dc[i]   = av_malloc(sizeof(**c->prev_dc) * c->dc_stride[i]);
 +        c->prev_dc[i]   = av_malloc_array(c->dc_stride[i], sizeof(**c->prev_dc));
          if (!c->prev_dc[i]) {
              av_log(avctx, AV_LOG_ERROR, "Cannot allocate buffer\n");
              mss4_free_vlcs(c);