vpx: merge with master

Change-Id: I44b3ad780cef6f448fa17ff8e28fea87ef9cd518
diff --git a/vp9/vp9_cx_iface.c b/vp9/vp9_cx_iface.c
index 1572920..bbd9317 100644
--- a/vp9/vp9_cx_iface.c
+++ b/vp9/vp9_cx_iface.c
@@ -13,20 +13,14 @@
 #include "vpx/internal/vpx_codec_internal.h"
 #include "vpx_version.h"
 #include "vp9/encoder/onyx_int.h"
-#include "vpx/vp8e.h"
+#include "vpx/vp8cx.h"
 #include "vp9/encoder/firstpass.h"
 #include "vp9/common/onyx.h"
 #include <stdlib.h>
 #include <string.h>
 
-/* This value is a sentinel for determining whether the user has set a mode
- * directly through the deprecated VP8E_SET_ENCODING_MODE control.
- */
-#define NO_MODE_SET 255
-
 struct vp8_extracfg {
   struct vpx_codec_pkt_list *pkt_list;
-  vp8e_encoding_mode      encoding_mode;               /** best, good, realtime            */
   int                         cpu_used;                    /** available cpu percentage in 1/16*/
   unsigned int                enable_auto_alt_ref;           /** if encoder decides to uses alternate reference frame */
   unsigned int                noise_sensitivity;
@@ -40,7 +34,9 @@
   vp8e_tuning                 tuning;
   unsigned int                cq_level;         /* constrained quality level */
   unsigned int                rc_max_intra_bitrate_pct;
-
+#if CONFIG_LOSSLESS
+  unsigned int                lossless;
+#endif
 };
 
 struct extraconfig_map {
@@ -53,7 +49,6 @@
     0,
     {
       NULL,
-      VP8_BEST_QUALITY_ENCODING,  /* Encoding Mode */
       0,                          /* cpu_used      */
       0,                          /* enable_auto_alt_ref */
       0,                          /* noise_sensitivity */
@@ -67,6 +62,9 @@
       0,                          /* tuning*/
       10,                         /* cq_level */
       0,                          /* rc_max_intra_bitrate_pct */
+#if CONFIG_LOSSLESS
+      0,                          /* lossless */
+#endif
     }
   }
 };
@@ -83,7 +81,6 @@
   unsigned int            next_frame_flag;
   vp8_postproc_cfg_t      preview_ppcfg;
   vpx_codec_pkt_list_decl(64) pkt_list;              // changed to accomendate the maximum number of lagged frames allowed
-  int                         deprecated_mode;
   unsigned int                fixed_kf_cntr;
 };
 
@@ -135,8 +132,17 @@
   RANGE_CHECK(cfg, g_timebase.den,        1, 1000000000);
   RANGE_CHECK(cfg, g_timebase.num,        1, cfg->g_timebase.den);
   RANGE_CHECK_HI(cfg, g_profile,          3);
+
   RANGE_CHECK_HI(cfg, rc_max_quantizer,   63);
   RANGE_CHECK_HI(cfg, rc_min_quantizer,   cfg->rc_max_quantizer);
+#if CONFIG_LOSSLESS
+  RANGE_CHECK_BOOL(vp8_cfg, lossless);
+  if (vp8_cfg->lossless) {
+    RANGE_CHECK_HI(cfg, rc_max_quantizer, 0);
+    RANGE_CHECK_HI(cfg, rc_min_quantizer, 0);
+  }
+#endif
+
   RANGE_CHECK_HI(cfg, g_threads,          64);
   RANGE_CHECK_HI(cfg, g_lag_in_frames,    MAX_LAG_BUFFERS);
   RANGE_CHECK(cfg, rc_end_usage,          VPX_VBR, VPX_CQ);
@@ -162,7 +168,6 @@
   RANGE_CHECK_BOOL(vp8_cfg,               enable_auto_alt_ref);
   RANGE_CHECK(vp8_cfg, cpu_used,           -16, 16);
 
-  RANGE_CHECK(vp8_cfg, encoding_mode,      VP8_BEST_QUALITY_ENCODING, VP8_REAL_TIME_ENCODING);
   RANGE_CHECK_HI(vp8_cfg, noise_sensitivity,  6);
 
   RANGE_CHECK(vp8_cfg, token_partitions,   VP8_ONE_TOKENPARTITION, VP8_EIGHT_TOKENPARTITION);
@@ -303,7 +308,7 @@
   oxcf->tuning = vp8_cfg.tuning;
 
 #if CONFIG_LOSSLESS
-  oxcf->lossless = cfg.lossless;
+  oxcf->lossless = vp8_cfg.lossless;
 #endif
 
   /*
@@ -397,7 +402,6 @@
 #define MAP(id, var) case id: var = CAST(id, args); break;
 
   switch (ctrl_id) {
-      MAP(VP8E_SET_ENCODING_MODE,         ctx->deprecated_mode);
       MAP(VP8E_SET_CPUUSED,               xcfg.cpu_used);
       MAP(VP8E_SET_ENABLEAUTOALTREF,      xcfg.enable_auto_alt_ref);
       MAP(VP8E_SET_NOISE_SENSITIVITY,     xcfg.noise_sensitivity);
@@ -411,7 +415,9 @@
       MAP(VP8E_SET_TUNING,                xcfg.tuning);
       MAP(VP8E_SET_CQ_LEVEL,              xcfg.cq_level);
       MAP(VP8E_SET_MAX_INTRA_BITRATE_PCT, xcfg.rc_max_intra_bitrate_pct);
-
+#if CONFIG_LOSSLESS
+      MAP(VP9E_SET_LOSSLESS,              xcfg.lossless);
+#endif
   }
 
   res = validate_config(ctx, &ctx->cfg, &xcfg);
@@ -429,7 +435,7 @@
 
 static vpx_codec_err_t vp8e_common_init(vpx_codec_ctx_t *ctx,
                                         int              experimental) {
-  vpx_codec_err_t        res = VPX_DEC_OK;
+  vpx_codec_err_t            res = VPX_CODEC_OK;
   struct vpx_codec_alg_priv *priv;
   vpx_codec_enc_cfg_t       *cfg;
   unsigned int               i;
@@ -448,6 +454,7 @@
     ctx->priv->iface = ctx->iface;
     ctx->priv->alg_priv = priv;
     ctx->priv->init_flags = ctx->init_flags;
+    ctx->priv->enc.total_encoders = 1;
 
     if (ctx->config.enc) {
       /* Update the reference to the config structure to an
@@ -481,8 +488,6 @@
       return VPX_CODEC_MEM_ERROR;
     }
 
-    priv->deprecated_mode = NO_MODE_SET;
-
     vp9_initialize_enc();
 
     res = validate_config(priv, &priv->cfg, &priv->vp8_cfg);
@@ -504,13 +509,15 @@
 }
 
 
-static vpx_codec_err_t vp8e_init(vpx_codec_ctx_t *ctx) {
+static vpx_codec_err_t vp8e_init(vpx_codec_ctx_t *ctx,
+                                 vpx_codec_priv_enc_mr_cfg_t *data) {
   return vp8e_common_init(ctx, 0);
 }
 
 
 #if CONFIG_EXPERIMENTAL
-static vpx_codec_err_t vp8e_exp_init(vpx_codec_ctx_t *ctx) {
+static vpx_codec_err_t vp8e_exp_init(vpx_codec_ctx_t *ctx,
+                                     vpx_codec_priv_enc_mr_cfg_t *data) {
   return vp8e_common_init(ctx, 1);
 }
 #endif
@@ -957,7 +964,6 @@
   {VP8E_SET_ROI_MAP,                  vp8e_set_roi_map},
   {VP8E_SET_ACTIVEMAP,                vp8e_set_activemap},
   {VP8E_SET_SCALEMODE,                vp8e_set_scalemode},
-  {VP8E_SET_ENCODING_MODE,            set_param},
   {VP8E_SET_CPUUSED,                  set_param},
   {VP8E_SET_NOISE_SENSITIVITY,        set_param},
   {VP8E_SET_ENABLEAUTOALTREF,         set_param},
@@ -972,6 +978,9 @@
   {VP8E_SET_TUNING,                   set_param},
   {VP8E_SET_CQ_LEVEL,                 set_param},
   {VP8E_SET_MAX_INTRA_BITRATE_PCT,    set_param},
+#if CONFIG_LOSSLESS
+  {VP9E_SET_LOSSLESS,                 set_param},
+#endif
   { -1, NULL},
 };
 
@@ -1090,80 +1099,3 @@
   } /* encoder functions */
 };
 #endif
-
-
-/*
- * BEGIN BACKWARDS COMPATIBILITY SHIM.
- */
-#define FORCE_KEY   2
-static vpx_codec_err_t api1_control(vpx_codec_alg_priv_t *ctx,
-                                    int                   ctrl_id,
-                                    va_list               args) {
-  vpx_codec_ctrl_fn_map_t *entry;
-
-  switch (ctrl_id) {
-    case VP8E_SET_FLUSHFLAG:
-      /* VP8 sample code did VP8E_SET_FLUSHFLAG followed by
-       * vpx_codec_get_cx_data() rather than vpx_codec_encode().
-       */
-      return vp8e_encode(ctx, NULL, 0, 0, 0, 0);
-    case VP8E_SET_FRAMETYPE:
-      ctx->base.enc.tbd |= FORCE_KEY;
-      return VPX_CODEC_OK;
-  }
-
-  for (entry = vp8e_ctf_maps; entry && entry->fn; entry++) {
-    if (!entry->ctrl_id || entry->ctrl_id == ctrl_id) {
-      return entry->fn(ctx, ctrl_id, args);
-    }
-  }
-
-  return VPX_CODEC_ERROR;
-}
-
-
-static vpx_codec_ctrl_fn_map_t api1_ctrl_maps[] = {
-  {0, api1_control},
-  { -1, NULL}
-};
-
-
-static vpx_codec_err_t api1_encode(vpx_codec_alg_priv_t  *ctx,
-                                   const vpx_image_t     *img,
-                                   vpx_codec_pts_t        pts,
-                                   unsigned long          duration,
-                                   vpx_enc_frame_flags_t  flags,
-                                   unsigned long          deadline) {
-  int force = ctx->base.enc.tbd;
-
-  ctx->base.enc.tbd = 0;
-  return vp8e_encode
-         (ctx,
-          img,
-          pts,
-          duration,
-          flags | ((force & FORCE_KEY) ? VPX_EFLAG_FORCE_KF : 0),
-          deadline);
-}
-
-
-vpx_codec_iface_t vpx_enc_vp8_algo = {
-  "WebM Project VP8 Encoder (Deprecated API)" VERSION_STRING,
-  VPX_CODEC_INTERNAL_ABI_VERSION,
-  VPX_CODEC_CAP_ENCODER,
-  /* vpx_codec_caps_t          caps; */
-  vp8e_init,          /* vpx_codec_init_fn_t       init; */
-  vp8e_destroy,       /* vpx_codec_destroy_fn_t    destroy; */
-  api1_ctrl_maps,     /* vpx_codec_ctrl_fn_map_t  *ctrl_maps; */
-  NOT_IMPLEMENTED,    /* vpx_codec_get_mmap_fn_t   get_mmap; */
-  NOT_IMPLEMENTED,    /* vpx_codec_set_mmap_fn_t   set_mmap; */
-  {NOT_IMPLEMENTED},  /* decoder functions */
-  {
-    vp8e_usage_cfg_map, /* vpx_codec_enc_cfg_map_t    peek_si; */
-    api1_encode,        /* vpx_codec_encode_fn_t      encode; */
-    vp8e_get_cxdata,    /* vpx_codec_get_cx_data_fn_t   frame_get; */
-    vp8e_set_config,
-    NOT_IMPLEMENTED,
-    vp8e_get_preview,
-  } /* encoder functions */
-};
diff --git a/vp9/vp9_dx_iface.c b/vp9/vp9_dx_iface.c
index 7116d5f..71d140c 100644
--- a/vp9/vp9_dx_iface.c
+++ b/vp9/vp9_dx_iface.c
@@ -163,7 +163,8 @@
   /* nothing to clean up */
 }
 
