Home | History | Annotate | Download | only in src
      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 vpx_decoder.c
     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