| 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, | 
|  |