annotate vp5.c @ 3990:746a60ba3177 libavcodec

enable CMOV_IS_FAST as its faster or equal speed on every cpu (duron, athlon, PM, P3) from which ive seen benchmarks, it might be slower on P4 but noone has posted benchmarks ...
author michael
date Wed, 11 Oct 2006 12:23:40 +0000
parents c8c591fe26f8
children 6a10cc9adb8a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
1 /**
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
2 * @file vp5.c
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
3 * VP5 compatible video decoder
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
4 *
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
5 * Copyright (C) 2006 Aurelien Jacobs <aurel@gnuage.org>
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
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
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
10 * modify it under the terms of the GNU Lesser General Public
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
11 * License as published by the Free Software Foundation; either
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
12 * version 2.1 of the License, or (at your option) any later version.
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
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
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
17 * Lesser General Public License for more details.
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
18 *
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
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
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
22 */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
23
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
24 #include <stdlib.h>
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
25 #include <string.h>
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
26 #include <inttypes.h>
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
27
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
28 #include "avcodec.h"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
29 #include "dsputil.h"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
30 #include "bitstream.h"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
31 #include "mpegvideo.h"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
32
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
33 #include "vp56.h"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
34 #include "vp56data.h"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
35 #include "vp5data.h"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
36
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
37
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
38 static int vp5_parse_header(vp56_context_t *s, uint8_t *buf, int buf_size,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
39 int *golden_frame)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
40 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
41 vp56_range_coder_t *c = &s->c;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
42 int rows, cols;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
43
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
44 vp56_init_range_decoder(&s->c, buf, buf_size);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
45 s->frames[VP56_FRAME_CURRENT].key_frame = !vp56_rac_get(c);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
46 vp56_rac_get(c);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
47 vp56_init_dequant(s, vp56_rac_gets(c, 6));
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
48 if (s->frames[VP56_FRAME_CURRENT].key_frame)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
49 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
50 vp56_rac_gets(c, 8);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
51 if(vp56_rac_gets(c, 5) > 5)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
52 return 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
53 vp56_rac_gets(c, 2);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
54 if (vp56_rac_get(c)) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
55 av_log(s->avctx, AV_LOG_ERROR, "interlacing not supported\n");
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
56 return 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
57 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
58 rows = vp56_rac_gets(c, 8); /* number of stored macroblock rows */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
59 cols = vp56_rac_gets(c, 8); /* number of stored macroblock cols */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
60 vp56_rac_gets(c, 8); /* number of displayed macroblock rows */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
61 vp56_rac_gets(c, 8); /* number of displayed macroblock cols */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
62 vp56_rac_gets(c, 2);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
63 if (16*cols != s->avctx->coded_width ||
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
64 16*rows != s->avctx->coded_height) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
65 avcodec_set_dimensions(s->avctx, 16*cols, 16*rows);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
66 return 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
67 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
68 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
69 return 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
70 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
71
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
72 /* Gives very similar result than the vp6 version except in a few cases */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
73 static int vp5_adjust(int v, int t)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
74 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
75 int s2, s1 = v >> 31;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
76 v ^= s1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
77 v -= s1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
78 v *= v < 2*t;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
79 v -= t;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
80 s2 = v >> 31;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
81 v ^= s2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
82 v -= s2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
83 v = t - v;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
84 v += s1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
85 v ^= s1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
86 return v;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
87 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
88
3697
596e62da8f29 rename vector to vect to avoid clash with Apple gcc
aurel
parents: 3695
diff changeset
89 static void vp5_parse_vector_adjustment(vp56_context_t *s, vp56_mv_t *vect)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
90 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
91 vp56_range_coder_t *c = &s->c;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
92 int comp, di;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
93
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
94 for (comp=0; comp<2; comp++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
95 int delta = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
96 if (vp56_rac_get_prob(c, s->vector_model_dct[comp])) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
97 int sign = vp56_rac_get_prob(c, s->vector_model_sig[comp]);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
98 di = vp56_rac_get_prob(c, s->vector_model_pdi[comp][0]);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
99 di |= vp56_rac_get_prob(c, s->vector_model_pdi[comp][1]) << 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
100 delta = vp56_rac_get_tree(c, vp56_pva_tree,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
101 s->vector_model_pdv[comp]);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
102 delta = di | (delta << 2);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
103 delta = (delta ^ -sign) + sign;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
104 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
105 if (!comp)
3697
596e62da8f29 rename vector to vect to avoid clash with Apple gcc
aurel
parents: 3695
diff changeset
106 vect->x = delta;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
107 else
3697
596e62da8f29 rename vector to vect to avoid clash with Apple gcc
aurel
parents: 3695
diff changeset
108 vect->y = delta;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
109 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
110 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
111
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
112 static void vp5_parse_vector_models(vp56_context_t *s)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
113 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
114 vp56_range_coder_t *c = &s->c;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
115 int comp, node;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
116
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
117 for (comp=0; comp<2; comp++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
118 if (vp56_rac_get_prob(c, vp5_vmc_pct[comp][0]))
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
119 s->vector_model_dct[comp] = vp56_rac_gets_nn(c, 7);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
120 if (vp56_rac_get_prob(c, vp5_vmc_pct[comp][1]))
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
121 s->vector_model_sig[comp] = vp56_rac_gets_nn(c, 7);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
122 if (vp56_rac_get_prob(c, vp5_vmc_pct[comp][2]))
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
123 s->vector_model_pdi[comp][0] = vp56_rac_gets_nn(c, 7);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
124 if (vp56_rac_get_prob(c, vp5_vmc_pct[comp][3]))
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
125 s->vector_model_pdi[comp][1] = vp56_rac_gets_nn(c, 7);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
126 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
127
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
128 for (comp=0; comp<2; comp++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
129 for (node=0; node<7; node++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
130 if (vp56_rac_get_prob(c, vp5_vmc_pct[comp][4 + node]))
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
131 s->vector_model_pdv[comp][node] = vp56_rac_gets_nn(c, 7);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
132 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
133
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
134 static void vp5_parse_coeff_models(vp56_context_t *s)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
135 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
136 vp56_range_coder_t *c = &s->c;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
137 uint8_t def_prob[11];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
138 int node, cg, ctx;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
139 int ct; /* code type */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
140 int pt; /* plane type (0 for Y, 1 for U or V) */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
141
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
142 memset(def_prob, 0x80, sizeof(def_prob));
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
143
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
144 for (pt=0; pt<2; pt++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
145 for (node=0; node<11; node++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
146 if (vp56_rac_get_prob(c, vp5_dccv_pct[pt][node])) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
147 def_prob[node] = vp56_rac_gets_nn(c, 7);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
148 s->coeff_model_dccv[pt][node] = def_prob[node];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
149 } else if (s->frames[VP56_FRAME_CURRENT].key_frame) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
150 s->coeff_model_dccv[pt][node] = def_prob[node];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
151 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
152
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
153 for (ct=0; ct<3; ct++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
154 for (pt=0; pt<2; pt++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
155 for (cg=0; cg<6; cg++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
156 for (node=0; node<11; node++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
157 if (vp56_rac_get_prob(c, vp5_ract_pct[ct][pt][cg][node])) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
158 def_prob[node] = vp56_rac_gets_nn(c, 7);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
159 s->coeff_model_ract[pt][ct][cg][node] = def_prob[node];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
160 } else if (s->frames[VP56_FRAME_CURRENT].key_frame) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
161 s->coeff_model_ract[pt][ct][cg][node] = def_prob[node];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
162 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
163
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
164 /* coeff_model_dcct is a linear combination of coeff_model_dccv */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
165 for (pt=0; pt<2; pt++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
166 for (ctx=0; ctx<36; ctx++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
167 for (node=0; node<5; node++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
168 s->coeff_model_dcct[pt][ctx][node] = clip(((s->coeff_model_dccv[pt][node] * vp5_dccv_lc[node][ctx][0] + 128) >> 8) + vp5_dccv_lc[node][ctx][1], 1, 254);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
169
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
170 /* coeff_model_acct is a linear combination of coeff_model_ract */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
171 for (ct=0; ct<3; ct++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
172 for (pt=0; pt<2; pt++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
173 for (cg=0; cg<3; cg++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
174 for (ctx=0; ctx<6; ctx++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
175 for (node=0; node<5; node++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
176 s->coeff_model_acct[pt][ct][cg][ctx][node] = clip(((s->coeff_model_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);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
177 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
178
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
179 static void vp5_parse_coeff(vp56_context_t *s)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
180 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
181 vp56_range_coder_t *c = &s->c;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
182 uint8_t *permute = s->scantable.permutated;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
183 uint8_t *model, *model2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
184 int coeff, sign, coeff_idx;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
185 int b, i, cg, idx, ctx, ctx_last;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
186 int pt = 0; /* plane type (0 for Y, 1 for U or V) */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
187
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
188 for (b=0; b<6; b++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
189 int ct = 1; /* code type */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
190
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
191 if (b > 3) pt = 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
192
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
193 ctx = 6*s->coeff_ctx[vp56_b6to4[b]][0]
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
194 + s->above_blocks[s->above_block_idx[b]].not_null_dc;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
195 model = s->coeff_model_dccv[pt];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
196 model2 = s->coeff_model_dcct[pt][ctx];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
197
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
198 for (coeff_idx=0; coeff_idx<64; ) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
199 if (vp56_rac_get_prob(c, model2[0])) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
200 if (vp56_rac_get_prob(c, model2[2])) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
201 if (vp56_rac_get_prob(c, model2[3])) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
202 s->coeff_ctx[vp56_b6to4[b]][coeff_idx] = 4;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
203 idx = vp56_rac_get_tree(c, vp56_pc_tree, model);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
204 sign = vp56_rac_get(c);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
205 coeff = vp56_coeff_bias[idx];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
206 for (i=vp56_coeff_bit_length[idx]; i>=0; i--)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
207 coeff += vp56_rac_get_prob(c, vp56_coeff_parse_table[idx][i]) << i;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
208 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
209 if (vp56_rac_get_prob(c, model2[4])) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
210 coeff = 3 + vp56_rac_get_prob(c, model[5]);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
211 s->coeff_ctx[vp56_b6to4[b]][coeff_idx] = 3;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
212 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
213 coeff = 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
214 s->coeff_ctx[vp56_b6to4[b]][coeff_idx] = 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
215 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
216 sign = vp56_rac_get(c);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
217 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
218 ct = 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
219 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
220 ct = 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
221 s->coeff_ctx[vp56_b6to4[b]][coeff_idx] = 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
222 sign = vp56_rac_get(c);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
223 coeff = 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
224 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
225 coeff = (coeff ^ -sign) + sign;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
226 if (coeff_idx)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
227 coeff *= s->dequant_ac;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
228 s->block_coeff[b][permute[coeff_idx]] = coeff;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
229 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
230 if (ct && !vp56_rac_get_prob(c, model2[1]))
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
231 break;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
232 ct = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
233 s->coeff_ctx[vp56_b6to4[b]][coeff_idx] = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
234 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
235
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
236 cg = vp5_coeff_groups[++coeff_idx];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
237 ctx = s->coeff_ctx[vp56_b6to4[b]][coeff_idx];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
238 model = s->coeff_model_ract[pt][ct][cg];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
239 model2 = cg > 2 ? model : s->coeff_model_acct[pt][ct][cg][ctx];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
240 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
241
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
242 ctx_last = FFMIN(s->coeff_ctx_last[vp56_b6to4[b]], 24);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
243 s->coeff_ctx_last[vp56_b6to4[b]] = coeff_idx;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
244 if (coeff_idx < ctx_last)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
245 for (i=coeff_idx; i<=ctx_last; i++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
246 s->coeff_ctx[vp56_b6to4[b]][i] = 5;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
247 s->above_blocks[s->above_block_idx[b]].not_null_dc = s->coeff_ctx[vp56_b6to4[b]][0];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
248 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
249 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
250
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
251 static void vp5_default_models_init(vp56_context_t *s)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
252 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
253 int i;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
254
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
255 for (i=0; i<2; i++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
256 s->vector_model_sig[i] = 0x80;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
257 s->vector_model_dct[i] = 0x80;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
258 s->vector_model_pdi[i][0] = 0x55;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
259 s->vector_model_pdi[i][1] = 0x80;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
260 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
261 memcpy(s->mb_types_stats, vp56_def_mb_types_stats, sizeof(s->mb_types_stats));
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
262 memset(s->vector_model_pdv, 0x80, sizeof(s->vector_model_pdv));
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
263 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
264
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
265 static int vp5_decode_init(AVCodecContext *avctx)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
266 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
267 vp56_context_t *s = avctx->priv_data;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
268
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
269 vp56_init(s, avctx, 1);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
270 s->vp56_coord_div = vp5_coord_div;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
271 s->parse_vector_adjustment = vp5_parse_vector_adjustment;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
272 s->adjust = vp5_adjust;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
273 s->parse_coeff = vp5_parse_coeff;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
274 s->default_models_init = vp5_default_models_init;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
275 s->parse_vector_models = vp5_parse_vector_models;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
276 s->parse_coeff_models = vp5_parse_coeff_models;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
277 s->parse_header = vp5_parse_header;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
278
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
279 return 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
280 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
281
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
282 AVCodec vp5_decoder = {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
283 "vp5",
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
284 CODEC_TYPE_VIDEO,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
285 CODEC_ID_VP5,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
286 sizeof(vp56_context_t),
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
287 vp5_decode_init,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
288 NULL,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
289 vp56_free,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
290 vp56_decode_frame,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
291 };