-static vpx_codec_err_t vp8_init(vpx_codec_ctx_t *ctx) {
+static vpx_codec_err_t vp8_init(vpx_codec_ctx_t *ctx,
+                                vpx_codec_priv_enc_mr_cfg_t *data) {
   vpx_codec_err_t        res = VPX_CODEC_OK;
 
   /* This function only allocates space for the vpx_codec_alg_priv_t
@@ -504,7 +505,7 @@
 
   if (done && !res) {
     vp8_finalize_mmaps(ctx->priv->alg_priv);
-    res = ctx->iface->init(ctx);
+    res = ctx->iface->init(ctx, NULL);
   }
 
   return res;
@@ -661,37 +662,6 @@
 CODEC_INTERFACE(vpx_codec_vp8_dx) = {
   "WebM Project VP8 Decoder" VERSION_STRING,
   VPX_CODEC_INTERNAL_ABI_VERSION,
-  VPX_CODEC_CAP_DECODER | VP8_CAP_POSTPROC |
-  VPX_CODEC_CAP_INPUT_PARTITION,
-  /* vpx_codec_caps_t          caps; */
-  vp8_init,         /* vpx_codec_init_fn_t       init; */
-  vp8_destroy,      /* vpx_codec_destroy_fn_t    destroy; */
-  ctf_maps,         /* vpx_codec_ctrl_fn_map_t  *ctrl_maps; */
-  vp8_xma_get_mmap, /* vpx_codec_get_mmap_fn_t   get_mmap; */
-  vp8_xma_set_mmap, /* vpx_codec_set_mmap_fn_t   set_mmap; */
-  {
-    vp8_peek_si,      /* vpx_codec_peek_si_fn_t    peek_si; */
-    vp8_get_si,       /* vpx_codec_get_si_fn_t     get_si; */
-    vp8_decode,       /* vpx_codec_decode_fn_t     decode; */
-    vp8_get_frame,    /* vpx_codec_frame_get_fn_t  frame_get; */
-  },
-  {
-    /* encoder functions */
-    NOT_IMPLEMENTED,
-    NOT_IMPLEMENTED,
-    NOT_IMPLEMENTED,
-    NOT_IMPLEMENTED,
-    NOT_IMPLEMENTED,
-    NOT_IMPLEMENTED
-  }
-};
-
-/*
- * BEGIN BACKWARDS COMPATIBILITY SHIM.
- */
-vpx_codec_iface_t vpx_codec_vp8_algo = {
-  "WebM Project VP8 Decoder (Deprecated API)" VERSION_STRING,
-  VPX_CODEC_INTERNAL_ABI_VERSION,
   VPX_CODEC_CAP_DECODER | VP8_CAP_POSTPROC,
   /* vpx_codec_caps_t          caps; */
   vp8_init,         /* vpx_codec_init_fn_t       init; */
diff --git a/vpx/internal/vpx_codec_internal.h b/vpx/internal/vpx_codec_internal.h
index 811fe34..4b7b030 100644
--- a/vpx/internal/vpx_codec_internal.h
+++ b/vpx/internal/vpx_codec_internal.h
@@ -56,9 +56,10 @@
  * types, removing or reassigning enums, adding/removing/rearranging
  * fields to structures
  */
-#define VPX_CODEC_INTERNAL_ABI_VERSION (3) /**<\hideinitializer*/
+#define VPX_CODEC_INTERNAL_ABI_VERSION (4) /**<\hideinitializer*/
 
 typedef struct vpx_codec_alg_priv  vpx_codec_alg_priv_t;
+typedef struct vpx_codec_priv_enc_mr_cfg vpx_codec_priv_enc_mr_cfg_t;
 
 /*!\brief init function pointer prototype
  *
@@ -73,7 +74,8 @@
  * \retval #VPX_CODEC_MEM_ERROR
  *     Memory operation failed.
  */
-typedef vpx_codec_err_t (*vpx_codec_init_fn_t)(vpx_codec_ctx_t *ctx);
+typedef vpx_codec_err_t (*vpx_codec_init_fn_t)(vpx_codec_ctx_t *ctx,
+                                               vpx_codec_priv_enc_mr_cfg_t *data);
 
 /*!\brief destroy function pointer prototype
  *
@@ -163,7 +165,7 @@
  * mapping. This implies that ctrl_id values chosen by the algorithm
  * \ref MUST be non-zero.
  */
-typedef const struct {
+typedef const struct vpx_codec_ctrl_fn_map {
   int                    ctrl_id;
   vpx_codec_control_fn_t   fn;
 } vpx_codec_ctrl_fn_map_t;
@@ -263,6 +265,10 @@
 typedef vpx_image_t *
 (*vpx_codec_get_preview_frame_fn_t)(vpx_codec_alg_priv_t   *ctx);
 
+typedef vpx_codec_err_t
+(*vpx_codec_enc_mr_get_mem_loc_fn_t)(const vpx_codec_enc_cfg_t     *cfg,
+                                     void **mem_loc);
+
 /*!\brief usage configuration mapping
  *
  * This structure stores the mapping between usage identifiers and
@@ -273,7 +279,7 @@
  * one mapping must be present, in addition to the end-of-list.
  *
  */
-typedef const struct {
+typedef const struct vpx_codec_enc_cfg_map {
   int                 usage;
   vpx_codec_enc_cfg_t cfg;
 } vpx_codec_enc_cfg_map_t;
@@ -293,19 +299,20 @@
   vpx_codec_ctrl_fn_map_t  *ctrl_maps;   /**< \copydoc ::vpx_codec_ctrl_fn_map_t */
   vpx_codec_get_mmap_fn_t   get_mmap;    /**< \copydoc ::vpx_codec_get_mmap_fn_t */
   vpx_codec_set_mmap_fn_t   set_mmap;    /**< \copydoc ::vpx_codec_set_mmap_fn_t */
-  struct {
+  struct vpx_codec_dec_iface {
     vpx_codec_peek_si_fn_t    peek_si;     /**< \copydoc ::vpx_codec_peek_si_fn_t */
     vpx_codec_get_si_fn_t     get_si;      /**< \copydoc ::vpx_codec_peek_si_fn_t */
     vpx_codec_decode_fn_t     decode;      /**< \copydoc ::vpx_codec_decode_fn_t */
     vpx_codec_get_frame_fn_t  get_frame;   /**< \copydoc ::vpx_codec_get_frame_fn_t */
   } dec;
-  struct {
+  struct vpx_codec_enc_iface {
     vpx_codec_enc_cfg_map_t           *cfg_maps;      /**< \copydoc ::vpx_codec_enc_cfg_map_t */
     vpx_codec_encode_fn_t              encode;        /**< \copydoc ::vpx_codec_encode_fn_t */
     vpx_codec_get_cx_data_fn_t         get_cx_data;   /**< \copydoc ::vpx_codec_get_cx_data_fn_t */
     vpx_codec_enc_config_set_fn_t      cfg_set;       /**< \copydoc ::vpx_codec_enc_config_set_fn_t */
-    vpx_codec_get_global_headers_fn_t  get_glob_hdrs; /**< \copydoc ::vpx_codec_enc_config_set_fn_t */
+    vpx_codec_get_global_headers_fn_t  get_glob_hdrs; /**< \copydoc ::vpx_codec_get_global_headers_fn_t */
     vpx_codec_get_preview_frame_fn_t   get_preview;   /**< \copydoc ::vpx_codec_get_preview_frame_fn_t */
+    vpx_codec_enc_mr_get_mem_loc_fn_t  mr_get_mem_loc;   /**< \copydoc ::vpx_codec_enc_mr_get_mem_loc_fn_t */
   } enc;
 };
 
@@ -343,9 +350,20 @@
     unsigned int                cx_data_pad_before;
     unsigned int                cx_data_pad_after;
     vpx_codec_cx_pkt_t          cx_data_pkt;
+    unsigned int                total_encoders;
   } enc;
 };
 
+/*
+ * Multi-resolution encoding internal configuration
+ */
+struct vpx_codec_priv_enc_mr_cfg {
+  unsigned int           mr_total_resolutions;
+  unsigned int           mr_encoder_id;
+  struct vpx_rational    mr_down_sampling_factor;
+  void                  *mr_low_res_mode_info;
+};
+
 #undef VPX_CTRL_USE_TYPE
 #define VPX_CTRL_USE_TYPE(id, typ) \
   static typ id##__value(va_list args) {return va_arg(args, typ);} \
diff --git a/vpx/src/vpx_decoder.c b/vpx/src/vpx_decoder.c
index 9fa1bf6..1f575e0 100644
--- a/vpx/src/vpx_decoder.c
+++ b/vpx/src/vpx_decoder.c
@@ -35,8 +35,11 @@
     res = VPX_CODEC_INCAPABLE;
   else if ((flags & VPX_CODEC_USE_POSTPROC) && !(iface->caps & VPX_CODEC_CAP_POSTPROC))
     res = VPX_CODEC_INCAPABLE;
-  else if ((flags & VPX_CODEC_USE_INPUT_PARTITION) &&
-           !(iface->caps & VPX_CODEC_CAP_INPUT_PARTITION))
+  else if ((flags & VPX_CODEC_USE_ERROR_CONCEALMENT) &&
+           !(iface->caps & VPX_CODEC_CAP_ERROR_CONCEALMENT))
+    res = VPX_CODEC_INCAPABLE;
+  else if ((flags & VPX_CODEC_USE_INPUT_FRAGMENTS) &&
+           !(iface->caps & VPX_CODEC_CAP_INPUT_FRAGMENTS))
     res = VPX_CODEC_INCAPABLE;
   else if (!(iface->caps & VPX_CODEC_CAP_DECODER))
     res = VPX_CODEC_INCAPABLE;
@@ -50,7 +53,7 @@
     res = VPX_CODEC_OK;
 
     if (!(flags & VPX_CODEC_USE_XMA)) {
-      res = ctx->iface->init(ctx);
+      res = ctx->iface->init(ctx, NULL);
 
       if (res) {
         ctx->err_detail = ctx->priv ? ctx->priv->err_detail : NULL;
diff --git a/vpx/src/vpx_decoder_compat.c b/vpx/src/vpx_decoder_compat.c
deleted file mode 100644
index 59bd261..0000000
--- a/vpx/src/vpx_decoder_compat.c
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*!\file
- * \brief Provides the high level interface to wrap decoder algorithms.
- *
- */
-#include <stdlib.h>
-#include <string.h>
-#include "vpx/vpx_decoder.h"
-#include "vpx/internal/vpx_codec_internal.h"
-
-#define SAVE_STATUS(ctx,var) (ctx?(ctx->err = var):var)
-
-const char *vpx_dec_iface_name(vpx_dec_iface_t *iface) {
-  return vpx_codec_iface_name((vpx_codec_iface_t *)iface);
-}
-
-const char *vpx_dec_err_to_string(vpx_dec_err_t  err) {
-  return vpx_codec_err_to_string(err);
-}
-
-const char *vpx_dec_error(vpx_dec_ctx_t  *ctx) {
-  return vpx_codec_error((vpx_codec_ctx_t *)ctx);
-}
-
-const char *vpx_dec_error_detail(vpx_dec_ctx_t  *ctx) {
-  return vpx_codec_error_detail((vpx_codec_ctx_t *)ctx);
-}
-
-
-vpx_dec_err_t vpx_dec_init_ver(vpx_dec_ctx_t    *ctx,
-                               vpx_dec_iface_t  *iface,
-                               int               ver) {
-  return vpx_codec_dec_init_ver((vpx_codec_ctx_t *)ctx,
-                                (vpx_codec_iface_t *)iface,
-                                NULL,
-                                0,
-                                ver);
-}
-
-
-vpx_dec_err_t vpx_dec_destroy(vpx_dec_ctx_t *ctx) {
-  return vpx_codec_destroy((vpx_codec_ctx_t *)ctx);
-}
-
-
-vpx_dec_caps_t vpx_dec_get_caps(vpx_dec_iface_t *iface) {
-  return vpx_codec_get_caps((vpx_codec_iface_t *)iface);
-}
-
-
-vpx_dec_err_t vpx_dec_peek_stream_info(vpx_dec_iface_t       *iface,
-                                       const uint8_t         *data,
-                                       unsigned int           data_sz,
-                                       vpx_dec_stream_info_t *si) {
-  return vpx_codec_peek_stream_info((vpx_codec_iface_t *)iface, data, data_sz,
-                                    (vpx_codec_stream_info_t *)si);
-}
-
-
-vpx_dec_err_t vpx_dec_get_stream_info(vpx_dec_ctx_t         *ctx,
-                                      vpx_dec_stream_info_t *si) {
-  return vpx_codec_get_stream_info((vpx_codec_ctx_t *)ctx,
-                                   (vpx_codec_stream_info_t *)si);
-}
-
-
-vpx_dec_err_t vpx_dec_control(vpx_dec_ctx_t  *ctx,
-                              int             ctrl_id,
-                              void           *data) {
-  return vpx_codec_control_((vpx_codec_ctx_t *)ctx, ctrl_id, data);
-}
-
-
-vpx_dec_err_t vpx_dec_decode(vpx_dec_ctx_t  *ctx,
-                             uint8_t        *data,
-                             unsigned int    data_sz,
-                             void       *user_priv,
-                             int         rel_pts) {
-  (void)rel_pts;
-  return vpx_codec_decode((vpx_codec_ctx_t *)ctx, data, data_sz, user_priv,
-                          0);
-}
-
-vpx_image_t *vpx_dec_get_frame(vpx_dec_ctx_t  *ctx,
-                               vpx_dec_iter_t *iter) {
-  return vpx_codec_get_frame((vpx_codec_ctx_t *)ctx, iter);
-}
-
-
-vpx_dec_err_t vpx_dec_register_put_frame_cb(vpx_dec_ctx_t             *ctx,
-                                            vpx_dec_put_frame_cb_fn_t  cb,
-                                            void                      *user_priv) {
-  return vpx_codec_register_put_frame_cb((vpx_codec_ctx_t *)ctx, cb,
-                                         user_priv);
-}
-
-
-vpx_dec_err_t vpx_dec_register_put_slice_cb(vpx_dec_ctx_t             *ctx,
-                                            vpx_dec_put_slice_cb_fn_t  cb,
-                                            void                      *user_priv) {
-  return vpx_codec_register_put_slice_cb((vpx_codec_ctx_t *)ctx, cb,
-                                         user_priv);
-}
-
-
-vpx_dec_err_t vpx_dec_xma_init_ver(vpx_dec_ctx_t    *ctx,
-                                   vpx_dec_iface_t  *iface,
-                                   int               ver) {
-  return vpx_codec_dec_init_ver((vpx_codec_ctx_t *)ctx,
-                                (vpx_codec_iface_t *)iface,
-                                NULL,
-                                VPX_CODEC_USE_XMA,
-                                ver);
-}
-
-vpx_dec_err_t vpx_dec_get_mem_map(vpx_dec_ctx_t                *ctx_,
-                                  vpx_dec_mmap_t               *mmap,
-                                  const vpx_dec_stream_info_t  *si,
-                                  vpx_dec_iter_t               *iter) {
-  vpx_codec_ctx_t   *ctx = (vpx_codec_ctx_t *)ctx_;
-  vpx_dec_err_t      res = VPX_DEC_OK;
-
-  if (!ctx || !mmap || !si || !iter || !ctx->iface)
-    res = VPX_DEC_INVALID_PARAM;
-  else if (!(ctx->iface->caps & VPX_DEC_CAP_XMA))
-    res = VPX_DEC_ERROR;
-  else {
-    if (!ctx->config.dec) {
-      ctx->config.dec = malloc(sizeof(vpx_codec_dec_cfg_t));
-      ctx->config.dec->w = si->w;
-      ctx->config.dec->h = si->h;
-    }
-
-    res = ctx->iface->get_mmap(ctx, mmap, iter);
-  }
-
-  return SAVE_STATUS(ctx, res);
-}
-
-
-vpx_dec_err_t vpx_dec_set_mem_map(vpx_dec_ctx_t   *ctx_,
-                                  vpx_dec_mmap_t  *mmap,
-                                  unsigned int     num_maps) {
-  vpx_codec_ctx_t   *ctx = (vpx_codec_ctx_t *)ctx_;
-  vpx_dec_err_t      res = VPX_DEC_MEM_ERROR;
-
-  if (!ctx || !mmap || !ctx->iface)
-    res = VPX_DEC_INVALID_PARAM;
-  else if (!(ctx->iface->caps & VPX_DEC_CAP_XMA))
-    res = VPX_DEC_ERROR;
-  else {
-    void         *save = (ctx->priv) ? NULL : ctx->config.dec;
-    unsigned int i;
-
-    for (i = 0; i < num_maps; i++, mmap++) {
-      if (!mmap->base)
-        break;
-
-      /* Everything look ok, set the mmap in the decoder */
-      res = ctx->iface->set_mmap(ctx, mmap);
-
-      if (res)
-        break;
-    }
-
-    if (save) free(save);
-  }
-
-  return SAVE_STATUS(ctx, res);
-}
diff --git a/vpx/src/vpx_encoder.c b/vpx/src/vpx_encoder.c
index 1d3b646..3cec895 100644
--- a/vpx/src/vpx_encoder.c
+++ b/vpx/src/vpx_encoder.c
@@ -49,7 +49,7 @@
     ctx->priv = NULL;
     ctx->init_flags = flags;
     ctx->config.enc = cfg;
-    res = ctx->iface->init(ctx);
+    res = ctx->iface->init(ctx, NULL);
 
     if (res) {
       ctx->err_detail = ctx->priv ? ctx->priv->err_detail : NULL;
@@ -63,6 +63,97 @@
   return SAVE_STATUS(ctx, res);
 }
 
+vpx_codec_err_t vpx_codec_enc_init_multi_ver(vpx_codec_ctx_t      *ctx,
+                                             vpx_codec_iface_t    *iface,
+                                             vpx_codec_enc_cfg_t  *cfg,
+                                             int                   num_enc,
+                                             vpx_codec_flags_t     flags,
+                                             vpx_rational_t       *dsf,
+                                             int                   ver) {
+  vpx_codec_err_t res = 0;
+
+  if (ver != VPX_ENCODER_ABI_VERSION)
+    res = VPX_CODEC_ABI_MISMATCH;
+  else if (!ctx || !iface || !cfg || (num_enc > 16 || num_enc < 1))
+    res = VPX_CODEC_INVALID_PARAM;
+  else if (iface->abi_version != VPX_CODEC_INTERNAL_ABI_VERSION)
+    res = VPX_CODEC_ABI_MISMATCH;
+  else if (!(iface->caps & VPX_CODEC_CAP_ENCODER))
+    res = VPX_CODEC_INCAPABLE;
+  else if ((flags & VPX_CODEC_USE_XMA) && !(iface->caps & VPX_CODEC_CAP_XMA))
+    res = VPX_CODEC_INCAPABLE;
+  else if ((flags & VPX_CODEC_USE_PSNR)
+           && !(iface->caps & VPX_CODEC_CAP_PSNR))
+    res = VPX_CODEC_INCAPABLE;
+  else if ((flags & VPX_CODEC_USE_OUTPUT_PARTITION)
+           && !(iface->caps & VPX_CODEC_CAP_OUTPUT_PARTITION))
+    res = VPX_CODEC_INCAPABLE;
+  else {
+    int i;
+    void *mem_loc = NULL;
+
+    if (!(res = iface->enc.mr_get_mem_loc(cfg, &mem_loc))) {
+      for (i = 0; i < num_enc; i++) {
+        vpx_codec_priv_enc_mr_cfg_t mr_cfg;
+
+        /* Validate down-sampling factor. */
+        if (dsf->num < 1 || dsf->num > 4096 || dsf->den < 1 ||
+            dsf->den > dsf->num) {
+          res = VPX_CODEC_INVALID_PARAM;
+          break;
+        }
+
+        mr_cfg.mr_low_res_mode_info = mem_loc;
+        mr_cfg.mr_total_resolutions = num_enc;
+        mr_cfg.mr_encoder_id = num_enc - 1 - i;
+        mr_cfg.mr_down_sampling_factor.num = dsf->num;
+        mr_cfg.mr_down_sampling_factor.den = dsf->den;
+
+        /* Force Key-frame synchronization. Namely, encoder at higher
+         * resolution always use the same frame_type chosen by the
+         * lowest-resolution encoder.
+         */
+        if (mr_cfg.mr_encoder_id)
+          cfg->kf_mode = VPX_KF_DISABLED;
+
+        ctx->iface = iface;
+        ctx->name = iface->name;
+        ctx->priv = NULL;
+        ctx->init_flags = flags;
+        ctx->config.enc = cfg;
+        res = ctx->iface->init(ctx, &mr_cfg);
+
+        if (res) {
+          const char *error_detail =
+            ctx->priv ? ctx->priv->err_detail : NULL;
+          /* Destroy current ctx */
+          ctx->err_detail = error_detail;
+          vpx_codec_destroy(ctx);
+
+          /* Destroy already allocated high-level ctx */
+          while (i) {
+            ctx--;
+            ctx->err_detail = error_detail;
+            vpx_codec_destroy(ctx);
+            i--;
+          }
+        }
+
+        if (ctx->priv)
+          ctx->priv->iface = ctx->iface;
+
+        if (res)
+          break;
+
+        ctx++;
+        cfg++;
+        dsf++;
+      }
+    }
+  }
+
+  return SAVE_STATUS(ctx, res);
+}
 
 
 vpx_codec_err_t  vpx_codec_enc_config_default(vpx_codec_iface_t    *iface,
@@ -115,7 +206,7 @@
                                   unsigned long               duration,
                                   vpx_enc_frame_flags_t       flags,
                                   unsigned long               deadline) {
-  vpx_codec_err_t res;
+  vpx_codec_err_t res = 0;
 
   if (!ctx || (img && !duration))
     res = VPX_CODEC_INVALID_PARAM;
@@ -127,9 +218,35 @@
     /* Execute in a normalized floating point environment, if the platform
      * requires it.
      */
+    unsigned int num_enc = ctx->priv->enc.total_encoders;
+
     FLOATING_POINT_INIT();
-    res = ctx->iface->enc.encode(ctx->priv->alg_priv, img, pts,
-                                 duration, flags, deadline);
+
+    if (num_enc == 1)
+      res = ctx->iface->enc.encode(ctx->priv->alg_priv, img, pts,
+                                   duration, flags, deadline);
+    else {
+      /* Multi-resolution encoding:
+       * Encode multi-levels in reverse order. For example,
+       * if mr_total_resolutions = 3, first encode level 2,
+       * then encode level 1, and finally encode level 0.
+       */
+      int i;
+
+      ctx += num_enc - 1;
+      if (img) img += num_enc - 1;
+
+      for (i = num_enc - 1; i >= 0; i--) {
+        if ((res = ctx->iface->enc.encode(ctx->priv->alg_priv, img, pts,
+                                          duration, flags, deadline)))
+          break;
+
+        ctx--;
+        if (img) img--;
+      }
+      ctx++;
+    }
+
     FLOATING_POINT_RESTORE();
   }
 
diff --git a/vpx/src/vpx_image.c b/vpx/src/vpx_image.c
index 4903789..36eda95 100644
--- a/vpx/src/vpx_image.c
+++ b/vpx/src/vpx_image.c
@@ -13,10 +13,38 @@
 #include <string.h>
 #include "vpx/vpx_image.h"
 
+#define ADDRESS_STORAGE_SIZE      sizeof(size_t)
+/*returns an addr aligned to the byte boundary specified by align*/
+#define align_addr(addr,align) (void*)(((size_t)(addr) + ((align) - 1)) & (size_t)-(align))
+
+/* Memalign code is copied from vpx_mem.c */
+static void *img_buf_memalign(size_t align, size_t size) {
+  void *addr,
+       * x = NULL;
+
+  addr = malloc(size + align - 1 + ADDRESS_STORAGE_SIZE);
+
+  if (addr) {
+    x = align_addr((unsigned char *)addr + ADDRESS_STORAGE_SIZE, (int)align);
+    /* save the actual malloc address */
+    ((size_t *)x)[-1] = (size_t)addr;
+  }
+
+  return x;
+}
+
+static void img_buf_free(void *memblk) {
+  if (memblk) {
+    void *addr = (void *)(((size_t *)memblk)[-1]);
+    free(addr);
+  }
+}
+
 static vpx_image_t *img_alloc_helper(vpx_image_t  *img,
                                      vpx_img_fmt_t fmt,
                                      unsigned int  d_w,
                                      unsigned int  d_h,
+                                     unsigned int  buf_align,
                                      unsigned int  stride_align,
                                      unsigned char      *img_data) {
 
@@ -24,6 +52,14 @@
   int           align;
 
   /* Treat align==0 like align==1 */
+  if (!buf_align)
+    buf_align = 1;
+
+  /* Validate alignment (must be power of 2) */
+  if (buf_align & (buf_align - 1))
+    goto fail;
+
+  /* Treat align==0 like align==1 */
   if (!stride_align)
     stride_align = 1;
 
@@ -111,7 +147,8 @@
   img->img_data = img_data;
 
   if (!img_data) {
-    img->img_data = malloc((fmt & VPX_IMG_FMT_PLANAR) ? h * w * bps / 8 : h * s);
+    img->img_data = img_buf_memalign(buf_align, ((fmt & VPX_IMG_FMT_PLANAR) ?
+                                                 h * s * bps / 8 : h * s));
     img->img_data_owner = 1;
   }
 
@@ -142,8 +179,8 @@
                            vpx_img_fmt_t fmt,
                            unsigned int  d_w,
                            unsigned int  d_h,
-                           unsigned int  stride_align) {
-  return img_alloc_helper(img, fmt, d_w, d_h, stride_align, NULL);
+                           unsigned int  align) {
+  return img_alloc_helper(img, fmt, d_w, d_h, align, align, NULL);
 }
 
 vpx_image_t *vpx_img_wrap(vpx_image_t  *img,
@@ -152,7 +189,9 @@
                           unsigned int  d_h,
                           unsigned int  stride_align,
                           unsigned char       *img_data) {
-  return img_alloc_helper(img, fmt, d_w, d_h, stride_align, img_data);
+  /* By setting buf_align = 1, we don't change buffer alignment in this
+   * function. */
+  return img_alloc_helper(img, fmt, d_w, d_h, 1, stride_align, img_data);
 }
 
 int vpx_img_set_rect(vpx_image_t  *img,
@@ -232,7 +271,7 @@
 void vpx_img_free(vpx_image_t *img) {
   if (img) {
     if (img->img_data && img->img_data_owner)
-      free(img->img_data);
+      img_buf_free(img->img_data);
 
     if (img->self_allocd)
       free(img);
diff --git a/vpx/vp8.h b/vpx/vp8.h
index 1450efb..3c31363 100644
--- a/vpx/vp8.h
+++ b/vpx/vp8.h
@@ -28,8 +28,8 @@
 /*!\file
  * \brief Provides controls common to both the VP8 encoder and decoder.
  */
-#ifndef VP9_H
-#define VP9_H
+#ifndef VP8_H
+#define VP8_H
 #include "vpx_codec_impl_top.h"
 
 /*!\brief Control functions
@@ -45,7 +45,7 @@
   VP8_SET_DBG_COLOR_B_MODES   = 6,    /**< set which blocks modes to color */
   VP8_SET_DBG_DISPLAY_MV      = 7,    /**< set which motion vector modes to draw */
   VP8_COMMON_CTRL_ID_MAX,
-  VP8_DECODER_CTRL_ID_START   = 256,
+  VP8_DECODER_CTRL_ID_START   = 256
 };
 
 /*!\brief post process flags
@@ -61,6 +61,7 @@
   VP8_DEBUG_TXT_MBLK_MODES    = 1 << 4, /**< print macro block modes over each macro block */
   VP8_DEBUG_TXT_DC_DIFF       = 1 << 5, /**< print dc diff for each macro block */
   VP8_DEBUG_TXT_RATE_INFO     = 1 << 6, /**< print video rate info (encoder only) */
+  VP8_MFQE                    = 1 << 10
 };
 
 /*!\brief post process flags
@@ -113,13 +114,5 @@
 
 /*! @} - end defgroup vp8 */
 
-#if !defined(VPX_CODEC_DISABLE_COMPAT) || !VPX_CODEC_DISABLE_COMPAT
-/* The following definitions are provided for backward compatibility with
- * the VP8 1.0.x SDK. USE IN PRODUCTION CODE IS NOT RECOMMENDED.
- */
-
-DECLSPEC_DEPRECATED extern vpx_codec_iface_t vpx_codec_vp8_algo DEPRECATED;
-#endif
-
 #include "vpx_codec_impl_bottom.h"
 #endif
diff --git a/vpx/vp8cx.h b/vpx/vp8cx.h
index 193ae80..50fc7f0 100644
--- a/vpx/vp8cx.h
+++ b/vpx/vp8cx.h
@@ -20,9 +20,8 @@
  * \brief Provides definitions for using the VP8 encoder algorithm within the
  *        vpx Codec Interface.
  */
-#ifndef VP9CX_H
-#define VP9CX_H
-#include "vpx_config.h"
+#ifndef VP8CX_H
+#define VP8CX_H
 #include "vpx_codec_impl_top.h"
 
 /*!\name Algorithm interface for VP8
@@ -33,18 +32,12 @@
  */
 extern vpx_codec_iface_t  vpx_codec_vp8_cx_algo;
 extern vpx_codec_iface_t *vpx_codec_vp8_cx(void);
-/*!@} - end algorithm interface member group*/
 
-
-#if CONFIG_EXPERIMENTAL
-/*!\brief Algorithm interface for VP8 experimental branch
- *
- * This interface provides the ability to encode using the "experimental"
- * VP8 variant, which is bitstream incompatible with the default VP8 encoder.
- */
-extern vpx_codec_iface_t vpx_codec_vp8x_cx_algo;
+/* TODO(jkoleszar): These move to VP9 in a later patch set. */
+extern vpx_codec_iface_t  vpx_codec_vp8x_cx_algo;
 extern vpx_codec_iface_t *vpx_codec_vp8x_cx(void);
-#endif
+
+/*!@} - end algorithm interface member group*/
 
 
 /*
@@ -189,6 +182,10 @@
    *
    */
   VP8E_SET_MAX_INTRA_BITRATE_PCT,
+
+
+  /* TODO(jkoleszar): Move to vp9cx.h */
+  VP9E_SET_LOSSLESS
 };
 
 /*!\brief vpx 1-D scaling mode
@@ -213,8 +210,8 @@
   unsigned char *roi_map;      /**< specify an id between 0 and 3 for each 16x16 region within a frame */
   unsigned int   rows;         /**< number of rows */
   unsigned int   cols;         /**< number of cols */
-  int     delta_q[4];          /**< quantizer delta [-64, 64] off baseline for regions with id between 0 and 3*/
-  int     delta_lf[4];         /**< loop filter strength delta [-32, 32] for regions with id between 0 and 3 */
+  int     delta_q[4];          /**< quantizer delta [-63, 63] off baseline for regions with id between 0 and 3*/
+  int     delta_lf[4];         /**< loop filter strength delta [-63, 63] for regions with id between 0 and 3 */
   unsigned int   static_threshold[4];/**< threshold for region to be treated as static */
 } vpx_roi_map_t;
 
@@ -241,17 +238,6 @@
   VPX_SCALING_MODE    v_scaling_mode;  /**< vertical scaling mode   */
 } vpx_scaling_mode_t;
 
-/*!\brief VP8 encoding mode
- *
- * This defines VP8 encoding mode
- *
- */
-typedef enum {
-  VP8_BEST_QUALITY_ENCODING,
-  VP8_GOOD_QUALITY_ENCODING,
-  VP8_REAL_TIME_ENCODING
-} vp8e_encoding_mode;
-
 /*!\brief VP8 token partition mode
  *
  * This defines VP8 partitioning mode for compressed data, i.e., the number of
@@ -263,7 +249,7 @@
   VP8_ONE_TOKENPARTITION   = 0,
   VP8_TWO_TOKENPARTITION   = 1,
   VP8_FOUR_TOKENPARTITION  = 2,
-  VP8_EIGHT_TOKENPARTITION = 3,
+  VP8_EIGHT_TOKENPARTITION = 3
 } vp8e_token_partitions;
 
 
@@ -302,12 +288,12 @@
 VPX_CTRL_USE_TYPE(VP8E_SET_NOISE_SENSITIVITY,  unsigned int)
 VPX_CTRL_USE_TYPE(VP8E_SET_SHARPNESS,          unsigned int)
 VPX_CTRL_USE_TYPE(VP8E_SET_STATIC_THRESHOLD,   unsigned int)
-VPX_CTRL_USE_TYPE(VP8E_SET_TOKEN_PARTITIONS,   vp8e_token_partitions)
+VPX_CTRL_USE_TYPE(VP8E_SET_TOKEN_PARTITIONS,   int) /* vp8e_token_partitions */
 
 VPX_CTRL_USE_TYPE(VP8E_SET_ARNR_MAXFRAMES,     unsigned int)
 VPX_CTRL_USE_TYPE(VP8E_SET_ARNR_STRENGTH,     unsigned int)
 VPX_CTRL_USE_TYPE(VP8E_SET_ARNR_TYPE,     unsigned int)
-VPX_CTRL_USE_TYPE(VP8E_SET_TUNING,             vp8e_tuning)
+VPX_CTRL_USE_TYPE(VP8E_SET_TUNING,             int) /* vp8e_tuning */
 VPX_CTRL_USE_TYPE(VP8E_SET_CQ_LEVEL,      unsigned int)
 
 VPX_CTRL_USE_TYPE(VP8E_GET_LAST_QUANTIZER,     int *)
@@ -315,6 +301,7 @@
 
 VPX_CTRL_USE_TYPE(VP8E_SET_MAX_INTRA_BITRATE_PCT, unsigned int)
 
+VPX_CTRL_USE_TYPE(VP9E_SET_LOSSLESS, unsigned int)
 
 /*! @} - end defgroup vp8_encoder */
 #include "vpx_codec_impl_bottom.h"
diff --git a/vpx/vp8dx.h b/vpx/vp8dx.h
index b076f51..a2c3a39 100644
--- a/vpx/vp8dx.h
+++ b/vpx/vp8dx.h
@@ -20,8 +20,8 @@
  * \brief Provides definitions for using the VP8 algorithm within the vpx Decoder
  *        interface.
  */
-#ifndef VP9DX_H
-#define VP9DX_H
+#ifndef VP8DX_H
+#define VP8DX_H
 #include "vpx_codec_impl_top.h"
 
 /*!\name Algorithm interface for VP8
@@ -54,6 +54,11 @@
   /** check if the indicated frame is corrupted */
   VP8D_GET_FRAME_CORRUPTED,
 
+  /** control function to get info on which reference frames were used
+   *  by the last decode
+   */
+  VP8D_GET_LAST_REF_USED,
+
   VP8_DECODER_CTRL_ID_MAX
 };
 
@@ -68,7 +73,7 @@
 
 VPX_CTRL_USE_TYPE(VP8D_GET_LAST_REF_UPDATES,   int *)
 VPX_CTRL_USE_TYPE(VP8D_GET_FRAME_CORRUPTED,    int *)
-
+VPX_CTRL_USE_TYPE(VP8D_GET_LAST_REF_USED,      int *)
 
 /*! @} - end defgroup vp8_decoder */
 
diff --git a/vpx/vp8e.h b/vpx/vp8e.h
deleted file mode 100644
index 00ff090..0000000
--- a/vpx/vp8e.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/* This file contains backwards compatibility stubs for applications using
- * the VP8 version 1.0 API.
- */
-#ifndef VP9E_H
-#define VP9E_H
-#include "vpx_codec_impl_top.h"
-
-#if defined(VPX_CODEC_DISABLE_COMPAT) && VPX_CODEC_DISABLE_COMPAT
-#error "Backwards compatibility disabled: don't include vp8e.h"
-#endif
-
-#include "vp8cx.h"
-DECLSPEC_DEPRECATED extern vpx_codec_iface_t vpx_enc_vp8_algo DEPRECATED;
-
-
-enum {
-  VP8E_SET_REFERENCE     = VP8_SET_REFERENCE,
-  VP8E_COPY_REFERENCE    = VP8_COPY_REFERENCE,
-  VP8E_SET_PREVIEWPP     = VP8_SET_POSTPROC,
-  VP8E_SET_FLUSHFLAG     = 4,
-  VP8E_SET_FRAMETYPE     = 10,
-  VP8E_SET_ENCODING_MODE = 12
-};
-
-#define NORMAL_FRAME   (0)
-#define KEY_FRAME      (1)
-
-/* Change VP8E to VP8 to get the undeprecated version of these (defined in
- * vp8.h)
- */
-VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_SET_REFERENCE,   vpx_ref_frame_t *)
-VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_COPY_REFERENCE,  vpx_ref_frame_t *)
-VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_SET_PREVIEWPP,   vp8_postproc_cfg_t *)
-
-
-/* Flush is done by calling vpx_codec_encode with a NULL input image. */
-VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_SET_FLUSHFLAG,          int)
-
-
-/* Frame type is set with a flag to vpx_codec_control. See VPX_EFLAG_FORCE_KF
- */
-VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_SET_FRAMETYPE,          int)
-
-
-/* This control has been deprecated in favor of the duration parameter to
- * vpx_codec_encode(). Use the #VPX_DL_REALTIME, #VPX_DL_GOOD_QUALITY,
- * #VPX_DL_BEST_QUALITY constants to that parameter instead.
- */
-VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_SET_ENCODING_MODE, vp8e_encoding_mode)
-#include "vpx_codec_impl_bottom.h"
-#endif
diff --git a/vpx/vpx_codec.mk b/vpx/vpx_codec.mk
index 4f1d74b..427fd0f 100644
--- a/vpx/vpx_codec.mk
+++ b/vpx/vpx_codec.mk
@@ -11,12 +11,10 @@
 
 API_EXPORTS += exports
 
