190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* 2f71323e297a928af368937089d3ed71239786f86Andreas Huber * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 4f71323e297a928af368937089d3ed71239786f86Andreas Huber * Use of this source code is governed by a BSD-style license 5f71323e297a928af368937089d3ed71239786f86Andreas Huber * that can be found in the LICENSE file in the root of the source 6f71323e297a928af368937089d3ed71239786f86Andreas Huber * tree. An additional intellectual property rights grant can be found 7f71323e297a928af368937089d3ed71239786f86Andreas Huber * in the file PATENTS. All contributing project authors may 8f71323e297a928af368937089d3ed71239786f86Andreas Huber * be found in the AUTHORS file in the root of the source tree. 990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1279f15823c34ae1e423108295e416213200bb280fAndreas Huber/*!\file 1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \brief Provides the high level interface to wrap decoder algorithms. 1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 16f71323e297a928af368937089d3ed71239786f86Andreas Huber#include <stdarg.h> 17f71323e297a928af368937089d3ed71239786f86Andreas Huber#include "vpx/vpx_integer.h" 18f71323e297a928af368937089d3ed71239786f86Andreas Huber#include "vpx/internal/vpx_codec_internal.h" 1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_version.h" 2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define SAVE_STATUS(ctx,var) (ctx?(ctx->err = var):var) 2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberint vpx_codec_version(void) 2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return VERSION_PACKED; 2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberconst char *vpx_codec_version_str(void) 3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return VERSION_STRING_NOSP; 3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberconst char *vpx_codec_version_extra_str(void) 3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return VERSION_EXTRA; 3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberconst char *vpx_codec_iface_name(vpx_codec_iface_t *iface) 4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return iface ? iface->name : "<invalid interface>"; 4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberconst char *vpx_codec_err_to_string(vpx_codec_err_t err) 4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber switch (err) 4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case VPX_CODEC_OK: 5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return "Success"; 5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case VPX_CODEC_ERROR: 5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return "Unspecified internal error"; 5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case VPX_CODEC_MEM_ERROR: 5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return "Memory allocation error"; 5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case VPX_CODEC_ABI_MISMATCH: 5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return "ABI version mismatch"; 5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case VPX_CODEC_INCAPABLE: 5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return "Codec does not implement requested capability"; 6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case VPX_CODEC_UNSUP_BITSTREAM: 6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return "Bitstream not supported by this decoder"; 6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case VPX_CODEC_UNSUP_FEATURE: 6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return "Bitstream required feature not supported by this decoder"; 6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case VPX_CODEC_CORRUPT_FRAME: 6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return "Corrupt frame detected"; 6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case VPX_CODEC_INVALID_PARAM: 6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return "Invalid parameter"; 6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case VPX_CODEC_LIST_END: 6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return "End of iterated list"; 7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return "Unrecognized error code"; 7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberconst char *vpx_codec_error(vpx_codec_ctx_t *ctx) 7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return (ctx) ? vpx_codec_err_to_string(ctx->err) 7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber : vpx_codec_err_to_string(VPX_CODEC_INVALID_PARAM); 7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberconst char *vpx_codec_error_detail(vpx_codec_ctx_t *ctx) 8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (ctx && ctx->err) 8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return ctx->priv ? ctx->priv->err_detail : ctx->err_detail; 8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return NULL; 8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervpx_codec_err_t vpx_codec_destroy(vpx_codec_ctx_t *ctx) 9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_err_t res; 9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!ctx) 9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = VPX_CODEC_INVALID_PARAM; 9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else if (!ctx->iface || !ctx->priv) 9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = VPX_CODEC_ERROR; 9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else 9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (ctx->priv->alg_priv) 10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->iface->destroy(ctx->priv->alg_priv); 10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->iface = NULL; 10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->name = NULL; 10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->priv = NULL; 10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = VPX_CODEC_OK; 10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return SAVE_STATUS(ctx, res); 11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervpx_codec_caps_t vpx_codec_get_caps(vpx_codec_iface_t *iface) 11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return (iface) ? iface->caps : 0; 11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervpx_codec_err_t vpx_codec_control_(vpx_codec_ctx_t *ctx, 12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int ctrl_id, 12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ...) 12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_err_t res; 12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!ctx || !ctrl_id) 12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = VPX_CODEC_INVALID_PARAM; 12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else if (!ctx->iface || !ctx->priv || !ctx->iface->ctrl_maps) 12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = VPX_CODEC_ERROR; 12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else 13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_ctrl_fn_map_t *entry; 13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = VPX_CODEC_ERROR; 13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (entry = ctx->iface->ctrl_maps; entry && entry->fn; entry++) 13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!entry->ctrl_id || entry->ctrl_id == ctrl_id) 13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber va_list ap; 14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber va_start(ap, ctrl_id); 14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = entry->fn(ctx->priv->alg_priv, ctrl_id, ap); 14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber va_end(ap); 14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return SAVE_STATUS(ctx, res); 15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 151