| Index: source/libvpx/vp9/vp9_dx_iface.c
 | 
| ===================================================================
 | 
| --- source/libvpx/vp9/vp9_dx_iface.c	(revision 263011)
 | 
| +++ source/libvpx/vp9/vp9_dx_iface.c	(working copy)
 | 
| @@ -8,45 +8,32 @@
 | 
|   *  be found in the AUTHORS file in the root of the source tree.
 | 
|   */
 | 
|  
 | 
| -
 | 
|  #include <stdlib.h>
 | 
|  #include <string.h>
 | 
| -#include "vpx/vpx_decoder.h"
 | 
| -#include "vpx/vp8dx.h"
 | 
| -#include "vpx/internal/vpx_codec_internal.h"
 | 
| +
 | 
|  #include "./vpx_version.h"
 | 
| +
 | 
| +#include "vpx/internal/vpx_codec_internal.h"
 | 
| +#include "vpx/vp8dx.h"
 | 
| +#include "vpx/vpx_decoder.h"
 | 
| +
 | 
|  #include "vp9/common/vp9_frame_buffers.h"
 | 
| -#include "vp9/decoder/vp9_onyxd.h"
 | 
| -#include "vp9/decoder/vp9_onyxd_int.h"
 | 
| +
 | 
| +#include "vp9/decoder/vp9_decoder.h"
 | 
|  #include "vp9/decoder/vp9_read_bit_buffer.h"
 | 
| +
 | 
|  #include "vp9/vp9_iface_common.h"
 | 
|  
 | 
|  #define VP9_CAP_POSTPROC (CONFIG_VP9_POSTPROC ? VPX_CODEC_CAP_POSTPROC : 0)
 | 
| -typedef vpx_codec_stream_info_t  vp9_stream_info_t;
 | 
|  
 | 
| -/* Structures for handling memory allocations */
 | 
| -typedef enum {
 | 
| -  VP9_SEG_ALG_PRIV = 256,
 | 
| -  VP9_SEG_MAX
 | 
| -} mem_seg_id_t;
 | 
| -#define NELEMENTS(x) ((int)(sizeof(x)/sizeof(x[0])))
 | 
| +typedef vpx_codec_stream_info_t vp9_stream_info_t;
 | 
|  
 | 
| -static unsigned long priv_sz(const vpx_codec_dec_cfg_t *si,
 | 
| -                             vpx_codec_flags_t flags);
 | 
| -
 | 
| -static const mem_req_t vp9_mem_req_segs[] = {
 | 
| -  {VP9_SEG_ALG_PRIV, 0, 8, VPX_CODEC_MEM_ZERO, priv_sz},
 | 
| -  {VP9_SEG_MAX, 0, 0, 0, NULL}
 | 
| -};
 | 
| -
 | 
|  struct vpx_codec_alg_priv {
 | 
|    vpx_codec_priv_t        base;
 | 
| -  vpx_codec_mmap_t        mmaps[NELEMENTS(vp9_mem_req_segs) - 1];
 | 
|    vpx_codec_dec_cfg_t     cfg;
 | 
|    vp9_stream_info_t       si;
 | 
| -  int                     defer_alloc;
 | 
|    int                     decoder_init;
 | 
| -  struct VP9Decompressor *pbi;
 | 
| +  struct VP9Decoder *pbi;
 | 
|    int                     postproc_cfg_set;
 | 
|    vp8_postproc_cfg_t      postproc_cfg;
 | 
|  #if CONFIG_POSTPROC_VISUALIZER
 | 
| @@ -67,87 +54,55 @@
 | 
|    vpx_release_frame_buffer_cb_fn_t release_ext_fb_cb;
 | 
|  };
 | 
|  
 | 
| -static unsigned long priv_sz(const vpx_codec_dec_cfg_t *si,
 | 
| -                             vpx_codec_flags_t flags) {
 | 
| -  /* Although this declaration is constant, we can't use it in the requested
 | 
| -   * segments list because we want to define the requested segments list
 | 
| -   * before defining the private type (so that the number of memory maps is
 | 
| -   * known)
 | 
| -   */
 | 
| -  (void)si;
 | 
| -  return sizeof(vpx_codec_alg_priv_t);
 | 
| -}
 | 
| -
 | 
