Mercurial > libavcodec.hg
annotate vp5.c @ 6323:e6da66f378c7 libavcodec
mpegvideo.h has two function declarations with the 'inline' specifier
but no definition for those functions. The C standard requires a
definition to appear in the same translation unit for any function
declared with 'inline'. Most of the files including mpegvideo.h do not
define those functions. Fix this by removing the 'inline' specifiers
from the header.
patch by Uoti Urpala
author | diego |
---|---|
date | Sun, 03 Feb 2008 17:54:30 +0000 |
parents | 1b91ce6c758c |
children | 7fa807dd7958 |
rev | line source |
---|---|
3695 | 1 /** |
2 * @file vp5.c | |
3 * VP5 compatible video decoder | |
4 * | |
5 * Copyright (C) 2006 Aurelien Jacobs <aurel@gnuage.org> | |
6 * | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3697
diff
changeset
|
7 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3697
diff
changeset
|
8 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3697
diff
changeset
|
9 * FFmpeg is free software; you can redistribute it and/or |
3695 | 10 * modify it under the terms of the GNU Lesser General Public |
11 * License as published by the Free Software Foundation; either | |
12 * version 2.1 of the License, or (at your option) any later version. | |
13 * | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3697
diff
changeset
|
14 * FFmpeg is distributed in the hope that it will be useful, |
3695 | 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
17 * Lesser General Public License for more details. | |
18 * | |
19 * You should have received a copy of the GNU Lesser General Public | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3697
diff
changeset
|
20 * License along with FFmpeg; if not, write to the Free Software |
5215 | 21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
3695 | 22 */ |
23 | |
24 #include <stdlib.h> | |
25 #include <string.h> | |
26 | |
27 #include "avcodec.h" | |
28 #include "dsputil.h" | |
29 #include "bitstream.h" | |
30 #include "mpegvideo.h" | |
31 | |
32 #include "vp56.h" | |
33 #include "vp56data.h" | |
34 #include "vp5data.h" | |
35 | |
36 | |
6297 | 37 static int vp5_parse_header(vp56_context_t *s, const uint8_t *buf, int buf_size, |
3695 | 38 int *golden_frame) |
39 { | |
40 vp56_range_coder_t *c = &s->c; | |
41 int rows, cols; | |
42 | |
43 vp56_init_range_decoder(&s->c, buf, buf_size); | |
4595 | 44 s->framep[VP56_FRAME_CURRENT]->key_frame = !vp56_rac_get(c); |
3695 | 45 vp56_rac_get(c); |
46 vp56_init_dequant(s, vp56_rac_gets(c, 6)); | |
4595 | 47 if (s->framep[VP56_FRAME_CURRENT]->key_frame) |
3695 | 48 { |
49 vp56_rac_gets(c, 8); | |
50 if(vp56_rac_gets(c, 5) > 5) | |
51 return 0; | |
52 vp56_rac_gets(c, 2); | |
53 if (vp56_rac_get(c)) { | |
54 av_log(s->avctx, AV_LOG_ERROR, "interlacing not supported\n"); | |
55 return 0; | |
56 } | |
57 rows = vp56_rac_gets(c, 8); /* number of stored macroblock rows */ | |
58 cols = vp56_rac_gets(c, 8); /* number of stored macroblock cols */ | |
59 vp56_rac_gets(c, 8); /* number of displayed macroblock rows */ | |
60 vp56_rac_gets(c, 8); /* number of displayed macroblock cols */ | |
61 vp56_rac_gets(c, 2); | |
62 if (16*cols != s->avctx->coded_width || | |
63 16*rows != s->avctx->coded_height) { | |
64 avcodec_set_dimensions(s->avctx, 16*cols, 16*rows); | |
65 return 2; | |
66 } | |
67 } | |
68 return 1; | |
69 } | |
70 | |
71 /* Gives very similar result than the vp6 version except in a few cases */ | |
72 static int vp5_adjust(int v, int t) | |
73 { | |
74 int s2, s1 = v >> 31; | |
75 v ^= s1; | |
76 v -= s1; | |
77 v *= v < 2*t; | |
78 v -= t; | |
79 s2 = v >> 31; | |
80 v ^= s2; | |
81 v -= s2; | |
82 v = t - v; | |
83 v += s1; | |
84 v ^= s1; | |
85 return v; | |
86 } | |
87 | |
3697 | 88 static void vp5_parse_vector_adjustment(vp56_context_t *s, vp56_mv_t *vect) |
3695 | 89 { |
90 vp56_range_coder_t *c = &s->c; | |
5711 | 91 vp56_model_t *model = s->modelp; |
3695 | 92 int comp, di; |
93 | |
94 for (comp=0; comp<2; comp++) { | |
95 int delta = 0; | |
5711 | 96 if (vp56_rac_get_prob(c, model->vector_dct[comp])) { |
97 int sign = vp56_rac_get_prob(c, model->vector_sig[comp]); | |
98 di = vp56_rac_get_prob(c, model->vector_pdi[comp][0]); | |
99 di |= vp56_rac_get_prob(c, model->vector_pdi[comp][1]) << 1; | |
3695 | 100 delta = vp56_rac_get_tree(c, vp56_pva_tree, |
5711 | 101 model->vector_pdv[comp]); |
3695 | 102 delta = di | (delta << 2); |
103 delta = (delta ^ -sign) + sign; | |
104 } | |
105 if (!comp) | |
3697 | 106 vect->x = delta; |
3695 | 107 else |
3697 | 108 vect->y = delta; |
3695 | 109 } |
110 } | |
111 | |
112 static void vp5_parse_vector_models(vp56_context_t *s) | |
113 { | |
114 vp56_range_coder_t *c = &s->c; | |
5711 | 115 vp56_model_t *model = s->modelp; |
3695 | 116 int comp, node; |
117 | |
118 for (comp=0; comp<2; comp++) { | |
119 if (vp56_rac_get_prob(c, vp5_vmc_pct[comp][0])) | |
5711 | 120 model->vector_dct[comp] = vp56_rac_gets_nn(c, 7); |
3695 | 121 if (vp56_rac_get_prob(c, vp5_vmc_pct[comp][1])) |
5711 | 122 model->vector_sig[comp] = vp56_rac_gets_nn(c, 7); |
3695 | 123 if (vp56_rac_get_prob(c, vp5_vmc_pct[comp][2])) |
5711 | 124 model->vector_pdi[comp][0] = vp56_rac_gets_nn(c, 7); |
3695 | 125 if (vp56_rac_get_prob(c, vp5_vmc_pct[comp][3])) |
5711 | 126 model->vector_pdi[comp][1] = vp56_rac_gets_nn(c, 7); |
3695 | 127 } |
128 | |
129 for (comp=0; comp<2; comp++) | |
130 for (node=0; node<7; node++) | |
131 if (vp56_rac_get_prob(c, vp5_vmc_pct[comp][4 + node])) | |
5711 | 132 model->vector_pdv[comp][node] = vp56_rac_gets_nn(c, 7); |
3695 | 133 } |
134 | |
135 static void vp5_parse_coeff_models(vp56_context_t *s) | |
136 { | |
137 vp56_range_coder_t *c = &s->c; | |
5711 | 138 vp56_model_t *model = s->modelp; |
3695 | 139 uint8_t def_prob[11]; |
140 int node, cg, ctx; | |
141 int ct; /* code type */ | |
142 int pt; /* plane type (0 for Y, 1 for U or V) */ | |
143 | |
144 memset(def_prob, 0x80, sizeof(def_prob)); | |
145 | |
146 for (pt=0; pt<2; pt++) | |
147 for (node=0; node<11; node++) | |
148 if (vp56_rac_get_prob(c, vp5_dccv_pct[pt][node])) { | |
149 def_prob[node] = vp56_rac_gets_nn(c, 7); | |
5711 | 150 model->coeff_dccv[pt][node] = def_prob[node]; |
4595 | 151 } else if (s->framep[VP56_FRAME_CURRENT]->key_frame) { |
5711 | 152 model->coeff_dccv[pt][node] = def_prob[node]; |
3695 | 153 } |
154 | |
155 for (ct=0; ct<3; ct++) | |
156 for (pt=0; pt<2; pt++) | |
157 for (cg=0; cg<6; cg++) | |
158 for (node=0; node<11; node++) | |
159 if (vp56_rac_get_prob(c, vp5_ract_pct[ct][pt][cg][node])) { | |
160 def_prob[node] = vp56_rac_gets_nn(c, 7); | |
5711 | 161 model->coeff_ract[pt][ct][cg][node] = def_prob[node]; |
4595 | 162 } else if (s->framep[VP56_FRAME_CURRENT]->key_frame) { |
5711 | 163 model->coeff_ract[pt][ct][cg][node] = def_prob[node]; |
3695 | 164 } |
165 | |
5711 | 166 /* coeff_dcct is a linear combination of coeff_dccv */ |
3695 | 167 for (pt=0; pt<2; pt++) |
168 for (ctx=0; ctx<36; ctx++) | |
169 for (node=0; node<5; node++) | |
5711 | 170 model->coeff_dcct[pt][ctx][node] = av_clip(((model->coeff_dccv[pt][node] * vp5_dccv_lc[node][ctx][0] + 128) >> 8) + vp5_dccv_lc[node][ctx][1], 1, 254); |
3695 | 171 |
5711 | 172 /* coeff_acct is a linear combination of coeff_ract */ |
3695 | 173 for (ct=0; ct<3; ct++) |
174 for (pt=0; pt<2; pt++) | |
175 for (cg=0; cg<3; cg++) | |
176 for (ctx=0; ctx<6; ctx++) | |
177 for (node=0; node<5; node++) | |
5711 | 178 model->coeff_acct[pt][ct][cg][ctx][node] = av_clip(((model->coeff_ract[pt][ct][cg][node] * vp5_ract_lc[ct][cg][node][ctx][0] + 128) >> 8) + vp5_ract_lc[ct][cg][node][ctx][1], 1, 254); |
3695 | 179 } |
180 | |
181 static void vp5_parse_coeff(vp56_context_t *s) | |
182 { | |
183 vp56_range_coder_t *c = &s->c; | |
5711 | 184 vp56_model_t *model = s->modelp; |
3695 | 185 uint8_t *permute = s->scantable.permutated; |
5711 | 186 uint8_t *model1, *model2; |
3695 | 187 int coeff, sign, coeff_idx; |
188 int b, i, cg, idx, ctx, ctx_last; | |
189 int pt = 0; /* plane type (0 for Y, 1 for U or V) */ | |
190 | |
191 for (b=0; b<6; b++) { | |
192 int ct = 1; /* code type */ | |
193 | |
194 if (b > 3) pt = 1; | |
195 | |
196 ctx = 6*s->coeff_ctx[vp56_b6to4[b]][0] | |
197 + s->above_blocks[s->above_block_idx[b]].not_null_dc; | |
5711 | 198 model1 = model->coeff_dccv[pt]; |
199 model2 = model->coeff_dcct[pt][ctx]; | |
3695 | 200 |
201 for (coeff_idx=0; coeff_idx<64; ) { | |
202 if (vp56_rac_get_prob(c, model2[0])) { | |
203 if (vp56_rac_get_prob(c, model2[2])) { | |
204 if (vp56_rac_get_prob(c, model2[3])) { | |
205 s->coeff_ctx[vp56_b6to4[b]][coeff_idx] = 4; | |
5711 | 206 idx = vp56_rac_get_tree(c, vp56_pc_tree, model1); |
3695 | 207 sign = vp56_rac_get(c); |
5821 | 208 coeff = vp56_coeff_bias[idx+5]; |
3695 | 209 for (i=vp56_coeff_bit_length[idx]; i>=0; i--) |
210 coeff += vp56_rac_get_prob(c, vp56_coeff_parse_table[idx][i]) << i; | |
211 } else { | |
212 if (vp56_rac_get_prob(c, model2[4])) { | |
5711 | 213 coeff = 3 + vp56_rac_get_prob(c, model1[5]); |
3695 | 214 s->coeff_ctx[vp56_b6to4[b]][coeff_idx] = 3; |
215 } else { | |
216 coeff = 2; | |
217 s->coeff_ctx[vp56_b6to4[b]][coeff_idx] = 2; | |
218 } | |
219 sign = vp56_rac_get(c); | |
220 } | |
221 ct = 2; | |
222 } else { | |
223 ct = 1; | |
224 s->coeff_ctx[vp56_b6to4[b]][coeff_idx] = 1; | |
225 sign = vp56_rac_get(c); | |
226 coeff = 1; | |
227 } | |
228 coeff = (coeff ^ -sign) + sign; | |
229 if (coeff_idx) | |
230 coeff *= s->dequant_ac; | |
231 s->block_coeff[b][permute[coeff_idx]] = coeff; | |
232 } else { | |
233 if (ct && !vp56_rac_get_prob(c, model2[1])) | |
234 break; | |
235 ct = 0; | |
236 s->coeff_ctx[vp56_b6to4[b]][coeff_idx] = 0; | |
237 } | |
238 | |
239 cg = vp5_coeff_groups[++coeff_idx]; | |
240 ctx = s->coeff_ctx[vp56_b6to4[b]][coeff_idx]; | |
5711 | 241 model1 = model->coeff_ract[pt][ct][cg]; |
242 model2 = cg > 2 ? model1 : model->coeff_acct[pt][ct][cg][ctx]; | |
3695 | 243 } |
244 | |
245 ctx_last = FFMIN(s->coeff_ctx_last[vp56_b6to4[b]], 24); | |
246 s->coeff_ctx_last[vp56_b6to4[b]] = coeff_idx; | |
247 if (coeff_idx < ctx_last) | |
248 for (i=coeff_idx; i<=ctx_last; i++) | |
249 s->coeff_ctx[vp56_b6to4[b]][i] = 5; | |
250 s->above_blocks[s->above_block_idx[b]].not_null_dc = s->coeff_ctx[vp56_b6to4[b]][0]; | |
251 } | |
252 } | |
253 | |
254 static void vp5_default_models_init(vp56_context_t *s) | |
255 { | |
5711 | 256 vp56_model_t *model = s->modelp; |
3695 | 257 int i; |
258 | |
259 for (i=0; i<2; i++) { | |
5711 | 260 model->vector_sig[i] = 0x80; |
261 model->vector_dct[i] = 0x80; | |
262 model->vector_pdi[i][0] = 0x55; | |
263 model->vector_pdi[i][1] = 0x80; | |
3695 | 264 } |
5711 | 265 memcpy(model->mb_types_stats, vp56_def_mb_types_stats, sizeof(model->mb_types_stats)); |
266 memset(model->vector_pdv, 0x80, sizeof(model->vector_pdv)); | |
3695 | 267 } |
268 | |
269 static int vp5_decode_init(AVCodecContext *avctx) | |
270 { | |
271 vp56_context_t *s = avctx->priv_data; | |
272 | |
5714
314be1cfdcb0
add a new vp6a codec (add alpha plan support to vp6)
aurel
parents:
5711
diff
changeset
|
273 vp56_init(avctx, 1, 0); |
3695 | 274 s->vp56_coord_div = vp5_coord_div; |
275 s->parse_vector_adjustment = vp5_parse_vector_adjustment; | |
276 s->adjust = vp5_adjust; | |
277 s->parse_coeff = vp5_parse_coeff; | |
278 s->default_models_init = vp5_default_models_init; | |
279 s->parse_vector_models = vp5_parse_vector_models; | |
280 s->parse_coeff_models = vp5_parse_coeff_models; | |
281 s->parse_header = vp5_parse_header; | |
282 | |
283 return 0; | |
284 } | |
285 | |
286 AVCodec vp5_decoder = { | |
287 "vp5", | |
288 CODEC_TYPE_VIDEO, | |
289 CODEC_ID_VP5, | |
290 sizeof(vp56_context_t), | |
291 vp5_decode_init, | |
292 NULL, | |
293 vp56_free, | |
294 vp56_decode_frame, | |
4910 | 295 CODEC_CAP_DR1, |
3695 | 296 }; |