1/* 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 12/*!\file 13 * \brief Provides the high level interface to wrap decoder algorithms. 14 * 15 */ 16#include <stdarg.h> 17#include "vpx/vpx_integer.h" 18#include "vpx/internal/vpx_codec_internal.h" 19#include "vpx_version.h" 20 21#define SAVE_STATUS(ctx,var) (ctx?(ctx->err = var):var) 22 23int vpx_codec_version(void) 24{ 25 return VERSION_PACKED; 26} 27 28 29const char *vpx_codec_version_str(void) 30{ 31 return VERSION_STRING_NOSP; 32} 33 34 35const char *vpx_codec_version_extra_str(void) 36{ 37 return VERSION_EXTRA; 38} 39 40 41const char *vpx_codec_iface_name(vpx_codec_iface_t *iface) 42{ 43 return iface ? iface->name : "<invalid interface>"; 44} 45 46const char *vpx_codec_err_to_string(vpx_codec_err_t err) 47{ 48 switch (err) 49 { 50 case VPX_CODEC_OK: 51 return "Success"; 52 case VPX_CODEC_ERROR: 53 return "Unspecified internal error"; 54 case VPX_CODEC_MEM_ERROR: 55 return "Memory allocation error"; 56 case VPX_CODEC_ABI_MISMATCH: 57 return "ABI version mismatch"; 58 case VPX_CODEC_INCAPABLE: 59 return "Codec does not implement requested capability"; 60 case VPX_CODEC_UNSUP_BITSTREAM: 61 return "Bitstream not supported by this decoder"; 62 case VPX_CODEC_UNSUP_FEATURE: 63 return "Bitstream required feature not supported by this decoder"; 64 case VPX_CODEC_CORRUPT_FRAME: 65 return "Corrupt frame detected"; 66 case VPX_CODEC_INVALID_PARAM: 67 return "Invalid parameter"; 68 case VPX_CODEC_LIST_END: 69 return "End of iterated list"; 70 } 71 72 return "Unrecognized error code"; 73} 74 75const char *vpx_codec_error(vpx_codec_ctx_t *ctx) 76{ 77 return (ctx) ? vpx_codec_err_to_string(ctx->err) 78 : vpx_codec_err_to_string(VPX_CODEC_INVALID_PARAM); 79} 80 81const char *vpx_codec_error_detail(vpx_codec_ctx_t *ctx) 82{ 83 if (ctx && ctx->err) 84 return ctx->priv ? ctx->priv->err_detail : ctx->err_detail; 85 86 return NULL; 87} 88 89 90vpx_codec_err_t vpx_codec_destroy(vpx_codec_ctx_t *ctx) 91{ 92 vpx_codec_err_t res; 93 94 if (!ctx) 95 res = VPX_CODEC_INVALID_PARAM; 96 else if (!ctx->iface || !ctx->priv) 97 res = VPX_CODEC_ERROR; 98 else 99 { 100 if (ctx->priv->alg_priv) 101 ctx->iface->destroy(ctx->priv->alg_priv); 102 103 ctx->iface = NULL; 104 ctx->name = NULL; 105 ctx->priv = NULL; 106 res = VPX_CODEC_OK; 107 } 108 109 return SAVE_STATUS(ctx, res); 110} 111 112 113vpx_codec_caps_t vpx_codec_get_caps(vpx_codec_iface_t *iface) 114{ 115 return (iface) ? iface->caps : 0; 116} 117 118 119vpx_codec_err_t vpx_codec_control_(vpx_codec_ctx_t *ctx, 120 int ctrl_id, 121 ...) 122{ 123 vpx_codec_err_t res; 124 125 if (!ctx || !ctrl_id) 126 res = VPX_CODEC_INVALID_PARAM; 127 else if (!ctx->iface || !ctx->priv || !ctx->iface->ctrl_maps) 128 res = VPX_CODEC_ERROR; 129 else 130 { 131 vpx_codec_ctrl_fn_map_t *entry; 132 133 res = VPX_CODEC_ERROR; 134 135 for (entry = ctx->iface->ctrl_maps; entry && entry->fn; entry++) 136 { 137 if (!entry->ctrl_id || entry->ctrl_id == ctrl_id) 138 { 139 va_list ap; 140 141 va_start(ap, ctrl_id); 142 res = entry->fn(ctx->priv->alg_priv, ctrl_id, ap); 143 va_end(ap); 144 break; 145 } 146 } 147 } 148 149 return SAVE_STATUS(ctx, res); 150} 151