annotate vp6.c @ 3990:746a60ba3177 libavcodec

enable CMOV_IS_FAST as its faster or equal speed on every cpu (duron, athlon, PM, P3) from which ive seen benchmarks, it might be slower on P4 but noone has posted benchmarks ...
author michael
date Wed, 11 Oct 2006 12:23:40 +0000
parents c8c591fe26f8
children 34fdffe98bd0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
1 /**
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
2 * @file vp6.c
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
3 * VP6 compatible video decoder
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
4 *
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
5 * Copyright (C) 2006 Aurelien Jacobs <aurel@gnuage.org>
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
6 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3697
diff changeset
7 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3697
diff changeset
8 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3697
diff changeset
9 * FFmpeg is free software; you can redistribute it and/or
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
10 * modify it under the terms of the GNU Lesser General Public
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
11 * License as published by the Free Software Foundation; either
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
12 * version 2.1 of the License, or (at your option) any later version.
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
13 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3697
diff changeset
14 * FFmpeg is distributed in the hope that it will be useful,
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
17 * Lesser General Public License for more details.
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
18 *
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
19 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3697
diff changeset
20 * License along with FFmpeg; if not, write to the Free Software
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
22 */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
23
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
24 #include <stdlib.h>
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
25 #include <inttypes.h>
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
26
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
27 #include "avcodec.h"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
28 #include "dsputil.h"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
29 #include "bitstream.h"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
30 #include "mpegvideo.h"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
31
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
32 #include "vp56.h"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
33 #include "vp56data.h"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
34 #include "vp6data.h"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
35
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
36
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
37 static int vp6_parse_header(vp56_context_t *s, uint8_t *buf, int buf_size,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
38 int *golden_frame)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
39 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
40 vp56_range_coder_t *c = &s->c;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
41 int parse_filter_info;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
42 int rows, cols;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
43 int res = 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
44
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
45 if (buf[0] & 1)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
46 return 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
47
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
48 s->frames[VP56_FRAME_CURRENT].key_frame = !(buf[0] & 0x80);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
49 vp56_init_dequant(s, (buf[0] >> 1) & 0x3F);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
50
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
51 if (s->frames[VP56_FRAME_CURRENT].key_frame) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
52 if ((buf[1] & 0xFE) != 0x46) /* would be 0x36 for VP61 */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
53 return 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
54 if (buf[1] & 1) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
55 av_log(s->avctx, AV_LOG_ERROR, "interlacing not supported\n");
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
56 return 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
57 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
58
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
59 rows = buf[2]; /* number of stored macroblock rows */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
60 cols = buf[3]; /* number of stored macroblock cols */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
61 /* buf[4] is number of displayed macroblock rows */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
62 /* buf[5] is number of displayed macroblock cols */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
63
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
64 if (16*cols != s->avctx->coded_width ||
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
65 16*rows != s->avctx->coded_height) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
66 avcodec_set_dimensions(s->avctx, 16*cols, 16*rows);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
67 res = 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
68 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
69
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
70 vp56_init_range_decoder(c, buf+6, buf_size-6);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
71 vp56_rac_gets(c, 2);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
72
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
73 parse_filter_info = 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
74 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
75 vp56_init_range_decoder(c, buf+1, buf_size-1);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
76
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
77 *golden_frame = vp56_rac_get(c);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
78 s->deblock_filtering = vp56_rac_get(c);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
79 if (s->deblock_filtering)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
80 vp56_rac_get(c);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
81 parse_filter_info = vp56_rac_get(c);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
82 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
83
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
84 if (parse_filter_info) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
85 if (vp56_rac_get(c)) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
86 s->filter_mode = 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
87 s->sample_variance_threshold = vp56_rac_gets(c, 5);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
88 s->max_vector_length = 2 << vp56_rac_gets(c, 3);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
89 } else if (vp56_rac_get(c)) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
90 s->filter_mode = 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
91 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
92 s->filter_mode = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
93 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
94 s->filter_selection = vp56_rac_gets(c, 4);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
95 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
96
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
97 vp56_rac_get(c);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
98 return res;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
99 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
100
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
101 static void vp6_coeff_order_table_init(vp56_context_t *s)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
102 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
103 int i, pos, idx = 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
104
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
105 s->coeff_index_to_pos[0] = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
106 for (i=0; i<16; i++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
107 for (pos=1; pos<64; pos++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
108 if (s->coeff_reorder[pos] == i)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
109 s->coeff_index_to_pos[idx++] = pos;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
110 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
111
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
112 static void vp6_default_models_init(vp56_context_t *s)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
113 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
114 s->vector_model_dct[0] = 0xA2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
115 s->vector_model_dct[1] = 0xA4;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
116 s->vector_model_sig[0] = 0x80;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
117 s->vector_model_sig[1] = 0x80;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
118
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
119 memcpy(s->mb_types_stats, vp56_def_mb_types_stats, sizeof(s->mb_types_stats));
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
120 memcpy(s->vector_model_fdv, vp6_def_fdv_vector_model, sizeof(s->vector_model_fdv));
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
121 memcpy(s->vector_model_pdv, vp6_def_pdv_vector_model, sizeof(s->vector_model_pdv));
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
122 memcpy(s->coeff_model_runv, vp6_def_runv_coeff_model, sizeof(s->coeff_model_runv));
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
123 memcpy(s->coeff_reorder, vp6_def_coeff_reorder, sizeof(s->coeff_reorder));
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
124
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
125 vp6_coeff_order_table_init(s);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
126 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
127
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
128 static void vp6_parse_vector_models(vp56_context_t *s)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
129 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
130 vp56_range_coder_t *c = &s->c;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
131 int comp, node;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
132
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
133 for (comp=0; comp<2; comp++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
134 if (vp56_rac_get_prob(c, vp6_sig_dct_pct[comp][0]))
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
135 s->vector_model_dct[comp] = vp56_rac_gets_nn(c, 7);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
136 if (vp56_rac_get_prob(c, vp6_sig_dct_pct[comp][1]))
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
137 s->vector_model_sig[comp] = vp56_rac_gets_nn(c, 7);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
138 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
139
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
140 for (comp=0; comp<2; comp++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
141 for (node=0; node<7; node++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
142 if (vp56_rac_get_prob(c, vp6_pdv_pct[comp][node]))
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
143 s->vector_model_pdv[comp][node] = vp56_rac_gets_nn(c, 7);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
144
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
145 for (comp=0; comp<2; comp++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
146 for (node=0; node<8; node++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
147 if (vp56_rac_get_prob(c, vp6_fdv_pct[comp][node]))
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
148 s->vector_model_fdv[comp][node] = vp56_rac_gets_nn(c, 7);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
149 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
150
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
151 static void vp6_parse_coeff_models(vp56_context_t *s)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
152 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
153 vp56_range_coder_t *c = &s->c;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
154 int def_prob[11];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
155 int node, cg, ctx, pos;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
156 int ct; /* code type */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
157 int pt; /* plane type (0 for Y, 1 for U or V) */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
158
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
159 memset(def_prob, 0x80, sizeof(def_prob));
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
160
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
161 for (pt=0; pt<2; pt++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
162 for (node=0; node<11; node++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
163 if (vp56_rac_get_prob(c, vp6_dccv_pct[pt][node])) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
164 def_prob[node] = vp56_rac_gets_nn(c, 7);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
165 s->coeff_model_dccv[pt][node] = def_prob[node];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
166 } else if (s->frames[VP56_FRAME_CURRENT].key_frame) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
167 s->coeff_model_dccv[pt][node] = def_prob[node];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
168 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
169
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
170 if (vp56_rac_get(c)) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
171 for (pos=1; pos<64; pos++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
172 if (vp56_rac_get_prob(c, vp6_coeff_reorder_pct[pos]))
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
173 s->coeff_reorder[pos] = vp56_rac_gets(c, 4);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
174 vp6_coeff_order_table_init(s);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
175 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
176
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
177 for (cg=0; cg<2; cg++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
178 for (node=0; node<14; node++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
179 if (vp56_rac_get_prob(c, vp6_runv_pct[cg][node]))
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
180 s->coeff_model_runv[cg][node] = vp56_rac_gets_nn(c, 7);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
181
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
182 for (ct=0; ct<3; ct++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
183 for (pt=0; pt<2; pt++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
184 for (cg=0; cg<6; cg++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
185 for (node=0; node<11; node++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
186 if (vp56_rac_get_prob(c, vp6_ract_pct[ct][pt][cg][node])) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
187 def_prob[node] = vp56_rac_gets_nn(c, 7);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
188 s->coeff_model_ract[pt][ct][cg][node] = def_prob[node];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
189 } else if (s->frames[VP56_FRAME_CURRENT].key_frame) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
190 s->coeff_model_ract[pt][ct][cg][node] = def_prob[node];
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 /* coeff_model_dcct is a linear combination of coeff_model_dccv */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
194 for (pt=0; pt<2; pt++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
195 for (ctx=0; ctx<3; ctx++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
196 for (node=0; node<5; node++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
197 s->coeff_model_dcct[pt][ctx][node] = clip(((s->coeff_model_dccv[pt][node] * vp6_dccv_lc[ctx][node][0] + 128) >> 8) + vp6_dccv_lc[ctx][node][1], 1, 255);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
198 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
199
3697
596e62da8f29 rename vector to vect to avoid clash with Apple gcc
aurel
parents: 3695
diff changeset
200 static void vp6_parse_vector_adjustment(vp56_context_t *s, vp56_mv_t *vect)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
201 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
202 vp56_range_coder_t *c = &s->c;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
203 int comp;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
204
3697
596e62da8f29 rename vector to vect to avoid clash with Apple gcc
aurel
parents: 3695
diff changeset
205 *vect = (vp56_mv_t) {0,0};
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
206 if (s->vector_candidate_pos < 2)
3697
596e62da8f29 rename vector to vect to avoid clash with Apple gcc
aurel
parents: 3695
diff changeset
207 *vect = s->vector_candidate[0];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
208
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
209 for (comp=0; comp<2; comp++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
210 int i, delta = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
211
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
212 if (vp56_rac_get_prob(c, s->vector_model_dct[comp])) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
213 static const uint8_t prob_order[] = {0, 1, 2, 7, 6, 5, 4};
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
214 for (i=0; i<sizeof(prob_order); i++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
215 int j = prob_order[i];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
216 delta |= vp56_rac_get_prob(c, s->vector_model_fdv[comp][j])<<j;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
217 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
218 if (delta & 0xF0)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
219 delta |= vp56_rac_get_prob(c, s->vector_model_fdv[comp][3])<<3;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
220 else
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
221 delta |= 8;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
222 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
223 delta = vp56_rac_get_tree(c, vp56_pva_tree,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
224 s->vector_model_pdv[comp]);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
225 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
226
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
227 if (delta && vp56_rac_get_prob(c, s->vector_model_sig[comp]))
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
228 delta = -delta;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
229
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
230 if (!comp)
3697
596e62da8f29 rename vector to vect to avoid clash with Apple gcc
aurel
parents: 3695
diff changeset
231 vect->x += delta;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
232 else
3697
596e62da8f29 rename vector to vect to avoid clash with Apple gcc
aurel
parents: 3695
diff changeset
233 vect->y += delta;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
234 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
235 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
236
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
237 static void vp6_parse_coeff(vp56_context_t *s)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
238 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
239 vp56_range_coder_t *c = &s->c;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
240 uint8_t *permute = s->scantable.permutated;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
241 uint8_t *model, *model2, *model3;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
242 int coeff, sign, coeff_idx;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
243 int b, i, cg, idx, ctx;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
244 int pt = 0; /* plane type (0 for Y, 1 for U or V) */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
245
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
246 for (b=0; b<6; b++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
247 int ct = 1; /* code type */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
248 int run = 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
249
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
250 if (b > 3) pt = 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
251
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
252 ctx = s->left_block[vp56_b6to4[b]].not_null_dc
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
253 + s->above_blocks[s->above_block_idx[b]].not_null_dc;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
254 model = s->coeff_model_dccv[pt];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
255 model2 = s->coeff_model_dcct[pt][ctx];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
256
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
257 for (coeff_idx=0; coeff_idx<64; ) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
258 if ((coeff_idx>1 && ct==0) || vp56_rac_get_prob(c, model2[0])) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
259 /* parse a coeff */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
260 if (coeff_idx == 0) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
261 s->left_block[vp56_b6to4[b]].not_null_dc = 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
262 s->above_blocks[s->above_block_idx[b]].not_null_dc = 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
263 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
264
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
265 if (vp56_rac_get_prob(c, model2[2])) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
266 if (vp56_rac_get_prob(c, model2[3])) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
267 idx = vp56_rac_get_tree(c, vp56_pc_tree, model);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
268 coeff = vp56_coeff_bias[idx];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
269 for (i=vp56_coeff_bit_length[idx]; i>=0; i--)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
270 coeff += vp56_rac_get_prob(c, vp56_coeff_parse_table[idx][i]) << i;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
271 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
272 if (vp56_rac_get_prob(c, model2[4]))
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
273 coeff = 3 + vp56_rac_get_prob(c, model[5]);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
274 else
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
275 coeff = 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
276 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
277 ct = 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
278 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
279 ct = 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
280 coeff = 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
281 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
282 sign = vp56_rac_get(c);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
283 coeff = (coeff ^ -sign) + sign;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
284 if (coeff_idx)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
285 coeff *= s->dequant_ac;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
286 idx = s->coeff_index_to_pos[coeff_idx];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
287 s->block_coeff[b][permute[idx]] = coeff;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
288 run = 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
289 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
290 /* parse a run */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
291 ct = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
292 if (coeff_idx == 0) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
293 s->left_block[vp56_b6to4[b]].not_null_dc = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
294 s->above_blocks[s->above_block_idx[b]].not_null_dc = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
295 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
296 if (!vp56_rac_get_prob(c, model2[1]))
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
297 break;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
298
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
299 model3 = s->coeff_model_runv[coeff_idx >= 6];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
300 run = vp56_rac_get_tree(c, vp6_pcr_tree, model3);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
301 if (!run)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
302 for (run=9, i=0; i<6; i++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
303 run += vp56_rac_get_prob(c, model3[i+8]) << i;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
304 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
305 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
306
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
307 cg = vp6_coeff_groups[coeff_idx+=run];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
308 model = model2 = s->coeff_model_ract[pt][ct][cg];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
309 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
310 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
311 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
312
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
313 static int vp6_adjust(int v, int t)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
314 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
315 int V = v, s = v >> 31;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
316 V ^= s;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
317 V -= s;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
318 if (V-t-1 >= (unsigned)(t-1))
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
319 return v;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
320 V = 2*t - V;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
321 V += s;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
322 V ^= s;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
323 return V;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
324 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
325
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
326 static int vp6_block_variance(uint8_t *src, int stride)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
327 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
328 int sum = 0, square_sum = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
329 int y, x;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
330
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
331 for (y=0; y<8; y+=2) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
332 for (x=0; x<8; x+=2) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
333 sum += src[x];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
334 square_sum += src[x]*src[x];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
335 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
336 src += 2*stride;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
337 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
338 return (16*square_sum - sum*sum) / (16*16);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
339 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
340
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
341 static void vp6_filter_hv2(vp56_context_t *s, uint8_t *dst, uint8_t *src,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
342 int stride, int delta, int16_t weight)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
343 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
344 s->dsp.put_pixels_tab[1][0](dst, src, stride, 8);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
345 s->dsp.biweight_h264_pixels_tab[3](dst, src+delta, stride, 2,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
346 8-weight, weight, 0);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
347 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
348
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
349 static void vp6_filter_hv4(uint8_t *dst, uint8_t *src, int stride,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
350 int delta, const int16_t *weights)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
351 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
352 int x, y;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
353
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
354 for (y=0; y<8; y++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
355 for (x=0; x<8; x++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
356 dst[x] = clip_uint8(( src[x-delta ] * weights[0]
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
357 + src[x ] * weights[1]
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
358 + src[x+delta ] * weights[2]
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
359 + src[x+2*delta] * weights[3] + 64) >> 7);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
360 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
361 src += stride;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
362 dst += stride;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
363 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
364 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
365
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
366 static void vp6_filter_diag2(vp56_context_t *s, uint8_t *dst, uint8_t *src,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
367 int stride, int h_weight, int v_weight)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
368 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
369 uint8_t *tmp = s->edge_emu_buffer+16;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
370 int x, xmax;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
371
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
372 s->dsp.put_pixels_tab[1][0](tmp, src, stride, 8);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
373 s->dsp.biweight_h264_pixels_tab[3](tmp, src+1, stride, 2,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
374 8-h_weight, h_weight, 0);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
375 /* we need a 8x9 block to do vertical filter, so compute one more line */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
376 for (x=8*stride, xmax=x+8; x<xmax; x++)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
377 tmp[x] = (src[x]*(8-h_weight) + src[x+1]*h_weight + 4) >> 3;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
378
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
379 s->dsp.put_pixels_tab[1][0](dst, tmp, stride, 8);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
380 s->dsp.biweight_h264_pixels_tab[3](dst, tmp+stride, stride, 2,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
381 8-v_weight, v_weight, 0);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
382 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
383
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
384 static void vp6_filter_diag4(uint8_t *dst, uint8_t *src, int stride,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
385 const int16_t *h_weights,const int16_t *v_weights)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
386 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
387 int x, y;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
388 int tmp[8*11];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
389 int *t = tmp;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
390
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
391 src -= stride;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
392
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
393 for (y=0; y<11; y++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
394 for (x=0; x<8; x++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
395 t[x] = clip_uint8(( src[x-1] * h_weights[0]
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
396 + src[x ] * h_weights[1]
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
397 + src[x+1] * h_weights[2]
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
398 + src[x+2] * h_weights[3] + 64) >> 7);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
399 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
400 src += stride;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
401 t += 8;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
402 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
403
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
404 t = tmp + 8;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
405 for (y=0; y<8; y++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
406 for (x=0; x<8; x++) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
407 dst[x] = clip_uint8(( t[x-8 ] * v_weights[0]
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
408 + t[x ] * v_weights[1]
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
409 + t[x+8 ] * v_weights[2]
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
410 + t[x+16] * v_weights[3] + 64) >> 7);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
411 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
412 dst += stride;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
413 t += 8;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
414 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
415 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
416
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
417 static void vp6_filter(vp56_context_t *s, uint8_t *dst, uint8_t *src,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
418 int offset1, int offset2, int stride,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
419 vp56_mv_t mv, int mask, int select, int luma)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
420 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
421 int filter4 = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
422 int x8 = mv.x & mask;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
423 int y8 = mv.y & mask;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
424
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
425 if (luma) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
426 x8 *= 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
427 y8 *= 2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
428 filter4 = s->filter_mode;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
429 if (filter4 == 2) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
430 if (s->max_vector_length &&
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
431 (ABS(mv.x) > s->max_vector_length ||
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
432 ABS(mv.y) > s->max_vector_length)) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
433 filter4 = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
434 } else if (!s->sample_variance_threshold
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
435 || (vp6_block_variance(src+offset1, stride)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
436 < s->sample_variance_threshold)) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
437 filter4 = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
438 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
439 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
440 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
441
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
442 if ((y8 && (offset2-offset1)*s->flip<0) || (!y8 && offset1 > offset2)) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
443 offset1 = offset2;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
444 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
445
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
446 if (filter4) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
447 if (!y8) { /* left or right combine */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
448 vp6_filter_hv4(dst, src+offset1, stride, 1,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
449 vp6_block_copy_filter[select][x8]);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
450 } else if (!x8) { /* above or below combine */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
451 vp6_filter_hv4(dst, src+offset1, stride, stride,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
452 vp6_block_copy_filter[select][y8]);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
453 } else if ((mv.x^mv.y) >> 31) { /* lower-left or upper-right combine */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
454 vp6_filter_diag4(dst, src+offset1-1, stride,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
455 vp6_block_copy_filter[select][x8],
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
456 vp6_block_copy_filter[select][y8]);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
457 } else { /* lower-right or upper-left combine */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
458 vp6_filter_diag4(dst, src+offset1, stride,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
459 vp6_block_copy_filter[select][x8],
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
460 vp6_block_copy_filter[select][y8]);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
461 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
462 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
463 if (!y8) { /* left or right combine */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
464 vp6_filter_hv2(s, dst, src+offset1, stride, 1, x8);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
465 } else if (!x8) { /* above or below combine */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
466 vp6_filter_hv2(s, dst, src+offset1, stride, stride, y8);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
467 } else if ((mv.x^mv.y) >> 31) { /* lower-left or upper-right combine */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
468 vp6_filter_diag2(s, dst, src+offset1-1, stride, x8, y8);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
469 } else { /* lower-right or upper-left combine */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
470 vp6_filter_diag2(s, dst, src+offset1, stride, x8, y8);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
471 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
472 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
473 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
474
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
475 static int vp6_decode_init(AVCodecContext *avctx)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
476 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
477 vp56_context_t *s = avctx->priv_data;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
478
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
479 vp56_init(s, avctx, avctx->codec->id == CODEC_ID_VP6);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
480 s->vp56_coord_div = vp6_coord_div;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
481 s->parse_vector_adjustment = vp6_parse_vector_adjustment;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
482 s->adjust = vp6_adjust;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
483 s->filter = vp6_filter;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
484 s->parse_coeff = vp6_parse_coeff;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
485 s->default_models_init = vp6_default_models_init;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
486 s->parse_vector_models = vp6_parse_vector_models;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
487 s->parse_coeff_models = vp6_parse_coeff_models;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
488 s->parse_header = vp6_parse_header;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
489
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
490 return 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
491 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
492
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
493 AVCodec vp6_decoder = {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
494 "vp6",
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
495 CODEC_TYPE_VIDEO,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
496 CODEC_ID_VP6,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
497 sizeof(vp56_context_t),
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
498 vp6_decode_init,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
499 NULL,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
500 vp56_free,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
501 vp56_decode_frame,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
502 };
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
503
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
504 /* flash version, not flipped upside-down */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
505 AVCodec vp6f_decoder = {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
506 "vp6f",
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
507 CODEC_TYPE_VIDEO,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
508 CODEC_ID_VP6F,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
509 sizeof(vp56_context_t),
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
510 vp6_decode_init,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
511 NULL,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
512 vp56_free,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
513 vp56_decode_frame,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
514 };