• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
vpx_codec_version(void)23 int vpx_codec_version(void)
24 {
25     return VERSION_PACKED;
26 }
27 
28 
vpx_codec_version_str(void)29 const char *vpx_codec_version_str(void)
30 {
31     return VERSION_STRING_NOSP;
32 }
33 
34 
vpx_codec_version_extra_str(void)35 const char *vpx_codec_version_extra_str(void)
36 {
37     return VERSION_EXTRA;
38 }
39 
40 
vpx_codec_iface_name(vpx_codec_iface_t * iface)41 const char *vpx_codec_iface_name(vpx_codec_iface_t *iface)
42 {
43     return iface ? iface->name : "<invalid interface>";
44 }
45 
vpx_codec_err_to_string(vpx_codec_err_t err)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 
vpx_codec_error(vpx_codec_ctx_t * ctx)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 
vpx_codec_error_detail(vpx_codec_ctx_t * ctx)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 
vpx_codec_destroy(vpx_codec_ctx_t * ctx)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 
vpx_codec_get_caps(vpx_codec_iface_t * iface)113 vpx_codec_caps_t vpx_codec_get_caps(vpx_codec_iface_t *iface)
114 {
115     return (iface) ? iface->caps : 0;
116 }
117 
118 
vpx_codec_control_(vpx_codec_ctx_t * ctx,int ctrl_id,...)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