Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(177)

Side by Side Diff: source/libvpx/vpx/src/vpx_decoder.c

Issue 11555023: libvpx: Add VP9 decoder. (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 11
12 /*!\file 12 /*!\file
13 * \brief Provides the high level interface to wrap decoder algorithms. 13 * \brief Provides the high level interface to wrap decoder algorithms.
14 * 14 *
15 */ 15 */
16 #include <string.h> 16 #include <string.h>
17 #include "vpx/internal/vpx_codec_internal.h" 17 #include "vpx/internal/vpx_codec_internal.h"
18 18
19 #define SAVE_STATUS(ctx,var) (ctx?(ctx->err = var):var) 19 #define SAVE_STATUS(ctx,var) (ctx?(ctx->err = var):var)
20 20
21 vpx_codec_err_t vpx_codec_dec_init_ver(vpx_codec_ctx_t *ctx, 21 vpx_codec_err_t vpx_codec_dec_init_ver(vpx_codec_ctx_t *ctx,
22 vpx_codec_iface_t *iface, 22 vpx_codec_iface_t *iface,
23 vpx_codec_dec_cfg_t *cfg, 23 vpx_codec_dec_cfg_t *cfg,
24 vpx_codec_flags_t flags, 24 vpx_codec_flags_t flags,
25 int ver) 25 int ver) {
26 { 26 vpx_codec_err_t res;
27 vpx_codec_err_t res;
28 27
29 if (ver != VPX_DECODER_ABI_VERSION) 28 if (ver != VPX_DECODER_ABI_VERSION)
30 res = VPX_CODEC_ABI_MISMATCH; 29 res = VPX_CODEC_ABI_MISMATCH;
31 else if (!ctx || !iface) 30 else if (!ctx || !iface)
32 res = VPX_CODEC_INVALID_PARAM; 31 res = VPX_CODEC_INVALID_PARAM;
33 else if (iface->abi_version != VPX_CODEC_INTERNAL_ABI_VERSION) 32 else if (iface->abi_version != VPX_CODEC_INTERNAL_ABI_VERSION)
34 res = VPX_CODEC_ABI_MISMATCH; 33 res = VPX_CODEC_ABI_MISMATCH;
35 else if ((flags & VPX_CODEC_USE_XMA) && !(iface->caps & VPX_CODEC_CAP_XMA)) 34 else if ((flags & VPX_CODEC_USE_XMA) && !(iface->caps & VPX_CODEC_CAP_XMA))
36 res = VPX_CODEC_INCAPABLE; 35 res = VPX_CODEC_INCAPABLE;
37 else if ((flags & VPX_CODEC_USE_POSTPROC) && !(iface->caps & VPX_CODEC_CAP_P OSTPROC)) 36 else if ((flags & VPX_CODEC_USE_POSTPROC) && !(iface->caps & VPX_CODEC_CAP_POS TPROC))
38 res = VPX_CODEC_INCAPABLE; 37 res = VPX_CODEC_INCAPABLE;
39 else if ((flags & VPX_CODEC_USE_ERROR_CONCEALMENT) && 38 else if ((flags & VPX_CODEC_USE_ERROR_CONCEALMENT) &&
40 !(iface->caps & VPX_CODEC_CAP_ERROR_CONCEALMENT)) 39 !(iface->caps & VPX_CODEC_CAP_ERROR_CONCEALMENT))
41 res = VPX_CODEC_INCAPABLE; 40 res = VPX_CODEC_INCAPABLE;
42 else if ((flags & VPX_CODEC_USE_INPUT_FRAGMENTS) && 41 else if ((flags & VPX_CODEC_USE_INPUT_FRAGMENTS) &&
43 !(iface->caps & VPX_CODEC_CAP_INPUT_FRAGMENTS)) 42 !(iface->caps & VPX_CODEC_CAP_INPUT_FRAGMENTS))
44 res = VPX_CODEC_INCAPABLE; 43 res = VPX_CODEC_INCAPABLE;
45 else if (!(iface->caps & VPX_CODEC_CAP_DECODER)) 44 else if (!(iface->caps & VPX_CODEC_CAP_DECODER))
46 res = VPX_CODEC_INCAPABLE; 45 res = VPX_CODEC_INCAPABLE;
47 else 46 else {
48 { 47 memset(ctx, 0, sizeof(*ctx));
49 memset(ctx, 0, sizeof(*ctx)); 48 ctx->iface = iface;
50 ctx->iface = iface; 49 ctx->name = iface->name;
51 ctx->name = iface->name; 50 ctx->priv = NULL;
52 ctx->priv = NULL; 51 ctx->init_flags = flags;
53 ctx->init_flags = flags; 52 ctx->config.dec = cfg;
54 ctx->config.dec = cfg; 53 res = VPX_CODEC_OK;
55 res = VPX_CODEC_OK;
56 54
57 if (!(flags & VPX_CODEC_USE_XMA)) 55 if (!(flags & VPX_CODEC_USE_XMA)) {
58 { 56 res = ctx->iface->init(ctx, NULL);
59 res = ctx->iface->init(ctx, NULL);
60 57
61 if (res) 58 if (res) {
62 { 59 ctx->err_detail = ctx->priv ? ctx->priv->err_detail : NULL;
63 ctx->err_detail = ctx->priv ? ctx->priv->err_detail : NULL; 60 vpx_codec_destroy(ctx);
64 vpx_codec_destroy(ctx); 61 }
65 }
66 62
67 if (ctx->priv) 63 if (ctx->priv)
68 ctx->priv->iface = ctx->iface; 64 ctx->priv->iface = ctx->iface;
69 }
70 } 65 }
66 }
71 67
72 return SAVE_STATUS(ctx, res); 68 return SAVE_STATUS(ctx, res);
73 } 69 }
74 70
75 71
76 vpx_codec_err_t vpx_codec_peek_stream_info(vpx_codec_iface_t *iface, 72 vpx_codec_err_t vpx_codec_peek_stream_info(vpx_codec_iface_t *iface,
77 const uint8_t *data, 73 const uint8_t *data,
78 unsigned int data_sz, 74 unsigned int data_sz,
79 vpx_codec_stream_info_t *si) 75 vpx_codec_stream_info_t *si) {
80 { 76 vpx_codec_err_t res;
81 vpx_codec_err_t res;
82 77
83 if (!iface || !data || !data_sz || !si 78 if (!iface || !data || !data_sz || !si
84 || si->sz < sizeof(vpx_codec_stream_info_t)) 79 || si->sz < sizeof(vpx_codec_stream_info_t))
85 res = VPX_CODEC_INVALID_PARAM; 80 res = VPX_CODEC_INVALID_PARAM;
86 else 81 else {
87 { 82 /* Set default/unknown values */
88 /* Set default/unknown values */ 83 si->w = 0;
89 si->w = 0; 84 si->h = 0;
90 si->h = 0;
91 85
92 res = iface->dec.peek_si(data, data_sz, si); 86 res = iface->dec.peek_si(data, data_sz, si);
93 } 87 }
94 88
95 return res; 89 return res;
96 } 90 }
97 91
98 92
99 vpx_codec_err_t vpx_codec_get_stream_info(vpx_codec_ctx_t *ctx, 93 vpx_codec_err_t vpx_codec_get_stream_info(vpx_codec_ctx_t *ctx,
100 vpx_codec_stream_info_t *si) 94 vpx_codec_stream_info_t *si) {
101 { 95 vpx_codec_err_t res;
102 vpx_codec_err_t res;
103 96
104 if (!ctx || !si || si->sz < sizeof(vpx_codec_stream_info_t)) 97 if (!ctx || !si || si->sz < sizeof(vpx_codec_stream_info_t))
105 res = VPX_CODEC_INVALID_PARAM; 98 res = VPX_CODEC_INVALID_PARAM;
106 else if (!ctx->iface || !ctx->priv) 99 else if (!ctx->iface || !ctx->priv)
107 res = VPX_CODEC_ERROR; 100 res = VPX_CODEC_ERROR;
108 else 101 else {
109 { 102 /* Set default/unknown values */
110 /* Set default/unknown values */ 103 si->w = 0;
111 si->w = 0; 104 si->h = 0;
112 si->h = 0;
113 105
114 res = ctx->iface->dec.get_si(ctx->priv->alg_priv, si); 106 res = ctx->iface->dec.get_si(ctx->priv->alg_priv, si);
115 } 107 }
116 108
117 return SAVE_STATUS(ctx, res); 109 return SAVE_STATUS(ctx, res);
118 } 110 }
119 111
120 112
121 vpx_codec_err_t vpx_codec_decode(vpx_codec_ctx_t *ctx, 113 vpx_codec_err_t vpx_codec_decode(vpx_codec_ctx_t *ctx,
122 const uint8_t *data, 114 const uint8_t *data,
123 unsigned int data_sz, 115 unsigned int data_sz,
124 void *user_priv, 116 void *user_priv,
125 long deadline) 117 long deadline) {
126 { 118 vpx_codec_err_t res;
127 vpx_codec_err_t res;
128 119
129 /* Sanity checks */ 120 /* Sanity checks */
130 /* NULL data ptr allowed if data_sz is 0 too */ 121 /* NULL data ptr allowed if data_sz is 0 too */
131 if (!ctx || (!data && data_sz)) 122 if (!ctx || (!data && data_sz))
132 res = VPX_CODEC_INVALID_PARAM; 123 res = VPX_CODEC_INVALID_PARAM;
133 else if (!ctx->iface || !ctx->priv) 124 else if (!ctx->iface || !ctx->priv)
134 res = VPX_CODEC_ERROR; 125 res = VPX_CODEC_ERROR;
135 else 126 else {
136 { 127 res = ctx->iface->dec.decode(ctx->priv->alg_priv, data, data_sz,
137 res = ctx->iface->dec.decode(ctx->priv->alg_priv, data, data_sz, 128 user_priv, deadline);
138 user_priv, deadline); 129 }
139 }
140 130
141 return SAVE_STATUS(ctx, res); 131 return SAVE_STATUS(ctx, res);
142 } 132 }
143 133
144 vpx_image_t *vpx_codec_get_frame(vpx_codec_ctx_t *ctx, 134 vpx_image_t *vpx_codec_get_frame(vpx_codec_ctx_t *ctx,
145 vpx_codec_iter_t *iter) 135 vpx_codec_iter_t *iter) {
146 { 136 vpx_image_t *img;
147 vpx_image_t *img;
148 137
149 if (!ctx || !iter || !ctx->iface || !ctx->priv) 138 if (!ctx || !iter || !ctx->iface || !ctx->priv)
150 img = NULL; 139 img = NULL;
151 else 140 else
152 img = ctx->iface->dec.get_frame(ctx->priv->alg_priv, iter); 141 img = ctx->iface->dec.get_frame(ctx->priv->alg_priv, iter);
153 142
154 return img; 143 return img;
155 } 144 }
156 145
157 146
158 vpx_codec_err_t vpx_codec_register_put_frame_cb(vpx_codec_ctx_t *ctx , 147 vpx_codec_err_t vpx_codec_register_put_frame_cb(vpx_codec_ctx_t *ctx ,
159 vpx_codec_put_frame_cb_fn_t cb, 148 vpx_codec_put_frame_cb_fn_t cb,
160 void *user_priv) 149 void *user_ priv) {
161 { 150 vpx_codec_err_t res;
162 vpx_codec_err_t res;
163 151
164 if (!ctx || !cb) 152 if (!ctx || !cb)
165 res = VPX_CODEC_INVALID_PARAM; 153 res = VPX_CODEC_INVALID_PARAM;
166 else if (!ctx->iface || !ctx->priv 154 else if (!ctx->iface || !ctx->priv
167 || !(ctx->iface->caps & VPX_CODEC_CAP_PUT_FRAME)) 155 || !(ctx->iface->caps & VPX_CODEC_CAP_PUT_FRAME))
168 res = VPX_CODEC_ERROR; 156 res = VPX_CODEC_ERROR;
169 else 157 else {
170 { 158 ctx->priv->dec.put_frame_cb.u.put_frame = cb;
171 ctx->priv->dec.put_frame_cb.u.put_frame = cb; 159 ctx->priv->dec.put_frame_cb.user_priv = user_priv;
172 ctx->priv->dec.put_frame_cb.user_priv = user_priv; 160 res = VPX_CODEC_OK;
173 res = VPX_CODEC_OK; 161 }
174 }
175 162
176 return SAVE_STATUS(ctx, res); 163 return SAVE_STATUS(ctx, res);
177 } 164 }
178 165
179 166
180 vpx_codec_err_t vpx_codec_register_put_slice_cb(vpx_codec_ctx_t *ctx , 167 vpx_codec_err_t vpx_codec_register_put_slice_cb(vpx_codec_ctx_t *ctx ,
181 vpx_codec_put_slice_cb_fn_t cb, 168 vpx_codec_put_slice_cb_fn_t cb,
182 void *user_priv) 169 void *user_ priv) {
183 { 170 vpx_codec_err_t res;
184 vpx_codec_err_t res;
185 171
186 if (!ctx || !cb) 172 if (!ctx || !cb)
187 res = VPX_CODEC_INVALID_PARAM; 173 res = VPX_CODEC_INVALID_PARAM;
188 else if (!ctx->iface || !ctx->priv 174 else if (!ctx->iface || !ctx->priv
189 || !(ctx->iface->caps & VPX_CODEC_CAP_PUT_FRAME)) 175 || !(ctx->iface->caps & VPX_CODEC_CAP_PUT_FRAME))
190 res = VPX_CODEC_ERROR; 176 res = VPX_CODEC_ERROR;
191 else 177 else {
192 { 178 ctx->priv->dec.put_slice_cb.u.put_slice = cb;
193 ctx->priv->dec.put_slice_cb.u.put_slice = cb; 179 ctx->priv->dec.put_slice_cb.user_priv = user_priv;
194 ctx->priv->dec.put_slice_cb.user_priv = user_priv; 180 res = VPX_CODEC_OK;
195 res = VPX_CODEC_OK; 181 }
196 }
197 182
198 return SAVE_STATUS(ctx, res); 183 return SAVE_STATUS(ctx, res);
199 } 184 }
200 185
201 186
202 vpx_codec_err_t vpx_codec_get_mem_map(vpx_codec_ctx_t *ctx, 187 vpx_codec_err_t vpx_codec_get_mem_map(vpx_codec_ctx_t *ctx,
203 vpx_codec_mmap_t *mmap, 188 vpx_codec_mmap_t *mmap,
204 vpx_codec_iter_t *iter) 189 vpx_codec_iter_t *iter) {
205 { 190 vpx_codec_err_t res = VPX_CODEC_OK;
206 vpx_codec_err_t res = VPX_CODEC_OK;
207 191
208 if (!ctx || !mmap || !iter || !ctx->iface) 192 if (!ctx || !mmap || !iter || !ctx->iface)
209 res = VPX_CODEC_INVALID_PARAM; 193 res = VPX_CODEC_INVALID_PARAM;
210 else if (!(ctx->iface->caps & VPX_CODEC_CAP_XMA)) 194 else if (!(ctx->iface->caps & VPX_CODEC_CAP_XMA))
211 res = VPX_CODEC_ERROR; 195 res = VPX_CODEC_ERROR;
212 else 196 else
213 res = ctx->iface->get_mmap(ctx, mmap, iter); 197 res = ctx->iface->get_mmap(ctx, mmap, iter);
214 198
215 return SAVE_STATUS(ctx, res); 199 return SAVE_STATUS(ctx, res);
216 } 200 }
217 201
218 202
219 vpx_codec_err_t vpx_codec_set_mem_map(vpx_codec_ctx_t *ctx, 203 vpx_codec_err_t vpx_codec_set_mem_map(vpx_codec_ctx_t *ctx,
220 vpx_codec_mmap_t *mmap, 204 vpx_codec_mmap_t *mmap,
221 unsigned int num_maps) 205 unsigned int num_maps) {
222 { 206 vpx_codec_err_t res = VPX_CODEC_MEM_ERROR;
223 vpx_codec_err_t res = VPX_CODEC_MEM_ERROR;
224 207
225 if (!ctx || !mmap || !ctx->iface) 208 if (!ctx || !mmap || !ctx->iface)
226 res = VPX_CODEC_INVALID_PARAM; 209 res = VPX_CODEC_INVALID_PARAM;
227 else if (!(ctx->iface->caps & VPX_CODEC_CAP_XMA)) 210 else if (!(ctx->iface->caps & VPX_CODEC_CAP_XMA))
228 res = VPX_CODEC_ERROR; 211 res = VPX_CODEC_ERROR;
229 else 212 else {
230 { 213 unsigned int i;
231 unsigned int i;
232 214
233 for (i = 0; i < num_maps; i++, mmap++) 215 for (i = 0; i < num_maps; i++, mmap++) {
234 { 216 if (!mmap->base)
235 if (!mmap->base) 217 break;
236 break;
237 218
238 /* Everything look ok, set the mmap in the decoder */ 219 /* Everything look ok, set the mmap in the decoder */
239 res = ctx->iface->set_mmap(ctx, mmap); 220 res = ctx->iface->set_mmap(ctx, mmap);
240 221
241 if (res) 222 if (res)
242 break; 223 break;
243 }
244 } 224 }
225 }
245 226
246 return SAVE_STATUS(ctx, res); 227 return SAVE_STATUS(ctx, res);
247 } 228 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698