diff options
Diffstat (limited to 'vpx_codec/src/vpx_decoder_compat.c')
-rw-r--r-- | vpx_codec/src/vpx_decoder_compat.c | 200 |
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); +} |