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