-API_SRCS-$(CONFIG_DECODERS) += src/vpx_decoder.c
-API_SRCS-$(CONFIG_DECODERS) += src/vpx_decoder_compat.c
-API_SRCS-$(CONFIG_DECODERS) += vpx_decoder.h
-API_SRCS-$(CONFIG_DECODERS) += vpx_decoder_compat.h
-API_SRCS-$(CONFIG_ENCODERS) += src/vpx_encoder.c
-API_SRCS-$(CONFIG_ENCODERS) += vpx_encoder.h
+API_SRCS-yes                += src/vpx_decoder.c
+API_SRCS-yes                += vpx_decoder.h
+API_SRCS-yes                += src/vpx_encoder.c
+API_SRCS-yes                += vpx_encoder.h
 API_SRCS-yes                += internal/vpx_codec_internal.h
 API_SRCS-yes                += src/vpx_codec.c
 API_SRCS-yes                += src/vpx_image.c
diff --git a/vpx/vpx_decoder.h b/vpx/vpx_decoder.h
index 3b919e5..dbe6aaa 100644
--- a/vpx/vpx_decoder.h
+++ b/vpx/vpx_decoder.h
@@ -53,8 +53,10 @@
 #define VPX_CODEC_CAP_PUT_SLICE  0x10000 /**< Will issue put_slice callbacks */
 #define VPX_CODEC_CAP_PUT_FRAME  0x20000 /**< Will issue put_frame callbacks */
 #define VPX_CODEC_CAP_POSTPROC   0x40000 /**< Can postprocess decoded frame */
