annotate vp5.c @ 5757:ace63c809071 libavcodec

Remove uses of SIGILL for CPU extension detection, that method is not acceptable in a library. Should not change anything for PPC, the autodetection is currently pointless due to other code being compiled with -maltivec as well (and detection for OSX and AmigaOS remains in place). SPARC binaries built with VIS support can now only run on systems with VIS.
author reimar
date Tue, 02 Oct 2007 18:18:35 +0000
parents 314be1cfdcb0
children 51918cb97f6f
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
5215
2b72f9bc4f06 license header consistency cosmetics
diego
parents: 4910
diff changeset
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
3695
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
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
27 #include "avcodec.h"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
28 #include "dsputil.h"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
29 #include "bitstream.h"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
30 #include "mpegvideo.h"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
31
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
32 #include "vp56.h"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
33 #include "vp56data.h"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
34 #include "vp5data.h"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
35
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
36
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
37 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
38 int *golden_frame)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
39 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
40 vp56_range_coder_t *c = &s->c;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
41 int rows, cols;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
42
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
43 vp56_init_range_decoder(&s->c, buf, buf_size);
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
44 s->framep[VP56_FRAME_CURRENT]->key_frame = !vp56_rac_get(c);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
45 vp56_rac_get(c);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
46 vp56_init_dequant(s, vp56_rac_gets(c, 6));
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
47 if (s->framep[VP56_FRAME_CURRENT]->key_frame)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
48 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
49 vp56_rac_gets(c, 8);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
50 if(vp56_rac_gets(c, 5) > 5)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
51 return 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
52 vp56_rac_gets(c, 2);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
53 if (vp56_rac_get(c)) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
54 av_log(s->avctx, AV_LOG_ERROR, "interlacing not supported\n");
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
55 return 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
56 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
57 rows = vp56_rac_gets(c, 8); /* number of stored macroblock rows */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
58 cols = vp56_rac_gets(c, 8); /* number of stored macroblock cols */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
59 vp56_rac_gets(c, 8); /* number of displayed macroblock rows */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
60 vp56_rac_gets(c, 8); /* number of displayed macroblock cols */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
61 vp56_rac_gets(c, 2);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
62 if (16*cols != s->avctx->coded_width ||
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
63 16*rows != s->avctx->coded_height) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
64 avcodec_set_dimensions(s->avctx, 16*cols, 16*rows);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
65 return 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
66 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
67 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
68 return 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
69 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
70
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
71 /* Gives very similar result than the vp6 version except in a few cases */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
72 static int vp5_adjust(int v, int t)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
73 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
74 int s2, s1 = v >> 31;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
75 v ^= s1;
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 *= v < 2*t;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
78 v -= t;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
79 s2 = v >> 31;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
80 v ^= s2;
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 = t - v;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
83 v += s1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
84 v ^= s1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
85 return v;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
86 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
87
3697
596e62da8f29 rename vector to vect to avoid clash with Apple gcc
aurel
parents: 3695
diff changeset
88 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
89 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
90 vp56_range_coder_t *c = &s->c;
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
91 vp56_model_t *model = s->modelp;
3695
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;
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
96 if (vp56_rac_get_prob(c, model->vector_dct[comp])) {
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
97 int sign = vp56_rac_get_prob(c, model->vector_sig[comp]);
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
98 di = vp56_rac_get_prob(c, model->vector_pdi[comp][0]);
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
99 di |= vp56_rac_get_prob(c, model->vector_pdi[comp][1]) << 1;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
100 delta = vp56_rac_get_tree(c, vp56_pva_tree,
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
101 model->vector_pdv[comp]);
3695
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;
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
115 vp56_model_t *model = s->modelp;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
116 int comp, node;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
117
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
118 for (comp=0; comp<2; comp++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
119 if (vp56_rac_get_prob(c, vp5_vmc_pct[comp][0]))
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
120 model->vector_dct[comp] = vp56_rac_gets_nn(c, 7);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
121 if (vp56_rac_get_prob(c, vp5_vmc_pct[comp][1]))
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
122 model->vector_sig[comp] = vp56_rac_gets_nn(c, 7);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
123 if (vp56_rac_get_prob(c, vp5_vmc_pct[comp][2]))
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
124 model->vector_pdi[comp][0] = vp56_rac_gets_nn(c, 7);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
125 if (vp56_rac_get_prob(c, vp5_vmc_pct[comp][3]))
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
126 model->vector_pdi[comp][1] = vp56_rac_gets_nn(c, 7);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
127 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
128
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
129 for (comp=0; comp<2; comp++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
130 for (node=0; node<7; node++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
131 if (vp56_rac_get_prob(c, vp5_vmc_pct[comp][4 + node]))
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
132 model->vector_pdv[comp][node] = vp56_rac_gets_nn(c, 7);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
133 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
134
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
135 static void vp5_parse_coeff_models(vp56_context_t *s)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
136 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
137 vp56_range_coder_t *c = &s->c;
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
138 vp56_model_t *model = s->modelp;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
139 uint8_t def_prob[11];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
140 int node, cg, ctx;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
141 int ct; /* code type */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
142 int pt; /* plane type (0 for Y, 1 for U or V) */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
143
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
144 memset(def_prob, 0x80, sizeof(def_prob));
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
145
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
146 for (pt=0; pt<2; pt++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
147 for (node=0; node<11; node++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
148 if (vp56_rac_get_prob(c, vp5_dccv_pct[pt][node])) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
149 def_prob[node] = vp56_rac_gets_nn(c, 7);
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
150 model->coeff_dccv[pt][node] = def_prob[node];
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
151 } else if (s->framep[VP56_FRAME_CURRENT]->key_frame) {
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
152 model->coeff_dccv[pt][node] = def_prob[node];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
153 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
154
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
155 for (ct=0; ct<3; ct++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
156 for (pt=0; pt<2; pt++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
157 for (cg=0; cg<6; cg++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
158 for (node=0; node<11; node++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
159 if (vp56_rac_get_prob(c, vp5_ract_pct[ct][pt][cg][node])) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
160 def_prob[node] = vp56_rac_gets_nn(c, 7);
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
161 model->coeff_ract[pt][ct][cg][node] = def_prob[node];
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
162 } else if (s->framep[VP56_FRAME_CURRENT]->key_frame) {
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
163 model->coeff_ract[pt][ct][cg][node] = def_prob[node];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
164 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
165
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
166 /* coeff_dcct is a linear combination of coeff_dccv */
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
167 for (pt=0; pt<2; pt++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
168 for (ctx=0; ctx<36; ctx++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
169 for (node=0; node<5; node++)
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
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
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
171
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
172 /* coeff_acct is a linear combination of coeff_ract */
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
173 for (ct=0; ct<3; ct++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
174 for (pt=0; pt<2; pt++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
175 for (cg=0; cg<3; cg++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
176 for (ctx=0; ctx<6; ctx++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
177 for (node=0; node<5; node++)
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
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
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
179 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
180
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
181 static void vp5_parse_coeff(vp56_context_t *s)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
182 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
183 vp56_range_coder_t *c = &s->c;
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
184 vp56_model_t *model = s->modelp;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
185 uint8_t *permute = s->scantable.permutated;
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
186 uint8_t *model1, *model2;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
187 int coeff, sign, coeff_idx;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
188 int b, i, cg, idx, ctx, ctx_last;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
189 int pt = 0; /* plane type (0 for Y, 1 for U or V) */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
190
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
191 for (b=0; b<6; b++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
192 int ct = 1; /* code type */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
193
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
194 if (b > 3) pt = 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
195
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
196 ctx = 6*s->coeff_ctx[vp56_b6to4[b]][0]
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
197 + s->above_blocks[s->above_block_idx[b]].not_null_dc;
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
198 model1 = model->coeff_dccv[pt];
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
199 model2 = model->coeff_dcct[pt][ctx];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
200
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
201 for (coeff_idx=0; coeff_idx<64; ) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
202 if (vp56_rac_get_prob(c, model2[0])) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
203 if (vp56_rac_get_prob(c, model2[2])) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
204 if (vp56_rac_get_prob(c, model2[3])) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
205 s->coeff_ctx[vp56_b6to4[b]][coeff_idx] = 4;
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
206 idx = vp56_rac_get_tree(c, vp56_pc_tree, model1);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
207 sign = vp56_rac_get(c);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
208 coeff = vp56_coeff_bias[idx];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
209 for (i=vp56_coeff_bit_length[idx]; i>=0; i--)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
210 coeff += vp56_rac_get_prob(c, vp56_coeff_parse_table[idx][i]) << i;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
211 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
212 if (vp56_rac_get_prob(c, model2[4])) {
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
213 coeff = 3 + vp56_rac_get_prob(c, model1[5]);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
214 s->coeff_ctx[vp56_b6to4[b]][coeff_idx] = 3;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
215 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
216 coeff = 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
217 s->coeff_ctx[vp56_b6to4[b]][coeff_idx] = 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
218 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
219 sign = vp56_rac_get(c);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
220 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
221 ct = 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
222 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
223 ct = 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
224 s->coeff_ctx[vp56_b6to4[b]][coeff_idx] = 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
225 sign = vp56_rac_get(c);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
226 coeff = 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
227 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
228 coeff = (coeff ^ -sign) + sign;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
229 if (coeff_idx)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
230 coeff *= s->dequant_ac;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
231 s->block_coeff[b][permute[coeff_idx]] = coeff;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
232 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
233 if (ct && !vp56_rac_get_prob(c, model2[1]))
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
234 break;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
235 ct = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
236 s->coeff_ctx[vp56_b6to4[b]][coeff_idx] = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
237 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
238
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
239 cg = vp5_coeff_groups[++coeff_idx];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
240 ctx = s->coeff_ctx[vp56_b6to4[b]][coeff_idx];
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
241 model1 = model->coeff_ract[pt][ct][cg];
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
242 model2 = cg > 2 ? model1 : model->coeff_acct[pt][ct][cg][ctx];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
243 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
244
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
245 ctx_last = FFMIN(s->coeff_ctx_last[vp56_b6to4[b]], 24);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
246 s->coeff_ctx_last[vp56_b6to4[b]] = coeff_idx;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
247 if (coeff_idx < ctx_last)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
248 for (i=coeff_idx; i<=ctx_last; i++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
249 s->coeff_ctx[vp56_b6to4[b]][i] = 5;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
250 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
251 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
252 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
253
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
254 static void vp5_default_models_init(vp56_context_t *s)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
255 {
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
256 vp56_model_t *model = s->modelp;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
257 int i;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
258
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
259 for (i=0; i<2; i++) {
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
260 model->vector_sig[i] = 0x80;
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
261 model->vector_dct[i] = 0x80;
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
262 model->vector_pdi[i][0] = 0x55;
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
263 model->vector_pdi[i][1] = 0x80;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
264 }
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
265 memcpy(model->mb_types_stats, vp56_def_mb_types_stats, sizeof(model->mb_types_stats));
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
266 memset(model->vector_pdv, 0x80, sizeof(model->vector_pdv));
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
267 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
268
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
269 static int vp5_decode_init(AVCodecContext *avctx)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
270 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
271 vp56_context_t *s = avctx->priv_data;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
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
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
274 s->vp56_coord_div = vp5_coord_div;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
275 s->parse_vector_adjustment = vp5_parse_vector_adjustment;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
276 s->adjust = vp5_adjust;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
277 s->parse_coeff = vp5_parse_coeff;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
278 s->default_models_init = vp5_default_models_init;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
279 s->parse_vector_models = vp5_parse_vector_models;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
280 s->parse_coeff_models = vp5_parse_coeff_models;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
281 s->parse_header = vp5_parse_header;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
282
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
283 return 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
284 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
285
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
286 AVCodec vp5_decoder = {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
287 "vp5",
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
288 CODEC_TYPE_VIDEO,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
289 CODEC_ID_VP5,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
290 sizeof(vp56_context_t),
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
291 vp5_decode_init,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
292 NULL,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
293 vp56_free,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
294 vp56_decode_frame,
4910
143b89ab8187 set CODEC_CAP_DR1 for vp5 and vp6 decoders
aurel
parents: 4595
diff changeset
295 CODEC_CAP_DR1,
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
296 };