Home | History | Annotate | Download | only in src
      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 
     23 int vpx_codec_version(void)
     24 {
     25     return VERSION_PACKED;
     26 }
     27 
     28 
     29 const char *vpx_codec_version_str(void)
     30 {
     31     return VERSION_STRING_NOSP;
     32 }
     33 
     34 
     35 const char *vpx_codec_version_extra_str(void)
     36 {
     37     return VERSION_EXTRA;
     38 }
     39 
     40 
     41 const char *vpx_codec_iface_name(vpx_codec_iface_t *iface)
     42 {
     43     return iface ? iface->name : "<invalid interface>";
     44 }
     45 
     46 const 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 
     75 const 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 
     81 const 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 
     90 vpx_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 
    113 vpx_codec_caps_t vpx_codec_get_caps(vpx_codec_iface_t *iface)
    114 {
    115     return (iface) ? iface->caps : 0;
    116 }
    117 
    118 
    119 vpx_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