-#define VPX_CODEC_CAP_INPUT_PARTITION   0x100000 /**< Can receive encoded frames
-  one partition at a time */
+#define VPX_CODEC_CAP_ERROR_CONCEALMENT   0x80000 /**< Can conceal errors due to
+  packet loss */
+#define VPX_CODEC_CAP_INPUT_FRAGMENTS   0x100000 /**< Can receive encoded frames
+  one fragment at a time */
 
   /*! \brief Initialization-time Feature Enabling
    *
@@ -64,9 +66,11 @@
    *  The available flags are specified by VPX_CODEC_USE_* defines.
    */
 #define VPX_CODEC_USE_POSTPROC   0x10000 /**< Postprocess decoded frame */
-#define VPX_CODEC_USE_INPUT_PARTITION   0x40000 /**< The input frame should be
+#define VPX_CODEC_USE_ERROR_CONCEALMENT 0x20000 /**< Conceal errors in decoded
+  frames */
+#define VPX_CODEC_USE_INPUT_FRAGMENTS   0x40000 /**< The input frame should be
   passed to the decoder one
-  partition at a time */
+  fragment at a time */
 
   /*!\brief Stream properties
    *
@@ -107,6 +111,10 @@
    * function directly, to ensure that the ABI version number parameter
    * is properly initialized.
    *
+   * If the library was configured with --disable-multithread, this call
+   * is not thread safe and should be guarded with a lock if being used
+   * in a multithreaded context.
+   *
    * In XMA mode (activated by setting VPX_CODEC_USE_XMA in the flags
    * parameter), the storage pointed to by the cfg parameter must be
    * kept readable and stable until all memory maps have been set.
@@ -183,11 +191,13 @@
    * generated, as appropriate. Encoded data \ref MUST be passed in DTS (decode
    * time stamp) order. Frames produced will always be in PTS (presentation
    * time stamp) order.
-   * If the decoder is configured with VPX_CODEC_USE_INPUT_PARTITION enabled,
-   * data and data_sz must contain at most one encoded partition. When no more
-   * data is available, this function should be called with NULL as data and 0
-   * as data_sz. The memory passed to this function must be available until
-   * the frame has been decoded.
+   * If the decoder is configured with VPX_CODEC_USE_INPUT_FRAGMENTS enabled,
+   * data and data_sz can contain a fragment of the encoded frame. Fragment
+   * \#n must contain at least partition \#n, but can also contain subsequent
+   * partitions (\#n+1 - \#n+i), and if so, fragments \#n+1, .., \#n+i must
+   * be empty. When no more data is available, this function should be called
+   * with NULL as data and 0 as data_sz. The memory passed to this function
+   * must be available until the frame has been decoded.
    *
    * \param[in] ctx          Pointer to this instance's context
    * \param[in] data         Pointer to this block of new coded data. If
@@ -319,7 +329,3 @@
 #ifdef __cplusplus
 }
 #endif
-
-#if !defined(VPX_CODEC_DISABLE_COMPAT) || !VPX_CODEC_DISABLE_COMPAT
-#include "vpx_decoder_compat.h"
-#endif
diff --git a/vpx/vpx_decoder_compat.h b/vpx/vpx_decoder_compat.h
deleted file mode 100644
index c657ef9..0000000
--- a/vpx/vpx_decoder_compat.h
+++ /dev/null
@@ -1,584 +0,0 @@
-/*
- *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*!\defgroup decoder Common Decoder Algorithm Interface
- * This abstraction allows applications using this decoder to easily support
- * multiple video formats with minimal code duplication. This section describes
- * the interface common to all codecs.
- * @{
- */
-
-/*!\file
- * \brief Provides a compatibility layer between version 1 and 2 of this API.
- *
- * This interface has been deprecated. Only existing code should make use
- * of this interface, and therefore, it is only thinly documented. Existing
- * code should be ported to the vpx_codec_* API.
- */
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifndef VPX_DECODER_COMPAT_H
-#define VPX_DECODER_COMPAT_H
-
-  /*!\brief Decoder algorithm return codes */
-  typedef enum {
-    /*!\brief Operation completed without error */
-    VPX_DEC_OK = VPX_CODEC_OK,
-
-    /*!\brief Unspecified error */
-    VPX_DEC_ERROR = VPX_CODEC_ERROR,
-
-    /*!\brief Memory operation failed */
-    VPX_DEC_MEM_ERROR = VPX_CODEC_MEM_ERROR,
-
-    /*!\brief ABI version mismatch */
-    VPX_DEC_ABI_MISMATCH = VPX_CODEC_ABI_MISMATCH,
-
-    /*!\brief The given bitstream is not supported.
-     *
-     * The bitstream was unable to be parsed at the highest level. The decoder
-     * is unable to proceed. This error \ref SHOULD be treated as fatal to the
-     * stream. */
-    VPX_DEC_UNSUP_BITSTREAM = VPX_CODEC_UNSUP_BITSTREAM,
-
-    /*!\brief Encoded bitstream uses an unsupported feature
-     *
-     * The decoder does not implement a feature required by the encoder. This
-     * return code should only be used for features that prevent future
-     * pictures from being properly decoded. This error \ref MAY be treated as
-     * fatal to the stream or \ref MAY be treated as fatal to the current GOP.
-     */
-    VPX_DEC_UNSUP_FEATURE = VPX_CODEC_UNSUP_FEATURE,
-
-    /*!\brief The coded data for this stream is corrupt or incomplete
-     *
-     * There was a problem decoding the current frame.  This return code
-     * should only be used for failures that prevent future pictures from
-     * being properly decoded. This error \ref MAY be treated as fatal to the
-     * stream or \ref MAY be treated as fatal to the current GOP. If decoding
-     * is continued for the current GOP, artifacts may be present.
-     */
-    VPX_DEC_CORRUPT_FRAME = VPX_CODEC_CORRUPT_FRAME,
-
-    /*!\brief An application-supplied parameter is not valid.
-     *
-     */
-    VPX_DEC_INVALID_PARAM = VPX_CODEC_INVALID_PARAM,
-
-    /*!\brief An iterator reached the end of list.
-     *
-     */
-    VPX_DEC_LIST_END = VPX_CODEC_LIST_END
-
-  }
-                     vpx_dec_err_t;
-
-  /*! \brief Decoder capabilities bitfield
-   *
-   *  Each decoder advertises the capabilities it supports as part of its
-   *  ::vpx_dec_iface_t interface structure. Capabilities are extra interfaces
-   *  or functionality, and are not required to be supported by a decoder.
-   *
-   *  The available flags are specified by VPX_DEC_CAP_* defines.
-   */
-  typedef int vpx_dec_caps_t;
-#define VPX_DEC_CAP_PUT_SLICE  0x0001 /**< Will issue put_slice callbacks */
-#define VPX_DEC_CAP_PUT_FRAME  0x0002 /**< Will issue put_frame callbacks */
-#define VPX_DEC_CAP_XMA        0x0004 /**< Supports eXternal Memory Allocation */
-
-  /*!\brief Stream properties
-   *
-   * This structure is used to query or set properties of the decoded
-   * stream. Algorithms may extend this structure with data specific
-   * to their bitstream by setting the sz member appropriately.
-   */
-#if 1
-  typedef vpx_codec_stream_info_t vpx_dec_stream_info_t;
-#else
-  typedef struct {
-    unsigned int sz;     /**< Size of this structure */
-    unsigned int w;      /**< Width (or 0 for unknown/default) */
-    unsigned int h;      /**< Height (or 0 for unknown/default) */
-    unsigned int is_kf;  /**< Current frame is a keyframe */
-  } vpx_dec_stream_info_t;
-#endif
-
-
-  /*!\brief Decoder interface structure.
-   *
-   * Contains function pointers and other data private to the decoder
-   * implementation. This structure is opaque to the application.
-   */
-  typedef const struct vpx_codec_iface vpx_dec_iface_t;
-  typedef       struct vpx_codec_priv  vpx_dec_priv_t;
-
-  /*!\brief Iterator
-   *
-   * Opaque storage used for iterating over lists.
-   */
-  typedef vpx_codec_iter_t vpx_dec_iter_t;
-
-  /*!\brief Decoder context structure
-   *
-   * All decoders \ref MUST support this context structure fully. In general,
-   * this data should be considered private to the decoder algorithm, and
-   * not be manipulated or examined by the calling application. Applications
-   * may reference the 'name' member to get a printable description of the
-   * algorithm.
-   */
-#if 1
-  typedef vpx_codec_ctx_t vpx_dec_ctx_t;
-#else
-  typedef struct {
-    const char            *name;        /**< Printable interface name */
-    vpx_dec_iface_t       *iface;       /**< Interface pointers */
-    vpx_dec_err_t          err;         /**< Last returned error */
-    vpx_dec_priv_t        *priv;        /**< Algorithm private storage */
-  } vpx_dec_ctx_t;
-#endif
-
-
-  /*!\brief Return the build configuration
-   *
-   * Returns a printable string containing an encoded version of the build
-   * configuration. This may be useful to vpx support.
-   *
-   */
-  const char *vpx_dec_build_config(void) DEPRECATED;
-
-  /*!\brief Return the name for a given interface
-   *
-   * Returns a human readable string for name of the given decoder interface.
-   *
-   * \param[in]    iface     Interface pointer
-   *
-   */
-  const char *vpx_dec_iface_name(vpx_dec_iface_t *iface) DEPRECATED;
-
-
-  /*!\brief Convert error number to printable string
-   *
-   * Returns a human readable string for the last error returned by the
-   * algorithm. The returned error will be one line and will not contain
-   * any newline characters.
-   *
-   *
-   * \param[in]    err     Error number.
-   *
-   */
-  const char *vpx_dec_err_to_string(vpx_dec_err_t  err) DEPRECATED;
-
-
-  /*!\brief Retrieve error synopsis for decoder context
-   *
-   * Returns a human readable string for the last error returned by the
-   * algorithm. The returned error will be one line and will not contain
-   * any newline characters.
-   *
-   *
-   * \param[in]    ctx     Pointer to this instance's context.
-   *
-   */
-  const char *vpx_dec_error(vpx_dec_ctx_t  *ctx) DEPRECATED;
-
-
-  /*!\brief Retrieve detailed error information for decoder context
-   *
-   * Returns a human readable string providing detailed information about
-   * the last error.
-   *
-   * \param[in]    ctx     Pointer to this instance's context.
-   *
-   * \retval NULL
-   *     No detailed information is available.
-   */
-  const char *vpx_dec_error_detail(vpx_dec_ctx_t  *ctx) DEPRECATED;
-
-
-  /* REQUIRED FUNCTIONS
-   *
-   * The following functions are required to be implemented for all decoders.
-   * They represent the base case functionality expected of all decoders.
-   */
-
-
-  /*!\brief Initialize a decoder instance
-   *
-   * Initializes a decoder context using the given interface. Applications
-   * should call the vpx_dec_init convenience macro instead of this
-   * function directly, to ensure that the ABI version number parameter
-   * is properly initialized.
-   *
-   * \param[in]    ctx     Pointer to this instance's context.
-   * \param[in]    iface   Pointer to the algorithm interface to use.
-   * \param[in]    ver     ABI version number. Must be set to
-   *                       VPX_DECODER_ABI_VERSION
-   * \retval #VPX_DEC_OK
-   *     The decoder algorithm initialized.
-   * \retval #VPX_DEC_MEM_ERROR
-   *     Memory allocation failed.
-   */
-  vpx_dec_err_t vpx_dec_init_ver(vpx_dec_ctx_t    *ctx,
-                                 vpx_dec_iface_t  *iface,
-                                 int               ver) DEPRECATED;
-#define vpx_dec_init(ctx, iface) \
-  vpx_dec_init_ver(ctx, iface, VPX_DECODER_ABI_VERSION)
-
-
-  /*!\brief Destroy a decoder instance
-   *
-   * Destroys a decoder context, freeing any associated memory buffers.
-   *
-   * \param[in] ctx   Pointer to this instance's context
-   *
-   * \retval #VPX_DEC_OK
-   *     The decoder algorithm initialized.
-   * \retval #VPX_DEC_MEM_ERROR
-   *     Memory allocation failed.
-   */
-  vpx_dec_err_t vpx_dec_destroy(vpx_dec_ctx_t *ctx) DEPRECATED;
-
-
-  /*!\brief Get the capabilities of an algorithm.
-   *
-   * Retrieves the capabilities bitfield from the algorithm's interface.
-   *
-   * \param[in] iface   Pointer to the algorithm interface
-   *
-   */
-  vpx_dec_caps_t vpx_dec_get_caps(vpx_dec_iface_t *iface) DEPRECATED;
-
-
-  /*!\brief Parse stream info from a buffer
-   *
-   * Performs high level parsing of the bitstream. Construction of a decoder
-   * context is not necessary. Can be used to determine if the bitstream is
-   * of the proper format, and to extract information from the stream.
-   *
-   * \param[in]      iface   Pointer to the algorithm interface
-   * \param[in]      data    Pointer to a block of data to parse
-   * \param[in]      data_sz Size of the data buffer
-   * \param[in,out]  si      Pointer to stream info to update. The size member
-   *                         \ref MUST be properly initialized, but \ref MAY be
-   *                         clobbered by the algorithm. This parameter \ref MAY
-   *                         be NULL.
-   *
-   * \retval #VPX_DEC_OK
-   *     Bitstream is parsable and stream information updated
-   */
-  vpx_dec_err_t vpx_dec_peek_stream_info(vpx_dec_iface_t       *iface,
-                                         const uint8_t         *data,
-                                         unsigned int           data_sz,
-                                         vpx_dec_stream_info_t *si) DEPRECATED;
-
-
-  /*!\brief Return information about the current stream.
-   *
-   * Returns information about the stream that has been parsed during decoding.
-   *
-   * \param[in]      ctx     Pointer to this instance's context
-   * \param[in,out]  si      Pointer to stream info to update. The size member
-   *                         \ref MUST be properly initialized, but \ref MAY be
-   *                         clobbered by the algorithm. This parameter \ref MAY
-   *                         be NULL.
-   *
-   * \retval #VPX_DEC_OK
-   *     Bitstream is parsable and stream information updated
-   */
-  vpx_dec_err_t vpx_dec_get_stream_info(vpx_dec_ctx_t         *ctx,
-                                        vpx_dec_stream_info_t *si) DEPRECATED;
-
-
-  /*!\brief Control algorithm
-   *
-   * This function is used to exchange algorithm specific data with the decoder
-   * instance. This can be used to implement features specific to a particular
-   * algorithm.
-   *
-   * This wrapper function dispatches the request to the helper function
-   * associated with the given ctrl_id. It tries to call this function
-   * transparently, but will return #VPX_DEC_ERROR if the request could not
-   * be dispatched.
-   *
-   * \param[in]     ctx              Pointer to this instance's context
-   * \param[in]     ctrl_id          Algorithm specific control identifier
-   * \param[in,out] data             Data to exchange with algorithm instance.
-   *
-   * \retval #VPX_DEC_OK
-   *     The control request was processed.
-   * \retval #VPX_DEC_ERROR
-   *     The control request was not processed.
-   * \retval #VPX_DEC_INVALID_PARAM
-   *     The data was not valid.
-   */
-  vpx_dec_err_t vpx_dec_control(vpx_dec_ctx_t  *ctx,
-                                int             ctrl_id,
-                                void           *data) DEPRECATED;
-
-  /*!\brief Decode data
-   *
-   * Processes a buffer of coded data. If the processing results in a new
-   * decoded frame becoming available, #VPX_DEC_CB_PUT_SLICE and
-   * #VPX_DEC_CB_PUT_FRAME events may be generated, as appropriate. Encoded data
-   * \ref MUST be passed in DTS (decode time stamp) order. Frames produced will
-   * always be in PTS (presentation time stamp) order.
-   *
-   * \param[in] ctx          Pointer to this instance's context
-   * \param[in] data         Pointer to this block of new coded data. If
-   *                         NULL, a VPX_DEC_CB_PUT_FRAME event is posted
-   *                         for the previously decoded frame.
-   * \param[in] data_sz      Size of the coded data, in bytes.
-   * \param[in] user_priv    Application specific data to associate with
-   *                         this frame.
-   * \param[in] rel_pts      PTS relative to the previous frame, in us. If
-   *                         unknown or unavailable, set to zero.
-   *
-   * \return Returns #VPX_DEC_OK if the coded data was processed completely
-   *         and future pictures can be decoded without error. Otherwise,
-   *         see the descriptions of the other error codes in ::vpx_dec_err_t
-   *         for recoverability capabilities.
-   */
-  vpx_dec_err_t vpx_dec_decode(vpx_dec_ctx_t  *ctx,
-                               uint8_t        *data,
-                               unsigned int    data_sz,
-                               void       *user_priv,
-                               int         rel_pts) DEPRECATED;
-
-
-  /*!\brief Decoded frames iterator
-   *
-   * Iterates over a list of the frames available for display. The iterator
-   * storage should be initialized to NULL to start the iteration. Iteration is
-   * complete when this function returns NULL.
-   *
-   * The list of available frames becomes valid upon completion of the
-   * vpx_dec_decode call, and remains valid until the next call to vpx_dec_decode.
-   *
-   * \param[in]     ctx      Pointer to this instance's context
-   * \param[in out] iter     Iterator storage, initialized to NULL
-   *
-   * \return Returns a pointer to an image, if one is ready for display. Frames
-   *         produced will always be in PTS (presentation time stamp) order.
-   */
-  vpx_image_t *vpx_dec_get_frame(vpx_dec_ctx_t  *ctx,
-                                 vpx_dec_iter_t *iter) DEPRECATED;
-
-
-  /*!\defgroup cap_put_frame Frame-Based Decoding Functions
-   *
-   * The following functions are required to be implemented for all decoders
-   * that advertise the VPX_DEC_CAP_PUT_FRAME capability. Calling these functions
-   * for codecs that don't advertise this capability will result in an error
-   * code being returned, usually VPX_DEC_ERROR
-   * @{
-   */
-
-  /*!\brief put frame callback prototype
-   *
-   * This callback is invoked by the decoder to notify the application of
-   * the availability of decoded image data.
-   */
-  typedef void (*vpx_dec_put_frame_cb_fn_t)(void          *user_priv,
-                                            const vpx_image_t *img);
-
-
-  /*!\brief Register for notification of frame completion.
-   *
-   * Registers a given function to be called when a decoded frame is
-   * available.
-   *
-   * \param[in] ctx          Pointer to this instance's context
-   * \param[in] cb           Pointer to the callback function
-   * \param[in] user_priv    User's private data
-   *
-   * \retval #VPX_DEC_OK
-   *     Callback successfully registered.
-   * \retval #VPX_DEC_ERROR
-   *     Decoder context not initialized, or algorithm not capable of
-   *     posting slice completion.
-   */
-  vpx_dec_err_t vpx_dec_register_put_frame_cb(vpx_dec_ctx_t             *ctx,
-                                              vpx_dec_put_frame_cb_fn_t  cb,
-                                              void                      *user_priv) DEPRECATED;
-
-
-  /*!@} - end defgroup cap_put_frame */
-
-  /*!\defgroup cap_put_slice Slice-Based Decoding Functions
-   *
-   * The following functions are required to be implemented for all decoders
-   * that advertise the VPX_DEC_CAP_PUT_SLICE capability. Calling these functions
-   * for codecs that don't advertise this capability will result in an error
-   * code being returned, usually VPX_DEC_ERROR
-   * @{
-   */
-
-  /*!\brief put slice callback prototype
-   *
-   * This callback is invoked by the decoder to notify the application of
-   * the availability of partially decoded image data. The
-   */
-  typedef void (*vpx_dec_put_slice_cb_fn_t)(void           *user_priv,
-                                            const vpx_image_t      *img,
-                                            const vpx_image_rect_t *valid,
-                                            const vpx_image_rect_t *update);
-
-
-  /*!\brief Register for notification of slice completion.
-   *
-   * Registers a given function to be called when a decoded slice is
-   * available.
-   *
-   * \param[in] ctx          Pointer to this instance's context
-   * \param[in] cb           Pointer to the callback function
-   * \param[in] user_priv    User's private data
-   *
-   * \retval #VPX_DEC_OK
-   *     Callback successfully registered.
-   * \retval #VPX_DEC_ERROR
-   *     Decoder context not initialized, or algorithm not capable of
-   *     posting slice completion.
-   */
-  vpx_dec_err_t vpx_dec_register_put_slice_cb(vpx_dec_ctx_t             *ctx,
-                                              vpx_dec_put_slice_cb_fn_t  cb,
-                                              void                      *user_priv) DEPRECATED;
-
-
-  /*!@} - end defgroup cap_put_slice*/
-
-  /*!\defgroup cap_xma External Memory Allocation Functions
-   *
-   * The following functions are required to be implemented for all decoders
-   * that advertise the VPX_DEC_CAP_XMA capability. Calling these functions
-   * for codecs that don't advertise this capability will result in an error
-   * code being returned, usually VPX_DEC_ERROR
-   * @{
-   */
-
-  /*!\brief Memory Map Entry
-   *
-   * This structure is used to contain the properties of a memory segment. It
-   * is populated by the decoder in the request phase, and by the calling
-   * application once the requested allocation has been performed.
-   */
-#if 1
-#define VPX_DEC_MEM_ZERO     0x1  /**< Segment must be zeroed by allocation */
-#define VPX_DEC_MEM_WRONLY   0x2  /**< Segment need not be readable */
-#define VPX_DEC_MEM_FAST     0x4  /**< Place in fast memory, if available */
-  typedef struct vpx_codec_mmap vpx_dec_mmap_t;
-#else
-  typedef struct vpx_dec_mmap {
-    /*
-     * The following members are set by the codec when requesting a segment
-     */
-    unsigned int   id;     /**< identifier for the segment's contents */
-    unsigned long  sz;     /**< size of the segment, in bytes */
-    unsigned int   align;  /**< required alignment of the segment, in bytes */
-    unsigned int   flags;  /**< bitfield containing segment properties */
-#define VPX_DEC_MEM_ZERO     0x1  /**< Segment must be zeroed by allocation */
-#define VPX_DEC_MEM_WRONLY   0x2  /**< Segment need not be readable */
-#define VPX_DEC_MEM_FAST     0x4  /**< Place in fast memory, if available */
-
-    /* The following members are to be filled in by the allocation function */
-    void          *base;   /**< pointer to the allocated segment */
-    void (*dtor)(struct vpx_dec_mmap *map);         /**< destructor to call */
-    void          *priv;   /**< allocator private storage */
-  } vpx_dec_mmap_t;
-#endif
-
-  /*!\brief Initialize a decoder instance in external allocation mode
-   *
-   * Initializes a decoder context using the given interface. Applications
-   * should call the vpx_dec_xma_init convenience macro instead of this
-   * function directly, to ensure that the ABI version number parameter
-   * is properly initialized.
-   *
-   * \param[in]    ctx     Pointer to this instance's context.
-   * \param[in]    iface   Pointer to the algorithm interface to use.
-   * \param[in]    ver     ABI version number. Must be set to
-   *                       VPX_DECODER_ABI_VERSION
-   * \retval #VPX_DEC_OK
-   *     The decoder algorithm initialized.
-   * \retval #VPX_DEC_ERROR
-   *     Decoder does not support XMA mode.
-   */
-  vpx_dec_err_t vpx_dec_xma_init_ver(vpx_dec_ctx_t    *ctx,
-                                     vpx_dec_iface_t  *iface,
-                                     int               ver) DEPRECATED;
-#define vpx_dec_xma_init(ctx, iface) \
-  vpx_dec_xma_init_ver(ctx, iface, VPX_DECODER_ABI_VERSION)
-
-
-  /*!\brief Iterate over the list of segments to allocate.
-   *
-   * Iterates over a list of the segments to allocate. The iterator storage
-   * should be initialized to NULL to start the iteration. Iteration is complete
-   * when this function returns VPX_DEC_LIST_END. The amount of memory needed to
-   * allocate is dependent upon the size of the encoded stream. This means that
-   * the stream info structure must be known at allocation time. It can be
-   * populated with the vpx_dec_peek_stream_info() function. In cases where the
-   * stream to be decoded is not available at allocation time, a fixed size must
-   * be requested. The decoder will not be able to decode streams larger than
-   * the size used at allocation time.
-   *
-   * \param[in]      ctx     Pointer to this instance's context.
-   * \param[out]     mmap    Pointer to the memory map entry to populate.
-   * \param[in]      si      Pointer to the stream info.
-   * \param[in out]  iter    Iterator storage, initialized to NULL
-   *
-   * \retval #VPX_DEC_OK
-   *     The memory map entry was populated.
-   * \retval #VPX_DEC_ERROR
-   *     Decoder does not support XMA mode.
-   * \retval #VPX_DEC_MEM_ERROR
-   *     Unable to determine segment size from stream info.
-   */
-  vpx_dec_err_t vpx_dec_get_mem_map(vpx_dec_ctx_t                *ctx,
-                                    vpx_dec_mmap_t               *mmap,
-                                    const vpx_dec_stream_info_t  *si,
-                                    vpx_dec_iter_t               *iter) DEPRECATED;
-
-
-  /*!\brief Identify allocated segments to decoder instance
-   *
-   * Stores a list of allocated segments in the decoder. Segments \ref MUST be
-   * passed in the order they are read from vpx_dec_get_mem_map(), but may be
-   * passed in groups of any size. Segments \ref MUST be set only once. The
-   * allocation function \ref MUST ensure that the vpx_dec_mmap_t::base member
-   * is non-NULL. If the segment requires cleanup handling (e.g., calling free()
-   * or close()) then the vpx_dec_mmap_t::dtor member \ref MUST be populated.
-   *
-   * \param[in]      ctx     Pointer to this instance's context.
-   * \param[in]      mmaps   Pointer to the first memory map entry in the list.
-   * \param[in]      num_maps  Number of entries being set at this time
-   *
-   * \retval #VPX_DEC_OK
-   *     The segment was stored in the decoder context.
-   * \retval #VPX_DEC_ERROR
-   *     Decoder does not support XMA mode.
-   * \retval #VPX_DEC_MEM_ERROR
-   *     Segment base address was not set, or segment was already stored.
-
-   */
-  vpx_dec_err_t  vpx_dec_set_mem_map(vpx_dec_ctx_t   *ctx,
-                                     vpx_dec_mmap_t  *mmaps,
-                                     unsigned int     num_maps) DEPRECATED;
-
-  /*!@} - end defgroup cap_xma*/
-  /*!@} - end defgroup decoder*/
-
-
-#endif
-#ifdef __cplusplus
-}
-#endif
diff --git a/vpx/vpx_encoder.h b/vpx/vpx_encoder.h
index ec7ce48..ffdbc06 100644
--- a/vpx/vpx_encoder.h
+++ b/vpx/vpx_encoder.h
@@ -32,6 +32,19 @@
 #define VPX_ENCODER_H
 #include "vpx_codec.h"
 
