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 <stdlib.h> 17 #include <string.h> 18 #include "vpx/vpx_decoder.h" 19 #include "vpx/internal/vpx_codec_internal.h" 20 21 #define SAVE_STATUS(ctx,var) (ctx?(ctx->err = var):var) 22 23 const char *vpx_dec_iface_name(vpx_dec_iface_t *iface) 24 { 25 return vpx_codec_iface_name((vpx_codec_iface_t *)iface); 26 } 27 28 const char *vpx_dec_err_to_string(vpx_dec_err_t err) 29 { 30 return vpx_codec_err_to_string(err); 31 } 32 33 const char *vpx_dec_error(vpx_dec_ctx_t *ctx) 34 { 35 return vpx_codec_error((vpx_codec_ctx_t *)ctx); 36 } 37 38 const char *vpx_dec_error_detail(vpx_dec_ctx_t *ctx) 39 { 40 return vpx_codec_error_detail((vpx_codec_ctx_t *)ctx); 41 } 42 43 44 vpx_dec_err_t vpx_dec_init_ver(vpx_dec_ctx_t *ctx, 45 vpx_dec_iface_t *iface, 46 int ver) 47 { 48 return vpx_codec_dec_init_ver((vpx_codec_ctx_t *)ctx, 49 (vpx_codec_iface_t *)iface, 50 NULL, 51 0, 52 ver); 53 } 54 55 56 vpx_dec_err_t vpx_dec_destroy(vpx_dec_ctx_t *ctx) 57 { 58 return vpx_codec_destroy((vpx_codec_ctx_t *)ctx); 59 } 60 61 62 vpx_dec_caps_t vpx_dec_get_caps(vpx_dec_iface_t *iface) 63 { 64 return vpx_codec_get_caps((vpx_codec_iface_t *)iface); 65 } 66 67 68 vpx_dec_err_t vpx_dec_peek_stream_info(vpx_dec_iface_t *iface, 69 const uint8_t *data, 70 unsigned int data_sz, 71 vpx_dec_stream_info_t *si) 72 { 73 return vpx_codec_peek_stream_info((vpx_codec_iface_t *)iface, data, data_sz, 74 (vpx_codec_stream_info_t *)si); 75 } 76 77 78 vpx_dec_err_t vpx_dec_get_stream_info(vpx_dec_ctx_t *ctx, 79 vpx_dec_stream_info_t *si) 80 { 81 return vpx_codec_get_stream_info((vpx_codec_ctx_t *)ctx, 82 (vpx_codec_stream_info_t *)si); 83 } 84 85 86 vpx_dec_err_t vpx_dec_control(vpx_dec_ctx_t *ctx, 87 int ctrl_id, 88 void *data) 89 { 90 return vpx_codec_control_((vpx_codec_ctx_t *)ctx, ctrl_id, data); 91 } 92 93 94 vpx_dec_err_t vpx_dec_decode(vpx_dec_ctx_t *ctx, 95 uint8_t *data, 96 unsigned int data_sz, 97 void *user_priv, 98 int rel_pts) 99 { 100 (void)rel_pts; 101 return vpx_codec_decode((vpx_codec_ctx_t *)ctx, data, data_sz, user_priv, 102 0); 103 } 104 105 vpx_image_t *vpx_dec_get_frame(vpx_dec_ctx_t *ctx, 106 vpx_dec_iter_t *iter) 107 { 108 return vpx_codec_get_frame((vpx_codec_ctx_t *)ctx, iter); 109 } 110 111 112 vpx_dec_err_t vpx_dec_register_put_frame_cb(vpx_dec_ctx_t *ctx, 113 vpx_dec_put_frame_cb_fn_t cb, 114 void *user_priv) 115 { 116 return vpx_codec_register_put_frame_cb((vpx_codec_ctx_t *)ctx, cb, 117 user_priv); 118 } 119 120 121 vpx_dec_err_t vpx_dec_register_put_slice_cb(vpx_dec_ctx_t *ctx, 122 vpx_dec_put_slice_cb_fn_t cb, 123 void *user_priv) 124 { 125 return vpx_codec_register_put_slice_cb((vpx_codec_ctx_t *)ctx, cb, 126 user_priv); 127 } 128 129 130 vpx_dec_err_t vpx_dec_xma_init_ver(vpx_dec_ctx_t *ctx, 131 vpx_dec_iface_t *iface, 132 int ver) 133 { 134 return vpx_codec_dec_init_ver((vpx_codec_ctx_t *)ctx, 135 (vpx_codec_iface_t *)iface, 136 NULL, 137 VPX_CODEC_USE_XMA, 138 ver); 139 } 140 141 vpx_dec_err_t vpx_dec_get_mem_map(vpx_dec_ctx_t *ctx_, 142 vpx_dec_mmap_t *mmap, 143 const vpx_dec_stream_info_t *si, 144 vpx_dec_iter_t *iter) 145 { 146 vpx_codec_ctx_t *ctx = (vpx_codec_ctx_t *)ctx_; 147 vpx_dec_err_t res = VPX_DEC_OK; 148 149 if (!ctx || !mmap || !si || !iter || !ctx->iface) 150 res = VPX_DEC_INVALID_PARAM; 151 else if (!(ctx->iface->caps & VPX_DEC_CAP_XMA)) 152 res = VPX_DEC_ERROR; 153 else 154 { 155 if (!ctx->config.dec) 156 { 157 ctx->config.dec = malloc(sizeof(vpx_codec_dec_cfg_t)); 158 ctx->config.dec->w = si->w; 159 ctx->config.dec->h = si->h; 160 } 161 162 res = ctx->iface->get_mmap(ctx, mmap, iter); 163 } 164 165 return SAVE_STATUS(ctx, res); 166 } 167 168 169 vpx_dec_err_t vpx_dec_set_mem_map(vpx_dec_ctx_t *ctx_, 170 vpx_dec_mmap_t *mmap, 171 unsigned int num_maps) 172 { 173 vpx_codec_ctx_t *ctx = (vpx_codec_ctx_t *)ctx_; 174 vpx_dec_err_t res = VPX_DEC_MEM_ERROR; 175 176 if (!ctx || !mmap || !ctx->iface) 177 res = VPX_DEC_INVALID_PARAM; 178 else if (!(ctx->iface->caps & VPX_DEC_CAP_XMA)) 179 res = VPX_DEC_ERROR; 180 else 181 { 182 void *save = (ctx->priv) ? NULL : ctx->config.dec; 183 unsigned int i; 184 185 for (i = 0; i < num_maps; i++, mmap++) 186 { 187 if (!mmap->base) 188 break; 189 190 /* Everything look ok, set the mmap in the decoder */ 191 res = ctx->iface->set_mmap(ctx, mmap); 192 193 if (res) 194 break; 195 } 196 197 if (save) free(save); 198 } 199 200 return SAVE_STATUS(ctx, res); 201 } 202