vp8_dx_iface.c revision 538f6170b788de7408b06efc6613dc98579aa6a6
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>
14f71323e297a928af368937089d3ed71239786f86Andreas Huber#include "vpx/vpx_decoder.h"
15f71323e297a928af368937089d3ed71239786f86Andreas Huber#include "vpx/vp8dx.h"
16f71323e297a928af368937089d3ed71239786f86Andreas Huber#include "vpx/internal/vpx_codec_internal.h"
1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_version.h"
1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "onyxd.h"
1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "onyxd_int.h"
2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VP8_CAP_POSTPROC (CONFIG_POSTPROC ? VPX_CODEC_CAP_POSTPROC : 0)
2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_BIG_ENDIAN
2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define swap4(d)\
2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ((d&0x000000ff)<<24) |  \
2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ((d&0x0000ff00)<<8)  |  \
2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ((d&0x00ff0000)>>8)  |  \
2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ((d&0xff000000)>>24)
2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define swap2(d)\
3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ((d&0x000000ff)<<8) |  \
3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ((d&0x0000ff00)>>8)
3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define swap4(d) d
3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define swap2(d) d
3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef vpx_codec_stream_info_t  vp8_stream_info_t;
3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* Structures for handling memory allocations */
3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef enum
4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    VP8_SEG_ALG_PRIV     = 256,
4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    VP8_SEG_MAX
4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} mem_seg_id_t;
44538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define NELEMENTS(x) ((int)(sizeof(x)/sizeof(x[0])))
4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic unsigned long vp8_priv_sz(const vpx_codec_dec_cfg_t *si, vpx_codec_flags_t);
4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef struct
4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int   id;
5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned long  sz;
5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int   align;
5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int   flags;
5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned long(*calc_sz)(const vpx_codec_dec_cfg_t *, vpx_codec_flags_t);
5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} mem_req_t;
5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic const mem_req_t vp8_mem_req_segs[] =
5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {VP8_SEG_ALG_PRIV,    0, 8, VPX_CODEC_MEM_ZERO, vp8_priv_sz},
6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {VP8_SEG_MAX, 0, 0, 0, NULL}
6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstruct vpx_codec_alg_priv
6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_priv_t        base;
6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_mmap_t        mmaps[NELEMENTS(vp8_mem_req_segs)-1];
6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_dec_cfg_t     cfg;
6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_stream_info_t   si;
6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int                     defer_alloc;
7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int                     decoder_init;
7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    VP8D_PTR                pbi;
7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int                     postproc_cfg_set;
7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_postproc_cfg_t      postproc_cfg;
7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_image_t             img;
7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int                     img_setup;
7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int                     img_avail;
7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic unsigned long vp8_priv_sz(const vpx_codec_dec_cfg_t *si, vpx_codec_flags_t flags)
8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /* Although this declaration is constant, we can't use it in the requested
8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * segments list because we want to define the requested segments list
8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * before defining the private type (so that the number of memory maps is
8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * known)
8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     */
8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void)si;
8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return sizeof(vpx_codec_alg_priv_t);
8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic void vp8_mmap_dtor(vpx_codec_mmap_t *mmap)
9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    free(mmap->priv);
9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_mmap_alloc(vpx_codec_mmap_t *mmap)
9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_err_t  res;
9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int   align;
10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    align = mmap->align ? mmap->align - 1 : 0;
10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (mmap->flags & VPX_CODEC_MEM_ZERO)
10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mmap->priv = calloc(1, mmap->sz + align);
10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mmap->priv = malloc(mmap->sz + align);
10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    res = (mmap->priv) ? VPX_CODEC_OK : VPX_CODEC_MEM_ERROR;
10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    mmap->base = (void *)((((uintptr_t)mmap->priv) + align) & ~(uintptr_t)align);
11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    mmap->dtor = vp8_mmap_dtor;
11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return res;
11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_validate_mmaps(const vp8_stream_info_t *si,
11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        const vpx_codec_mmap_t        *mmaps,
11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vpx_codec_flags_t              init_flags)
11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int i;
11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_err_t res = VPX_CODEC_OK;
12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (i = 0; i < NELEMENTS(vp8_mem_req_segs) - 1; i++)
12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /* Ensure the segment has been allocated */
12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (!mmaps[i].base)
12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            res = VPX_CODEC_MEM_ERROR;
12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            break;
12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /* Verify variable size segment is big enough for the current si. */
13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (vp8_mem_req_segs[i].calc_sz)
13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            vpx_codec_dec_cfg_t cfg;
13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cfg.w = si->w;
13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cfg.h = si->h;
13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (mmaps[i].sz < vp8_mem_req_segs[i].calc_sz(&cfg, init_flags))
13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                res = VPX_CODEC_MEM_ERROR;
14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                break;
14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return res;
14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic void vp8_init_ctx(vpx_codec_ctx_t *ctx, const vpx_codec_mmap_t *mmap)
15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int i;
15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->priv = mmap->base;
15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->priv->sz = sizeof(*ctx->priv);
15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->priv->iface = ctx->iface;
15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->priv->alg_priv = mmap->base;
15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (i = 0; i < NELEMENTS(ctx->priv->alg_priv->mmaps); i++)
15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ctx->priv->alg_priv->mmaps[i].id = vp8_mem_req_segs[i].id;
16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->priv->alg_priv->mmaps[0] = *mmap;
16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->priv->alg_priv->si.sz = sizeof(ctx->priv->alg_priv->si);
16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->priv->init_flags = ctx->init_flags;
16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (ctx->config.dec)
16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /* Update the reference to the config structure to an internal copy. */
16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ctx->priv->alg_priv->cfg = *ctx->config.dec;
16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ctx->config.dec = &ctx->priv->alg_priv->cfg;
17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
17290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
173538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic void *mmap_lkup(vpx_codec_alg_priv_t *ctx, unsigned int id)
17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int i;
17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (i = 0; i < NELEMENTS(vp8_mem_req_segs); i++)
17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (ctx->mmaps[i].id == id)
17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            return ctx->mmaps[i].base;
18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return NULL;
18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic void vp8_finalize_mmaps(vpx_codec_alg_priv_t *ctx)
18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*
18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->pbi = mmap_lkup(ctx, VP6_SEG_PB_INSTANCE);
18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->pbi->mbi.block_dx_info[0].idct_output_ptr = mmap_lkup(ctx, VP6_SEG_IDCT_BUFFER);
18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->pbi->loop_filtered_block = mmap_lkup(ctx, VP6_SEG_LF_BLOCK);
18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->pbi->huff = mmap_lkup(ctx, VP6_SEG_HUFF);
19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->pbi->mbi.coeffs_base_ptr = mmap_lkup(ctx, VP6_SEG_COEFFS);
19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->pbi->fc.above_y = mmap_lkup(ctx, VP6_SEG_ABOVEY);
19290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->pbi->fc.above_u = mmap_lkup(ctx, VP6_SEG_ABOVEU);
19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->pbi->fc.above_v = mmap_lkup(ctx, VP6_SEG_ABOVEV);
19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->pbi->prediction_mode = mmap_lkup(ctx, VP6_SEG_PRED_MODES);
19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->pbi->mbmotion_vector = mmap_lkup(ctx, VP6_SEG_MV_FIELD);
19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->pbi->fb_storage_ptr[0] = mmap_lkup(ctx, VP6_SEG_IMG0_STRG);
19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->pbi->fb_storage_ptr[1] = mmap_lkup(ctx, VP6_SEG_IMG1_STRG);
19890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->pbi->fb_storage_ptr[2] = mmap_lkup(ctx, VP6_SEG_IMG2_STRG);
19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    #if CONFIG_POSTPROC
20090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->pbi->postproc.deblock.fragment_variances = mmap_lkup(ctx, VP6_SEG_DEBLOCKER);
20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->pbi->fb_storage_ptr[3] = mmap_lkup(ctx, VP6_SEG_PP_IMG_STRG);
20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    #endif
20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    */
20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_init(vpx_codec_ctx_t *ctx)
20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_err_t        res = VPX_CODEC_OK;
20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /* This function only allocates space for the vpx_codec_alg_priv_t
21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * structure. More memory may be required at the time the stream
21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * information becomes known.
21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     */
21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (!ctx->priv)
21590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vpx_codec_mmap_t mmap;
21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mmap.id = vp8_mem_req_segs[0].id;
21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mmap.sz = sizeof(vpx_codec_alg_priv_t);
22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mmap.align = vp8_mem_req_segs[0].align;
22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mmap.flags = vp8_mem_req_segs[0].flags;
22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        res = vp8_mmap_alloc(&mmap);
22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (!res)
226f71323e297a928af368937089d3ed71239786f86Andreas Huber        {
22790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            vp8_init_ctx(ctx, &mmap);
22890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
229f71323e297a928af368937089d3ed71239786f86Andreas Huber            ctx->priv->alg_priv->defer_alloc = 1;
230f71323e297a928af368937089d3ed71239786f86Andreas Huber            /*post processing level initialized to do nothing */
231f71323e297a928af368937089d3ed71239786f86Andreas Huber        }
23290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
23390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return res;
23590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
23690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_destroy(vpx_codec_alg_priv_t *ctx)
23890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
23990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int i;
24090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8dx_remove_decompressor(ctx->pbi);
24290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (i = NELEMENTS(ctx->mmaps) - 1; i >= 0; i--)
24490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
24590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (ctx->mmaps[i].dtor)
24690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            ctx->mmaps[i].dtor(&ctx->mmaps[i]);
24790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
24890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return VPX_CODEC_OK;
25090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
25190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_peek_si(const uint8_t         *data,
25390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                   unsigned int           data_sz,
25490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                   vpx_codec_stream_info_t *si)
25590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
25690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_err_t res = VPX_CODEC_OK;
257538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
258538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    if(data + data_sz <= data)
259538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        res = VPX_CODEC_INVALID_PARAM;
260538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    else
26190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
262f71323e297a928af368937089d3ed71239786f86Andreas Huber        /* Parse uncompresssed part of key frame header.
263f71323e297a928af368937089d3ed71239786f86Andreas Huber         * 3 bytes:- including version, frame type and an offset
264f71323e297a928af368937089d3ed71239786f86Andreas Huber         * 3 bytes:- sync code (0x9d, 0x01, 0x2a)
265f71323e297a928af368937089d3ed71239786f86Andreas Huber         * 4 bytes:- including image width and height in the lowest 14 bits
266f71323e297a928af368937089d3ed71239786f86Andreas Huber         *           of each 2-byte value.
26790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
26890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        si->is_kf = 0;
26990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (data_sz >= 10 && !(data[0] & 0x01))  /* I-Frame */
27190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
27290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            const uint8_t *c = data + 3;
27390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            si->is_kf = 1;
27490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
275538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            /* vet via sync code */
27690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (c[0] != 0x9d || c[1] != 0x01 || c[2] != 0x2a)
27790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                res = VPX_CODEC_UNSUP_BITSTREAM;
27890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            si->w = swap2(*(const unsigned short *)(c + 3)) & 0x3fff;
28090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            si->h = swap2(*(const unsigned short *)(c + 5)) & 0x3fff;
28190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
282538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            /*printf("w=%d, h=%d\n", si->w, si->h);*/
28390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (!(si->h | si->w))
28490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                res = VPX_CODEC_UNSUP_BITSTREAM;
28590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
28690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
28790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            res = VPX_CODEC_UNSUP_BITSTREAM;
28890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
28990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return res;
29190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
29390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_get_si(vpx_codec_alg_priv_t    *ctx,
29590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                  vpx_codec_stream_info_t *si)
29690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
29790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int sz;
29990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
30090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (si->sz >= sizeof(vp8_stream_info_t))
30190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        sz = sizeof(vp8_stream_info_t);
30290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
30390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        sz = sizeof(vpx_codec_stream_info_t);
30490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
30590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    memcpy(si, &ctx->si, sz);
30690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    si->sz = sz;
30790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
30890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return VPX_CODEC_OK;
30990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
31090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
31190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
31290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t
31390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberupdate_error_state(vpx_codec_alg_priv_t                 *ctx,
31490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                   const struct vpx_internal_error_info *error)
31590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
31690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_err_t res;
31790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
31890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if ((res = error->error_code))
31990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ctx->base.err_detail = error->has_detail
32090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                               ? error->detail
32190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                               : NULL;
32290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
32390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return res;
32490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
32590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
32690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
32790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_decode(vpx_codec_alg_priv_t  *ctx,
32890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                  const uint8_t         *data,
32990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                  unsigned int            data_sz,
33090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                  void                    *user_priv,
33190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                  long                    deadline)
33290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
33390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_err_t res = VPX_CODEC_OK;
33490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
33590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ctx->img_avail = 0;
33690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
337538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    /* Determine the stream parameters. Note that we rely on peek_si to
338538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber     * validate that we have a buffer that does not wrap around the top
339538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber     * of the heap.
340538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber     */
34190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (!ctx->si.h)
34290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        res = ctx->base.iface->dec.peek_si(data, data_sz, &ctx->si);
34390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
34490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
34590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /* Perform deferred allocations, if required */
34690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (!res && ctx->defer_alloc)
34790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
34890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int i;
34990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (i = 1; !res && i < NELEMENTS(ctx->mmaps); i++)
35190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
35290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            vpx_codec_dec_cfg_t cfg;
35390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cfg.w = ctx->si.w;
35590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cfg.h = ctx->si.h;
35690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            ctx->mmaps[i].id = vp8_mem_req_segs[i].id;
35790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            ctx->mmaps[i].sz = vp8_mem_req_segs[i].sz;
35890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            ctx->mmaps[i].align = vp8_mem_req_segs[i].align;
35990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            ctx->mmaps[i].flags = vp8_mem_req_segs[i].flags;
36090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
36190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (!ctx->mmaps[i].sz)
36290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                ctx->mmaps[i].sz = vp8_mem_req_segs[i].calc_sz(&cfg,
36390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                   ctx->base.init_flags);
36490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
36590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            res = vp8_mmap_alloc(&ctx->mmaps[i]);
36690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
36790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
36890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (!res)
36990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            vp8_finalize_mmaps(ctx);
37090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ctx->defer_alloc = 0;
37290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
37390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /* Initialize the decoder instance on the first frame*/
37590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (!res && !ctx->decoder_init)
37690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
37790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        res = vp8_validate_mmaps(&ctx->si, ctx->mmaps, ctx->base.init_flags);
37890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (!res)
38090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
38190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            VP8D_CONFIG oxcf;
38290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            VP8D_PTR optr;
38390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            vp8dx_initialize();
38590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            oxcf.Width = ctx->si.w;
38790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            oxcf.Height = ctx->si.h;
38890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            oxcf.Version = 9;
38990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            oxcf.postprocess = 0;
39090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            oxcf.max_threads = ctx->cfg.threads;
39190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
39290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            optr = vp8dx_create_decompressor(&oxcf);
39390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
39490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            /* If postprocessing was enabled by the application and a
39590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber             * configuration has not been provided, default it.
39690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber             */
39790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (!ctx->postproc_cfg_set
39890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                && (ctx->base.init_flags & VPX_CODEC_USE_POSTPROC))
39990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
40090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                ctx->postproc_cfg.post_proc_flag =
40190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    VP8_DEBLOCK | VP8_DEMACROBLOCK;
40290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                ctx->postproc_cfg.deblocking_level = 4;
40390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                ctx->postproc_cfg.noise_level = 0;
40490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
40590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (!optr)
40790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                res = VPX_CODEC_ERROR;
40890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
40990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                ctx->pbi = optr;
41090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
41190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ctx->decoder_init = 1;
41390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
41490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (!res && ctx->pbi)
41690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
41790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        YV12_BUFFER_CONFIG sd;
41890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        INT64 time_stamp = 0, time_end_stamp = 0;
41990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int ppflag       = 0;
42090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int ppdeblocking = 0;
42190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int ppnoise      = 0;
42290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (ctx->base.init_flags & VPX_CODEC_USE_POSTPROC)
42490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
42590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            ppflag      = ctx->postproc_cfg.post_proc_flag;
42690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            ppdeblocking = ctx->postproc_cfg.deblocking_level;
42790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            ppnoise     = ctx->postproc_cfg.noise_level;
42890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
42990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (vp8dx_receive_compressed_data(ctx->pbi, data_sz, data, deadline))
43190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
43290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            VP8D_COMP *pbi = (VP8D_COMP *)ctx->pbi;
43390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            res = update_error_state(ctx, &pbi->common.error);
43490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
43590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (!res && 0 == vp8dx_get_raw_frame(ctx->pbi, &sd, &time_stamp, &time_end_stamp, ppdeblocking, ppnoise, ppflag))
43790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
43890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            /* Align width/height */
43990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            unsigned int a_w = (sd.y_width + 15) & ~15;
44090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            unsigned int a_h = (sd.y_height + 15) & ~15;
44190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
442f71323e297a928af368937089d3ed71239786f86Andreas Huber            vpx_img_wrap(&ctx->img, VPX_IMG_FMT_I420,
44390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                         a_w + 2 * VP8BORDERINPIXELS,
44490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                         a_h + 2 * VP8BORDERINPIXELS,
44590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                         1,
44690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                         sd.buffer_alloc);
44790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            vpx_img_set_rect(&ctx->img,
44890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                             VP8BORDERINPIXELS, VP8BORDERINPIXELS,
44990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                             sd.y_width, sd.y_height);
45090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            ctx->img_avail = 1;
45190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
45390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
45490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return res;
45690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
45790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_image_t *vp8_get_frame(vpx_codec_alg_priv_t  *ctx,
45990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                  vpx_codec_iter_t      *iter)
46090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
46190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_image_t *img = NULL;
46290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
46390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (ctx->img_avail)
46490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
46590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /* iter acts as a flip flop, so an image is only returned on the first
46690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * call to get_frame.
46790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
46890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (!(*iter))
46990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
47090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            img = &ctx->img;
47190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            *iter = img;
47290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
47390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
47490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return img;
47690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
47790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic
48090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervpx_codec_err_t vp8_xma_get_mmap(const vpx_codec_ctx_t      *ctx,
48190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                 vpx_codec_mmap_t           *mmap,
48290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                 vpx_codec_iter_t           *iter)
48390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
48490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_err_t     res;
48590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const mem_req_t  *seg_iter = *iter;
48690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
48790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /* Get address of next segment request */
48890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    do
48990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
49090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (!seg_iter)
49190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            seg_iter = vp8_mem_req_segs;
49290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else if (seg_iter->id != VP8_SEG_MAX)
49390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            seg_iter++;
49490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        *iter = (vpx_codec_iter_t)seg_iter;
49690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (seg_iter->id != VP8_SEG_MAX)
49890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
49990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            mmap->id = seg_iter->id;
50090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            mmap->sz = seg_iter->sz;
50190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            mmap->align = seg_iter->align;
50290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            mmap->flags = seg_iter->flags;
50390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
50490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (!seg_iter->sz)
50590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                mmap->sz = seg_iter->calc_sz(ctx->config.dec, ctx->init_flags);
50690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
50790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            res = VPX_CODEC_OK;
50890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
50990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
51090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            res = VPX_CODEC_LIST_END;
51190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
51290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    while (!mmap->sz && res != VPX_CODEC_LIST_END);
51390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return res;
51590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
51690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_xma_set_mmap(vpx_codec_ctx_t         *ctx,
51890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                        const vpx_codec_mmap_t  *mmap)
51990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
52090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_err_t res = VPX_CODEC_MEM_ERROR;
52190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int i, done;
52290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
52390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (!ctx->priv)
52490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
52590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (mmap->id == VP8_SEG_ALG_PRIV)
52690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
52790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (!ctx->priv)
52890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
52990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                vp8_init_ctx(ctx, mmap);
53090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                res = VPX_CODEC_OK;
53190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
53290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
53390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
53490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
53590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    done = 1;
53690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
537f71323e297a928af368937089d3ed71239786f86Andreas Huber    if (!res && ctx->priv->alg_priv)
53890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
53990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (i = 0; i < NELEMENTS(vp8_mem_req_segs); i++)
54090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
54190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (ctx->priv->alg_priv->mmaps[i].id == mmap->id)
54290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (!ctx->priv->alg_priv->mmaps[i].base)
54390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
54490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    ctx->priv->alg_priv->mmaps[i] = *mmap;
54590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    res = VPX_CODEC_OK;
54690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
54790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
54890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            done &= (ctx->priv->alg_priv->mmaps[i].base != NULL);
54990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
55090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
55190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
55290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (done && !res)
55390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
55490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8_finalize_mmaps(ctx->priv->alg_priv);
55590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        res = ctx->iface->init(ctx);
55690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
55790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
55890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return res;
55990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
56090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
56190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t image2yuvconfig(const vpx_image_t   *img,
56290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                       YV12_BUFFER_CONFIG  *yv12)
56390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
56490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_err_t        res = VPX_CODEC_OK;
565f71323e297a928af368937089d3ed71239786f86Andreas Huber    yv12->y_buffer = img->planes[VPX_PLANE_Y];
566f71323e297a928af368937089d3ed71239786f86Andreas Huber    yv12->u_buffer = img->planes[VPX_PLANE_U];
567f71323e297a928af368937089d3ed71239786f86Andreas Huber    yv12->v_buffer = img->planes[VPX_PLANE_V];
56890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
56990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    yv12->y_width  = img->d_w;
57090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    yv12->y_height = img->d_h;
57190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    yv12->uv_width = yv12->y_width / 2;
57290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    yv12->uv_height = yv12->y_height / 2;
57390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
574f71323e297a928af368937089d3ed71239786f86Andreas Huber    yv12->y_stride = img->stride[VPX_PLANE_Y];
575f71323e297a928af368937089d3ed71239786f86Andreas Huber    yv12->uv_stride = img->stride[VPX_PLANE_U];
57690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
577f71323e297a928af368937089d3ed71239786f86Andreas Huber    yv12->border  = (img->stride[VPX_PLANE_Y] - img->d_w) / 2;
578f71323e297a928af368937089d3ed71239786f86Andreas Huber    yv12->clrtype = (img->fmt == VPX_IMG_FMT_VPXI420 || img->fmt == VPX_IMG_FMT_VPXYV12);
57990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
58090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return res;
58190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
58290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
58390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
58490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_set_reference(vpx_codec_alg_priv_t *ctx,
58590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int ctr_id,
58690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        va_list args)
58790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
58890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
58990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_ref_frame_t *data = va_arg(args, vpx_ref_frame_t *);
59090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
59190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (data)
59290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
59390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vpx_ref_frame_t *frame = (vpx_ref_frame_t *)data;
59490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        YV12_BUFFER_CONFIG sd;
59590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
59690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        image2yuvconfig(&frame->img, &sd);
59790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
59890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8dx_set_reference(ctx->pbi, frame->frame_type, &sd);
59990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        return VPX_CODEC_OK;
60090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
60190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
60290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        return VPX_CODEC_INVALID_PARAM;
60390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
60490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
60590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
60690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_get_reference(vpx_codec_alg_priv_t *ctx,
60790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int ctr_id,
60890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        va_list args)
60990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
61090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
61190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_ref_frame_t *data = va_arg(args, vpx_ref_frame_t *);
61290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
61390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (data)
61490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
61590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vpx_ref_frame_t *frame = (vpx_ref_frame_t *)data;
61690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        YV12_BUFFER_CONFIG sd;
61790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
61890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        image2yuvconfig(&frame->img, &sd);
61990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
62090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8dx_get_reference(ctx->pbi, frame->frame_type, &sd);
62190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        return VPX_CODEC_OK;
62290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
62390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
62490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        return VPX_CODEC_INVALID_PARAM;
62590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
62690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
62790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
62890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_set_postproc(vpx_codec_alg_priv_t *ctx,
62990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                        int ctr_id,
63090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                        va_list args)
63190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
63290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_postproc_cfg_t *data = va_arg(args, vp8_postproc_cfg_t *);
63390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_POSTPROC
63490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
63590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (data)
63690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
63790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ctx->postproc_cfg_set = 1;
63890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ctx->postproc_cfg = *((vp8_postproc_cfg_t *)data);
63990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        return VPX_CODEC_OK;
64090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
64190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
64290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        return VPX_CODEC_INVALID_PARAM;
64390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
64490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
64590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return VPX_CODEC_INCAPABLE;
64690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
64790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
64890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
64990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
65090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervpx_codec_ctrl_fn_map_t vp8_ctf_maps[] =
65190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
65290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {VP8_SET_REFERENCE,  vp8_set_reference},
65390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {VP8_COPY_REFERENCE, vp8_get_reference},
65490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {VP8_SET_POSTPROC,   vp8_set_postproc},
65590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    { -1, NULL},
65690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
65790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
65890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
65990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifndef VERSION_STRING
66090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VERSION_STRING
66190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
662538f6170b788de7408b06efc6613dc98579aa6a6Andreas HuberCODEC_INTERFACE(vpx_codec_vp8_dx) =
66390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
664f71323e297a928af368937089d3ed71239786f86Andreas Huber    "WebM Project VP8 Decoder" VERSION_STRING,
66590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    VPX_CODEC_INTERNAL_ABI_VERSION,
66690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    VPX_CODEC_CAP_DECODER | VP8_CAP_POSTPROC,
66790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /* vpx_codec_caps_t          caps; */
66890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_init,         /* vpx_codec_init_fn_t       init; */
66990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_destroy,      /* vpx_codec_destroy_fn_t    destroy; */
67090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_ctf_maps,     /* vpx_codec_ctrl_fn_map_t  *ctrl_maps; */
67190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_xma_get_mmap, /* vpx_codec_get_mmap_fn_t   get_mmap; */
67290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_xma_set_mmap, /* vpx_codec_set_mmap_fn_t   set_mmap; */
67390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
67490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8_peek_si,      /* vpx_codec_peek_si_fn_t    peek_si; */
67590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8_get_si,       /* vpx_codec_get_si_fn_t     get_si; */
67690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8_decode,       /* vpx_codec_decode_fn_t     decode; */
67790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8_get_frame,    /* vpx_codec_frame_get_fn_t  frame_get; */
67890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    },
679538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { /* encoder functions */
680538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        NOT_IMPLEMENTED,
681538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        NOT_IMPLEMENTED,
682538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        NOT_IMPLEMENTED,
683538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        NOT_IMPLEMENTED,
684538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        NOT_IMPLEMENTED,
685538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        NOT_IMPLEMENTED
686538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
68790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
68890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
68990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*
69090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * BEGIN BACKWARDS COMPATIBILITY SHIM.
69190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
69290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervpx_codec_iface_t vpx_codec_vp8_algo =
69390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
694f71323e297a928af368937089d3ed71239786f86Andreas Huber    "WebM Project VP8 Decoder (Deprecated API)" VERSION_STRING,
69590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    VPX_CODEC_INTERNAL_ABI_VERSION,
69690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    VPX_CODEC_CAP_DECODER | VP8_CAP_POSTPROC,
69790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /* vpx_codec_caps_t          caps; */
69890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_init,         /* vpx_codec_init_fn_t       init; */
69990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_destroy,      /* vpx_codec_destroy_fn_t    destroy; */
70090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_ctf_maps,     /* vpx_codec_ctrl_fn_map_t  *ctrl_maps; */
70190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_xma_get_mmap, /* vpx_codec_get_mmap_fn_t   get_mmap; */
70290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_xma_set_mmap, /* vpx_codec_set_mmap_fn_t   set_mmap; */
70390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
70490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8_peek_si,      /* vpx_codec_peek_si_fn_t    peek_si; */
70590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8_get_si,       /* vpx_codec_get_si_fn_t     get_si; */
70690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8_decode,       /* vpx_codec_decode_fn_t     decode; */
70790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8_get_frame,    /* vpx_codec_frame_get_fn_t  frame_get; */
70890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    },
709538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { /* encoder functions */
710538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        NOT_IMPLEMENTED,
711538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        NOT_IMPLEMENTED,
712538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        NOT_IMPLEMENTED,
713538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        NOT_IMPLEMENTED,
714538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        NOT_IMPLEMENTED,
715538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        NOT_IMPLEMENTED
716538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
71790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
718