+  /*! Temporal Scalability: Maximum length of the sequence defining frame
+   * layer membership
+   */
+#define VPX_TS_MAX_PERIODICITY 16
+
+  /*! Temporal Scalability: Maximum number of coding layers */
+#define VPX_TS_MAX_LAYERS       5
+
+  /*!\deprecated Use #VPX_TS_MAX_PERIODICITY instead. */
+#define MAX_PERIODICITY VPX_TS_MAX_PERIODICITY
+
+  /*!\deprecated Use #VPX_TS_MAX_LAYERS instead. */
+#define MAX_LAYERS      VPX_TS_MAX_LAYERS
 
   /*!\brief Current ABI version number
    *
@@ -41,7 +54,7 @@
    * types, removing or reassigning enums, adding/removing/rearranging
    * fields to structures
    */
-#define VPX_ENCODER_ABI_VERSION (2 + VPX_CODEC_ABI_VERSION) /**<\hideinitializer*/
+#define VPX_ENCODER_ABI_VERSION (3 + VPX_CODEC_ABI_VERSION) /**<\hideinitializer*/
 
 
   /*! \brief Encoder capabilities bitfield
@@ -581,12 +594,46 @@
      */
     unsigned int           kf_max_dist;
 
-
-    /*!\brief Enable lossless compression mode
-     *
-     * If this flag is set, the decoder will be in lossless compression mode.
+    /*
+     * Temporal scalability settings (ts)
      */
