summaryrefslogtreecommitdiff
path: root/vpx_codec/src/vpx_decoder_compat.c
diff options
context:
space:
mode:
Diffstat (limited to 'vpx_codec/src/vpx_decoder_compat.c')
-rw-r--r--vpx_codec/src/vpx_decoder_compat.c200
1 files changed, 200 insertions, 0 deletions
diff --git a/vpx_codec/src/vpx_decoder_compat.c b/vpx_codec/src/vpx_decoder_compat.c
new file mode 100644
index 000000000..d5b04aec0
--- /dev/null
+++ b/vpx_codec/src/vpx_decoder_compat.c
@@ -0,0 +1,200 @@
+/*
+ * Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license and patent
+ * grant that can be found in the LICENSE file in the root of the source
+ * tree. All contributing project authors may be found in the AUTHORS
+ * file in the root of the source tree.
+ */
+
+
+/*!\file vpx_decoder.c
+ * \brief Provides the high level interface to wrap decoder algorithms.
+ *
+ */
+#include <stdlib.h>
+#include <string.h>
+#include "vpx_codec/vpx_decoder.h"
+#include "vpx_codec/internal/vpx_codec_internal.h"
+
+#define SAVE_STATUS(ctx,var) (ctx?(ctx->err = var):var)
+
+const char *vpx_dec_iface_name(vpx_dec_iface_t *iface)
+{
+ return vpx_codec_iface_name((vpx_codec_iface_t *)iface);
+}
+
+const char *vpx_dec_err_to_string(vpx_dec_err_t err)
+{
+ return vpx_codec_err_to_string(err);
+}
+
+const char *vpx_dec_error(vpx_dec_ctx_t *ctx)
+{
+ return vpx_codec_error((vpx_codec_ctx_t *)ctx);
+}
+
+const char *vpx_dec_error_detail(vpx_dec_ctx_t *ctx)
+{
+ return vpx_codec_error_detail((vpx_codec_ctx_t *)ctx);
+}
+
+
+vpx_dec_err_t vpx_dec_init_ver(vpx_dec_ctx_t *ctx,
+ vpx_dec_iface_t *iface,
+ int ver)
+{
+ return vpx_codec_dec_init_ver((vpx_codec_ctx_t *)ctx,
+ (vpx_codec_iface_t *)iface,
+ NULL,
+ 0,
+ ver);
+}
+
+
+vpx_dec_err_t vpx_dec_destroy(vpx_dec_ctx_t *ctx)
+{
+ return vpx_codec_destroy((vpx_codec_ctx_t *)ctx);
+}
+
+
+vpx_dec_caps_t vpx_dec_get_caps(vpx_dec_iface_t *iface)
+{
+ return vpx_codec_get_caps((vpx_codec_iface_t *)iface);
+}
+
+
+vpx_dec_err_t vpx_dec_peek_stream_info(vpx_dec_iface_t *iface,
+ const uint8_t *data,
+ unsigned int data_sz,
+ vpx_dec_stream_info_t *si)
+{
+ return vpx_codec_peek_stream_info((vpx_codec_iface_t *)iface, data, data_sz,
+ (vpx_codec_stream_info_t *)si);
+}
+
+
+vpx_dec_err_t vpx_dec_get_stream_info(vpx_dec_ctx_t *ctx,
+ vpx_dec_stream_info_t *si)
+{
+ return vpx_codec_get_stream_info((vpx_codec_ctx_t *)ctx,
+ (vpx_codec_stream_info_t *)si);
+}
+
+
+vpx_dec_err_t vpx_dec_control(vpx_dec_ctx_t *ctx,
+ int ctrl_id,
+ void *data)
+{
+ return vpx_codec_control_((vpx_codec_ctx_t *)ctx, ctrl_id, data);
+}
+
+
+vpx_dec_err_t vpx_dec_decode(vpx_dec_ctx_t *ctx,
+ uint8_t *data,
+ unsigned int data_sz,
+ void *user_priv,
+ int rel_pts)
+{
+ (void)rel_pts;
+ return vpx_codec_decode((vpx_codec_ctx_t *)ctx, data, data_sz, user_priv,
+ 0);
+}
+
+vpx_image_t *vpx_dec_get_frame(vpx_dec_ctx_t *ctx,
+ vpx_dec_iter_t *iter)
+{
+ return vpx_codec_get_frame((vpx_codec_ctx_t *)ctx, iter);
+}
+
+
+vpx_dec_err_t vpx_dec_register_put_frame_cb(vpx_dec_ctx_t *ctx,
+ vpx_dec_put_frame_cb_fn_t cb,
+ void *user_priv)
+{
+ return vpx_codec_register_put_frame_cb((vpx_codec_ctx_t *)ctx, cb,
+ user_priv);
+}
+
+
+vpx_dec_err_t vpx_dec_register_put_slice_cb(vpx_dec_ctx_t *ctx,
+ vpx_dec_put_slice_cb_fn_t cb,
+ void *user_priv)
+{
+ return vpx_codec_register_put_slice_cb((vpx_codec_ctx_t *)ctx, cb,
+ user_priv);
+}
+
+
+vpx_dec_err_t vpx_dec_xma_init_ver(vpx_dec_ctx_t *ctx,
+ vpx_dec_iface_t *iface,
+ int ver)
+{
+ return vpx_codec_dec_init_ver((vpx_codec_ctx_t *)ctx,
+ (vpx_codec_iface_t *)iface,
+ NULL,
+ VPX_CODEC_USE_XMA,
+ ver);
+}
+
+vpx_dec_err_t vpx_dec_get_mem_map(vpx_dec_ctx_t *ctx_,
+ vpx_dec_mmap_t *mmap,
+ const vpx_dec_stream_info_t *si,
+ vpx_dec_iter_t *iter)
+{
+ vpx_codec_ctx_t *ctx = (vpx_codec_ctx_t *)ctx_;
+ vpx_dec_err_t res = VPX_DEC_OK;
+
+ if (!ctx || !mmap || !si || !iter || !ctx->iface)
+ res = VPX_DEC_INVALID_PARAM;
+ else if (!(ctx->iface->caps & VPX_DEC_CAP_XMA))
+ res = VPX_DEC_ERROR;
+ else
+ {
+ if (!ctx->config.dec)
+ {
+ ctx->config.dec = malloc(sizeof(vpx_codec_dec_cfg_t));
+ ctx->config.dec->w = si->w;
+ ctx->config.dec->h = si->h;
+ }
+
+ res = ctx->iface->get_mmap(ctx, mmap, iter);
+ }
+
+ return SAVE_STATUS(ctx, res);
+}
+
+
+vpx_dec_err_t vpx_dec_set_mem_map(vpx_dec_ctx_t *ctx_,
+ vpx_dec_mmap_t *mmap,
+ unsigned int num_maps)
+{
+ vpx_codec_ctx_t *ctx = (vpx_codec_ctx_t *)ctx_;
+ vpx_dec_err_t res = VPX_DEC_MEM_ERROR;
+
+ if (!ctx || !mmap || !ctx->iface)
+ res = VPX_DEC_INVALID_PARAM;
+ else if (!(ctx->iface->caps & VPX_DEC_CAP_XMA))
+ res = VPX_DEC_ERROR;
+ else
+ {
+ void *save = (ctx->priv) ? NULL : ctx->config.dec;
+ unsigned int i;
+
+ for (i = 0; i < num_maps; i++, mmap++)
+ {
+ if (!mmap->base)
+ break;
+
+ /* Everything look ok, set the mmap in the decoder */
+ res = ctx->iface->set_mmap(ctx, mmap);
+
+ if (res)
+ break;
+ }
+
+ if (save) free(save);
+ }
+
+ return SAVE_STATUS(ctx, res);
+}