190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*
2f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
4f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Use of this source code is governed by a BSD-style license
5f71323e297a928af368937089d3ed71239786f86Andreas Huber *  that can be found in the LICENSE file in the root of the source
6f71323e297a928af368937089d3ed71239786f86Andreas Huber *  tree. An additional intellectual property rights grant can be found
7f71323e297a928af368937089d3ed71239786f86Andreas Huber *  in the file PATENTS.  All contributing project authors may
8f71323e297a928af368937089d3ed71239786f86Andreas Huber *  be found in the AUTHORS file in the root of the source tree.
990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <stdlib.h>
1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <string.h>
141b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_rtcd.h"
15f71323e297a928af368937089d3ed71239786f86Andreas Huber#include "vpx/vpx_decoder.h"
16f71323e297a928af368937089d3ed71239786f86Andreas Huber#include "vpx/vp8dx.h"
17f71323e297a928af368937089d3ed71239786f86Andreas Huber#include "vpx/internal/vpx_codec_internal.h"
1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_version.h"
1979f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "common/onyxd.h"
2079f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "decoder/onyxd_int.h"
211b362b15af34006e6a11974088a46d42b903418eJohann#include "common/alloccommon.h"
221b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_mem/vpx_mem.h"
231b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT
241b362b15af34006e6a11974088a46d42b903418eJohann#include "decoder/error_concealment.h"
251b362b15af34006e6a11974088a46d42b903418eJohann#endif
261b362b15af34006e6a11974088a46d42b903418eJohann#include "decoder/decoderthreading.h"
2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VP8_CAP_POSTPROC (CONFIG_POSTPROC ? VPX_CODEC_CAP_POSTPROC : 0)
291b362b15af34006e6a11974088a46d42b903418eJohann#define VP8_CAP_ERROR_CONCEALMENT (CONFIG_ERROR_CONCEALMENT ? \
301b362b15af34006e6a11974088a46d42b903418eJohann                                    VPX_CODEC_CAP_ERROR_CONCEALMENT : 0)
3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef vpx_codec_stream_info_t  vp8_stream_info_t;
3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* Structures for handling memory allocations */
3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef enum
3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    VP8_SEG_ALG_PRIV     = 256,
3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    VP8_SEG_MAX
3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} mem_seg_id_t;
40538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define NELEMENTS(x) ((int)(sizeof(x)/sizeof(x[0])))
4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic unsigned long vp8_priv_sz(const vpx_codec_dec_cfg_t *si, vpx_codec_flags_t);
4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef struct
4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int   id;
4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned long  sz;
4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int   align;
4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int   flags;
5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned long(*calc_sz)(const vpx_codec_dec_cfg_t *, vpx_codec_flags_t);
5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} mem_req_t;
5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic const mem_req_t vp8_mem_req_segs[] =
5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {VP8_SEG_ALG_PRIV,    0, 8, VPX_CODEC_MEM_ZERO, vp8_priv_sz},
5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {VP8_SEG_MAX, 0, 0, 0, NULL}
5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstruct vpx_codec_alg_priv
6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_priv_t        base;
6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_mmap_t        mmaps[NELEMENTS(vp8_mem_req_segs)-1];
6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_dec_cfg_t     cfg;
6479f15823c34ae1e423108295e416213200bb280fAndreas Huber    vp8_stream_info_t       si;
6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int                     defer_alloc;
6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int                     decoder_init;
671b362b15af34006e6a11974088a46d42b903418eJohann    struct VP8D_COMP       *pbi;
6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int                     postproc_cfg_set;
6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_postproc_cfg_t      postproc_cfg;
7079f15823c34ae1e423108295e416213200bb280fAndreas Huber#if CONFIG_POSTPROC_VISUALIZER
7179f15823c34ae1e423108295e416213200bb280fAndreas Huber    unsigned int            dbg_postproc_flag;
7279f15823c34ae1e423108295e416213200bb280fAndreas Huber    int                     dbg_color_ref_frame_flag;
7379f15823c34ae1e423108295e416213200bb280fAndreas Huber    int                     dbg_color_mb_modes_flag;
7479f15823c34ae1e423108295e416213200bb280fAndreas Huber    int                     dbg_color_b_modes_flag;
7579f15823c34ae1e423108295e416213200bb280fAndreas Huber    int                     dbg_display_mv_flag;
7679f15823c34ae1e423108295e416213200bb280fAndreas Huber#endif
7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_image_t             img;
7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int                     img_setup;
791b362b15af34006e6a11974088a46d42b903418eJohann    void                    *user_priv;
8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic unsigned long vp8_priv_sz(const vpx_codec_dec_cfg_t *si, vpx_codec_flags_t flags)
8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /* Although this declaration is constant, we can't use it in the requested
8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * segments list because we want to define the requested segments list
8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * before defining the private type (so that the number of memory maps is
8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * known)
8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     */
8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void)si;
9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return sizeof(vpx_codec_alg_priv_t);
9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic void vp8_mmap_dtor(vpx_codec_mmap_t *mmap)
9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    free(mmap->priv);
9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_mmap_alloc(vpx_codec_mmap_t *mmap)
10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_err_t  res;
10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int   align;
10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    align = mmap->align ? mmap->align - 1 : 0;
10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (mmap->flags & VPX_CODEC_MEM_ZERO)
10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mmap->priv = calloc(1, mmap->sz + align);
10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mmap->priv = malloc(mmap->sz + align);
11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    res = (mmap->priv) ? VPX_CODEC_OK : VPX_CODEC_MEM_ERROR;
11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    mmap->base = (void *)((((uintptr_t)mmap->priv) + align) & ~(uintptr_t)align);
11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    mmap->dtor = vp8_mmap_dtor;
11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return res;
11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_validate_mmaps(const vp8_stream_info_t *si,
11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        const vpx_codec_mmap_t        *mmaps,
11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vpx_codec_flags_t              init_flags)
12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int i;
12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_err_t res = VPX_CODEC_OK;
12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (i = 0; i < NELEMENTS(vp8_mem_req_segs) - 1; i++)
12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /* Ensure the segment has been allocated */
12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (!mmaps[i].base)
12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            res = VPX_CODEC_MEM_ERROR;
13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            break;
13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /* Verify variable size segment is big enough for the current si. */
13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (vp8_mem_req_segs[i].calc_sz)
13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            vpx_codec_dec_cfg_t cfg;
13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cfg.w = si->w;
13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cfg.h = si->h;
14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (mmaps[i].sz < vp8_mem_req_segs[i].calc_sz(&cfg, init_flags))
14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                res = VPX_CODEC_MEM_ERROR;
14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                break;
14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return res;
15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic void vp8_init_ctx(vpx_codec_ctx_t *ctx, const vpx_codec_mmap_t *mmap)
15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int i;
15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->priv = mmap->base;
15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->priv->sz = sizeof(*ctx->priv);
15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->priv->iface = ctx->iface;
15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->priv->alg_priv = mmap->base;
16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (i = 0; i < NELEMENTS(ctx->priv->alg_priv->mmaps); i++)
16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ctx->priv->alg_priv->mmaps[i].id = vp8_mem_req_segs[i].id;
16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->priv->alg_priv->mmaps[0] = *mmap;
16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->priv->alg_priv->si.sz = sizeof(ctx->priv->alg_priv->si);
16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->priv->init_flags = ctx->init_flags;
16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (ctx->config.dec)
16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /* Update the reference to the config structure to an internal copy. */
17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ctx->priv->alg_priv->cfg = *ctx->config.dec;
17290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ctx->config.dec = &ctx->priv->alg_priv->cfg;
17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
176538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic void *mmap_lkup(vpx_codec_alg_priv_t *ctx, unsigned int id)
17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int i;
17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18079f15823c34ae1e423108295e416213200bb280fAndreas Huber    for (i = 0; i < NELEMENTS(ctx->mmaps); i++)
18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (ctx->mmaps[i].id == id)
18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            return ctx->mmaps[i].base;
18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return NULL;
18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic void vp8_finalize_mmaps(vpx_codec_alg_priv_t *ctx)
18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
18879f15823c34ae1e423108295e416213200bb280fAndreas Huber    /* nothing to clean up */
18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1911b362b15af34006e6a11974088a46d42b903418eJohannstatic vpx_codec_err_t vp8_init(vpx_codec_ctx_t *ctx,
1921b362b15af34006e6a11974088a46d42b903418eJohann                                vpx_codec_priv_enc_mr_cfg_t *data)
19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_err_t        res = VPX_CODEC_OK;
1951b362b15af34006e6a11974088a46d42b903418eJohann    (void) data;
1961b362b15af34006e6a11974088a46d42b903418eJohann
1971b362b15af34006e6a11974088a46d42b903418eJohann    vpx_rtcd();
19890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /* This function only allocates space for the vpx_codec_alg_priv_t
20090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * structure. More memory may be required at the time the stream
20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * information becomes known.
20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     */
20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (!ctx->priv)
20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vpx_codec_mmap_t mmap;
20690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mmap.id = vp8_mem_req_segs[0].id;
20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mmap.sz = sizeof(vpx_codec_alg_priv_t);
20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mmap.align = vp8_mem_req_segs[0].align;
21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mmap.flags = vp8_mem_req_segs[0].flags;
21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        res = vp8_mmap_alloc(&mmap);
21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (!res)
215f71323e297a928af368937089d3ed71239786f86Andreas Huber        {
21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            vp8_init_ctx(ctx, &mmap);
21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
218f71323e297a928af368937089d3ed71239786f86Andreas Huber            ctx->priv->alg_priv->defer_alloc = 1;
219f71323e297a928af368937089d3ed71239786f86Andreas Huber            /*post processing level initialized to do nothing */
220f71323e297a928af368937089d3ed71239786f86Andreas Huber        }
22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return res;
22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
22590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_destroy(vpx_codec_alg_priv_t *ctx)
22790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
22890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int i;
22990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8dx_remove_decompressor(ctx->pbi);
23190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (i = NELEMENTS(ctx->mmaps) - 1; i >= 0; i--)
23390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (ctx->mmaps[i].dtor)
23590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            ctx->mmaps[i].dtor(&ctx->mmaps[i]);
23690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
23790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return VPX_CODEC_OK;
23990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
24090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_peek_si(const uint8_t         *data,
24290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                   unsigned int           data_sz,
24390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                   vpx_codec_stream_info_t *si)
24490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
24590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_err_t res = VPX_CODEC_OK;
246538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
247538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    if(data + data_sz <= data)
248538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        res = VPX_CODEC_INVALID_PARAM;
249538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    else
25090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
251f71323e297a928af368937089d3ed71239786f86Andreas Huber        /* Parse uncompresssed part of key frame header.
252f71323e297a928af368937089d3ed71239786f86Andreas Huber         * 3 bytes:- including version, frame type and an offset
253f71323e297a928af368937089d3ed71239786f86Andreas Huber         * 3 bytes:- sync code (0x9d, 0x01, 0x2a)
254f71323e297a928af368937089d3ed71239786f86Andreas Huber         * 4 bytes:- including image width and height in the lowest 14 bits
255f71323e297a928af368937089d3ed71239786f86Andreas Huber         *           of each 2-byte value.
25690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
25790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        si->is_kf = 0;
25890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (data_sz >= 10 && !(data[0] & 0x01))  /* I-Frame */
26090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
26190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            const uint8_t *c = data + 3;
26290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            si->is_kf = 1;
26390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
264538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            /* vet via sync code */
26590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (c[0] != 0x9d || c[1] != 0x01 || c[2] != 0x2a)
26690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                res = VPX_CODEC_UNSUP_BITSTREAM;
26790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26879f15823c34ae1e423108295e416213200bb280fAndreas Huber            si->w = (c[3] | (c[4] << 8)) & 0x3fff;
26979f15823c34ae1e423108295e416213200bb280fAndreas Huber            si->h = (c[5] | (c[6] << 8)) & 0x3fff;
27090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
271538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            /*printf("w=%d, h=%d\n", si->w, si->h);*/
27290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (!(si->h | si->w))
27390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                res = VPX_CODEC_UNSUP_BITSTREAM;
27490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
27590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
27690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            res = VPX_CODEC_UNSUP_BITSTREAM;
27790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
27890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return res;
28090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
28290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_get_si(vpx_codec_alg_priv_t    *ctx,
28490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                  vpx_codec_stream_info_t *si)
28590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
28690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int sz;
28890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (si->sz >= sizeof(vp8_stream_info_t))
29090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        sz = sizeof(vp8_stream_info_t);
29190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
29290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        sz = sizeof(vpx_codec_stream_info_t);
29390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    memcpy(si, &ctx->si, sz);
29590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    si->sz = sz;
29690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return VPX_CODEC_OK;
29890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
29990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
30090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
30190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t
30290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberupdate_error_state(vpx_codec_alg_priv_t                 *ctx,
30390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                   const struct vpx_internal_error_info *error)
30490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
30590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_err_t res;
30690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
30790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if ((res = error->error_code))
30890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ctx->base.err_detail = error->has_detail
30990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                               ? error->detail
31090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                               : NULL;
31190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
31290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return res;
31390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
31490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3151b362b15af34006e6a11974088a46d42b903418eJohannstatic void yuvconfig2image(vpx_image_t               *img,
3161b362b15af34006e6a11974088a46d42b903418eJohann                            const YV12_BUFFER_CONFIG  *yv12,
3171b362b15af34006e6a11974088a46d42b903418eJohann                            void                      *user_priv)
3181b362b15af34006e6a11974088a46d42b903418eJohann{
3191b362b15af34006e6a11974088a46d42b903418eJohann    /** vpx_img_wrap() doesn't allow specifying independent strides for
3201b362b15af34006e6a11974088a46d42b903418eJohann      * the Y, U, and V planes, nor other alignment adjustments that
3211b362b15af34006e6a11974088a46d42b903418eJohann      * might be representable by a YV12_BUFFER_CONFIG, so we just
3221b362b15af34006e6a11974088a46d42b903418eJohann      * initialize all the fields.*/
3231b362b15af34006e6a11974088a46d42b903418eJohann    img->fmt = yv12->clrtype == REG_YUV ?
3241b362b15af34006e6a11974088a46d42b903418eJohann        VPX_IMG_FMT_I420 : VPX_IMG_FMT_VPXI420;
3251b362b15af34006e6a11974088a46d42b903418eJohann    img->w = yv12->y_stride;
3261b362b15af34006e6a11974088a46d42b903418eJohann    img->h = (yv12->y_height + 2 * VP8BORDERINPIXELS + 15) & ~15;
3271b362b15af34006e6a11974088a46d42b903418eJohann    img->d_w = yv12->y_width;
3281b362b15af34006e6a11974088a46d42b903418eJohann    img->d_h = yv12->y_height;
3291b362b15af34006e6a11974088a46d42b903418eJohann    img->x_chroma_shift = 1;
3301b362b15af34006e6a11974088a46d42b903418eJohann    img->y_chroma_shift = 1;
3311b362b15af34006e6a11974088a46d42b903418eJohann    img->planes[VPX_PLANE_Y] = yv12->y_buffer;
3321b362b15af34006e6a11974088a46d42b903418eJohann    img->planes[VPX_PLANE_U] = yv12->u_buffer;
3331b362b15af34006e6a11974088a46d42b903418eJohann    img->planes[VPX_PLANE_V] = yv12->v_buffer;
3341b362b15af34006e6a11974088a46d42b903418eJohann    img->planes[VPX_PLANE_ALPHA] = NULL;
3351b362b15af34006e6a11974088a46d42b903418eJohann    img->stride[VPX_PLANE_Y] = yv12->y_stride;
3361b362b15af34006e6a11974088a46d42b903418eJohann    img->stride[VPX_PLANE_U] = yv12->uv_stride;
3371b362b15af34006e6a11974088a46d42b903418eJohann    img->stride[VPX_PLANE_V] = yv12->uv_stride;
3381b362b15af34006e6a11974088a46d42b903418eJohann    img->stride[VPX_PLANE_ALPHA] = yv12->y_stride;
3391b362b15af34006e6a11974088a46d42b903418eJohann    img->bps = 12;
3401b362b15af34006e6a11974088a46d42b903418eJohann    img->user_priv = user_priv;
3411b362b15af34006e6a11974088a46d42b903418eJohann    img->img_data = yv12->buffer_alloc;
3421b362b15af34006e6a11974088a46d42b903418eJohann    img->img_data_owner = 0;
3431b362b15af34006e6a11974088a46d42b903418eJohann    img->self_allocd = 0;
3441b362b15af34006e6a11974088a46d42b903418eJohann}
34590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
34690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_decode(vpx_codec_alg_priv_t  *ctx,
34790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                  const uint8_t         *data,
34890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                  unsigned int            data_sz,
34990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                  void                    *user_priv,
35090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                  long                    deadline)
35190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
35290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_err_t res = VPX_CODEC_OK;
3531b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int resolution_change = 0;
3541b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int w, h;
35590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
356538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    /* Determine the stream parameters. Note that we rely on peek_si to
357538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber     * validate that we have a buffer that does not wrap around the top
358538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber     * of the heap.
359538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber     */
3601b362b15af34006e6a11974088a46d42b903418eJohann    w = ctx->si.w;
3611b362b15af34006e6a11974088a46d42b903418eJohann    h = ctx->si.h;
3621b362b15af34006e6a11974088a46d42b903418eJohann
3631b362b15af34006e6a11974088a46d42b903418eJohann    res = ctx->base.iface->dec.peek_si(data, data_sz, &ctx->si);
3641b362b15af34006e6a11974088a46d42b903418eJohann
3651b362b15af34006e6a11974088a46d42b903418eJohann    if((res == VPX_CODEC_UNSUP_BITSTREAM) && !ctx->si.is_kf)
3661b362b15af34006e6a11974088a46d42b903418eJohann    {
3671b362b15af34006e6a11974088a46d42b903418eJohann        /* the peek function returns an error for non keyframes, however for
3681b362b15af34006e6a11974088a46d42b903418eJohann         * this case, it is not an error */
3691b362b15af34006e6a11974088a46d42b903418eJohann        res = VPX_CODEC_OK;
3701b362b15af34006e6a11974088a46d42b903418eJohann    }
3711b362b15af34006e6a11974088a46d42b903418eJohann
3721b362b15af34006e6a11974088a46d42b903418eJohann    if(!ctx->decoder_init && !ctx->si.is_kf)
3731b362b15af34006e6a11974088a46d42b903418eJohann        res = VPX_CODEC_UNSUP_BITSTREAM;
37490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3751b362b15af34006e6a11974088a46d42b903418eJohann    if ((ctx->si.h != h) || (ctx->si.w != w))
3761b362b15af34006e6a11974088a46d42b903418eJohann        resolution_change = 1;
37790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /* Perform deferred allocations, if required */
37990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (!res && ctx->defer_alloc)
38090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
38190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int i;
38290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (i = 1; !res && i < NELEMENTS(ctx->mmaps); i++)
38490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
38590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            vpx_codec_dec_cfg_t cfg;
38690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cfg.w = ctx->si.w;
38890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cfg.h = ctx->si.h;
38990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            ctx->mmaps[i].id = vp8_mem_req_segs[i].id;
39090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            ctx->mmaps[i].sz = vp8_mem_req_segs[i].sz;
39190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            ctx->mmaps[i].align = vp8_mem_req_segs[i].align;
39290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            ctx->mmaps[i].flags = vp8_mem_req_segs[i].flags;
39390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
39490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (!ctx->mmaps[i].sz)
39590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                ctx->mmaps[i].sz = vp8_mem_req_segs[i].calc_sz(&cfg,
39690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                   ctx->base.init_flags);
39790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
39890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            res = vp8_mmap_alloc(&ctx->mmaps[i]);
39990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
40090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (!res)
40290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            vp8_finalize_mmaps(ctx);
40390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ctx->defer_alloc = 0;
40590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
40690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /* Initialize the decoder instance on the first frame*/
40890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (!res && !ctx->decoder_init)
40990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
41090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        res = vp8_validate_mmaps(&ctx->si, ctx->mmaps, ctx->base.init_flags);
41190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (!res)
41390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
41490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            VP8D_CONFIG oxcf;
4151b362b15af34006e6a11974088a46d42b903418eJohann            struct VP8D_COMP* optr;
41690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            oxcf.Width = ctx->si.w;
41890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            oxcf.Height = ctx->si.h;
41990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            oxcf.Version = 9;
42090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            oxcf.postprocess = 0;
42190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            oxcf.max_threads = ctx->cfg.threads;
4221b362b15af34006e6a11974088a46d42b903418eJohann            oxcf.error_concealment =
4231b362b15af34006e6a11974088a46d42b903418eJohann                    (ctx->base.init_flags & VPX_CODEC_USE_ERROR_CONCEALMENT);
4241b362b15af34006e6a11974088a46d42b903418eJohann            oxcf.input_fragments =
4251b362b15af34006e6a11974088a46d42b903418eJohann                    (ctx->base.init_flags & VPX_CODEC_USE_INPUT_FRAGMENTS);
42690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            optr = vp8dx_create_decompressor(&oxcf);
42890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            /* If postprocessing was enabled by the application and a
43090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber             * configuration has not been provided, default it.
43190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber             */
43290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (!ctx->postproc_cfg_set
43390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                && (ctx->base.init_flags & VPX_CODEC_USE_POSTPROC))
43490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
43590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                ctx->postproc_cfg.post_proc_flag =
4361b362b15af34006e6a11974088a46d42b903418eJohann                    VP8_DEBLOCK | VP8_DEMACROBLOCK | VP8_MFQE;
43790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                ctx->postproc_cfg.deblocking_level = 4;
43890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                ctx->postproc_cfg.noise_level = 0;
43990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
44090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (!optr)
44290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                res = VPX_CODEC_ERROR;
44390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
44490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                ctx->pbi = optr;
44590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
44690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ctx->decoder_init = 1;
44890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
44990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (!res && ctx->pbi)
45190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
4521b362b15af34006e6a11974088a46d42b903418eJohann        if(resolution_change)
4531b362b15af34006e6a11974088a46d42b903418eJohann        {
4541b362b15af34006e6a11974088a46d42b903418eJohann            VP8D_COMP *pbi = ctx->pbi;
4551b362b15af34006e6a11974088a46d42b903418eJohann            VP8_COMMON *const pc = & pbi->common;
4561b362b15af34006e6a11974088a46d42b903418eJohann            MACROBLOCKD *const xd  = & pbi->mb;
4571b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_MULTITHREAD
4581b362b15af34006e6a11974088a46d42b903418eJohann            int i;
4591b362b15af34006e6a11974088a46d42b903418eJohann#endif
4601b362b15af34006e6a11974088a46d42b903418eJohann            pc->Width = ctx->si.w;
4611b362b15af34006e6a11974088a46d42b903418eJohann            pc->Height = ctx->si.h;
4621b362b15af34006e6a11974088a46d42b903418eJohann            {
4631b362b15af34006e6a11974088a46d42b903418eJohann                int prev_mb_rows = pc->mb_rows;
4641b362b15af34006e6a11974088a46d42b903418eJohann
4651b362b15af34006e6a11974088a46d42b903418eJohann                if (setjmp(pbi->common.error.jmp))
4661b362b15af34006e6a11974088a46d42b903418eJohann                {
4671b362b15af34006e6a11974088a46d42b903418eJohann                    pbi->common.error.setjmp = 0;
4681b362b15af34006e6a11974088a46d42b903418eJohann                    /* same return value as used in vp8dx_receive_compressed_data */
4691b362b15af34006e6a11974088a46d42b903418eJohann                    return -1;
4701b362b15af34006e6a11974088a46d42b903418eJohann                }
4711b362b15af34006e6a11974088a46d42b903418eJohann
4721b362b15af34006e6a11974088a46d42b903418eJohann                pbi->common.error.setjmp = 1;
4731b362b15af34006e6a11974088a46d42b903418eJohann
4741b362b15af34006e6a11974088a46d42b903418eJohann                if (pc->Width <= 0)
4751b362b15af34006e6a11974088a46d42b903418eJohann                {
4761b362b15af34006e6a11974088a46d42b903418eJohann                    pc->Width = w;
4771b362b15af34006e6a11974088a46d42b903418eJohann                    vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME,
4781b362b15af34006e6a11974088a46d42b903418eJohann                                       "Invalid frame width");
4791b362b15af34006e6a11974088a46d42b903418eJohann                }
4801b362b15af34006e6a11974088a46d42b903418eJohann
4811b362b15af34006e6a11974088a46d42b903418eJohann                if (pc->Height <= 0)
4821b362b15af34006e6a11974088a46d42b903418eJohann                {
4831b362b15af34006e6a11974088a46d42b903418eJohann                    pc->Height = h;
4841b362b15af34006e6a11974088a46d42b903418eJohann                    vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME,
4851b362b15af34006e6a11974088a46d42b903418eJohann                                       "Invalid frame height");
4861b362b15af34006e6a11974088a46d42b903418eJohann                }
4871b362b15af34006e6a11974088a46d42b903418eJohann
4881b362b15af34006e6a11974088a46d42b903418eJohann                if (vp8_alloc_frame_buffers(pc, pc->Width, pc->Height))
4891b362b15af34006e6a11974088a46d42b903418eJohann                    vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR,
4901b362b15af34006e6a11974088a46d42b903418eJohann                                       "Failed to allocate frame buffers");
4911b362b15af34006e6a11974088a46d42b903418eJohann
4921b362b15af34006e6a11974088a46d42b903418eJohann                xd->pre = pc->yv12_fb[pc->lst_fb_idx];
4931b362b15af34006e6a11974088a46d42b903418eJohann                xd->dst = pc->yv12_fb[pc->new_fb_idx];
4941b362b15af34006e6a11974088a46d42b903418eJohann
4951b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_MULTITHREAD
4961b362b15af34006e6a11974088a46d42b903418eJohann                for (i = 0; i < pbi->allocated_decoding_thread_count; i++)
4971b362b15af34006e6a11974088a46d42b903418eJohann                {
4981b362b15af34006e6a11974088a46d42b903418eJohann                    pbi->mb_row_di[i].mbd.dst = pc->yv12_fb[pc->new_fb_idx];
4991b362b15af34006e6a11974088a46d42b903418eJohann                    vp8_build_block_doffsets(&pbi->mb_row_di[i].mbd);
5001b362b15af34006e6a11974088a46d42b903418eJohann                }
5011b362b15af34006e6a11974088a46d42b903418eJohann#endif
5021b362b15af34006e6a11974088a46d42b903418eJohann                vp8_build_block_doffsets(&pbi->mb);
5031b362b15af34006e6a11974088a46d42b903418eJohann
5041b362b15af34006e6a11974088a46d42b903418eJohann                /* allocate memory for last frame MODE_INFO array */
5051b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT
5061b362b15af34006e6a11974088a46d42b903418eJohann
5071b362b15af34006e6a11974088a46d42b903418eJohann                if (pbi->ec_enabled)
5081b362b15af34006e6a11974088a46d42b903418eJohann                {
5091b362b15af34006e6a11974088a46d42b903418eJohann                    /* old prev_mip was released by vp8_de_alloc_frame_buffers()
5101b362b15af34006e6a11974088a46d42b903418eJohann                     * called in vp8_alloc_frame_buffers() */
5111b362b15af34006e6a11974088a46d42b903418eJohann                    pc->prev_mip = vpx_calloc(
5121b362b15af34006e6a11974088a46d42b903418eJohann                                       (pc->mb_cols + 1) * (pc->mb_rows + 1),
5131b362b15af34006e6a11974088a46d42b903418eJohann                                       sizeof(MODE_INFO));
5141b362b15af34006e6a11974088a46d42b903418eJohann
5151b362b15af34006e6a11974088a46d42b903418eJohann                    if (!pc->prev_mip)
5161b362b15af34006e6a11974088a46d42b903418eJohann                    {
5171b362b15af34006e6a11974088a46d42b903418eJohann                        vp8_de_alloc_frame_buffers(pc);
5181b362b15af34006e6a11974088a46d42b903418eJohann                        vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR,
5191b362b15af34006e6a11974088a46d42b903418eJohann                                           "Failed to allocate"
5201b362b15af34006e6a11974088a46d42b903418eJohann                                           "last frame MODE_INFO array");
5211b362b15af34006e6a11974088a46d42b903418eJohann                    }
5221b362b15af34006e6a11974088a46d42b903418eJohann
5231b362b15af34006e6a11974088a46d42b903418eJohann                    pc->prev_mi = pc->prev_mip + pc->mode_info_stride + 1;
5241b362b15af34006e6a11974088a46d42b903418eJohann
5251b362b15af34006e6a11974088a46d42b903418eJohann                    if (vp8_alloc_overlap_lists(pbi))
5261b362b15af34006e6a11974088a46d42b903418eJohann                        vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR,
5271b362b15af34006e6a11974088a46d42b903418eJohann                                           "Failed to allocate overlap lists "
5281b362b15af34006e6a11974088a46d42b903418eJohann                                           "for error concealment");
5291b362b15af34006e6a11974088a46d42b903418eJohann                }
5301b362b15af34006e6a11974088a46d42b903418eJohann
5311b362b15af34006e6a11974088a46d42b903418eJohann#endif
5321b362b15af34006e6a11974088a46d42b903418eJohann
5331b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_MULTITHREAD
5341b362b15af34006e6a11974088a46d42b903418eJohann                if (pbi->b_multithreaded_rd)
5351b362b15af34006e6a11974088a46d42b903418eJohann                    vp8mt_alloc_temp_buffers(pbi, pc->Width, prev_mb_rows);
5361b362b15af34006e6a11974088a46d42b903418eJohann#else
5371b362b15af34006e6a11974088a46d42b903418eJohann                (void)prev_mb_rows;
5381b362b15af34006e6a11974088a46d42b903418eJohann#endif
5391b362b15af34006e6a11974088a46d42b903418eJohann            }
5401b362b15af34006e6a11974088a46d42b903418eJohann
5411b362b15af34006e6a11974088a46d42b903418eJohann            pbi->common.error.setjmp = 0;
5421b362b15af34006e6a11974088a46d42b903418eJohann
5431b362b15af34006e6a11974088a46d42b903418eJohann            /* required to get past the first get_free_fb() call */
5441b362b15af34006e6a11974088a46d42b903418eJohann            ctx->pbi->common.fb_idx_ref_cnt[0] = 0;
5451b362b15af34006e6a11974088a46d42b903418eJohann        }
5461b362b15af34006e6a11974088a46d42b903418eJohann
5471b362b15af34006e6a11974088a46d42b903418eJohann        ctx->user_priv = user_priv;
5481b362b15af34006e6a11974088a46d42b903418eJohann        if (vp8dx_receive_compressed_data(ctx->pbi, data_sz, data, deadline))
5491b362b15af34006e6a11974088a46d42b903418eJohann        {
5501b362b15af34006e6a11974088a46d42b903418eJohann            VP8D_COMP *pbi = (VP8D_COMP *)ctx->pbi;
5511b362b15af34006e6a11974088a46d42b903418eJohann            res = update_error_state(ctx, &pbi->common.error);
5521b362b15af34006e6a11974088a46d42b903418eJohann        }
5531b362b15af34006e6a11974088a46d42b903418eJohann    }
5541b362b15af34006e6a11974088a46d42b903418eJohann
5551b362b15af34006e6a11974088a46d42b903418eJohann    return res;
5561b362b15af34006e6a11974088a46d42b903418eJohann}
5571b362b15af34006e6a11974088a46d42b903418eJohann
5581b362b15af34006e6a11974088a46d42b903418eJohannstatic vpx_image_t *vp8_get_frame(vpx_codec_alg_priv_t  *ctx,
5591b362b15af34006e6a11974088a46d42b903418eJohann                                  vpx_codec_iter_t      *iter)
5601b362b15af34006e6a11974088a46d42b903418eJohann{
5611b362b15af34006e6a11974088a46d42b903418eJohann    vpx_image_t *img = NULL;
5621b362b15af34006e6a11974088a46d42b903418eJohann
5631b362b15af34006e6a11974088a46d42b903418eJohann    /* iter acts as a flip flop, so an image is only returned on the first
5641b362b15af34006e6a11974088a46d42b903418eJohann     * call to get_frame.
5651b362b15af34006e6a11974088a46d42b903418eJohann     */
5661b362b15af34006e6a11974088a46d42b903418eJohann    if (!(*iter))
5671b362b15af34006e6a11974088a46d42b903418eJohann    {
56890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        YV12_BUFFER_CONFIG sd;
5691b362b15af34006e6a11974088a46d42b903418eJohann        int64_t time_stamp = 0, time_end_stamp = 0;
57079f15823c34ae1e423108295e416213200bb280fAndreas Huber        vp8_ppflags_t flags = {0};
57190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
57290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (ctx->base.init_flags & VPX_CODEC_USE_POSTPROC)
57390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
57479f15823c34ae1e423108295e416213200bb280fAndreas Huber            flags.post_proc_flag= ctx->postproc_cfg.post_proc_flag
57579f15823c34ae1e423108295e416213200bb280fAndreas Huber#if CONFIG_POSTPROC_VISUALIZER
57679f15823c34ae1e423108295e416213200bb280fAndreas Huber
57779f15823c34ae1e423108295e416213200bb280fAndreas Huber                                | ((ctx->dbg_color_ref_frame_flag != 0) ? VP8D_DEBUG_CLR_FRM_REF_BLKS : 0)
57879f15823c34ae1e423108295e416213200bb280fAndreas Huber                                | ((ctx->dbg_color_mb_modes_flag != 0) ? VP8D_DEBUG_CLR_BLK_MODES : 0)
57979f15823c34ae1e423108295e416213200bb280fAndreas Huber                                | ((ctx->dbg_color_b_modes_flag != 0) ? VP8D_DEBUG_CLR_BLK_MODES : 0)
58079f15823c34ae1e423108295e416213200bb280fAndreas Huber                                | ((ctx->dbg_display_mv_flag != 0) ? VP8D_DEBUG_DRAW_MV : 0)
58179f15823c34ae1e423108295e416213200bb280fAndreas Huber#endif
58279f15823c34ae1e423108295e416213200bb280fAndreas Huber                                ;
58379f15823c34ae1e423108295e416213200bb280fAndreas Huber            flags.deblocking_level      = ctx->postproc_cfg.deblocking_level;
58479f15823c34ae1e423108295e416213200bb280fAndreas Huber            flags.noise_level           = ctx->postproc_cfg.noise_level;
58579f15823c34ae1e423108295e416213200bb280fAndreas Huber#if CONFIG_POSTPROC_VISUALIZER
58679f15823c34ae1e423108295e416213200bb280fAndreas Huber            flags.display_ref_frame_flag= ctx->dbg_color_ref_frame_flag;
58779f15823c34ae1e423108295e416213200bb280fAndreas Huber            flags.display_mb_modes_flag = ctx->dbg_color_mb_modes_flag;
58879f15823c34ae1e423108295e416213200bb280fAndreas Huber            flags.display_b_modes_flag  = ctx->dbg_color_b_modes_flag;
58979f15823c34ae1e423108295e416213200bb280fAndreas Huber            flags.display_mv_flag       = ctx->dbg_display_mv_flag;
59079f15823c34ae1e423108295e416213200bb280fAndreas Huber#endif
59190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
59290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5931b362b15af34006e6a11974088a46d42b903418eJohann        if (0 == vp8dx_get_raw_frame(ctx->pbi, &sd, &time_stamp, &time_end_stamp, &flags))
59490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
5951b362b15af34006e6a11974088a46d42b903418eJohann            yuvconfig2image(&ctx->img, &sd, ctx->user_priv);
59690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
59790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            img = &ctx->img;
59890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            *iter = img;
59990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
60090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
60190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
60290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return img;
60390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
60490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
60590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
60690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic
60790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervpx_codec_err_t vp8_xma_get_mmap(const vpx_codec_ctx_t      *ctx,
60890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                 vpx_codec_mmap_t           *mmap,
60990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                 vpx_codec_iter_t           *iter)
61090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
61190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_err_t     res;
61290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const mem_req_t  *seg_iter = *iter;
61390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
61490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /* Get address of next segment request */
61590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    do
61690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
61790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (!seg_iter)
61890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            seg_iter = vp8_mem_req_segs;
61990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else if (seg_iter->id != VP8_SEG_MAX)
62090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            seg_iter++;
62190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
62290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        *iter = (vpx_codec_iter_t)seg_iter;
62390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
62490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (seg_iter->id != VP8_SEG_MAX)
62590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
62690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            mmap->id = seg_iter->id;
62790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            mmap->sz = seg_iter->sz;
62890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            mmap->align = seg_iter->align;
62990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            mmap->flags = seg_iter->flags;
63090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
63190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (!seg_iter->sz)
63290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                mmap->sz = seg_iter->calc_sz(ctx->config.dec, ctx->init_flags);
63390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
63490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            res = VPX_CODEC_OK;
63590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
63690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
63790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            res = VPX_CODEC_LIST_END;
63890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
63990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    while (!mmap->sz && res != VPX_CODEC_LIST_END);
64090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
64190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return res;
64290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
64390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
64490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_xma_set_mmap(vpx_codec_ctx_t         *ctx,
64590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                        const vpx_codec_mmap_t  *mmap)
64690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
64790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_err_t res = VPX_CODEC_MEM_ERROR;
64890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int i, done;
64990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
65090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (!ctx->priv)
65190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
65290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (mmap->id == VP8_SEG_ALG_PRIV)
65390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
65490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (!ctx->priv)
65590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
65690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                vp8_init_ctx(ctx, mmap);
65790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                res = VPX_CODEC_OK;
65890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
65990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
66090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
66190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
66290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    done = 1;
66390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
664f71323e297a928af368937089d3ed71239786f86Andreas Huber    if (!res && ctx->priv->alg_priv)
66590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
66679f15823c34ae1e423108295e416213200bb280fAndreas Huber        for (i = 0; i < NELEMENTS(ctx->priv->alg_priv->mmaps); i++)
66790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
66890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (ctx->priv->alg_priv->mmaps[i].id == mmap->id)
66990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (!ctx->priv->alg_priv->mmaps[i].base)
67090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
67190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    ctx->priv->alg_priv->mmaps[i] = *mmap;
67290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    res = VPX_CODEC_OK;
67390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
67490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
67590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            done &= (ctx->priv->alg_priv->mmaps[i].base != NULL);
67690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
67790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
67890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
67990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (done && !res)
68090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
68190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8_finalize_mmaps(ctx->priv->alg_priv);
6821b362b15af34006e6a11974088a46d42b903418eJohann        res = ctx->iface->init(ctx, NULL);
68390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
68490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
68590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return res;
68690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
68790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
68890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t image2yuvconfig(const vpx_image_t   *img,
68990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                       YV12_BUFFER_CONFIG  *yv12)
69090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
69190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_err_t        res = VPX_CODEC_OK;
692f71323e297a928af368937089d3ed71239786f86Andreas Huber    yv12->y_buffer = img->planes[VPX_PLANE_Y];
693f71323e297a928af368937089d3ed71239786f86Andreas Huber    yv12->u_buffer = img->planes[VPX_PLANE_U];
694f71323e297a928af368937089d3ed71239786f86Andreas Huber    yv12->v_buffer = img->planes[VPX_PLANE_V];
69590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
69690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    yv12->y_width  = img->d_w;
69790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    yv12->y_height = img->d_h;
69890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    yv12->uv_width = yv12->y_width / 2;
69990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    yv12->uv_height = yv12->y_height / 2;
70090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
701f71323e297a928af368937089d3ed71239786f86Andreas Huber    yv12->y_stride = img->stride[VPX_PLANE_Y];
702f71323e297a928af368937089d3ed71239786f86Andreas Huber    yv12->uv_stride = img->stride[VPX_PLANE_U];
70390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
704f71323e297a928af368937089d3ed71239786f86Andreas Huber    yv12->border  = (img->stride[VPX_PLANE_Y] - img->d_w) / 2;
705f71323e297a928af368937089d3ed71239786f86Andreas Huber    yv12->clrtype = (img->fmt == VPX_IMG_FMT_VPXI420 || img->fmt == VPX_IMG_FMT_VPXYV12);
70690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
70790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return res;
70890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
70990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
71090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
71190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_set_reference(vpx_codec_alg_priv_t *ctx,
71290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int ctr_id,
71390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        va_list args)
71490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
71590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
71690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_ref_frame_t *data = va_arg(args, vpx_ref_frame_t *);
71790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
71890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (data)
71990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
72090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vpx_ref_frame_t *frame = (vpx_ref_frame_t *)data;
72190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        YV12_BUFFER_CONFIG sd;
72290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
72390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        image2yuvconfig(&frame->img, &sd);
72490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7251b362b15af34006e6a11974088a46d42b903418eJohann        return vp8dx_set_reference(ctx->pbi, frame->frame_type, &sd);
72690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
72790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
72890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        return VPX_CODEC_INVALID_PARAM;
72990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
73090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
73190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
73290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_get_reference(vpx_codec_alg_priv_t *ctx,
73390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int ctr_id,
73490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        va_list args)
73590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
73690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
73790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_ref_frame_t *data = va_arg(args, vpx_ref_frame_t *);
73890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
73990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (data)
74090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
74190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vpx_ref_frame_t *frame = (vpx_ref_frame_t *)data;
74290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        YV12_BUFFER_CONFIG sd;
74390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
74490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        image2yuvconfig(&frame->img, &sd);
74590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7461b362b15af34006e6a11974088a46d42b903418eJohann        return vp8dx_get_reference(ctx->pbi, frame->frame_type, &sd);
74790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
74890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
74990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        return VPX_CODEC_INVALID_PARAM;
75090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
75190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
75290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
75390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_set_postproc(vpx_codec_alg_priv_t *ctx,
75490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                        int ctr_id,
75590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                        va_list args)
75690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
75790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_POSTPROC
7581b362b15af34006e6a11974088a46d42b903418eJohann    vp8_postproc_cfg_t *data = va_arg(args, vp8_postproc_cfg_t *);
75990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
76090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (data)
76190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
76290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ctx->postproc_cfg_set = 1;
76390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ctx->postproc_cfg = *((vp8_postproc_cfg_t *)data);
76490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        return VPX_CODEC_OK;
76590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
76690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
76790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        return VPX_CODEC_INVALID_PARAM;
76890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
76990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
77090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return VPX_CODEC_INCAPABLE;
77190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
77290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
77390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
77479f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic vpx_codec_err_t vp8_set_dbg_options(vpx_codec_alg_priv_t *ctx,
77579f15823c34ae1e423108295e416213200bb280fAndreas Huber                                        int ctrl_id,
77679f15823c34ae1e423108295e416213200bb280fAndreas Huber                                        va_list args)
77779f15823c34ae1e423108295e416213200bb280fAndreas Huber{
77879f15823c34ae1e423108295e416213200bb280fAndreas Huber#if CONFIG_POSTPROC_VISUALIZER && CONFIG_POSTPROC
77979f15823c34ae1e423108295e416213200bb280fAndreas Huber    int data = va_arg(args, int);
78079f15823c34ae1e423108295e416213200bb280fAndreas Huber
78179f15823c34ae1e423108295e416213200bb280fAndreas Huber#define MAP(id, var) case id: var = data; break;
78279f15823c34ae1e423108295e416213200bb280fAndreas Huber
78379f15823c34ae1e423108295e416213200bb280fAndreas Huber    switch (ctrl_id)
78479f15823c34ae1e423108295e416213200bb280fAndreas Huber    {
78579f15823c34ae1e423108295e416213200bb280fAndreas Huber        MAP (VP8_SET_DBG_COLOR_REF_FRAME,   ctx->dbg_color_ref_frame_flag);
78679f15823c34ae1e423108295e416213200bb280fAndreas Huber        MAP (VP8_SET_DBG_COLOR_MB_MODES,    ctx->dbg_color_mb_modes_flag);
78779f15823c34ae1e423108295e416213200bb280fAndreas Huber        MAP (VP8_SET_DBG_COLOR_B_MODES,     ctx->dbg_color_b_modes_flag);
78879f15823c34ae1e423108295e416213200bb280fAndreas Huber        MAP (VP8_SET_DBG_DISPLAY_MV,        ctx->dbg_display_mv_flag);
78979f15823c34ae1e423108295e416213200bb280fAndreas Huber    }
79079f15823c34ae1e423108295e416213200bb280fAndreas Huber
79179f15823c34ae1e423108295e416213200bb280fAndreas Huber    return VPX_CODEC_OK;
79279f15823c34ae1e423108295e416213200bb280fAndreas Huber#else
79379f15823c34ae1e423108295e416213200bb280fAndreas Huber    return VPX_CODEC_INCAPABLE;
79479f15823c34ae1e423108295e416213200bb280fAndreas Huber#endif
79579f15823c34ae1e423108295e416213200bb280fAndreas Huber}
79679f15823c34ae1e423108295e416213200bb280fAndreas Huber
79779f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic vpx_codec_err_t vp8_get_last_ref_updates(vpx_codec_alg_priv_t *ctx,
79879f15823c34ae1e423108295e416213200bb280fAndreas Huber                                                int ctrl_id,
79979f15823c34ae1e423108295e416213200bb280fAndreas Huber                                                va_list args)
80079f15823c34ae1e423108295e416213200bb280fAndreas Huber{
80179f15823c34ae1e423108295e416213200bb280fAndreas Huber    int *update_info = va_arg(args, int *);
80279f15823c34ae1e423108295e416213200bb280fAndreas Huber    VP8D_COMP *pbi = (VP8D_COMP *)ctx->pbi;
80379f15823c34ae1e423108295e416213200bb280fAndreas Huber
80479f15823c34ae1e423108295e416213200bb280fAndreas Huber    if (update_info)
80579f15823c34ae1e423108295e416213200bb280fAndreas Huber    {
80679f15823c34ae1e423108295e416213200bb280fAndreas Huber        *update_info = pbi->common.refresh_alt_ref_frame * (int) VP8_ALTR_FRAME
80779f15823c34ae1e423108295e416213200bb280fAndreas Huber            + pbi->common.refresh_golden_frame * (int) VP8_GOLD_FRAME
80879f15823c34ae1e423108295e416213200bb280fAndreas Huber            + pbi->common.refresh_last_frame * (int) VP8_LAST_FRAME;
80979f15823c34ae1e423108295e416213200bb280fAndreas Huber
81079f15823c34ae1e423108295e416213200bb280fAndreas Huber        return VPX_CODEC_OK;
81179f15823c34ae1e423108295e416213200bb280fAndreas Huber    }
81279f15823c34ae1e423108295e416213200bb280fAndreas Huber    else
81379f15823c34ae1e423108295e416213200bb280fAndreas Huber        return VPX_CODEC_INVALID_PARAM;
81479f15823c34ae1e423108295e416213200bb280fAndreas Huber}
81579f15823c34ae1e423108295e416213200bb280fAndreas Huber
8161b362b15af34006e6a11974088a46d42b903418eJohannextern int vp8dx_references_buffer( VP8_COMMON *oci, int ref_frame );
8171b362b15af34006e6a11974088a46d42b903418eJohannstatic vpx_codec_err_t vp8_get_last_ref_frame(vpx_codec_alg_priv_t *ctx,
8181b362b15af34006e6a11974088a46d42b903418eJohann                                              int ctrl_id,
8191b362b15af34006e6a11974088a46d42b903418eJohann                                              va_list args)
8201b362b15af34006e6a11974088a46d42b903418eJohann{
8211b362b15af34006e6a11974088a46d42b903418eJohann    int *ref_info = va_arg(args, int *);
8221b362b15af34006e6a11974088a46d42b903418eJohann    VP8D_COMP *pbi = (VP8D_COMP *)ctx->pbi;
8231b362b15af34006e6a11974088a46d42b903418eJohann    VP8_COMMON *oci = &pbi->common;
8241b362b15af34006e6a11974088a46d42b903418eJohann
8251b362b15af34006e6a11974088a46d42b903418eJohann    if (ref_info)
8261b362b15af34006e6a11974088a46d42b903418eJohann    {
8271b362b15af34006e6a11974088a46d42b903418eJohann        *ref_info =
8281b362b15af34006e6a11974088a46d42b903418eJohann            (vp8dx_references_buffer( oci, ALTREF_FRAME )?VP8_ALTR_FRAME:0) |
8291b362b15af34006e6a11974088a46d42b903418eJohann            (vp8dx_references_buffer( oci, GOLDEN_FRAME )?VP8_GOLD_FRAME:0) |
8301b362b15af34006e6a11974088a46d42b903418eJohann            (vp8dx_references_buffer( oci, LAST_FRAME )?VP8_LAST_FRAME:0);
8311b362b15af34006e6a11974088a46d42b903418eJohann
8321b362b15af34006e6a11974088a46d42b903418eJohann        return VPX_CODEC_OK;
8331b362b15af34006e6a11974088a46d42b903418eJohann    }
8341b362b15af34006e6a11974088a46d42b903418eJohann    else
8351b362b15af34006e6a11974088a46d42b903418eJohann        return VPX_CODEC_INVALID_PARAM;
8361b362b15af34006e6a11974088a46d42b903418eJohann}
83779f15823c34ae1e423108295e416213200bb280fAndreas Huber
83879f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic vpx_codec_err_t vp8_get_frame_corrupted(vpx_codec_alg_priv_t *ctx,
83979f15823c34ae1e423108295e416213200bb280fAndreas Huber                                               int ctrl_id,
84079f15823c34ae1e423108295e416213200bb280fAndreas Huber                                               va_list args)
84179f15823c34ae1e423108295e416213200bb280fAndreas Huber{
84279f15823c34ae1e423108295e416213200bb280fAndreas Huber
84379f15823c34ae1e423108295e416213200bb280fAndreas Huber    int *corrupted = va_arg(args, int *);
84479f15823c34ae1e423108295e416213200bb280fAndreas Huber
84579f15823c34ae1e423108295e416213200bb280fAndreas Huber    if (corrupted)
84679f15823c34ae1e423108295e416213200bb280fAndreas Huber    {
84779f15823c34ae1e423108295e416213200bb280fAndreas Huber        VP8D_COMP *pbi = (VP8D_COMP *)ctx->pbi;
84879f15823c34ae1e423108295e416213200bb280fAndreas Huber        *corrupted = pbi->common.frame_to_show->corrupted;
84979f15823c34ae1e423108295e416213200bb280fAndreas Huber
85079f15823c34ae1e423108295e416213200bb280fAndreas Huber        return VPX_CODEC_OK;
85179f15823c34ae1e423108295e416213200bb280fAndreas Huber    }
85279f15823c34ae1e423108295e416213200bb280fAndreas Huber    else
85379f15823c34ae1e423108295e416213200bb280fAndreas Huber        return VPX_CODEC_INVALID_PARAM;
85479f15823c34ae1e423108295e416213200bb280fAndreas Huber
85579f15823c34ae1e423108295e416213200bb280fAndreas Huber}
85690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
85790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervpx_codec_ctrl_fn_map_t vp8_ctf_maps[] =
85890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
85979f15823c34ae1e423108295e416213200bb280fAndreas Huber    {VP8_SET_REFERENCE,             vp8_set_reference},
86079f15823c34ae1e423108295e416213200bb280fAndreas Huber    {VP8_COPY_REFERENCE,            vp8_get_reference},
86179f15823c34ae1e423108295e416213200bb280fAndreas Huber    {VP8_SET_POSTPROC,              vp8_set_postproc},
86279f15823c34ae1e423108295e416213200bb280fAndreas Huber    {VP8_SET_DBG_COLOR_REF_FRAME,   vp8_set_dbg_options},
86379f15823c34ae1e423108295e416213200bb280fAndreas Huber    {VP8_SET_DBG_COLOR_MB_MODES,    vp8_set_dbg_options},
86479f15823c34ae1e423108295e416213200bb280fAndreas Huber    {VP8_SET_DBG_COLOR_B_MODES,     vp8_set_dbg_options},
86579f15823c34ae1e423108295e416213200bb280fAndreas Huber    {VP8_SET_DBG_DISPLAY_MV,        vp8_set_dbg_options},
86679f15823c34ae1e423108295e416213200bb280fAndreas Huber    {VP8D_GET_LAST_REF_UPDATES,     vp8_get_last_ref_updates},
86779f15823c34ae1e423108295e416213200bb280fAndreas Huber    {VP8D_GET_FRAME_CORRUPTED,      vp8_get_frame_corrupted},
8681b362b15af34006e6a11974088a46d42b903418eJohann    {VP8D_GET_LAST_REF_USED,        vp8_get_last_ref_frame},
86990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    { -1, NULL},
87090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
87190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
87290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
87390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifndef VERSION_STRING
87490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VERSION_STRING
87590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
876538f6170b788de7408b06efc6613dc98579aa6a6Andreas HuberCODEC_INTERFACE(vpx_codec_vp8_dx) =
87790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
878f71323e297a928af368937089d3ed71239786f86Andreas Huber    "WebM Project VP8 Decoder" VERSION_STRING,
87990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    VPX_CODEC_INTERNAL_ABI_VERSION,
8801b362b15af34006e6a11974088a46d42b903418eJohann    VPX_CODEC_CAP_DECODER | VP8_CAP_POSTPROC | VP8_CAP_ERROR_CONCEALMENT |
8811b362b15af34006e6a11974088a46d42b903418eJohann    VPX_CODEC_CAP_INPUT_FRAGMENTS,
88290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /* vpx_codec_caps_t          caps; */
88390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_init,         /* vpx_codec_init_fn_t       init; */
88490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_destroy,      /* vpx_codec_destroy_fn_t    destroy; */
88590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_ctf_maps,     /* vpx_codec_ctrl_fn_map_t  *ctrl_maps; */
88690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_xma_get_mmap, /* vpx_codec_get_mmap_fn_t   get_mmap; */
88790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_xma_set_mmap, /* vpx_codec_set_mmap_fn_t   set_mmap; */
88890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
88990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8_peek_si,      /* vpx_codec_peek_si_fn_t    peek_si; */
89090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8_get_si,       /* vpx_codec_get_si_fn_t     get_si; */
89190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8_decode,       /* vpx_codec_decode_fn_t     decode; */
89290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8_get_frame,    /* vpx_codec_frame_get_fn_t  frame_get; */
89390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    },
894538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { /* encoder functions */
895538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        NOT_IMPLEMENTED,
896538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        NOT_IMPLEMENTED,
897538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        NOT_IMPLEMENTED,
898538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        NOT_IMPLEMENTED,
899538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        NOT_IMPLEMENTED,
900538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        NOT_IMPLEMENTED
901538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
90290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
903