-    unsigned int           lossless;
+
+    /*!\brief Number of coding layers
+     *
+     * This value specifies the number of coding layers to be used.
+     */
+    unsigned int           ts_number_layers;
+
+    /*!\brief Target bitrate for each layer
+     *
+     * These values specify the target coding bitrate for each coding layer.
+     */
+    unsigned int           ts_target_bitrate[VPX_TS_MAX_LAYERS];
+
+    /*!\brief Frame rate decimation factor for each layer
+     *
+     * These values specify the frame rate decimation factors to apply
+     * to each layer.
+     */
+    unsigned int           ts_rate_decimator[VPX_TS_MAX_LAYERS];
+
+    /*!\brief Length of the sequence defining frame layer membership
+     *
+     * This value specifies the length of the sequence that defines the
+     * membership of frames to layers. For example, if ts_periodicity=8 then
+     * frames are assigned to coding layers with a repeated sequence of
+     * length 8.
+     */
+    unsigned int           ts_periodicity;
+
+    /*!\brief Template defining the membership of frames to coding layers
+     *
+     * This array defines the membership of frames to coding layers. For a
+     * 2-layer encoding that assigns even numbered frames to one layer (0)
+     * and odd numbered frames to a second layer (1) with ts_periodicity=8,
+     * then ts_layer_id = (0,1,0,1,0,1,0,1).
+     */
+    unsigned int           ts_layer_id[VPX_TS_MAX_PERIODICITY];
   } vpx_codec_enc_cfg_t; /**< alias for struct vpx_codec_enc_cfg */
 
 