| -static void vp9_init_ctx(vpx_codec_ctx_t *ctx, const vpx_codec_mmap_t *mmap) {
 | 
| -  int i;
 | 
| -
 | 
| -  ctx->priv = mmap->base;
 | 
| -  ctx->priv->sz = sizeof(*ctx->priv);
 | 
| -  ctx->priv->iface = ctx->iface;
 | 
| -  ctx->priv->alg_priv = mmap->base;
 | 
| -
 | 
| -  for (i = 0; i < NELEMENTS(ctx->priv->alg_priv->mmaps); i++)
 | 
| -    ctx->priv->alg_priv->mmaps[i].id = vp9_mem_req_segs[i].id;
 | 
| -
 | 
| -  ctx->priv->alg_priv->mmaps[0] = *mmap;
 | 
| -  ctx->priv->alg_priv->si.sz = sizeof(ctx->priv->alg_priv->si);
 | 
| -  ctx->priv->init_flags = ctx->init_flags;
 | 
| -
 | 
| -  if (ctx->config.dec) {
 | 
| -    /* Update the reference to the config structure to an internal copy. */
 | 
| -    ctx->priv->alg_priv->cfg = *ctx->config.dec;
 | 
| -    ctx->config.dec = &ctx->priv->alg_priv->cfg;
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -static void vp9_finalize_mmaps(vpx_codec_alg_priv_t *ctx) {
 | 
| -  /* nothing to clean up */
 | 
| -}
 | 
| -
 | 
| -static vpx_codec_err_t vp9_init(vpx_codec_ctx_t *ctx,
 | 
| -                                vpx_codec_priv_enc_mr_cfg_t *data) {
 | 
| -  vpx_codec_err_t res = VPX_CODEC_OK;
 | 
| -
 | 
| +static vpx_codec_err_t decoder_init(vpx_codec_ctx_t *ctx,
 | 
| +                            vpx_codec_priv_enc_mr_cfg_t *data) {
 | 
|    // This function only allocates space for the vpx_codec_alg_priv_t
 | 
|    // structure. More memory may be required at the time the stream
 | 
|    // information becomes known.
 | 
|    if (!ctx->priv) {
 | 
| -    vpx_codec_mmap_t mmap;
 | 
| +    vpx_codec_alg_priv_t *alg_priv = vpx_memalign(32, sizeof(*alg_priv));
 | 
| +    if (alg_priv == NULL)
 | 
| +      return VPX_CODEC_MEM_ERROR;
 | 
|  
 | 
| -    mmap.id = vp9_mem_req_segs[0].id;
 | 
| -    mmap.sz = sizeof(vpx_codec_alg_priv_t);
 | 
| -    mmap.align = vp9_mem_req_segs[0].align;
 | 
| -    mmap.flags = vp9_mem_req_segs[0].flags;
 | 
| +    vp9_zero(*alg_priv);
 | 
|  
 | 
| -    res = vpx_mmap_alloc(&mmap);
 | 
| -    if (!res) {
 | 
| -      vp9_init_ctx(ctx, &mmap);
 | 
| +    ctx->priv = (vpx_codec_priv_t *)alg_priv;
 | 
| +    ctx->priv->sz = sizeof(*ctx->priv);
 | 
| +    ctx->priv->iface = ctx->iface;
 | 
| +    ctx->priv->alg_priv = alg_priv;
 | 
| +    ctx->priv->alg_priv->si.sz = sizeof(ctx->priv->alg_priv->si);
 | 
| +    ctx->priv->init_flags = ctx->init_flags;
 | 
|  
 | 
| -      ctx->priv->alg_priv->defer_alloc = 1;
 | 
| +    if (ctx->config.dec) {
 | 
| +      // Update the reference to the config structure to an internal copy.
 | 
| +      ctx->priv->alg_priv->cfg = *ctx->config.dec;
 | 
| +      ctx->config.dec = &ctx->priv->alg_priv->cfg;
 | 
|      }
 | 
|    }
 | 
|  
 | 
| -  return res;
 | 
| +  return VPX_CODEC_OK;
 | 
|  }
 | 
|  
 | 
| -static vpx_codec_err_t vp9_destroy(vpx_codec_alg_priv_t *ctx) {
 | 
| -  int i;
 | 
| -
 | 
| -  vp9_remove_decompressor(ctx->pbi);
 | 
| -
 | 
| -  for (i = NELEMENTS(ctx->mmaps) - 1; i >= 0; i--) {
 | 
| -    if (ctx->mmaps[i].dtor)
 | 
| -      ctx->mmaps[i].dtor(&ctx->mmaps[i]);
 | 
| +static vpx_codec_err_t decoder_destroy(vpx_codec_alg_priv_t *ctx) {
 | 
| +  if (ctx->pbi) {
 | 
| +    vp9_decoder_remove(ctx->pbi);
 | 
| +    ctx->pbi = NULL;
 | 
|    }
 | 
|  
 | 
| +  vpx_free(ctx);
 | 
| +
 | 
|    return VPX_CODEC_OK;
 | 
|  }
 | 
|  
 | 
| -static vpx_codec_err_t vp9_peek_si(const uint8_t *data, unsigned int data_sz,
 | 
| -                                   vpx_codec_stream_info_t *si) {
 | 
| -  if (data_sz <= 8) return VPX_CODEC_UNSUP_BITSTREAM;
 | 
| -  if (data + data_sz <= data) return VPX_CODEC_INVALID_PARAM;
 | 
| +static vpx_codec_err_t decoder_peek_si(const uint8_t *data,
 | 
| +                                       unsigned int data_sz,
 | 
| +                                       vpx_codec_stream_info_t *si) {
 | 
| +  if (data_sz <= 8)
 | 
| +    return VPX_CODEC_UNSUP_BITSTREAM;
 | 
|  
 | 
| +  if (data + data_sz <= data)
 | 
| +    return VPX_CODEC_INVALID_PARAM;
 | 
| +
 | 
|    si->is_kf = 0;
 | 
|    si->w = si->h = 0;
 | 
|  
 | 
| @@ -204,8 +159,8 @@
 | 
|    return VPX_CODEC_OK;
 | 
|  }
 | 
|  
 | 
| -static vpx_codec_err_t vp9_get_si(vpx_codec_alg_priv_t    *ctx,
 | 
| -                                  vpx_codec_stream_info_t *si) {
 | 
| +static vpx_codec_err_t decoder_get_si(vpx_codec_alg_priv_t *ctx,
 | 
| +                                      vpx_codec_stream_info_t *si) {
 | 
|    const size_t sz = (si->sz >= sizeof(vp9_stream_info_t))
 | 
|                         ? sizeof(vp9_stream_info_t)
 | 
|                         : sizeof(vpx_codec_stream_info_t);
 | 
| @@ -215,7 +170,6 @@
 | 
|    return VPX_CODEC_OK;
 | 
|  }
 | 
|  
 | 
| -
 | 
|  static vpx_codec_err_t update_error_state(vpx_codec_alg_priv_t *ctx,
 | 
|                             const struct vpx_internal_error_info *error) {
 | 
|    if (error->error_code)
 | 
| @@ -224,149 +178,122 @@
 | 
|    return error->error_code;
 | 
|  }
 | 
|  
 | 
| -static vpx_codec_err_t decode_one(vpx_codec_alg_priv_t *ctx,
 | 
| -                                  const uint8_t **data, unsigned int data_sz,
 | 
| -                                  void *user_priv, int64_t deadline) {
 | 
| -  vpx_codec_err_t res = VPX_CODEC_OK;
 | 
| +static void init_buffer_callbacks(vpx_codec_alg_priv_t *ctx) {
 | 
| +  VP9_COMMON *const cm = &ctx->pbi->common;
 | 
|  
 | 
| -  ctx->img_avail = 0;
 | 
| +  cm->new_fb_idx = -1;
 | 
|  
 | 
| -  /* Determine the stream parameters. Note that we rely on peek_si to
 | 
| -   * validate that we have a buffer that does not wrap around the top
 | 
| -   * of the heap.
 | 
| -   */
 | 
| -  if (!ctx->si.h)
 | 
| -    res = ctx->base.iface->dec.peek_si(*data, data_sz, &ctx->si);
 | 
| +  if (ctx->get_ext_fb_cb != NULL && ctx->release_ext_fb_cb != NULL) {
 | 
| +    cm->get_fb_cb = ctx->get_ext_fb_cb;
 | 
| +    cm->release_fb_cb = ctx->release_ext_fb_cb;
 | 
| +    cm->cb_priv = ctx->ext_priv;
 | 
| +  } else {
 | 
| +    cm->get_fb_cb = vp9_get_frame_buffer;
 | 
| +    cm->release_fb_cb = vp9_release_frame_buffer;
 | 
|  
 | 
| +    if (vp9_alloc_internal_frame_buffers(&cm->int_frame_buffers))
 | 
| +      vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
 | 
| +                         "Failed to initialize internal frame buffers");
 | 
|  
 | 
| -  /* Perform deferred allocations, if required */
 | 
| -  if (!res && ctx->defer_alloc) {
 | 
| -    int i;
 | 
| +    cm->cb_priv = &cm->int_frame_buffers;
 | 
| +  }
 | 
| +}
 | 
|  
 | 
| -    for (i = 1; !res && i < NELEMENTS(ctx->mmaps); i++) {
 | 
| -      vpx_codec_dec_cfg_t cfg;
 | 
| +static void set_default_ppflags(vp8_postproc_cfg_t *cfg) {
 | 
| +  cfg->post_proc_flag = VP8_DEBLOCK | VP8_DEMACROBLOCK;
 | 
| +  cfg->deblocking_level = 4;
 | 
| +  cfg->noise_level = 0;
 | 
| +}
 | 
|  
 | 
| -      cfg.w = ctx->si.w;
 | 
| -      cfg.h = ctx->si.h;
 | 
| -      ctx->mmaps[i].id = vp9_mem_req_segs[i].id;
 | 
| -      ctx->mmaps[i].sz = vp9_mem_req_segs[i].sz;
 | 
| -      ctx->mmaps[i].align = vp9_mem_req_segs[i].align;
 | 
| -      ctx->mmaps[i].flags = vp9_mem_req_segs[i].flags;
 | 
| +static void set_ppflags(const vpx_codec_alg_priv_t *ctx,
 | 
| +                        vp9_ppflags_t *flags) {
 | 
| +  flags->post_proc_flag =
 | 
| +#if CONFIG_POSTPROC_VISUALIZER
 | 
| +      (ctx->dbg_color_ref_frame_flag ? VP9D_DEBUG_CLR_FRM_REF_BLKS : 0) |
 | 
| +      (ctx->dbg_color_mb_modes_flag ? VP9D_DEBUG_CLR_BLK_MODES : 0) |
 | 
| +      (ctx->dbg_color_b_modes_flag ? VP9D_DEBUG_CLR_BLK_MODES : 0) |
 | 
| +      (ctx->dbg_display_mv_flag ? VP9D_DEBUG_DRAW_MV : 0) |
 | 
| +#endif
 | 
| +      ctx->postproc_cfg.post_proc_flag;
 | 
|  
 | 
| -      if (!ctx->mmaps[i].sz)
 | 
| -        ctx->mmaps[i].sz = vp9_mem_req_segs[i].calc_sz(&cfg,
 | 
| -                                                       ctx->base.init_flags);
 | 
| +  flags->deblocking_level = ctx->postproc_cfg.deblocking_level;
 | 
| +  flags->noise_level = ctx->postproc_cfg.noise_level;
 | 
| +#if CONFIG_POSTPROC_VISUALIZER
 | 
| +  flags->display_ref_frame_flag = ctx->dbg_color_ref_frame_flag;
 | 
| +  flags->display_mb_modes_flag = ctx->dbg_color_mb_modes_flag;
 | 
| +  flags->display_b_modes_flag = ctx->dbg_color_b_modes_flag;
 | 
| +  flags->display_mv_flag = ctx->dbg_display_mv_flag;
 | 
| +#endif
 | 
| +}
 | 
|  
 | 
| -      res = vpx_mmap_alloc(&ctx->mmaps[i]);
 | 
| -    }
 | 
| +static void init_decoder(vpx_codec_alg_priv_t *ctx) {
 | 
| +  VP9D_CONFIG oxcf;
 | 
| +  oxcf.width = ctx->si.w;
 | 
| +  oxcf.height = ctx->si.h;
 | 
| +  oxcf.version = 9;
 | 
| +  oxcf.max_threads = ctx->cfg.threads;
 | 
| +  oxcf.inv_tile_order = ctx->invert_tile_order;
 | 
|  
 | 
| -    if (!res)
 | 
| -      vp9_finalize_mmaps(ctx);
 | 
| +  ctx->pbi = vp9_decoder_create(&oxcf);
 | 
| +  if (ctx->pbi == NULL)
 | 
| +    return;
 | 
|  
 | 
| -    ctx->defer_alloc = 0;
 | 
| -  }
 | 
| +  vp9_initialize_dec();
 | 
|  
 | 
| -  /* Initialize the decoder instance on the first frame*/
 | 
| -  if (!res && !ctx->decoder_init) {
 | 
| -    res = vpx_validate_mmaps(&ctx->si, ctx->mmaps,
 | 
| -                             vp9_mem_req_segs, NELEMENTS(vp9_mem_req_segs),
 | 
| -                             ctx->base.init_flags);
 | 
| +  // If postprocessing was enabled by the application and a
 | 
| +  // configuration has not been provided, default it.
 | 
| +  if (!ctx->postproc_cfg_set &&
 | 
| +      (ctx->base.init_flags & VPX_CODEC_USE_POSTPROC))
 | 
| +    set_default_ppflags(&ctx->postproc_cfg);
 | 
|  
 | 
| -    if (!res) {
 | 
| -      VP9D_CONFIG oxcf;
 | 
| -      struct VP9Decompressor *optr;
 | 
| +  init_buffer_callbacks(ctx);
 | 
| +}
 | 
|  
 | 
| -      vp9_initialize_dec();
 | 
| +static vpx_codec_err_t decode_one(vpx_codec_alg_priv_t *ctx,
 | 
| +                                  const uint8_t **data, unsigned int data_sz,
 | 
| +                                  void *user_priv, int64_t deadline) {
 | 
| +  YV12_BUFFER_CONFIG sd = { 0 };
 | 
| +  int64_t time_stamp = 0, time_end_stamp = 0;
 | 
| +  vp9_ppflags_t flags = {0};
 | 
| +  VP9_COMMON *cm = NULL;
 | 
|  
 | 
| -      oxcf.width = ctx->si.w;
 | 
| -      oxcf.height = ctx->si.h;
 | 
| -      oxcf.version = 9;
 | 
| -      oxcf.postprocess = 0;
 | 
| -      oxcf.max_threads = ctx->cfg.threads;
 | 
| -      oxcf.inv_tile_order = ctx->invert_tile_order;
 | 
| -      optr = vp9_create_decompressor(&oxcf);
 | 
| +  ctx->img_avail = 0;
 | 
|  
 | 
| -      // If postprocessing was enabled by the application and a
 | 
| -      // configuration has not been provided, default it.
 | 
| -      if (!ctx->postproc_cfg_set &&
 | 
| -          (ctx->base.init_flags & VPX_CODEC_USE_POSTPROC)) {
 | 
| -        ctx->postproc_cfg.post_proc_flag = VP8_DEBLOCK | VP8_DEMACROBLOCK;
 | 
| -        ctx->postproc_cfg.deblocking_level = 4;
 | 
| -        ctx->postproc_cfg.noise_level = 0;
 | 
| -      }
 | 
| +  // Determine the stream parameters. Note that we rely on peek_si to
 | 
| +  // validate that we have a buffer that does not wrap around the top
 | 
| +  // of the heap.
 | 
| +  if (!ctx->si.h) {
 | 
| +    const vpx_codec_err_t res =
 | 
| +        ctx->base.iface->dec.peek_si(*data, data_sz, &ctx->si);
 | 
| +    if (res != VPX_CODEC_OK)
 | 
| +      return res;
 | 
| +  }
 | 
|  
 | 
| -      if (!optr) {
 | 
| -        res = VPX_CODEC_ERROR;
 | 
| -      } else {
 | 
| -        VP9D_COMP *const pbi = (VP9D_COMP*)optr;
 | 
| -        VP9_COMMON *const cm = &pbi->common;
 | 
| +  // Initialize the decoder instance on the first frame
 | 
| +  if (!ctx->decoder_init) {
 | 
| +    init_decoder(ctx);
 | 
| +    if (ctx->pbi == NULL)
 | 
| +      return VPX_CODEC_ERROR;
 | 
|  
 | 
| -        // Set index to not initialized.
 | 
| -        cm->new_fb_idx = -1;
 | 
| -
 | 
| -        if (ctx->get_ext_fb_cb != NULL && ctx->release_ext_fb_cb != NULL) {
 | 
| -          cm->get_fb_cb = ctx->get_ext_fb_cb;
 | 
| -          cm->release_fb_cb = ctx->release_ext_fb_cb;
 | 
| -          cm->cb_priv = ctx->ext_priv;
 | 
| -        } else {
 | 
| -          cm->get_fb_cb = vp9_get_frame_buffer;
 | 
| -          cm->release_fb_cb = vp9_release_frame_buffer;
 | 
| -
 | 
| -          if (vp9_alloc_internal_frame_buffers(&cm->int_frame_buffers))
 | 
| -            vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
 | 
| -                               "Failed to initialize internal frame buffers");
 | 
| -          cm->cb_priv = &cm->int_frame_buffers;
 | 
| -        }
 | 
| -
 | 
| -        ctx->pbi = optr;
 | 
| -      }
 | 
| -    }
 | 
| -
 | 
|      ctx->decoder_init = 1;
 | 
|    }
 | 
|  
 | 
| -  if (!res && ctx->pbi) {
 | 
| -    YV12_BUFFER_CONFIG sd;
 | 
| -    int64_t time_stamp = 0, time_end_stamp = 0;
 | 
| -    vp9_ppflags_t flags = {0};
 | 
| +  cm = &ctx->pbi->common;
 | 
|  
 | 
| -    if (ctx->base.init_flags & VPX_CODEC_USE_POSTPROC) {
 | 
| -      flags.post_proc_flag =
 | 
| -#if CONFIG_POSTPROC_VISUALIZER
 | 
| -          (ctx->dbg_color_ref_frame_flag ? VP9D_DEBUG_CLR_FRM_REF_BLKS : 0) |
 | 
| -          (ctx->dbg_color_mb_modes_flag ? VP9D_DEBUG_CLR_BLK_MODES : 0) |
 | 
| -          (ctx->dbg_color_b_modes_flag ? VP9D_DEBUG_CLR_BLK_MODES : 0) |
 | 
| -          (ctx->dbg_display_mv_flag ? VP9D_DEBUG_DRAW_MV : 0) |
 | 
| -#endif
 | 
| -          ctx->postproc_cfg.post_proc_flag;
 | 
| +  if (vp9_receive_compressed_data(ctx->pbi, data_sz, data, deadline))
 | 
| +    return update_error_state(ctx, &cm->error);
 | 
|  
 | 
| -      flags.deblocking_level = ctx->postproc_cfg.deblocking_level;
 | 
| -      flags.noise_level = ctx->postproc_cfg.noise_level;
 | 
| -#if CONFIG_POSTPROC_VISUALIZER
 | 
| -      flags.display_ref_frame_flag = ctx->dbg_color_ref_frame_flag;
 | 
| -      flags.display_mb_modes_flag = ctx->dbg_color_mb_modes_flag;
 | 
| -      flags.display_b_modes_flag = ctx->dbg_color_b_modes_flag;
 | 
| -      flags.display_mv_flag = ctx->dbg_display_mv_flag;
 | 
| -#endif
 | 
| -    }
 | 
| +  if (ctx->base.init_flags & VPX_CODEC_USE_POSTPROC)
 | 
| +    set_ppflags(ctx, &flags);
 | 
|  
 | 
| -    if (vp9_receive_compressed_data(ctx->pbi, data_sz, data, deadline)) {
 | 
| -      VP9D_COMP *pbi = (VP9D_COMP*)ctx->pbi;
 | 
| -      res = update_error_state(ctx, &pbi->common.error);
 | 
| -    }
 | 
| +  if (vp9_get_raw_frame(ctx->pbi, &sd, &time_stamp, &time_end_stamp, &flags))
 | 
| +    return update_error_state(ctx, &cm->error);
 | 
|  
 | 
| -    if (!res && 0 == vp9_get_raw_frame(ctx->pbi, &sd, &time_stamp,
 | 
| -                                       &time_end_stamp, &flags)) {
 | 
| -      VP9D_COMP *const pbi = (VP9D_COMP*)ctx->pbi;
 | 
| -      VP9_COMMON *const cm = &pbi->common;
 | 
| -      yuvconfig2image(&ctx->img, &sd, user_priv);
 | 
| +  yuvconfig2image(&ctx->img, &sd, user_priv);
 | 
| +  ctx->img.fb_priv = cm->frame_bufs[cm->new_fb_idx].raw_frame_buffer.priv;
 | 
| +  ctx->img_avail = 1;
 | 
|  
 | 
| -      ctx->img.fb_priv = cm->frame_bufs[cm->new_fb_idx].raw_frame_buffer.priv;
 | 
| -      ctx->img_avail = 1;
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -  return res;
 | 
| +  return VPX_CODEC_OK;
 | 
|  }
 | 
|  
 | 
|  static void parse_superframe_index(const uint8_t *data, size_t data_sz,
 | 
| @@ -385,7 +312,7 @@
 | 
|      if (data_sz >= index_sz && data[data_sz - index_sz] == marker) {
 | 
|        // found a valid superframe index
 | 
|        uint32_t i, j;
 | 
| -      const uint8_t *x = data + data_sz - index_sz + 1;
 | 
| +      const uint8_t *x = &data[data_sz - index_sz + 1];
 | 
|  
 | 
|        for (i = 0; i < frames; i++) {
 | 
|          uint32_t this_sz = 0;
 | 
| @@ -400,18 +327,17 @@
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -static vpx_codec_err_t vp9_decode(vpx_codec_alg_priv_t  *ctx,
 | 
| -                                  const uint8_t         *data,
 | 
| -                                  unsigned int           data_sz,
 | 
| -                                  void                  *user_priv,
 | 
| -                                  long                   deadline) {
 | 
| +static vpx_codec_err_t decoder_decode(vpx_codec_alg_priv_t *ctx,
 | 
| +                                      const uint8_t *data, unsigned int data_sz,
 | 
| +                                      void *user_priv, long deadline) {
 | 
|    const uint8_t *data_start = data;
 | 
|    const uint8_t *data_end = data + data_sz;
 | 
| -  vpx_codec_err_t res = 0;
 | 
| +  vpx_codec_err_t res = VPX_CODEC_OK;
 | 
|    uint32_t sizes[8];
 | 
|    int frames_this_pts, frame_count = 0;
 | 
|  
 | 
| -  if (data == NULL || data_sz == 0) return VPX_CODEC_INVALID_PARAM;
 | 
| +  if (data == NULL || data_sz == 0)
 | 
| +    return VPX_CODEC_INVALID_PARAM;
 | 
|  
 | 
|    parse_superframe_index(data, data_sz, sizes, &frames_this_pts);
 | 
|  
 | 
| @@ -450,27 +376,27 @@
 | 
|      assert(data_start >= data);
 | 
|      assert(data_start <= data_end);
 | 
|  
 | 
| -    /* Early exit if there was a decode error */
 | 
| +    // Early exit if there was a decode error
 | 
|      if (res)
 | 
|        break;
 | 
|  
 | 
| -    /* Account for suboptimal termination by the encoder. */
 | 
| +    // Account for suboptimal termination by the encoder.
 | 
|      while (data_start < data_end && *data_start == 0)
 | 
|        data_start++;
 | 
|  
 | 
|      data_sz = (unsigned int)(data_end - data_start);
 | 
|    } while (data_start < data_end);
 | 
| +
 | 
|    return res;
 | 
|  }
 | 
|  
 | 
| -static vpx_image_t *vp9_get_frame(vpx_codec_alg_priv_t  *ctx,
 | 
| -                                  vpx_codec_iter_t      *iter) {
 | 
| +static vpx_image_t *decoder_get_frame(vpx_codec_alg_priv_t *ctx,
 | 
| +                                      vpx_codec_iter_t *iter) {
 | 
|    vpx_image_t *img = NULL;
 | 
|  
 | 
|    if (ctx->img_avail) {
 | 
| -    /* iter acts as a flip flop, so an image is only returned on the first
 | 
| -     * call to get_frame.
 | 
| -     */
 | 
| +    // iter acts as a flip flop, so an image is only returned on the first
 | 
| +    // call to get_frame.
 | 
|      if (!(*iter)) {
 | 
|        img = &ctx->img;
 | 
|        *iter = img;
 | 
| @@ -481,7 +407,7 @@
 | 
|    return img;
 | 
|  }
 | 
|  
 | 
| -static vpx_codec_err_t vp9_set_fb_fn(
 | 
| +static vpx_codec_err_t decoder_set_fb_fn(
 | 
|      vpx_codec_alg_priv_t *ctx,
 | 
|      vpx_get_frame_buffer_cb_fn_t cb_get,
 | 
|      vpx_release_frame_buffer_cb_fn_t cb_release, void *cb_priv) {
 | 
| @@ -499,93 +425,24 @@
 | 
|    return VPX_CODEC_ERROR;
 | 
|  }
 | 
|  
 | 
| -static vpx_codec_err_t vp9_xma_get_mmap(const vpx_codec_ctx_t *ctx,
 | 
| -                                        vpx_codec_mmap_t *mmap,
 | 
| -                                        vpx_codec_iter_t *iter) {
 | 
| -  vpx_codec_err_t res;
 | 
| -  const mem_req_t *seg_iter = *iter;
 | 
| +static vpx_codec_err_t ctrl_set_reference(vpx_codec_alg_priv_t *ctx,
 | 
| +                                          int ctr_id, va_list args) {
 | 
| +  vpx_ref_frame_t *const data = va_arg(args, vpx_ref_frame_t *);
 | 
|  
 | 
| -  /* Get address of next segment request */
 | 
| -  do {
 | 
| -    if (!seg_iter)
 | 
| -      seg_iter = vp9_mem_req_segs;
 | 
| -    else if (seg_iter->id != VP9_SEG_MAX)
 | 
| -      seg_iter++;
 | 
| -
 | 
| -    *iter = (vpx_codec_iter_t)seg_iter;
 | 
| -
 | 
| -    if (seg_iter->id != VP9_SEG_MAX) {
 | 
| -      mmap->id = seg_iter->id;
 | 
| -      mmap->sz = seg_iter->sz;
 | 
| -      mmap->align = seg_iter->align;
 | 
| -      mmap->flags = seg_iter->flags;
 | 
| -
 | 
| -      if (!seg_iter->sz)
 | 
| -        mmap->sz = seg_iter->calc_sz(ctx->config.dec, ctx->init_flags);
 | 
| -
 | 
| -      res = VPX_CODEC_OK;
 | 
| -    } else {
 | 
| -      res = VPX_CODEC_LIST_END;
 | 
| -    }
 | 
| -  } while (!mmap->sz && res != VPX_CODEC_LIST_END);
 | 
| -
 | 
| -  return res;
 | 
| -}
 | 
| -
 | 
| -static vpx_codec_err_t vp9_xma_set_mmap(vpx_codec_ctx_t *ctx,
 | 
| -                                        const vpx_codec_mmap_t  *mmap) {
 | 
| -  vpx_codec_err_t res = VPX_CODEC_MEM_ERROR;
 | 
| -  int i, done;
 | 
| -
 | 
| -  if (!ctx->priv) {
 | 
| -    if (mmap->id == VP9_SEG_ALG_PRIV) {
 | 
| -      if (!ctx->priv) {
 | 
| -        vp9_init_ctx(ctx, mmap);
 | 
| -        res = VPX_CODEC_OK;
 | 
| -      }
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -  done = 1;
 | 
| -
 | 
| -  if (!res && ctx->priv->alg_priv) {
 | 
| -    for (i = 0; i < NELEMENTS(ctx->priv->alg_priv->mmaps); i++) {
 | 
| -      if (ctx->priv->alg_priv->mmaps[i].id == mmap->id)
 | 
| -        if (!ctx->priv->alg_priv->mmaps[i].base) {
 | 
| -          ctx->priv->alg_priv->mmaps[i] = *mmap;
 | 
| -          res = VPX_CODEC_OK;
 | 
| -        }
 | 
| -
 | 
| -      done &= (ctx->priv->alg_priv->mmaps[i].base != NULL);
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -  if (done && !res) {
 | 
| -    vp9_finalize_mmaps(ctx->priv->alg_priv);
 | 
| -    res = ctx->iface->init(ctx, NULL);
 | 
| -  }
 | 
| -
 | 
| -  return res;
 | 
| -}
 | 
| -
 | 
| -static vpx_codec_err_t set_reference(vpx_codec_alg_priv_t *ctx, int ctr_id,
 | 
| -                                     va_list args) {
 | 
| -  vpx_ref_frame_t *data = va_arg(args, vpx_ref_frame_t *);
 | 
| -
 | 
|    if (data) {
 | 
| -    vpx_ref_frame_t *frame = (vpx_ref_frame_t *)data;
 | 
| +    vpx_ref_frame_t *const frame = (vpx_ref_frame_t *)data;
 | 
|      YV12_BUFFER_CONFIG sd;
 | 
|  
 | 
|      image2yuvconfig(&frame->img, &sd);
 | 
| -    return vp9_set_reference_dec(ctx->pbi,
 | 
| +    return vp9_set_reference_dec(&ctx->pbi->common,
 | 
|                                   (VP9_REFFRAME)frame->frame_type, &sd);
 | 
|    } else {
 | 
|      return VPX_CODEC_INVALID_PARAM;
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -static vpx_codec_err_t copy_reference(vpx_codec_alg_priv_t *ctx, int ctr_id,
 | 
| -                                      va_list args) {
 | 
| +static vpx_codec_err_t ctrl_copy_reference(vpx_codec_alg_priv_t *ctx,
 | 
| +                                           int ctr_id, va_list args) {
 | 
|    vpx_ref_frame_t *data = va_arg(args, vpx_ref_frame_t *);
 | 
|  
 | 
|    if (data) {
 | 
| @@ -601,8 +458,8 @@
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -static vpx_codec_err_t get_reference(vpx_codec_alg_priv_t *ctx, int ctr_id,
 | 
| -                                     va_list args) {
 | 
| +static vpx_codec_err_t ctrl_get_reference(vpx_codec_alg_priv_t *ctx,
 | 
| +                                          int ctr_id, va_list args) {
 | 
|    vp9_ref_frame_t *data = va_arg(args, vp9_ref_frame_t *);
 | 
|  
 | 
|    if (data) {
 | 
| @@ -616,8 +473,8 @@
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -static vpx_codec_err_t set_postproc(vpx_codec_alg_priv_t *ctx, int ctr_id,
 | 
| -                                    va_list args) {
 | 
| +static vpx_codec_err_t ctrl_set_postproc(vpx_codec_alg_priv_t *ctx,
 | 
| +                                         int ctr_id, va_list args) {
 | 
|  #if CONFIG_VP9_POSTPROC
 | 
|    vp8_postproc_cfg_t *data = va_arg(args, vp8_postproc_cfg_t *);
 | 
|  
 | 
| @@ -633,8 +490,8 @@
 | 
|  #endif
 | 
|  }
 | 
|  
 | 
| -static vpx_codec_err_t set_dbg_options(vpx_codec_alg_priv_t *ctx, int ctrl_id,
 | 
| -                                       va_list args) {
 | 
| +static vpx_codec_err_t ctrl_set_dbg_options(vpx_codec_alg_priv_t *ctx,
 | 
| +                                            int ctrl_id, va_list args) {
 | 
|  #if CONFIG_POSTPROC_VISUALIZER && CONFIG_POSTPROC
 | 
|    int data = va_arg(args, int);
 | 
|  
 | 
| @@ -653,14 +510,15 @@
 | 
|  #endif
 | 
|  }
 | 
|  
 | 
| -static vpx_codec_err_t get_last_ref_updates(vpx_codec_alg_priv_t *ctx,
 | 
| -                                            int ctrl_id, va_list args) {
 | 
| -  int *update_info = va_arg(args, int *);
 | 
| -  VP9D_COMP *pbi = (VP9D_COMP*)ctx->pbi;
 | 
| +static vpx_codec_err_t ctrl_get_last_ref_updates(vpx_codec_alg_priv_t *ctx,
 | 
| +                                                 int ctrl_id, va_list args) {
 | 
| +  int *const update_info = va_arg(args, int *);
 | 
|  
 | 
|    if (update_info) {
 | 
| -    *update_info = pbi->refresh_frame_flags;
 | 
| -
 | 
| +    if (ctx->pbi)
 | 
| +      *update_info = ctx->pbi->refresh_frame_flags;
 | 
| +    else
 | 
| +      return VPX_CODEC_ERROR;
 | 
|      return VPX_CODEC_OK;
 | 
|    } else {
 | 
|      return VPX_CODEC_INVALID_PARAM;
 | 
| @@ -668,14 +526,13 @@
 | 
|  }
 | 
|  
 | 
|  
 | 
| -static vpx_codec_err_t get_frame_corrupted(vpx_codec_alg_priv_t *ctx,
 | 
| -                                           int ctrl_id, va_list args) {
 | 
| +static vpx_codec_err_t ctrl_get_frame_corrupted(vpx_codec_alg_priv_t *ctx,
 | 
| +                                                int ctrl_id, va_list args) {
 | 
|    int *corrupted = va_arg(args, int *);
 | 
|  
 | 
|    if (corrupted) {
 | 
| -    VP9D_COMP *pbi = (VP9D_COMP*)ctx->pbi;
 | 
| -    if (pbi)
 | 
| -      *corrupted = pbi->common.frame_to_show->corrupted;
 | 
| +    if (ctx->pbi)
 | 
| +      *corrupted = ctx->pbi->common.frame_to_show->corrupted;
 | 
|      else
 | 
|        return VPX_CODEC_ERROR;
 | 
|      return VPX_CODEC_OK;
 | 
| @@ -684,15 +541,15 @@
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -static vpx_codec_err_t get_display_size(vpx_codec_alg_priv_t *ctx,
 | 
| -                                        int ctrl_id, va_list args) {
 | 
| +static vpx_codec_err_t ctrl_get_display_size(vpx_codec_alg_priv_t *ctx,
 | 
| +                                             int ctrl_id, va_list args) {
 | 
|    int *const display_size = va_arg(args, int *);
 | 
|  
 | 
|    if (display_size) {
 | 
| -    const VP9D_COMP *const pbi = (VP9D_COMP*)ctx->pbi;
 | 
| -    if (pbi) {
 | 
| -      display_size[0] = pbi->common.display_width;
 | 
| -      display_size[1] = pbi->common.display_height;
 | 
| +    if (ctx->pbi) {
 | 
| +      const VP9_COMMON *const cm = &ctx->pbi->common;
 | 
| +      display_size[0] = cm->display_width;
 | 
| +      display_size[1] = cm->display_height;
 | 
|      } else {
 | 
|        return VPX_CODEC_ERROR;
 | 
|      }
 | 
| @@ -702,30 +559,33 @@
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -static vpx_codec_err_t set_invert_tile_order(vpx_codec_alg_priv_t *ctx,
 | 
| -                                             int ctr_id,
 | 
| -                                             va_list args) {
 | 
| +static vpx_codec_err_t ctrl_set_invert_tile_order(vpx_codec_alg_priv_t *ctx,
 | 
| +                                                  int ctr_id, va_list args) {
 | 
|    ctx->invert_tile_order = va_arg(args, int);
 | 
|    return VPX_CODEC_OK;
 | 
|  }
 | 
|  
 | 
| -static vpx_codec_ctrl_fn_map_t ctf_maps[] = {
 | 
| -  {VP8_SET_REFERENCE,             set_reference},
 | 
| -  {VP8_COPY_REFERENCE,            copy_reference},
 | 
| -  {VP8_SET_POSTPROC,              set_postproc},
 | 
| -  {VP8_SET_DBG_COLOR_REF_FRAME,   set_dbg_options},
 | 
| -  {VP8_SET_DBG_COLOR_MB_MODES,    set_dbg_options},
 | 
| -  {VP8_SET_DBG_COLOR_B_MODES,     set_dbg_options},
 | 
| -  {VP8_SET_DBG_DISPLAY_MV,        set_dbg_options},
 | 
| -  {VP8D_GET_LAST_REF_UPDATES,     get_last_ref_updates},
 | 
| -  {VP8D_GET_FRAME_CORRUPTED,      get_frame_corrupted},
 | 
| -  {VP9_GET_REFERENCE,             get_reference},
 | 
| -  {VP9D_GET_DISPLAY_SIZE,         get_display_size},
 | 
| -  {VP9_INVERT_TILE_DECODE_ORDER,  set_invert_tile_order},
 | 
| +static vpx_codec_ctrl_fn_map_t decoder_ctrl_maps[] = {
 | 
| +  {VP8_COPY_REFERENCE,            ctrl_copy_reference},
 | 
| +
 | 
| +  // Setters
 | 
| +  {VP8_SET_REFERENCE,             ctrl_set_reference},
 | 
| +  {VP8_SET_POSTPROC,              ctrl_set_postproc},
 | 
| +  {VP8_SET_DBG_COLOR_REF_FRAME,   ctrl_set_dbg_options},
 | 
| +  {VP8_SET_DBG_COLOR_MB_MODES,    ctrl_set_dbg_options},
 | 
| +  {VP8_SET_DBG_COLOR_B_MODES,     ctrl_set_dbg_options},
 | 
| +  {VP8_SET_DBG_DISPLAY_MV,        ctrl_set_dbg_options},
 | 
| +  {VP9_INVERT_TILE_DECODE_ORDER,  ctrl_set_invert_tile_order},
 | 
| +
 | 
| +  // Getters
 | 
| +  {VP8D_GET_LAST_REF_UPDATES,     ctrl_get_last_ref_updates},
 | 
| +  {VP8D_GET_FRAME_CORRUPTED,      ctrl_get_frame_corrupted},
 | 
| +  {VP9_GET_REFERENCE,             ctrl_get_reference},
 | 
| +  {VP9D_GET_DISPLAY_SIZE,         ctrl_get_display_size},
 | 
| +
 | 
|    { -1, NULL},
 | 
|  };
 | 
|  
 | 
| -
 | 
|  #ifndef VERSION_STRING
 | 
|  #define VERSION_STRING
 | 
|  #endif
 | 
| @@ -733,22 +593,20 @@
 | 
|    "WebM Project VP9 Decoder" VERSION_STRING,
 | 
|    VPX_CODEC_INTERNAL_ABI_VERSION,
 | 
|    VPX_CODEC_CAP_DECODER | VP9_CAP_POSTPROC |
 | 
| -      VPX_CODEC_CAP_EXTERNAL_FRAME_BUFFER,
 | 
| -  /* vpx_codec_caps_t          caps; */
 | 
| -  vp9_init,         /* vpx_codec_init_fn_t       init; */
 | 
| -  vp9_destroy,      /* vpx_codec_destroy_fn_t    destroy; */
 | 
| -  ctf_maps,         /* vpx_codec_ctrl_fn_map_t  *ctrl_maps; */
 | 
| -  vp9_xma_get_mmap, /* vpx_codec_get_mmap_fn_t   get_mmap; */
 | 
| -  vp9_xma_set_mmap, /* vpx_codec_set_mmap_fn_t   set_mmap; */
 | 
| +      VPX_CODEC_CAP_EXTERNAL_FRAME_BUFFER,  // vpx_codec_caps_t
 | 
| +  decoder_init,       // vpx_codec_init_fn_t
 | 
| +  decoder_destroy,    // vpx_codec_destroy_fn_t
 | 
| +  decoder_ctrl_maps,  // vpx_codec_ctrl_fn_map_t
 | 
| +  NOT_IMPLEMENTED,    // vpx_codec_get_mmap_fn_t
 | 
| +  NOT_IMPLEMENTED,    // vpx_codec_set_mmap_fn_t
 | 
|    { // NOLINT
 | 
| -    vp9_peek_si,      /* vpx_codec_peek_si_fn_t    peek_si; */
 | 
| -    vp9_get_si,       /* vpx_codec_get_si_fn_t     get_si; */
 | 
| -    vp9_decode,       /* vpx_codec_decode_fn_t     decode; */
 | 
| -    vp9_get_frame,    /* vpx_codec_frame_get_fn_t  frame_get; */
 | 
| -    vp9_set_fb_fn,    /* vpx_codec_set_fb_fn_t     set_fb_fn; */
 | 
| +    decoder_peek_si,    // vpx_codec_peek_si_fn_t
 | 
| +    decoder_get_si,     // vpx_codec_get_si_fn_t
 | 
| +    decoder_decode,     // vpx_codec_decode_fn_t
 | 
| +    decoder_get_frame,  // vpx_codec_frame_get_fn_t
 | 
| +    decoder_set_fb_fn,  // vpx_codec_set_fb_fn_t
 | 
|    },
 | 
|    { // NOLINT
 | 
| -    /* encoder functions */
 | 
|      NOT_IMPLEMENTED,
 | 
|      NOT_IMPLEMENTED,
 | 
|      NOT_IMPLEMENTED,
 | 
| 
 |