2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
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.
13 * \brief Provides the high level interface to wrap decoder algorithms.
17 #include "vpx/internal/vpx_codec_internal.h"
19 #define SAVE_STATUS(ctx,var) (ctx?(ctx->err = var):var)
21 vpx_codec_err_t
vpx_codec_dec_init_ver(vpx_codec_ctx_t
*ctx
,
22 vpx_codec_iface_t
*iface
,
23 vpx_codec_dec_cfg_t
*cfg
,
24 vpx_codec_flags_t flags
,
29 if (ver
!= VPX_DECODER_ABI_VERSION
)
30 res
= VPX_CODEC_ABI_MISMATCH
;
31 else if (!ctx
|| !iface
)
32 res
= VPX_CODEC_INVALID_PARAM
;
33 else if (iface
->abi_version
!= VPX_CODEC_INTERNAL_ABI_VERSION
)
34 res
= VPX_CODEC_ABI_MISMATCH
;
35 else if ((flags
& VPX_CODEC_USE_XMA
) && !(iface
->caps
& VPX_CODEC_CAP_XMA
))
36 res
= VPX_CODEC_INCAPABLE
;
37 else if ((flags
& VPX_CODEC_USE_POSTPROC
) && !(iface
->caps
& VPX_CODEC_CAP_POSTPROC
))
38 res
= VPX_CODEC_INCAPABLE
;
39 else if (!(iface
->caps
& VPX_CODEC_CAP_DECODER
))
40 res
= VPX_CODEC_INCAPABLE
;
43 memset(ctx
, 0, sizeof(*ctx
));
45 ctx
->name
= iface
->name
;
47 ctx
->init_flags
= flags
;
48 ctx
->config
.dec
= cfg
;
51 if (!(flags
& VPX_CODEC_USE_XMA
))
53 res
= ctx
->iface
->init(ctx
);
57 ctx
->err_detail
= ctx
->priv
? ctx
->priv
->err_detail
: NULL
;
58 vpx_codec_destroy(ctx
);
62 ctx
->priv
->iface
= ctx
->iface
;
66 return SAVE_STATUS(ctx
, res
);
70 vpx_codec_err_t
vpx_codec_peek_stream_info(vpx_codec_iface_t
*iface
,
73 vpx_codec_stream_info_t
*si
)
77 if (!iface
|| !data
|| !data_sz
|| !si
78 || si
->sz
< sizeof(vpx_codec_stream_info_t
))
79 res
= VPX_CODEC_INVALID_PARAM
;
82 /* Set default/unknown values */
86 res
= iface
->dec
.peek_si(data
, data_sz
, si
);
93 vpx_codec_err_t
vpx_codec_get_stream_info(vpx_codec_ctx_t
*ctx
,
94 vpx_codec_stream_info_t
*si
)
98 if (!ctx
|| !si
|| si
->sz
< sizeof(vpx_codec_stream_info_t
))
99 res
= VPX_CODEC_INVALID_PARAM
;
100 else if (!ctx
->iface
|| !ctx
->priv
)
101 res
= VPX_CODEC_ERROR
;
104 /* Set default/unknown values */
108 res
= ctx
->iface
->dec
.get_si(ctx
->priv
->alg_priv
, si
);
111 return SAVE_STATUS(ctx
, res
);
115 vpx_codec_err_t
vpx_codec_decode(vpx_codec_ctx_t
*ctx
,
117 unsigned int data_sz
,
124 /* NULL data ptr allowed if data_sz is 0 too */
125 if (!ctx
|| (!data
&& data_sz
))
126 res
= VPX_CODEC_INVALID_PARAM
;
127 else if (!ctx
->iface
|| !ctx
->priv
)
128 res
= VPX_CODEC_ERROR
;
131 res
= ctx
->iface
->dec
.decode(ctx
->priv
->alg_priv
, data
, data_sz
,
132 user_priv
, deadline
);
135 return SAVE_STATUS(ctx
, res
);
138 vpx_image_t
*vpx_codec_get_frame(vpx_codec_ctx_t
*ctx
,
139 vpx_codec_iter_t
*iter
)
143 if (!ctx
|| !iter
|| !ctx
->iface
|| !ctx
->priv
)
146 img
= ctx
->iface
->dec
.get_frame(ctx
->priv
->alg_priv
, iter
);
152 vpx_codec_err_t
vpx_codec_register_put_frame_cb(vpx_codec_ctx_t
*ctx
,
153 vpx_codec_put_frame_cb_fn_t cb
,
159 res
= VPX_CODEC_INVALID_PARAM
;
160 else if (!ctx
->iface
|| !ctx
->priv
161 || !(ctx
->iface
->caps
& VPX_CODEC_CAP_PUT_FRAME
))
162 res
= VPX_CODEC_ERROR
;
165 ctx
->priv
->dec
.put_frame_cb
.u
.put_frame
= cb
;
166 ctx
->priv
->dec
.put_frame_cb
.user_priv
= user_priv
;
170 return SAVE_STATUS(ctx
, res
);
174 vpx_codec_err_t
vpx_codec_register_put_slice_cb(vpx_codec_ctx_t
*ctx
,
175 vpx_codec_put_slice_cb_fn_t cb
,
181 res
= VPX_CODEC_INVALID_PARAM
;
182 else if (!ctx
->iface
|| !ctx
->priv
183 || !(ctx
->iface
->caps
& VPX_CODEC_CAP_PUT_FRAME
))
184 res
= VPX_CODEC_ERROR
;
187 ctx
->priv
->dec
.put_slice_cb
.u
.put_slice
= cb
;
188 ctx
->priv
->dec
.put_slice_cb
.user_priv
= user_priv
;
192 return SAVE_STATUS(ctx
, res
);
196 vpx_codec_err_t
vpx_codec_get_mem_map(vpx_codec_ctx_t
*ctx
,
197 vpx_codec_mmap_t
*mmap
,
198 vpx_codec_iter_t
*iter
)
200 vpx_codec_err_t res
= VPX_CODEC_OK
;
202 if (!ctx
|| !mmap
|| !iter
|| !ctx
->iface
)
203 res
= VPX_CODEC_INVALID_PARAM
;
204 else if (!(ctx
->iface
->caps
& VPX_CODEC_CAP_XMA
))
205 res
= VPX_CODEC_ERROR
;
207 res
= ctx
->iface
->get_mmap(ctx
, mmap
, iter
);
209 return SAVE_STATUS(ctx
, res
);
213 vpx_codec_err_t
vpx_codec_set_mem_map(vpx_codec_ctx_t
*ctx
,
214 vpx_codec_mmap_t
*mmap
,
215 unsigned int num_maps
)
217 vpx_codec_err_t res
= VPX_CODEC_MEM_ERROR
;
219 if (!ctx
|| !mmap
|| !ctx
->iface
)
220 res
= VPX_CODEC_INVALID_PARAM
;
221 else if (!(ctx
->iface
->caps
& VPX_CODEC_CAP_XMA
))
222 res
= VPX_CODEC_ERROR
;
227 for (i
= 0; i
< num_maps
; i
++, mmap
++)
232 /* Everything look ok, set the mmap in the decoder */
233 res
= ctx
->iface
->set_mmap(ctx
, mmap
);
240 return SAVE_STATUS(ctx
, res
);