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