annotate vp56.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 54583a14a995
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: 11350
diff changeset
2 * @file
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
3 * VP5 and VP6 compatible video decoder (common features)
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: 3715
diff changeset
7 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3715
diff changeset
8 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3715
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: 3715
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: 3715
diff changeset
20 * License along with FFmpeg; if not, write to the Free Software
5215
2b72f9bc4f06 license header consistency cosmetics
diego
parents: 4596
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 "avcodec.h"
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
25 #include "bytestream.h"
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
26
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
27 #include "vp56.h"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
28 #include "vp56data.h"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
29
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
30
12292
d8364962cc4a ff_prefix non static vp56 functions.
alexc
parents: 11665
diff changeset
31 void ff_vp56_init_dequant(VP56Context *s, int quantizer)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
32 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
33 s->quantizer = quantizer;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
34 s->dequant_dc = vp56_dc_dequant[quantizer] << 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
35 s->dequant_ac = vp56_ac_dequant[quantizer] << 2;
11053
c57e72227d7d Make VP5 and VP6 decoders output a qscale table to allow for more automatic
reimar
parents: 11050
diff changeset
36 memset(s->qscale_table, quantizer, s->mb_width);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
37 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
38
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
39 static int vp56_get_vectors_predictors(VP56Context *s, int row, int col,
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
40 VP56Frame ref_frame)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
41 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
42 int nb_pred = 0;
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
43 VP56mv vect[2] = {{0,0}, {0,0}};
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
44 int pos, offset;
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
45 VP56mv mvp;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
46
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
47 for (pos=0; pos<12; pos++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
48 mvp.x = col + vp56_candidate_predictor_pos[pos][0];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
49 mvp.y = row + vp56_candidate_predictor_pos[pos][1];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
50 if (mvp.x < 0 || mvp.x >= s->mb_width ||
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
51 mvp.y < 0 || mvp.y >= s->mb_height)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
52 continue;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
53 offset = mvp.x + s->mb_width*mvp.y;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
54
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
55 if (vp56_reference_frame[s->macroblocks[offset].type] != ref_frame)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
56 continue;
3697
596e62da8f29 rename vector to vect to avoid clash with Apple gcc
aurel
parents: 3695
diff changeset
57 if ((s->macroblocks[offset].mv.x == vect[0].x &&
596e62da8f29 rename vector to vect to avoid clash with Apple gcc
aurel
parents: 3695
diff changeset
58 s->macroblocks[offset].mv.y == vect[0].y) ||
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
59 (s->macroblocks[offset].mv.x == 0 &&
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
60 s->macroblocks[offset].mv.y == 0))
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
61 continue;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
62
3697
596e62da8f29 rename vector to vect to avoid clash with Apple gcc
aurel
parents: 3695
diff changeset
63 vect[nb_pred++] = s->macroblocks[offset].mv;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
64 if (nb_pred > 1) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
65 nb_pred = -1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
66 break;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
67 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
68 s->vector_candidate_pos = pos;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
69 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
70
3697
596e62da8f29 rename vector to vect to avoid clash with Apple gcc
aurel
parents: 3695
diff changeset
71 s->vector_candidate[0] = vect[0];
596e62da8f29 rename vector to vect to avoid clash with Apple gcc
aurel
parents: 3695
diff changeset
72 s->vector_candidate[1] = vect[1];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
73
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
74 return nb_pred+1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
75 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
76
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
77 static void vp56_parse_mb_type_models(VP56Context *s)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
78 {
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
79 VP56RangeCoder *c = &s->c;
8304
3cddc18caeca rename Vp56Model to VP56Model for consistency
aurel
parents: 8300
diff changeset
80 VP56Model *model = s->modelp;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
81 int i, ctx, type;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
82
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
83 for (ctx=0; ctx<3; ctx++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
84 if (vp56_rac_get_prob(c, 174)) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
85 int idx = vp56_rac_gets(c, 4);
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5709
diff changeset
86 memcpy(model->mb_types_stats[ctx],
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5709
diff changeset
87 vp56_pre_def_mb_type_stats[idx][ctx],
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5709
diff changeset
88 sizeof(model->mb_types_stats[ctx]));
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
89 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
90 if (vp56_rac_get_prob(c, 254)) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
91 for (type=0; type<10; type++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
92 for(i=0; i<2; i++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
93 if (vp56_rac_get_prob(c, 205)) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
94 int delta, sign = vp56_rac_get(c);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
95
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
96 delta = vp56_rac_get_tree(c, vp56_pmbtm_tree,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
97 vp56_mb_type_model_model);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
98 if (!delta)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
99 delta = 4 * vp56_rac_gets(c, 7);
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5709
diff changeset
100 model->mb_types_stats[ctx][type][i] += (delta ^ -sign) + sign;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
101 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
102 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
103 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
104 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
105 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
106
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
107 /* compute MB type probability tables based on previous MB type */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
108 for (ctx=0; ctx<3; ctx++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
109 int p[10];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
110
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
111 for (type=0; type<10; type++)
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5709
diff changeset
112 p[type] = 100 * model->mb_types_stats[ctx][type][1];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
113
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
114 for (type=0; type<10; type++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
115 int p02, p34, p0234, p17, p56, p89, p5689, p156789;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
116
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
117 /* conservative MB type probability */
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5709
diff changeset
118 model->mb_type[ctx][type][0] = 255 - (255 * model->mb_types_stats[ctx][type][0]) / (1 + model->mb_types_stats[ctx][type][0] + model->mb_types_stats[ctx][type][1]);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
119
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
120 p[type] = 0; /* same MB type => weight is null */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
121
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
122 /* binary tree parsing probabilities */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
123 p02 = p[0] + p[2];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
124 p34 = p[3] + p[4];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
125 p0234 = p02 + p34;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
126 p17 = p[1] + p[7];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
127 p56 = p[5] + p[6];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
128 p89 = p[8] + p[9];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
129 p5689 = p56 + p89;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
130 p156789 = p17 + p5689;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
131
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5709
diff changeset
132 model->mb_type[ctx][type][1] = 1 + 255 * p0234/(1+p0234+p156789);
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5709
diff changeset
133 model->mb_type[ctx][type][2] = 1 + 255 * p02 / (1+p0234);
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5709
diff changeset
134 model->mb_type[ctx][type][3] = 1 + 255 * p17 / (1+p156789);
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5709
diff changeset
135 model->mb_type[ctx][type][4] = 1 + 255 * p[0] / (1+p02);
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5709
diff changeset
136 model->mb_type[ctx][type][5] = 1 + 255 * p[3] / (1+p34);
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5709
diff changeset
137 model->mb_type[ctx][type][6] = 1 + 255 * p[1] / (1+p17);
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5709
diff changeset
138 model->mb_type[ctx][type][7] = 1 + 255 * p56 / (1+p5689);
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5709
diff changeset
139 model->mb_type[ctx][type][8] = 1 + 255 * p[5] / (1+p56);
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5709
diff changeset
140 model->mb_type[ctx][type][9] = 1 + 255 * p[8] / (1+p89);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
141
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
142 /* restore initial value */
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5709
diff changeset
143 p[type] = 100 * model->mb_types_stats[ctx][type][1];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
144 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
145 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
146 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
147
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
148 static VP56mb vp56_parse_mb_type(VP56Context *s,
8300
c47323828269 cosmetics: vertical alignment
aurel
parents: 8299
diff changeset
149 VP56mb prev_type, int ctx)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
150 {
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5709
diff changeset
151 uint8_t *mb_type_model = s->modelp->mb_type[ctx][prev_type];
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
152 VP56RangeCoder *c = &s->c;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
153
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
154 if (vp56_rac_get_prob(c, mb_type_model[0]))
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
155 return prev_type;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
156 else
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
157 return vp56_rac_get_tree(c, vp56_pmbt_tree, mb_type_model);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
158 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
159
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
160 static void vp56_decode_4mv(VP56Context *s, int row, int col)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
161 {
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
162 VP56mv mv = {0,0};
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
163 int type[4];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
164 int b;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
165
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
166 /* parse each block type */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
167 for (b=0; b<4; b++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
168 type[b] = vp56_rac_gets(&s->c, 2);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
169 if (type[b])
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
170 type[b]++; /* only returns 0, 2, 3 or 4 (all INTER_PF) */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
171 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
172
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
173 /* get vectors */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
174 for (b=0; b<4; b++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
175 switch (type[b]) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
176 case VP56_MB_INTER_NOVEC_PF:
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
177 s->mv[b] = (VP56mv) {0,0};
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
178 break;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
179 case VP56_MB_INTER_DELTA_PF:
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
180 s->parse_vector_adjustment(s, &s->mv[b]);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
181 break;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
182 case VP56_MB_INTER_V1_PF:
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
183 s->mv[b] = s->vector_candidate[0];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
184 break;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
185 case VP56_MB_INTER_V2_PF:
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
186 s->mv[b] = s->vector_candidate[1];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
187 break;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
188 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
189 mv.x += s->mv[b].x;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
190 mv.y += s->mv[b].y;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
191 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
192
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
193 /* this is the one selected for the whole MB for prediction */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
194 s->macroblocks[row * s->mb_width + col].mv = s->mv[3];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
195
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
196 /* chroma vectors are average luma vectors */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
197 if (s->avctx->codec->id == CODEC_ID_VP5) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
198 s->mv[4].x = s->mv[5].x = RSHIFT(mv.x,2);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
199 s->mv[4].y = s->mv[5].y = RSHIFT(mv.y,2);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
200 } else {
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
201 s->mv[4] = s->mv[5] = (VP56mv) {mv.x/4, mv.y/4};
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
202 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
203 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
204
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
205 static VP56mb vp56_decode_mv(VP56Context *s, int row, int col)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
206 {
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
207 VP56mv *mv, vect = {0,0};
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
208 int ctx, b;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
209
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
210 ctx = vp56_get_vectors_predictors(s, row, col, VP56_FRAME_PREVIOUS);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
211 s->mb_type = vp56_parse_mb_type(s, s->mb_type, ctx);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
212 s->macroblocks[row * s->mb_width + col].type = s->mb_type;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
213
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
214 switch (s->mb_type) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
215 case VP56_MB_INTER_V1_PF:
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
216 mv = &s->vector_candidate[0];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
217 break;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
218
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
219 case VP56_MB_INTER_V2_PF:
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
220 mv = &s->vector_candidate[1];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
221 break;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
222
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
223 case VP56_MB_INTER_V1_GF:
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
224 vp56_get_vectors_predictors(s, row, col, VP56_FRAME_GOLDEN);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
225 mv = &s->vector_candidate[0];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
226 break;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
227
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
228 case VP56_MB_INTER_V2_GF:
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
229 vp56_get_vectors_predictors(s, row, col, VP56_FRAME_GOLDEN);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
230 mv = &s->vector_candidate[1];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
231 break;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
232
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
233 case VP56_MB_INTER_DELTA_PF:
3697
596e62da8f29 rename vector to vect to avoid clash with Apple gcc
aurel
parents: 3695
diff changeset
234 s->parse_vector_adjustment(s, &vect);
596e62da8f29 rename vector to vect to avoid clash with Apple gcc
aurel
parents: 3695
diff changeset
235 mv = &vect;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
236 break;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
237
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
238 case VP56_MB_INTER_DELTA_GF:
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
239 vp56_get_vectors_predictors(s, row, col, VP56_FRAME_GOLDEN);
3697
596e62da8f29 rename vector to vect to avoid clash with Apple gcc
aurel
parents: 3695
diff changeset
240 s->parse_vector_adjustment(s, &vect);
596e62da8f29 rename vector to vect to avoid clash with Apple gcc
aurel
parents: 3695
diff changeset
241 mv = &vect;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
242 break;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
243
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
244 case VP56_MB_INTER_4V:
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
245 vp56_decode_4mv(s, row, col);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
246 return s->mb_type;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
247
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
248 default:
3697
596e62da8f29 rename vector to vect to avoid clash with Apple gcc
aurel
parents: 3695
diff changeset
249 mv = &vect;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
250 break;
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 s->macroblocks[row*s->mb_width + col].mv = *mv;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
254
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
255 /* same vector for all blocks */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
256 for (b=0; b<6; b++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
257 s->mv[b] = *mv;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
258
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
259 return s->mb_type;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
260 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
261
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
262 static void vp56_add_predictors_dc(VP56Context *s, VP56Frame ref_frame)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
263 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
264 int idx = s->scantable.permutated[0];
5718
bb4293d858da rename one variable to be consistent with the rest of the file
aurel
parents: 5717
diff changeset
265 int b;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
266
5718
bb4293d858da rename one variable to be consistent with the rest of the file
aurel
parents: 5717
diff changeset
267 for (b=0; b<6; b++) {
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
268 VP56RefDc *ab = &s->above_blocks[s->above_block_idx[b]];
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
269 VP56RefDc *lb = &s->left_block[vp56_b6to4[b]];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
270 int count = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
271 int dc = 0;
5719
1643aa6ac147 simplify
aurel
parents: 5718
diff changeset
272 int i;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
273
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
274 if (ref_frame == lb->ref_frame) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
275 dc += lb->dc_coeff;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
276 count++;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
277 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
278 if (ref_frame == ab->ref_frame) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
279 dc += ab->dc_coeff;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
280 count++;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
281 }
5719
1643aa6ac147 simplify
aurel
parents: 5718
diff changeset
282 if (s->avctx->codec->id == CODEC_ID_VP5)
1643aa6ac147 simplify
aurel
parents: 5718
diff changeset
283 for (i=0; i<2; i++)
1643aa6ac147 simplify
aurel
parents: 5718
diff changeset
284 if (count < 2 && ref_frame == ab[-1+2*i].ref_frame) {
1643aa6ac147 simplify
aurel
parents: 5718
diff changeset
285 dc += ab[-1+2*i].dc_coeff;
1643aa6ac147 simplify
aurel
parents: 5718
diff changeset
286 count++;
1643aa6ac147 simplify
aurel
parents: 5718
diff changeset
287 }
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
288 if (count == 0)
5718
bb4293d858da rename one variable to be consistent with the rest of the file
aurel
parents: 5717
diff changeset
289 dc = s->prev_dc[vp56_b2p[b]][ref_frame];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
290 else if (count == 2)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
291 dc /= 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
292
5718
bb4293d858da rename one variable to be consistent with the rest of the file
aurel
parents: 5717
diff changeset
293 s->block_coeff[b][idx] += dc;
bb4293d858da rename one variable to be consistent with the rest of the file
aurel
parents: 5717
diff changeset
294 s->prev_dc[vp56_b2p[b]][ref_frame] = s->block_coeff[b][idx];
bb4293d858da rename one variable to be consistent with the rest of the file
aurel
parents: 5717
diff changeset
295 ab->dc_coeff = s->block_coeff[b][idx];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
296 ab->ref_frame = ref_frame;
5718
bb4293d858da rename one variable to be consistent with the rest of the file
aurel
parents: 5717
diff changeset
297 lb->dc_coeff = s->block_coeff[b][idx];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
298 lb->ref_frame = ref_frame;
5718
bb4293d858da rename one variable to be consistent with the rest of the file
aurel
parents: 5717
diff changeset
299 s->block_coeff[b][idx] *= s->dequant_dc;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
300 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
301 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
302
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
303 static void vp56_deblock_filter(VP56Context *s, uint8_t *yuv,
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
304 int stride, int dx, int dy)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
305 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
306 int t = vp56_filter_threshold[s->quantizer];
11665
85ee3d14b906 VP56: move vp56_edge_filter to new VP56DSPContext
mru
parents: 11644
diff changeset
307 if (dx) s->vp56dsp.edge_filter_hor(yuv + 10-dx , stride, t);
85ee3d14b906 VP56: move vp56_edge_filter to new VP56DSPContext
mru
parents: 11644
diff changeset
308 if (dy) s->vp56dsp.edge_filter_ver(yuv + stride*(10-dy), stride, t);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
309 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
310
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
311 static void vp56_mc(VP56Context *s, int b, int plane, uint8_t *src,
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
312 int stride, int x, int y)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
313 {
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
314 uint8_t *dst=s->framep[VP56_FRAME_CURRENT]->data[plane]+s->block_offset[b];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
315 uint8_t *src_block;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
316 int src_offset;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
317 int overlap_offset = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
318 int mask = s->vp56_coord_div[b] - 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
319 int deblock_filtering = s->deblock_filtering;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
320 int dx;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
321 int dy;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
322
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
323 if (s->avctx->skip_loop_filter >= AVDISCARD_ALL ||
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
324 (s->avctx->skip_loop_filter >= AVDISCARD_NONKEY
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
325 && !s->framep[VP56_FRAME_CURRENT]->key_frame))
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
326 deblock_filtering = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
327
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
328 dx = s->mv[b].x / s->vp56_coord_div[b];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
329 dy = s->mv[b].y / s->vp56_coord_div[b];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
330
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
331 if (b >= 4) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
332 x /= 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
333 y /= 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
334 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
335 x += dx - 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
336 y += dy - 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
337
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
338 if (x<0 || x+12>=s->plane_width[plane] ||
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
339 y<0 || y+12>=s->plane_height[plane]) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
340 ff_emulated_edge_mc(s->edge_emu_buffer,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
341 src + s->block_offset[b] + (dy-2)*stride + (dx-2),
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
342 stride, 12, 12, x, y,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
343 s->plane_width[plane],
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
344 s->plane_height[plane]);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
345 src_block = s->edge_emu_buffer;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
346 src_offset = 2 + 2*stride;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
347 } else if (deblock_filtering) {
3715
cdaee53c5da1 replaces back some C code by dsp.put_pixels_tab[0][0] (revert r6231)
aurel
parents: 3706
diff changeset
348 /* only need a 12x12 block, but there is no such dsp function, */
cdaee53c5da1 replaces back some C code by dsp.put_pixels_tab[0][0] (revert r6231)
aurel
parents: 3706
diff changeset
349 /* so copy a 16x12 block */
cdaee53c5da1 replaces back some C code by dsp.put_pixels_tab[0][0] (revert r6231)
aurel
parents: 3706
diff changeset
350 s->dsp.put_pixels_tab[0][0](s->edge_emu_buffer,
cdaee53c5da1 replaces back some C code by dsp.put_pixels_tab[0][0] (revert r6231)
aurel
parents: 3706
diff changeset
351 src + s->block_offset[b] + (dy-2)*stride + (dx-2),
cdaee53c5da1 replaces back some C code by dsp.put_pixels_tab[0][0] (revert r6231)
aurel
parents: 3706
diff changeset
352 stride, 12);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
353 src_block = s->edge_emu_buffer;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
354 src_offset = 2 + 2*stride;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
355 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
356 src_block = src;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
357 src_offset = s->block_offset[b] + dy*stride + dx;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
358 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
359
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
360 if (deblock_filtering)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
361 vp56_deblock_filter(s, src_block, stride, dx&7, dy&7);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
362
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
363 if (s->mv[b].x & mask)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
364 overlap_offset += (s->mv[b].x > 0) ? 1 : -1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
365 if (s->mv[b].y & mask)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
366 overlap_offset += (s->mv[b].y > 0) ? stride : -stride;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
367
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
368 if (overlap_offset) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
369 if (s->filter)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
370 s->filter(s, dst, src_block, src_offset, src_offset+overlap_offset,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
371 stride, s->mv[b], mask, s->filter_selection, b<4);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
372 else
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
373 s->dsp.put_no_rnd_pixels_l2[1](dst, src_block+src_offset,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
374 src_block+src_offset+overlap_offset,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
375 stride, 8);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
376 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
377 s->dsp.put_pixels_tab[1][0](dst, src_block+src_offset, stride, 8);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
378 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
379 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
380
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
381 static void vp56_decode_mb(VP56Context *s, int row, int col, int is_alpha)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
382 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
383 AVFrame *frame_current, *frame_ref;
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
384 VP56mb mb_type;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
385 VP56Frame ref_frame;
5717
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
386 int b, ab, b_max, plane, off;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
387
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
388 if (s->framep[VP56_FRAME_CURRENT]->key_frame)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
389 mb_type = VP56_MB_INTRA;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
390 else
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
391 mb_type = vp56_decode_mv(s, row, col);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
392 ref_frame = vp56_reference_frame[mb_type];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
393
8288
800444234375 clear_block mmx
lorenm
parents: 6795
diff changeset
394 s->dsp.clear_blocks(*s->block_coeff);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
395
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
396 s->parse_coeff(s);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
397
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
398 vp56_add_predictors_dc(s, ref_frame);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
399
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
400 frame_current = s->framep[VP56_FRAME_CURRENT];
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
401 frame_ref = s->framep[ref_frame];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
402
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
403 ab = 6*is_alpha;
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
404 b_max = 6 - 2*is_alpha;
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
405
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
406 switch (mb_type) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
407 case VP56_MB_INTRA:
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
408 for (b=0; b<b_max; b++) {
5717
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
409 plane = vp56_b2p[b+ab];
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
410 s->dsp.idct_put(frame_current->data[plane] + s->block_offset[b],
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
411 s->stride[plane], s->block_coeff[b]);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
412 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
413 break;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
414
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
415 case VP56_MB_INTER_NOVEC_PF:
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
416 case VP56_MB_INTER_NOVEC_GF:
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
417 for (b=0; b<b_max; b++) {
5717
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
418 plane = vp56_b2p[b+ab];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
419 off = s->block_offset[b];
5717
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
420 s->dsp.put_pixels_tab[1][0](frame_current->data[plane] + off,
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
421 frame_ref->data[plane] + off,
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
422 s->stride[plane], 8);
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
423 s->dsp.idct_add(frame_current->data[plane] + off,
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
424 s->stride[plane], s->block_coeff[b]);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
425 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
426 break;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
427
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
428 case VP56_MB_INTER_DELTA_PF:
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
429 case VP56_MB_INTER_V1_PF:
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
430 case VP56_MB_INTER_V2_PF:
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
431 case VP56_MB_INTER_DELTA_GF:
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
432 case VP56_MB_INTER_4V:
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
433 case VP56_MB_INTER_V1_GF:
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
434 case VP56_MB_INTER_V2_GF:
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
435 for (b=0; b<b_max; b++) {
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
436 int x_off = b==1 || b==3 ? 8 : 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
437 int y_off = b==2 || b==3 ? 8 : 0;
5717
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
438 plane = vp56_b2p[b+ab];
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
439 vp56_mc(s, b, plane, frame_ref->data[plane], s->stride[plane],
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
440 16*col+x_off, 16*row+y_off);
5717
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
441 s->dsp.idct_add(frame_current->data[plane] + s->block_offset[b],
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
442 s->stride[plane], s->block_coeff[b]);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
443 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
444 break;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
445 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
446 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
447
5708
8f52599c4c6c some simplifications and uniformisation
aurel
parents: 5215
diff changeset
448 static int vp56_size_changed(AVCodecContext *avctx)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
449 {
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
450 VP56Context *s = avctx->priv_data;
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
451 int stride = s->framep[VP56_FRAME_CURRENT]->linesize[0];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
452 int i;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
453
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
454 s->plane_width[0] = s->plane_width[3] = avctx->coded_width;
5708
8f52599c4c6c some simplifications and uniformisation
aurel
parents: 5215
diff changeset
455 s->plane_width[1] = s->plane_width[2] = avctx->coded_width/2;
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
456 s->plane_height[0] = s->plane_height[3] = avctx->coded_height;
5708
8f52599c4c6c some simplifications and uniformisation
aurel
parents: 5215
diff changeset
457 s->plane_height[1] = s->plane_height[2] = avctx->coded_height/2;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
458
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
459 for (i=0; i<4; i++)
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
460 s->stride[i] = s->flip * s->framep[VP56_FRAME_CURRENT]->linesize[i];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
461
5708
8f52599c4c6c some simplifications and uniformisation
aurel
parents: 5215
diff changeset
462 s->mb_width = (avctx->coded_width +15) / 16;
8f52599c4c6c some simplifications and uniformisation
aurel
parents: 5215
diff changeset
463 s->mb_height = (avctx->coded_height+15) / 16;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
464
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
465 if (s->mb_width > 1000 || s->mb_height > 1000) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
466 av_log(avctx, AV_LOG_ERROR, "picture too big\n");
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
467 return -1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
468 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
469
11053
c57e72227d7d Make VP5 and VP6 decoders output a qscale table to allow for more automatic
reimar
parents: 11050
diff changeset
470 s->qscale_table = av_realloc(s->qscale_table, s->mb_width);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
471 s->above_blocks = av_realloc(s->above_blocks,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
472 (4*s->mb_width+6) * sizeof(*s->above_blocks));
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
473 s->macroblocks = av_realloc(s->macroblocks,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
474 s->mb_width*s->mb_height*sizeof(*s->macroblocks));
3715
cdaee53c5da1 replaces back some C code by dsp.put_pixels_tab[0][0] (revert r6231)
aurel
parents: 3706
diff changeset
475 av_free(s->edge_emu_buffer_alloc);
cdaee53c5da1 replaces back some C code by dsp.put_pixels_tab[0][0] (revert r6231)
aurel
parents: 3706
diff changeset
476 s->edge_emu_buffer_alloc = av_malloc(16*stride);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
477 s->edge_emu_buffer = s->edge_emu_buffer_alloc;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
478 if (s->flip < 0)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
479 s->edge_emu_buffer += 15 * stride;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
480
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
481 return 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
482 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
483
12292
d8364962cc4a ff_prefix non static vp56 functions.
alexc
parents: 11665
diff changeset
484 int ff_vp56_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
12294
54583a14a995 10l: missed one reindent.
alexc
parents: 12292
diff changeset
485 AVPacket *avpkt)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
486 {
9356
2983bd7deaf5 fix vp5/vp6 decoding by using new prototype for decode function
aurel
parents: 8782
diff changeset
487 const uint8_t *buf = avpkt->data;
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
488 VP56Context *s = avctx->priv_data;
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
489 AVFrame *const p = s->framep[VP56_FRAME_CURRENT];
9356
2983bd7deaf5 fix vp5/vp6 decoding by using new prototype for decode function
aurel
parents: 8782
diff changeset
490 int remaining_buf_size = avpkt->size;
8782
bf4b7bde40ab vp56: alpha_offset is uninitialized on purpose
aurel
parents: 8718
diff changeset
491 int is_alpha, av_uninit(alpha_offset);
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
492
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
493 if (s->has_alpha) {
11050
170c9ce34d14 vp56: check buffer size to fix a potential segfault
aurel
parents: 10968
diff changeset
494 if (remaining_buf_size < 3)
170c9ce34d14 vp56: check buffer size to fix a potential segfault
aurel
parents: 10968
diff changeset
495 return -1;
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
496 alpha_offset = bytestream_get_be24(&buf);
6756
c00f5cad61cc ensure vp56_decode_frame always return unchanged buf_size
aurel
parents: 6517
diff changeset
497 remaining_buf_size -= 3;
11050
170c9ce34d14 vp56: check buffer size to fix a potential segfault
aurel
parents: 10968
diff changeset
498 if (remaining_buf_size < alpha_offset)
170c9ce34d14 vp56: check buffer size to fix a potential segfault
aurel
parents: 10968
diff changeset
499 return -1;
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
500 }
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
501
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
502 for (is_alpha=0; is_alpha < 1+s->has_alpha; is_alpha++) {
5715
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
503 int mb_row, mb_col, mb_row_flip, mb_offset = 0;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
504 int block, y, uv, stride_y, stride_uv;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
505 int golden_frame = 0;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
506 int res;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
507
5715
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
508 s->modelp = &s->models[is_alpha];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
509
6756
c00f5cad61cc ensure vp56_decode_frame always return unchanged buf_size
aurel
parents: 6517
diff changeset
510 res = s->parse_header(s, buf, remaining_buf_size, &golden_frame);
5715
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
511 if (!res)
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
512 return -1;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
513
5715
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
514 if (!is_alpha) {
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
515 p->reference = 1;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
516 if (avctx->get_buffer(avctx, p) < 0) {
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
517 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
518 return -1;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
519 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
520
5715
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
521 if (res == 2)
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
522 if (vp56_size_changed(avctx)) {
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
523 avctx->release_buffer(avctx, p);
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
524 return -1;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
525 }
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
526 }
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
527
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
528 if (p->key_frame) {
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
529 p->pict_type = FF_I_TYPE;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
530 s->default_models_init(s);
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
531 for (block=0; block<s->mb_height*s->mb_width; block++)
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
532 s->macroblocks[block].type = VP56_MB_INTRA;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
533 } else {
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
534 p->pict_type = FF_P_TYPE;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
535 vp56_parse_mb_type_models(s);
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
536 s->parse_vector_models(s);
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
537 s->mb_type = VP56_MB_INTER_NOVEC_PF;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
538 }
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
539
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
540 s->parse_coeff_models(s);
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
541
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
542 memset(s->prev_dc, 0, sizeof(s->prev_dc));
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
543 s->prev_dc[1][VP56_FRAME_CURRENT] = 128;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
544 s->prev_dc[2][VP56_FRAME_CURRENT] = 128;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
545
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
546 for (block=0; block < 4*s->mb_width+6; block++) {
6795
6c7e7fdedfd3 Add VP56_FRAME_NONE and use VP56_FRAME_CURRENT.
cehoyos
parents: 6756
diff changeset
547 s->above_blocks[block].ref_frame = VP56_FRAME_NONE;
5715
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
548 s->above_blocks[block].dc_coeff = 0;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
549 s->above_blocks[block].not_null_dc = 0;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
550 }
6795
6c7e7fdedfd3 Add VP56_FRAME_NONE and use VP56_FRAME_CURRENT.
cehoyos
parents: 6756
diff changeset
551 s->above_blocks[2*s->mb_width + 2].ref_frame = VP56_FRAME_CURRENT;
6c7e7fdedfd3 Add VP56_FRAME_NONE and use VP56_FRAME_CURRENT.
cehoyos
parents: 6756
diff changeset
552 s->above_blocks[3*s->mb_width + 4].ref_frame = VP56_FRAME_CURRENT;
5715
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
553
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
554 stride_y = p->linesize[0];
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
555 stride_uv = p->linesize[1];
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
556
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
557 if (s->flip < 0)
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
558 mb_offset = 7;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
559
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
560 /* main macroblocks loop */
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
561 for (mb_row=0; mb_row<s->mb_height; mb_row++) {
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
562 if (s->flip < 0)
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
563 mb_row_flip = s->mb_height - mb_row - 1;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
564 else
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
565 mb_row_flip = mb_row;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
566
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
567 for (block=0; block<4; block++) {
6795
6c7e7fdedfd3 Add VP56_FRAME_NONE and use VP56_FRAME_CURRENT.
cehoyos
parents: 6756
diff changeset
568 s->left_block[block].ref_frame = VP56_FRAME_NONE;
5715
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
569 s->left_block[block].dc_coeff = 0;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
570 s->left_block[block].not_null_dc = 0;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
571 }
5716
7577e3036290 simplify
aurel
parents: 5715
diff changeset
572 memset(s->coeff_ctx, 0, sizeof(s->coeff_ctx));
5715
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
573 memset(s->coeff_ctx_last, 24, sizeof(s->coeff_ctx_last));
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
574
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
575 s->above_block_idx[0] = 1;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
576 s->above_block_idx[1] = 2;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
577 s->above_block_idx[2] = 1;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
578 s->above_block_idx[3] = 2;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
579 s->above_block_idx[4] = 2*s->mb_width + 2 + 1;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
580 s->above_block_idx[5] = 3*s->mb_width + 4 + 1;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
581
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
582 s->block_offset[s->frbi] = (mb_row_flip*16 + mb_offset) * stride_y;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
583 s->block_offset[s->srbi] = s->block_offset[s->frbi] + 8*stride_y;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
584 s->block_offset[1] = s->block_offset[0] + 8;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
585 s->block_offset[3] = s->block_offset[2] + 8;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
586 s->block_offset[4] = (mb_row_flip*8 + mb_offset) * stride_uv;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
587 s->block_offset[5] = s->block_offset[4];
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
588
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
589 for (mb_col=0; mb_col<s->mb_width; mb_col++) {
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
590 vp56_decode_mb(s, mb_row, mb_col, is_alpha);
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
591
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
592 for (y=0; y<4; y++) {
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
593 s->above_block_idx[y] += 2;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
594 s->block_offset[y] += 16;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
595 }
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
596
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
597 for (uv=4; uv<6; uv++) {
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
598 s->above_block_idx[uv] += 1;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
599 s->block_offset[uv] += 8;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
600 }
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
601 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
602 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
603
5715
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
604 if (p->key_frame || golden_frame) {
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
605 if (s->framep[VP56_FRAME_GOLDEN]->data[0] &&
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
606 s->framep[VP56_FRAME_GOLDEN] != s->framep[VP56_FRAME_GOLDEN2])
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
607 avctx->release_buffer(avctx, s->framep[VP56_FRAME_GOLDEN]);
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
608 s->framep[VP56_FRAME_GOLDEN] = p;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
609 }
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
610
5715
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
611 if (s->has_alpha) {
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
612 FFSWAP(AVFrame *, s->framep[VP56_FRAME_GOLDEN],
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
613 s->framep[VP56_FRAME_GOLDEN2]);
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
614 buf += alpha_offset;
6756
c00f5cad61cc ensure vp56_decode_frame always return unchanged buf_size
aurel
parents: 6517
diff changeset
615 remaining_buf_size -= alpha_offset;
5715
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
616 }
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
617 }
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
618
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
619 if (s->framep[VP56_FRAME_PREVIOUS] == s->framep[VP56_FRAME_GOLDEN] ||
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
620 s->framep[VP56_FRAME_PREVIOUS] == s->framep[VP56_FRAME_GOLDEN2]) {
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
621 if (s->framep[VP56_FRAME_UNUSED] != s->framep[VP56_FRAME_GOLDEN] &&
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
622 s->framep[VP56_FRAME_UNUSED] != s->framep[VP56_FRAME_GOLDEN2])
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
623 FFSWAP(AVFrame *, s->framep[VP56_FRAME_PREVIOUS],
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
624 s->framep[VP56_FRAME_UNUSED]);
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
625 else
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
626 FFSWAP(AVFrame *, s->framep[VP56_FRAME_PREVIOUS],
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
627 s->framep[VP56_FRAME_UNUSED2]);
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
628 } else if (s->framep[VP56_FRAME_PREVIOUS]->data[0])
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
629 avctx->release_buffer(avctx, s->framep[VP56_FRAME_PREVIOUS]);
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
630 FFSWAP(AVFrame *, s->framep[VP56_FRAME_CURRENT],
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
631 s->framep[VP56_FRAME_PREVIOUS]);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
632
11053
c57e72227d7d Make VP5 and VP6 decoders output a qscale table to allow for more automatic
reimar
parents: 11050
diff changeset
633 p->qstride = 0;
c57e72227d7d Make VP5 and VP6 decoders output a qscale table to allow for more automatic
reimar
parents: 11050
diff changeset
634 p->qscale_table = s->qscale_table;
c57e72227d7d Make VP5 and VP6 decoders output a qscale table to allow for more automatic
reimar
parents: 11050
diff changeset
635 p->qscale_type = FF_QSCALE_TYPE_VP56;
4596
4992cbff45c6 cleanup setting of returned data frame
aurel
parents: 4595
diff changeset
636 *(AVFrame*)data = *p;
4992cbff45c6 cleanup setting of returned data frame
aurel
parents: 4595
diff changeset
637 *data_size = sizeof(AVFrame);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
638
9356
2983bd7deaf5 fix vp5/vp6 decoding by using new prototype for decode function
aurel
parents: 8782
diff changeset
639 return avpkt->size;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
640 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
641
12292
d8364962cc4a ff_prefix non static vp56 functions.
alexc
parents: 11665
diff changeset
642 av_cold void ff_vp56_init(AVCodecContext *avctx, int flip, int has_alpha)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
643 {
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
644 VP56Context *s = avctx->priv_data;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
645 int i;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
646
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
647 s->avctx = avctx;
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
648 avctx->pix_fmt = has_alpha ? PIX_FMT_YUVA420P : PIX_FMT_YUV420P;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
649
5708
8f52599c4c6c some simplifications and uniformisation
aurel
parents: 5215
diff changeset
650 if (avctx->idct_algo == FF_IDCT_AUTO)
8f52599c4c6c some simplifications and uniformisation
aurel
parents: 5215
diff changeset
651 avctx->idct_algo = FF_IDCT_VP3;
8f52599c4c6c some simplifications and uniformisation
aurel
parents: 5215
diff changeset
652 dsputil_init(&s->dsp, avctx);
11665
85ee3d14b906 VP56: move vp56_edge_filter to new VP56DSPContext
mru
parents: 11644
diff changeset
653 ff_vp56dsp_init(&s->vp56dsp, avctx->codec->id);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
654 ff_init_scantable(s->dsp.idct_permutation, &s->scantable,ff_zigzag_direct);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
655
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
656 for (i=0; i<4; i++)
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
657 s->framep[i] = &s->frames[i];
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
658 s->framep[VP56_FRAME_UNUSED] = s->framep[VP56_FRAME_GOLDEN];
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
659 s->framep[VP56_FRAME_UNUSED2] = s->framep[VP56_FRAME_GOLDEN2];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
660 s->edge_emu_buffer_alloc = NULL;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
661
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
662 s->above_blocks = NULL;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
663 s->macroblocks = NULL;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
664 s->quantizer = -1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
665 s->deblock_filtering = 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
666
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
667 s->filter = NULL;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
668
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
669 s->has_alpha = has_alpha;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
670 if (flip) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
671 s->flip = -1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
672 s->frbi = 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
673 s->srbi = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
674 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
675 s->flip = 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
676 s->frbi = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
677 s->srbi = 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
678 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
679 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
680
12292
d8364962cc4a ff_prefix non static vp56 functions.
alexc
parents: 11665
diff changeset
681 av_cold int ff_vp56_free(AVCodecContext *avctx)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
682 {
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
683 VP56Context *s = avctx->priv_data;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
684
11053
c57e72227d7d Make VP5 and VP6 decoders output a qscale table to allow for more automatic
reimar
parents: 11050
diff changeset
685 av_freep(&s->qscale_table);
10968
c1cccc058c7a Use av_freep intead of av_free to free pointers in vp56 context.
reimar
parents: 9356
diff changeset
686 av_freep(&s->above_blocks);
c1cccc058c7a Use av_freep intead of av_free to free pointers in vp56 context.
reimar
parents: 9356
diff changeset
687 av_freep(&s->macroblocks);
c1cccc058c7a Use av_freep intead of av_free to free pointers in vp56 context.
reimar
parents: 9356
diff changeset
688 av_freep(&s->edge_emu_buffer_alloc);
5708
8f52599c4c6c some simplifications and uniformisation
aurel
parents: 5215
diff changeset
689 if (s->framep[VP56_FRAME_GOLDEN]->data[0])
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
690 avctx->release_buffer(avctx, s->framep[VP56_FRAME_GOLDEN]);
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
691 if (s->framep[VP56_FRAME_GOLDEN2]->data[0])
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
692 avctx->release_buffer(avctx, s->framep[VP56_FRAME_GOLDEN2]);
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
693 if (s->framep[VP56_FRAME_PREVIOUS]->data[0])
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
694 avctx->release_buffer(avctx, s->framep[VP56_FRAME_PREVIOUS]);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
695 return 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
696 }