annotate vp5.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 7c54834209f6
children
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 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11560
diff changeset
2 * @file
3695
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"
9428
0dce4fe6e6f3 Rename bitstream.h to get_bits.h.
stefano
parents: 8718
diff changeset
29 #include "get_bits.h"
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
30
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
31 #include "vp56.h"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
32 #include "vp56data.h"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
33 #include "vp5data.h"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
34
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
35
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7040
diff changeset
36 static int vp5_parse_header(VP56Context *s, const uint8_t *buf, int buf_size,
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
37 int *golden_frame)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
38 {
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7040
diff changeset
39 VP56RangeCoder *c = &s->c;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
40 int rows, cols;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
41
12365
7c54834209f6 VP5/6/8: eliminate CABAC dependency
darkshikari
parents: 12292
diff changeset
42 ff_vp56_init_range_decoder(&s->c, buf, buf_size);
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
43 s->framep[VP56_FRAME_CURRENT]->key_frame = !vp56_rac_get(c);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
44 vp56_rac_get(c);
12292
d8364962cc4a ff_prefix non static vp56 functions.
alexc
parents: 11665
diff changeset
45 ff_vp56_init_dequant(s, vp56_rac_gets(c, 6));
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
46 if (s->framep[VP56_FRAME_CURRENT]->key_frame)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
47 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
48 vp56_rac_gets(c, 8);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
49 if(vp56_rac_gets(c, 5) > 5)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
50 return 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
51 vp56_rac_gets(c, 2);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
52 if (vp56_rac_get(c)) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
53 av_log(s->avctx, AV_LOG_ERROR, "interlacing not supported\n");
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
54 return 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
55 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
56 rows = vp56_rac_gets(c, 8); /* number of stored macroblock rows */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
57 cols = vp56_rac_gets(c, 8); /* number of stored macroblock cols */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
58 vp56_rac_gets(c, 8); /* number of displayed macroblock rows */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
59 vp56_rac_gets(c, 8); /* number of displayed macroblock cols */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
60 vp56_rac_gets(c, 2);
8329
8b6bcfa22aa8 vp56: don't reset dimensions to 0 in codec init
aurel
parents: 8304
diff changeset
61 if (!s->macroblocks || /* first frame */
8b6bcfa22aa8 vp56: don't reset dimensions to 0 in codec init
aurel
parents: 8304
diff changeset
62 16*cols != s->avctx->coded_width ||
3695
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 }
8674
f36e2c1749b5 vp5: don't try decoding a P frame before any I frame was parsed
aurel
parents: 8329
diff changeset
67 } else if (!s->macroblocks)
f36e2c1749b5 vp5: don't try decoding a P frame before any I frame was parsed
aurel
parents: 8329
diff changeset
68 return 0;
3695
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
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7040
diff changeset
72 static void vp5_parse_vector_adjustment(VP56Context *s, VP56mv *vect)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
73 {
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7040
diff changeset
74 VP56RangeCoder *c = &s->c;
8304
3cddc18caeca rename Vp56Model to VP56Model for consistency
aurel
parents: 8299
diff changeset
75 VP56Model *model = s->modelp;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
76 int comp, di;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
77
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
78 for (comp=0; comp<2; comp++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
79 int delta = 0;
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
80 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
81 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
82 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
83 di |= vp56_rac_get_prob(c, model->vector_pdi[comp][1]) << 1;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
84 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
85 model->vector_pdv[comp]);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
86 delta = di | (delta << 2);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
87 delta = (delta ^ -sign) + sign;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
88 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
89 if (!comp)
3697
596e62da8f29 rename vector to vect to avoid clash with Apple gcc
aurel
parents: 3695
diff changeset
90 vect->x = delta;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
91 else
3697
596e62da8f29 rename vector to vect to avoid clash with Apple gcc
aurel
parents: 3695
diff changeset
92 vect->y = delta;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
93 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
94 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
95
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7040
diff changeset
96 static void vp5_parse_vector_models(VP56Context *s)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
97 {
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7040
diff changeset
98 VP56RangeCoder *c = &s->c;
8304
3cddc18caeca rename Vp56Model to VP56Model for consistency
aurel
parents: 8299
diff changeset
99 VP56Model *model = s->modelp;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
100 int comp, node;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
101
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
102 for (comp=0; comp<2; comp++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
103 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
104 model->vector_dct[comp] = vp56_rac_gets_nn(c, 7);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
105 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
106 model->vector_sig[comp] = vp56_rac_gets_nn(c, 7);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
107 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
108 model->vector_pdi[comp][0] = vp56_rac_gets_nn(c, 7);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
109 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
110 model->vector_pdi[comp][1] = vp56_rac_gets_nn(c, 7);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
111 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
112
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
113 for (comp=0; comp<2; comp++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
114 for (node=0; node<7; node++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
115 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
116 model->vector_pdv[comp][node] = vp56_rac_gets_nn(c, 7);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
117 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
118
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7040
diff changeset
119 static void vp5_parse_coeff_models(VP56Context *s)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
120 {
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7040
diff changeset
121 VP56RangeCoder *c = &s->c;
8304
3cddc18caeca rename Vp56Model to VP56Model for consistency
aurel
parents: 8299
diff changeset
122 VP56Model *model = s->modelp;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
123 uint8_t def_prob[11];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
124 int node, cg, ctx;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
125 int ct; /* code type */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
126 int pt; /* plane type (0 for Y, 1 for U or V) */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
127
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
128 memset(def_prob, 0x80, sizeof(def_prob));
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
129
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
130 for (pt=0; pt<2; pt++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
131 for (node=0; node<11; node++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
132 if (vp56_rac_get_prob(c, vp5_dccv_pct[pt][node])) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
133 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
134 model->coeff_dccv[pt][node] = def_prob[node];
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
135 } 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
136 model->coeff_dccv[pt][node] = def_prob[node];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
137 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
138
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
139 for (ct=0; ct<3; ct++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
140 for (pt=0; pt<2; pt++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
141 for (cg=0; cg<6; cg++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
142 for (node=0; node<11; node++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
143 if (vp56_rac_get_prob(c, vp5_ract_pct[ct][pt][cg][node])) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
144 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
145 model->coeff_ract[pt][ct][cg][node] = def_prob[node];
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
146 } 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
147 model->coeff_ract[pt][ct][cg][node] = def_prob[node];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
148 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
149
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
150 /* coeff_dcct is a linear combination of coeff_dccv */
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
151 for (pt=0; pt<2; pt++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
152 for (ctx=0; ctx<36; ctx++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
153 for (node=0; node<5; node++)
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
154 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
155
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
156 /* coeff_acct is a linear combination of coeff_ract */
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
157 for (ct=0; ct<3; ct++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
158 for (pt=0; pt<2; pt++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
159 for (cg=0; cg<3; cg++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
160 for (ctx=0; ctx<6; ctx++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
161 for (node=0; node<5; node++)
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
162 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
163 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
164
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7040
diff changeset
165 static void vp5_parse_coeff(VP56Context *s)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
166 {
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7040
diff changeset
167 VP56RangeCoder *c = &s->c;
8304
3cddc18caeca rename Vp56Model to VP56Model for consistency
aurel
parents: 8299
diff changeset
168 VP56Model *model = s->modelp;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
169 uint8_t *permute = s->scantable.permutated;
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
170 uint8_t *model1, *model2;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
171 int coeff, sign, coeff_idx;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
172 int b, i, cg, idx, ctx, ctx_last;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
173 int pt = 0; /* plane type (0 for Y, 1 for U or V) */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
174
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
175 for (b=0; b<6; b++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
176 int ct = 1; /* code type */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
177
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
178 if (b > 3) pt = 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
179
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
180 ctx = 6*s->coeff_ctx[vp56_b6to4[b]][0]
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
181 + 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
182 model1 = model->coeff_dccv[pt];
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
183 model2 = model->coeff_dcct[pt][ctx];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
184
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
185 for (coeff_idx=0; coeff_idx<64; ) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
186 if (vp56_rac_get_prob(c, model2[0])) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
187 if (vp56_rac_get_prob(c, model2[2])) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
188 if (vp56_rac_get_prob(c, model2[3])) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
189 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
190 idx = vp56_rac_get_tree(c, vp56_pc_tree, model1);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
191 sign = vp56_rac_get(c);
5821
51918cb97f6f add support for VP6 with huffman encoded blocks
aurel
parents: 5714
diff changeset
192 coeff = vp56_coeff_bias[idx+5];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
193 for (i=vp56_coeff_bit_length[idx]; i>=0; i--)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
194 coeff += vp56_rac_get_prob(c, vp56_coeff_parse_table[idx][i]) << i;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
195 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
196 if (vp56_rac_get_prob(c, model2[4])) {
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
197 coeff = 3 + vp56_rac_get_prob(c, model1[5]);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
198 s->coeff_ctx[vp56_b6to4[b]][coeff_idx] = 3;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
199 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
200 coeff = 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
201 s->coeff_ctx[vp56_b6to4[b]][coeff_idx] = 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
202 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
203 sign = vp56_rac_get(c);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
204 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
205 ct = 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
206 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
207 ct = 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
208 s->coeff_ctx[vp56_b6to4[b]][coeff_idx] = 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
209 sign = vp56_rac_get(c);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
210 coeff = 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
211 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
212 coeff = (coeff ^ -sign) + sign;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
213 if (coeff_idx)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
214 coeff *= s->dequant_ac;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
215 s->block_coeff[b][permute[coeff_idx]] = coeff;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
216 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
217 if (ct && !vp56_rac_get_prob(c, model2[1]))
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
218 break;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
219 ct = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
220 s->coeff_ctx[vp56_b6to4[b]][coeff_idx] = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
221 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
222
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
223 cg = vp5_coeff_groups[++coeff_idx];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
224 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
225 model1 = model->coeff_ract[pt][ct][cg];
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
226 model2 = cg > 2 ? model1 : model->coeff_acct[pt][ct][cg][ctx];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
227 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
228
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
229 ctx_last = FFMIN(s->coeff_ctx_last[vp56_b6to4[b]], 24);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
230 s->coeff_ctx_last[vp56_b6to4[b]] = coeff_idx;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
231 if (coeff_idx < ctx_last)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
232 for (i=coeff_idx; i<=ctx_last; i++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
233 s->coeff_ctx[vp56_b6to4[b]][i] = 5;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
234 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
235 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
236 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
237
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7040
diff changeset
238 static void vp5_default_models_init(VP56Context *s)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
239 {
8304
3cddc18caeca rename Vp56Model to VP56Model for consistency
aurel
parents: 8299
diff changeset
240 VP56Model *model = s->modelp;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
241 int i;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
242
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
243 for (i=0; i<2; i++) {
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
244 model->vector_sig[i] = 0x80;
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
245 model->vector_dct[i] = 0x80;
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
246 model->vector_pdi[i][0] = 0x55;
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
247 model->vector_pdi[i][1] = 0x80;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
248 }
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
249 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
250 memset(model->vector_pdv, 0x80, sizeof(model->vector_pdv));
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
251 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
252
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6448
diff changeset
253 static av_cold int vp5_decode_init(AVCodecContext *avctx)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
254 {
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7040
diff changeset
255 VP56Context *s = avctx->priv_data;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
256
12292
d8364962cc4a ff_prefix non static vp56 functions.
alexc
parents: 11665
diff changeset
257 ff_vp56_init(avctx, 1, 0);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
258 s->vp56_coord_div = vp5_coord_div;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
259 s->parse_vector_adjustment = vp5_parse_vector_adjustment;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
260 s->parse_coeff = vp5_parse_coeff;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
261 s->default_models_init = vp5_default_models_init;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
262 s->parse_vector_models = vp5_parse_vector_models;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
263 s->parse_coeff_models = vp5_parse_coeff_models;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
264 s->parse_header = vp5_parse_header;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
265
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
266 return 0;
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 AVCodec vp5_decoder = {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
270 "vp5",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 9428
diff changeset
271 AVMEDIA_TYPE_VIDEO,
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
272 CODEC_ID_VP5,
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7040
diff changeset
273 sizeof(VP56Context),
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
274 vp5_decode_init,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
275 NULL,
12292
d8364962cc4a ff_prefix non static vp56 functions.
alexc
parents: 11665
diff changeset
276 ff_vp56_free,
d8364962cc4a ff_prefix non static vp56 functions.
alexc
parents: 11665
diff changeset
277 ff_vp56_decode_frame,
4910
143b89ab8187 set CODEC_CAP_DR1 for vp5 and vp6 decoders
aurel
parents: 4595
diff changeset
278 CODEC_CAP_DR1,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6710
diff changeset
279 .long_name = NULL_IF_CONFIG_SMALL("On2 VP5"),
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
280 };