@@ -597,6 +644,10 @@
    * function directly, to ensure that the ABI version number parameter
    * is properly initialized.
    *
+   * If the library was configured with --disable-multithread, this call
+   * is not thread safe and should be guarded with a lock if being used
+   * in a multithreaded context.
+   *
    * In XMA mode (activated by setting VPX_CODEC_USE_XMA in the flags
    * parameter), the storage pointed to by the cfg parameter must be
    * kept readable and stable until all memory maps have been set.
@@ -627,6 +678,48 @@
   vpx_codec_enc_init_ver(ctx, iface, cfg, flags, VPX_ENCODER_ABI_VERSION)
 
 
+  /*!\brief Initialize multi-encoder instance
+   *
+   * Initializes multi-encoder context using the given interface.
+   * Applications should call the vpx_codec_enc_init_multi convenience macro
+   * instead of this function directly, to ensure that the ABI version number
+   * parameter is properly initialized.
+   *
+   * In XMA mode (activated by setting VPX_CODEC_USE_XMA in the flags
+   * parameter), the storage pointed to by the cfg parameter must be
+   * kept readable and stable until all memory maps have been set.
+   *
+   * \param[in]    ctx     Pointer to this instance's context.
+   * \param[in]    iface   Pointer to the algorithm interface to use.
+   * \param[in]    cfg     Configuration to use, if known. May be NULL.
+   * \param[in]    num_enc Total number of encoders.
+   * \param[in]    flags   Bitfield of VPX_CODEC_USE_* flags
+   * \param[in]    dsf     Pointer to down-sampling factors.
+   * \param[in]    ver     ABI version number. Must be set to
+   *                       VPX_ENCODER_ABI_VERSION
+   * \retval #VPX_CODEC_OK
+   *     The decoder algorithm initialized.
+   * \retval #VPX_CODEC_MEM_ERROR
+   *     Memory allocation failed.
+   */
+  vpx_codec_err_t vpx_codec_enc_init_multi_ver(vpx_codec_ctx_t      *ctx,
+                                               vpx_codec_iface_t    *iface,
+                                               vpx_codec_enc_cfg_t  *cfg,
+                                               int                   num_enc,
+                                               vpx_codec_flags_t     flags,
+                                               vpx_rational_t       *dsf,
+                                               int                   ver);
+
+
+  /*!\brief Convenience macro for vpx_codec_enc_init_multi_ver()
+   *
+   * Ensures the ABI version parameter is properly set.
+   */
+#define vpx_codec_enc_init_multi(ctx, iface, cfg, num_enc, flags, dsf) \
+  vpx_codec_enc_init_multi_ver(ctx, iface, cfg, num_enc, flags, dsf, \
+                               VPX_ENCODER_ABI_VERSION)
+
+
   /*!\brief Get a default configuration
    *
    * Initializes a encoder configuration structure with default values. Supports
@@ -732,7 +825,6 @@
                                     vpx_enc_frame_flags_t       flags,
                                     unsigned long               deadline);
 
-
   /*!\brief Set compressed data output buffer
    *
    * Sets the buffer that the codec should output the compressed data
diff --git a/vpx/vpx_image.h b/vpx/vpx_image.h
index c94028b..809fa38 100644
--- a/vpx/vpx_image.h
+++ b/vpx/vpx_image.h
@@ -158,7 +158,8 @@
    * \param[in]    fmt       Format for the image
    * \param[in]    d_w       Width of the image
    * \param[in]    d_h       Height of the image
-   * \param[in]    align     Alignment, in bytes, of each row in the image.
+   * \param[in]    align     Alignment, in bytes, of the image buffer and
+   *                         each row in the image(stride).
    *
    * \return Returns a pointer to the initialized image descriptor. If the img
    *         parameter is non-null, the value of the img parameter will be
diff --git a/vpx/vpx_integer.h b/vpx/vpx_integer.h
index 608760f..218bca7 100644
--- a/vpx/vpx_integer.h
+++ b/vpx/vpx_integer.h
@@ -29,16 +29,8 @@
 typedef unsigned __int64 uint64_t;
 #endif
 
-#ifdef HAVE_ARMV6
-typedef unsigned int int_fast16_t;
-#else
-typedef signed short int_fast16_t;
-#endif
-typedef signed char int_fast8_t;
-typedef unsigned char uint_fast8_t;
-
 #ifndef _UINTPTR_T_DEFINED
-typedef unsigned int   uintptr_t;
+typedef size_t uintptr_t;
 #endif
 
 #else
diff --git a/vpxenc.c b/vpxenc.c
index c528006..cf77274 100644
--- a/vpxenc.c
+++ b/vpxenc.c
@@ -1052,14 +1052,22 @@
 static const arg_def_t *vp8_args[] = {
   &cpu_used, &auto_altref, &noise_sens, &sharpness, &static_thresh,
   &token_parts, &arnr_maxframes, &arnr_strength, &arnr_type,
-  &tune_ssim, &cq_level, &max_intra_rate_pct, NULL
+  &tune_ssim, &cq_level, &max_intra_rate_pct,
+#if CONFIG_LOSSLESS
+  &lossless_enabled,
+#endif
+  NULL
 };
 static const int vp8_arg_ctrl_map[] = {
   VP8E_SET_CPUUSED, VP8E_SET_ENABLEAUTOALTREF,
   VP8E_SET_NOISE_SENSITIVITY, VP8E_SET_SHARPNESS, VP8E_SET_STATIC_THRESHOLD,
   VP8E_SET_TOKEN_PARTITIONS,
   VP8E_SET_ARNR_MAXFRAMES, VP8E_SET_ARNR_STRENGTH, VP8E_SET_ARNR_TYPE,
-  VP8E_SET_TUNING, VP8E_SET_CQ_LEVEL, VP8E_SET_MAX_INTRA_BITRATE_PCT, 0
+  VP8E_SET_TUNING, VP8E_SET_CQ_LEVEL, VP8E_SET_MAX_INTRA_BITRATE_PCT,
+#if CONFIG_LOSSLESS
+  VP9E_SET_LOSSLESS,
+#endif
+  0
 };
 #endif
 
@@ -1563,10 +1571,6 @@
   cfg.g_w = 0;
   cfg.g_h = 0;
 
-#if CONFIG_LOSSLESS
-  cfg.lossless = 0;
-#endif
-
   /* Now parse the remainder of the parameters. */
   for (argi = argj = argv; (*argj = *argi); argi += arg.argv_step) {
     arg.argv_step = 1;
@@ -1643,21 +1647,10 @@
       cfg.kf_max_dist = arg_parse_uint(&arg);
     else if (arg_match(&arg, &kf_disabled, argi))
       cfg.kf_mode = VPX_KF_DISABLED;
-#if CONFIG_LOSSLESS
-    else if (arg_match(&arg, &lossless_enabled, argi))
-      cfg.lossless = 1;
-#endif
     else
       argj++;
   }
 
-#if CONFIG_LOSSLESS
-  if (cfg.lossless) {
-    cfg.rc_min_quantizer = 0;
-    cfg.rc_max_quantizer = 0;
-  }
-#endif
-
   /* Handle codec specific options */
 #if CONFIG_VP9_ENCODER
 
@@ -1807,9 +1800,6 @@
       SHOW(kf_mode);
       SHOW(kf_min_dist);
       SHOW(kf_max_dist);
-#if CONFIG_LOSSLESS
-      SHOW(lossless);
-#endif
     }
 
     if (pass == (one_pass_only ? one_pass_only - 1 : 0)) {