annotate vp56.c @ 11560:8a4984c5cacc libavcodec

Define AVMediaType enum, and use it instead of enum CodecType, which is deprecated and will be dropped at the next major bump.
author stefano
date Tue, 30 Mar 2010 23:30:55 +0000
parents 7d9a1a807e91
children 7dd2a45249a9
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 /**
8718
e9d9d946f213 Use full internal pathname in doxygen @file directives.
diego
parents: 8329
diff changeset
2 * @file libavcodec/vp56.c
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
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
31 void 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_edge_filter(VP56Context *s, uint8_t *yuv,
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
304 int pix_inc, int line_inc, int t)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
305 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
306 int pix2_inc = 2 * pix_inc;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
307 int i, v;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
308
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
309 for (i=0; i<12; i++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
310 v = (yuv[-pix2_inc] + 3*(yuv[0]-yuv[-pix_inc]) - yuv[pix_inc] + 4) >>3;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
311 v = s->adjust(v, t);
4594
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4484
diff changeset
312 yuv[-pix_inc] = av_clip_uint8(yuv[-pix_inc] + v);
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4484
diff changeset
313 yuv[0] = av_clip_uint8(yuv[0] - v);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
314 yuv += line_inc;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
315 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
316 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
317
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
318 static void vp56_deblock_filter(VP56Context *s, uint8_t *yuv,
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
319 int stride, int dx, int dy)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
320 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
321 int t = vp56_filter_threshold[s->quantizer];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
322 if (dx) vp56_edge_filter(s, yuv + 10-dx , 1, stride, t);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
323 if (dy) vp56_edge_filter(s, yuv + stride*(10-dy), stride, 1, t);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
324 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
325
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
326 static void vp56_mc(VP56Context *s, int b, int plane, uint8_t *src,
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
327 int stride, int x, int y)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
328 {
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
329 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
330 uint8_t *src_block;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
331 int src_offset;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
332 int overlap_offset = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
333 int mask = s->vp56_coord_div[b] - 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
334 int deblock_filtering = s->deblock_filtering;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
335 int dx;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
336 int dy;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
337
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
338 if (s->avctx->skip_loop_filter >= AVDISCARD_ALL ||
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
339 (s->avctx->skip_loop_filter >= AVDISCARD_NONKEY
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
340 && !s->framep[VP56_FRAME_CURRENT]->key_frame))
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
341 deblock_filtering = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
342
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
343 dx = s->mv[b].x / s->vp56_coord_div[b];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
344 dy = s->mv[b].y / s->vp56_coord_div[b];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
345
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
346 if (b >= 4) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
347 x /= 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
348 y /= 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
349 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
350 x += dx - 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
351 y += dy - 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
352
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
353 if (x<0 || x+12>=s->plane_width[plane] ||
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
354 y<0 || y+12>=s->plane_height[plane]) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
355 ff_emulated_edge_mc(s->edge_emu_buffer,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
356 src + s->block_offset[b] + (dy-2)*stride + (dx-2),
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
357 stride, 12, 12, x, y,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
358 s->plane_width[plane],
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
359 s->plane_height[plane]);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
360 src_block = s->edge_emu_buffer;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
361 src_offset = 2 + 2*stride;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
362 } 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
363 /* 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
364 /* 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
365 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
366 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
367 stride, 12);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
368 src_block = s->edge_emu_buffer;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
369 src_offset = 2 + 2*stride;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
370 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
371 src_block = src;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
372 src_offset = s->block_offset[b] + dy*stride + dx;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
373 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
374
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
375 if (deblock_filtering)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
376 vp56_deblock_filter(s, src_block, stride, dx&7, dy&7);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
377
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
378 if (s->mv[b].x & mask)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
379 overlap_offset += (s->mv[b].x > 0) ? 1 : -1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
380 if (s->mv[b].y & mask)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
381 overlap_offset += (s->mv[b].y > 0) ? stride : -stride;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
382
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
383 if (overlap_offset) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
384 if (s->filter)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
385 s->filter(s, dst, src_block, src_offset, src_offset+overlap_offset,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
386 stride, s->mv[b], mask, s->filter_selection, b<4);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
387 else
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
388 s->dsp.put_no_rnd_pixels_l2[1](dst, src_block+src_offset,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
389 src_block+src_offset+overlap_offset,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
390 stride, 8);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
391 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
392 s->dsp.put_pixels_tab[1][0](dst, src_block+src_offset, stride, 8);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
393 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
394 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
395
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
396 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
397 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
398 AVFrame *frame_current, *frame_ref;
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
399 VP56mb mb_type;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
400 VP56Frame ref_frame;
5717
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
401 int b, ab, b_max, plane, off;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
402
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
403 if (s->framep[VP56_FRAME_CURRENT]->key_frame)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
404 mb_type = VP56_MB_INTRA;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
405 else
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
406 mb_type = vp56_decode_mv(s, row, col);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
407 ref_frame = vp56_reference_frame[mb_type];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
408
8288
800444234375 clear_block mmx
lorenm
parents: 6795
diff changeset
409 s->dsp.clear_blocks(*s->block_coeff);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
410
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
411 s->parse_coeff(s);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
412
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
413 vp56_add_predictors_dc(s, ref_frame);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
414
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
415 frame_current = s->framep[VP56_FRAME_CURRENT];
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
416 frame_ref = s->framep[ref_frame];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
417
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
418 ab = 6*is_alpha;
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
419 b_max = 6 - 2*is_alpha;
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
420
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
421 switch (mb_type) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
422 case VP56_MB_INTRA:
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
423 for (b=0; b<b_max; b++) {
5717
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
424 plane = vp56_b2p[b+ab];
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
425 s->dsp.idct_put(frame_current->data[plane] + s->block_offset[b],
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
426 s->stride[plane], s->block_coeff[b]);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
427 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
428 break;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
429
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
430 case VP56_MB_INTER_NOVEC_PF:
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
431 case VP56_MB_INTER_NOVEC_GF:
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
432 for (b=0; b<b_max; b++) {
5717
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
433 plane = vp56_b2p[b+ab];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
434 off = s->block_offset[b];
5717
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
435 s->dsp.put_pixels_tab[1][0](frame_current->data[plane] + off,
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
436 frame_ref->data[plane] + off,
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
437 s->stride[plane], 8);
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
438 s->dsp.idct_add(frame_current->data[plane] + off,
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
439 s->stride[plane], s->block_coeff[b]);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
440 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
441 break;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
442
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
443 case VP56_MB_INTER_DELTA_PF:
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
444 case VP56_MB_INTER_V1_PF:
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
445 case VP56_MB_INTER_V2_PF:
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
446 case VP56_MB_INTER_DELTA_GF:
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
447 case VP56_MB_INTER_4V:
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
448 case VP56_MB_INTER_V1_GF:
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
449 case VP56_MB_INTER_V2_GF:
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
450 for (b=0; b<b_max; b++) {
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
451 int x_off = b==1 || b==3 ? 8 : 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
452 int y_off = b==2 || b==3 ? 8 : 0;
5717
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
453 plane = vp56_b2p[b+ab];
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
454 vp56_mc(s, b, plane, frame_ref->data[plane], s->stride[plane],
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
455 16*col+x_off, 16*row+y_off);
5717
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
456 s->dsp.idct_add(frame_current->data[plane] + s->block_offset[b],
c5ec68f922d8 consistent spelling: plan => plane
aurel
parents: 5716
diff changeset
457 s->stride[plane], s->block_coeff[b]);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
458 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
459 break;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
460 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
461 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
462
5708
8f52599c4c6c some simplifications and uniformisation
aurel
parents: 5215
diff changeset
463 static int vp56_size_changed(AVCodecContext *avctx)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
464 {
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
465 VP56Context *s = avctx->priv_data;
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
466 int stride = s->framep[VP56_FRAME_CURRENT]->linesize[0];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
467 int i;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
468
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
469 s->plane_width[0] = s->plane_width[3] = avctx->coded_width;
5708
8f52599c4c6c some simplifications and uniformisation
aurel
parents: 5215
diff changeset
470 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
471 s->plane_height[0] = s->plane_height[3] = avctx->coded_height;
5708
8f52599c4c6c some simplifications and uniformisation
aurel
parents: 5215
diff changeset
472 s->plane_height[1] = s->plane_height[2] = avctx->coded_height/2;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
473
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
474 for (i=0; i<4; i++)
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
475 s->stride[i] = s->flip * s->framep[VP56_FRAME_CURRENT]->linesize[i];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
476
5708
8f52599c4c6c some simplifications and uniformisation
aurel
parents: 5215
diff changeset
477 s->mb_width = (avctx->coded_width +15) / 16;
8f52599c4c6c some simplifications and uniformisation
aurel
parents: 5215
diff changeset
478 s->mb_height = (avctx->coded_height+15) / 16;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
479
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
480 if (s->mb_width > 1000 || s->mb_height > 1000) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
481 av_log(avctx, AV_LOG_ERROR, "picture too big\n");
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
482 return -1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
483 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
484
11053
c57e72227d7d Make VP5 and VP6 decoders output a qscale table to allow for more automatic
reimar
parents: 11050
diff changeset
485 s->qscale_table = av_realloc(s->qscale_table, s->mb_width);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
486 s->above_blocks = av_realloc(s->above_blocks,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
487 (4*s->mb_width+6) * sizeof(*s->above_blocks));
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
488 s->macroblocks = av_realloc(s->macroblocks,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
489 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
490 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
491 s->edge_emu_buffer_alloc = av_malloc(16*stride);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
492 s->edge_emu_buffer = s->edge_emu_buffer_alloc;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
493 if (s->flip < 0)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
494 s->edge_emu_buffer += 15 * stride;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
495
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
496 return 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
497 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
498
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
499 int vp56_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
9356
2983bd7deaf5 fix vp5/vp6 decoding by using new prototype for decode function
aurel
parents: 8782
diff changeset
500 AVPacket *avpkt)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
501 {
9356
2983bd7deaf5 fix vp5/vp6 decoding by using new prototype for decode function
aurel
parents: 8782
diff changeset
502 const uint8_t *buf = avpkt->data;
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
503 VP56Context *s = avctx->priv_data;
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
504 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
505 int remaining_buf_size = avpkt->size;
8782
bf4b7bde40ab vp56: alpha_offset is uninitialized on purpose
aurel
parents: 8718
diff changeset
506 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
507
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
508 if (s->has_alpha) {
11050
170c9ce34d14 vp56: check buffer size to fix a potential segfault
aurel
parents: 10968
diff changeset
509 if (remaining_buf_size < 3)
170c9ce34d14 vp56: check buffer size to fix a potential segfault
aurel
parents: 10968
diff changeset
510 return -1;
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
511 alpha_offset = bytestream_get_be24(&buf);
6756
c00f5cad61cc ensure vp56_decode_frame always return unchanged buf_size
aurel
parents: 6517
diff changeset
512 remaining_buf_size -= 3;
11050
170c9ce34d14 vp56: check buffer size to fix a potential segfault
aurel
parents: 10968
diff changeset
513 if (remaining_buf_size < alpha_offset)
170c9ce34d14 vp56: check buffer size to fix a potential segfault
aurel
parents: 10968
diff changeset
514 return -1;
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
515 }
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
516
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
517 for (is_alpha=0; is_alpha < 1+s->has_alpha; is_alpha++) {
5715
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
518 int mb_row, mb_col, mb_row_flip, mb_offset = 0;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
519 int block, y, uv, stride_y, stride_uv;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
520 int golden_frame = 0;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
521 int res;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
522
5715
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
523 s->modelp = &s->models[is_alpha];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
524
6756
c00f5cad61cc ensure vp56_decode_frame always return unchanged buf_size
aurel
parents: 6517
diff changeset
525 res = s->parse_header(s, buf, remaining_buf_size, &golden_frame);
5715
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
526 if (!res)
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
527 return -1;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
528
5715
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
529 if (!is_alpha) {
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
530 p->reference = 1;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
531 if (avctx->get_buffer(avctx, p) < 0) {
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
532 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
533 return -1;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
534 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
535
5715
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
536 if (res == 2)
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
537 if (vp56_size_changed(avctx)) {
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
538 avctx->release_buffer(avctx, p);
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
539 return -1;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
540 }
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
541 }
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
542
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
543 if (p->key_frame) {
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
544 p->pict_type = FF_I_TYPE;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
545 s->default_models_init(s);
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
546 for (block=0; block<s->mb_height*s->mb_width; block++)
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
547 s->macroblocks[block].type = VP56_MB_INTRA;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
548 } else {
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
549 p->pict_type = FF_P_TYPE;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
550 vp56_parse_mb_type_models(s);
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
551 s->parse_vector_models(s);
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
552 s->mb_type = VP56_MB_INTER_NOVEC_PF;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
553 }
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
554
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
555 s->parse_coeff_models(s);
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
556
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
557 memset(s->prev_dc, 0, sizeof(s->prev_dc));
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
558 s->prev_dc[1][VP56_FRAME_CURRENT] = 128;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
559 s->prev_dc[2][VP56_FRAME_CURRENT] = 128;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
560
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
561 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
562 s->above_blocks[block].ref_frame = VP56_FRAME_NONE;
5715
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
563 s->above_blocks[block].dc_coeff = 0;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
564 s->above_blocks[block].not_null_dc = 0;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
565 }
6795
6c7e7fdedfd3 Add VP56_FRAME_NONE and use VP56_FRAME_CURRENT.
cehoyos
parents: 6756
diff changeset
566 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
567 s->above_blocks[3*s->mb_width + 4].ref_frame = VP56_FRAME_CURRENT;
5715
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
568
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
569 stride_y = p->linesize[0];
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
570 stride_uv = p->linesize[1];
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
571
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
572 if (s->flip < 0)
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
573 mb_offset = 7;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
574
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
575 /* main macroblocks loop */
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
576 for (mb_row=0; mb_row<s->mb_height; mb_row++) {
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
577 if (s->flip < 0)
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
578 mb_row_flip = s->mb_height - mb_row - 1;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
579 else
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
580 mb_row_flip = mb_row;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
581
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
582 for (block=0; block<4; block++) {
6795
6c7e7fdedfd3 Add VP56_FRAME_NONE and use VP56_FRAME_CURRENT.
cehoyos
parents: 6756
diff changeset
583 s->left_block[block].ref_frame = VP56_FRAME_NONE;
5715
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
584 s->left_block[block].dc_coeff = 0;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
585 s->left_block[block].not_null_dc = 0;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
586 }
5716
7577e3036290 simplify
aurel
parents: 5715
diff changeset
587 memset(s->coeff_ctx, 0, sizeof(s->coeff_ctx));
5715
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
588 memset(s->coeff_ctx_last, 24, sizeof(s->coeff_ctx_last));
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
589
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
590 s->above_block_idx[0] = 1;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
591 s->above_block_idx[1] = 2;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
592 s->above_block_idx[2] = 1;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
593 s->above_block_idx[3] = 2;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
594 s->above_block_idx[4] = 2*s->mb_width + 2 + 1;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
595 s->above_block_idx[5] = 3*s->mb_width + 4 + 1;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
596
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
597 s->block_offset[s->frbi] = (mb_row_flip*16 + mb_offset) * stride_y;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
598 s->block_offset[s->srbi] = s->block_offset[s->frbi] + 8*stride_y;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
599 s->block_offset[1] = s->block_offset[0] + 8;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
600 s->block_offset[3] = s->block_offset[2] + 8;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
601 s->block_offset[4] = (mb_row_flip*8 + mb_offset) * stride_uv;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
602 s->block_offset[5] = s->block_offset[4];
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
603
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
604 for (mb_col=0; mb_col<s->mb_width; mb_col++) {
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
605 vp56_decode_mb(s, mb_row, mb_col, is_alpha);
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
606
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
607 for (y=0; y<4; y++) {
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
608 s->above_block_idx[y] += 2;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
609 s->block_offset[y] += 16;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
610 }
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
611
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
612 for (uv=4; uv<6; uv++) {
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
613 s->above_block_idx[uv] += 1;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
614 s->block_offset[uv] += 8;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
615 }
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
616 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
617 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
618
5715
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
619 if (p->key_frame || golden_frame) {
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
620 if (s->framep[VP56_FRAME_GOLDEN]->data[0] &&
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
621 s->framep[VP56_FRAME_GOLDEN] != s->framep[VP56_FRAME_GOLDEN2])
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
622 avctx->release_buffer(avctx, s->framep[VP56_FRAME_GOLDEN]);
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
623 s->framep[VP56_FRAME_GOLDEN] = p;
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
624 }
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
625
5715
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
626 if (s->has_alpha) {
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
627 FFSWAP(AVFrame *, s->framep[VP56_FRAME_GOLDEN],
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
628 s->framep[VP56_FRAME_GOLDEN2]);
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
629 buf += alpha_offset;
6756
c00f5cad61cc ensure vp56_decode_frame always return unchanged buf_size
aurel
parents: 6517
diff changeset
630 remaining_buf_size -= alpha_offset;
5715
fbd55dbbf809 cosmetic: indent
aurel
parents: 5714
diff changeset
631 }
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
632 }
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
633
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
634 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
635 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
636 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
637 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
638 FFSWAP(AVFrame *, s->framep[VP56_FRAME_PREVIOUS],
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
639 s->framep[VP56_FRAME_UNUSED]);
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
640 else
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
641 FFSWAP(AVFrame *, s->framep[VP56_FRAME_PREVIOUS],
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
642 s->framep[VP56_FRAME_UNUSED2]);
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
643 } 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
644 avctx->release_buffer(avctx, s->framep[VP56_FRAME_PREVIOUS]);
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
645 FFSWAP(AVFrame *, s->framep[VP56_FRAME_CURRENT],
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
646 s->framep[VP56_FRAME_PREVIOUS]);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
647
11053
c57e72227d7d Make VP5 and VP6 decoders output a qscale table to allow for more automatic
reimar
parents: 11050
diff changeset
648 p->qstride = 0;
c57e72227d7d Make VP5 and VP6 decoders output a qscale table to allow for more automatic
reimar
parents: 11050
diff changeset
649 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
650 p->qscale_type = FF_QSCALE_TYPE_VP56;
4596
4992cbff45c6 cleanup setting of returned data frame
aurel
parents: 4595
diff changeset
651 *(AVFrame*)data = *p;
4992cbff45c6 cleanup setting of returned data frame
aurel
parents: 4595
diff changeset
652 *data_size = sizeof(AVFrame);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
653
9356
2983bd7deaf5 fix vp5/vp6 decoding by using new prototype for decode function
aurel
parents: 8782
diff changeset
654 return avpkt->size;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
655 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
656
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6297
diff changeset
657 av_cold void vp56_init(AVCodecContext *avctx, int flip, int has_alpha)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
658 {
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
659 VP56Context *s = avctx->priv_data;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
660 int i;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
661
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
662 s->avctx = avctx;
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
663 avctx->pix_fmt = has_alpha ? PIX_FMT_YUVA420P : PIX_FMT_YUV420P;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
664
5708
8f52599c4c6c some simplifications and uniformisation
aurel
parents: 5215
diff changeset
665 if (avctx->idct_algo == FF_IDCT_AUTO)
8f52599c4c6c some simplifications and uniformisation
aurel
parents: 5215
diff changeset
666 avctx->idct_algo = FF_IDCT_VP3;
8f52599c4c6c some simplifications and uniformisation
aurel
parents: 5215
diff changeset
667 dsputil_init(&s->dsp, avctx);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
668 ff_init_scantable(s->dsp.idct_permutation, &s->scantable,ff_zigzag_direct);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
669
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
670 for (i=0; i<4; i++)
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
671 s->framep[i] = &s->frames[i];
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
672 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
673 s->framep[VP56_FRAME_UNUSED2] = s->framep[VP56_FRAME_GOLDEN2];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
674 s->edge_emu_buffer_alloc = NULL;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
675
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
676 s->above_blocks = NULL;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
677 s->macroblocks = NULL;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
678 s->quantizer = -1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
679 s->deblock_filtering = 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
680
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
681 s->filter = NULL;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
682
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
683 s->has_alpha = has_alpha;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
684 if (flip) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
685 s->flip = -1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
686 s->frbi = 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
687 s->srbi = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
688 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
689 s->flip = 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
690 s->frbi = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
691 s->srbi = 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
692 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
693 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
694
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6297
diff changeset
695 av_cold int vp56_free(AVCodecContext *avctx)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
696 {
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 8288
diff changeset
697 VP56Context *s = avctx->priv_data;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
698
11053
c57e72227d7d Make VP5 and VP6 decoders output a qscale table to allow for more automatic
reimar
parents: 11050
diff changeset
699 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
700 av_freep(&s->above_blocks);
c1cccc058c7a Use av_freep intead of av_free to free pointers in vp56 context.
reimar
parents: 9356
diff changeset
701 av_freep(&s->macroblocks);
c1cccc058c7a Use av_freep intead of av_free to free pointers in vp56 context.
reimar
parents: 9356
diff changeset
702 av_freep(&s->edge_emu_buffer_alloc);
5708
8f52599c4c6c some simplifications and uniformisation
aurel
parents: 5215
diff changeset
703 if (s->framep[VP56_FRAME_GOLDEN]->data[0])
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
704 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
705 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
706 avctx->release_buffer(avctx, s->framep[VP56_FRAME_GOLDEN2]);
4595
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
707 if (s->framep[VP56_FRAME_PREVIOUS]->data[0])
340c876320eb Use pointers to avoid copying AVFrame.
aurel
parents: 4594
diff changeset
708 avctx->release_buffer(avctx, s->framep[VP56_FRAME_PREVIOUS]);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
709 return 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
710 }