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