annotate vp8.c @ 12242:a2f6d8c61b9c libavcodec

VP8: fix broken sign bias code in MV pred Apparently the official conformance test vectors don't test this feature, even though libvpx uses it.
author darkshikari
date Fri, 23 Jul 2010 06:41:35 +0000
parents c7f6ddcc5c01
children 788445bf10c0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1 /**
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
2 * VP8 compatible video decoder
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
3 *
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
4 * Copyright (C) 2010 David Conrad
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
5 * Copyright (C) 2010 Ronald S. Bultje
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
6 *
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
7 * This file is part of FFmpeg.
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
8 *
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
9 * FFmpeg is free software; you can redistribute it and/or
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
10 * modify it under the terms of the GNU Lesser General Public
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
11 * License as published by the Free Software Foundation; either
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
12 * version 2.1 of the License, or (at your option) any later version.
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
13 *
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
14 * FFmpeg is distributed in the hope that it will be useful,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
17 * Lesser General Public License for more details.
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
18 *
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
19 * You should have received a copy of the GNU Lesser General Public
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
20 * License along with FFmpeg; if not, write to the Free Software
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
22 */
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
23
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
24 #include "avcodec.h"
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
25 #include "vp56.h"
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
26 #include "vp8data.h"
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
27 #include "vp8dsp.h"
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
28 #include "h264pred.h"
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
29 #include "rectangle.h"
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
30
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
31 typedef struct {
12222
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
32 uint8_t filter_level;
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
33 uint8_t inner_limit;
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
34 uint8_t inner_filter;
12222
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
35 } VP8FilterStrength;
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
36
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
37 typedef struct {
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
38 uint8_t skip;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
39 // todo: make it possible to check for at least (i4x4 or split_mv)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
40 // in one op. are others needed?
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
41 uint8_t mode;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
42 uint8_t ref_frame;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
43 uint8_t partitioning;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
44 VP56mv mv;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
45 VP56mv bmv[16];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
46 } VP8Macroblock;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
47
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
48 typedef struct {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
49 AVCodecContext *avctx;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
50 DSPContext dsp;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
51 VP8DSPContext vp8dsp;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
52 H264PredContext hpc;
11974
356b20a6566d VP8 bilinear filter
conrad
parents: 11970
diff changeset
53 vp8_mc_func put_pixels_tab[3][3][3];
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
54 AVFrame frames[4];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
55 AVFrame *framep[4];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
56 uint8_t *edge_emu_buffer;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
57 VP56RangeCoder c; ///< header context, includes mb modes and motion vectors
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
58 int profile;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
59
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
60 int mb_width; /* number of horizontal MB */
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
61 int mb_height; /* number of vertical MB */
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
62 int linesize;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
63 int uvlinesize;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
64
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
65 int keyframe;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
66 int invisible;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
67 int update_last; ///< update VP56_FRAME_PREVIOUS with the current one
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
68 int update_golden; ///< VP56_FRAME_NONE if not updated, or which frame to copy if so
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
69 int update_altref;
12170
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
70 int deblock_filter;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
71
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
72 /**
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
73 * If this flag is not set, all the probability updates
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
74 * are discarded after this frame is decoded.
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
75 */
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
76 int update_probabilities;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
77
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
78 /**
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
79 * All coefficients are contained in separate arith coding contexts.
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
80 * There can be 1, 2, 4, or 8 of these after the header context.
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
81 */
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
82 int num_coeff_partitions;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
83 VP56RangeCoder coeff_partition[8];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
84
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
85 VP8Macroblock *macroblocks;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
86 VP8Macroblock *macroblocks_base;
12222
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
87 VP8FilterStrength *filter_strength;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
88 int mb_stride;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
89
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
90 uint8_t *intra4x4_pred_mode;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
91 uint8_t *intra4x4_pred_mode_base;
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
92 uint8_t *segmentation_map;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
93 int b4_stride;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
94
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
95 /**
12170
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
96 * Cache of the top row needed for intra prediction
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
97 * 16 for luma, 8 for each chroma plane
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
98 */
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
99 uint8_t (*top_border)[16+8+8];
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
100
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
101 /**
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
102 * For coeff decode, we need to know whether the above block had non-zero
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
103 * coefficients. This means for each macroblock, we need data for 4 luma
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
104 * blocks, 2 u blocks, 2 v blocks, and the luma dc block, for a total of 9
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
105 * per macroblock. We keep the last row in top_nnz.
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
106 */
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
107 uint8_t (*top_nnz)[9];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
108 DECLARE_ALIGNED(8, uint8_t, left_nnz)[9];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
109
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
110 /**
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
111 * This is the index plus one of the last non-zero coeff
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
112 * for each of the blocks in the current macroblock.
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
113 * So, 0 -> no coeffs
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
114 * 1 -> dc-only (special transform)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
115 * 2+-> full transform
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
116 */
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
117 DECLARE_ALIGNED(16, uint8_t, non_zero_count_cache)[6][4];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
118 DECLARE_ALIGNED(16, DCTELEM, block)[6][4][16];
12221
45852dac8338 Avoid tracking i4x4 modes in P-frames in VP8
darkshikari
parents: 12220
diff changeset
119 uint8_t intra4x4_pred_mode_mb[16];
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
120
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
121 int chroma_pred_mode; ///< 8x8c pred mode of the current macroblock
12224
5b7d690b761b VP8: Don't store segment in macroblock struct anymore.
darkshikari
parents: 12223
diff changeset
122 int segment; ///< segment of the current macroblock
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
123
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
124 int mbskip_enabled;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
125 int sign_bias[4]; ///< one state [0, 1] per ref frame type
12231
d3f3897ddb5c Smarter VP8 prefetching
darkshikari
parents: 12230
diff changeset
126 int ref_count[3];
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
127
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
128 /**
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
129 * Base parameters for segmentation, i.e. per-macroblock parameters.
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
130 * These must be kept unchanged even if segmentation is not used for
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
131 * a frame, since the values persist between interframes.
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
132 */
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
133 struct {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
134 int enabled;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
135 int absolute_vals;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
136 int update_map;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
137 int8_t base_quant[4];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
138 int8_t filter_level[4]; ///< base loop filter level
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
139 } segmentation;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
140
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
141 /**
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
142 * Macroblocks can have one of 4 different quants in a frame when
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
143 * segmentation is enabled.
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
144 * If segmentation is disabled, only the first segment's values are used.
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
145 */
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
146 struct {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
147 // [0] - DC qmul [1] - AC qmul
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
148 int16_t luma_qmul[2];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
149 int16_t luma_dc_qmul[2]; ///< luma dc-only block quant
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
150 int16_t chroma_qmul[2];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
151 } qmat[4];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
152
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
153 struct {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
154 int simple;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
155 int level;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
156 int sharpness;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
157 } filter;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
158
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
159 struct {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
160 int enabled; ///< whether each mb can have a different strength based on mode/ref
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
161
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
162 /**
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
163 * filter strength adjustment for the following macroblock modes:
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
164 * [0] - i4x4
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
165 * [1] - zero mv
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
166 * [2] - inter modes except for zero or split mv
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
167 * [3] - split mv
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
168 * i16x16 modes never have any adjustment
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
169 */
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
170 int8_t mode[4];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
171
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
172 /**
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
173 * filter strength adjustment for macroblocks that reference:
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
174 * [0] - intra / VP56_FRAME_CURRENT
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
175 * [1] - VP56_FRAME_PREVIOUS
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
176 * [2] - VP56_FRAME_GOLDEN
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
177 * [3] - altref / VP56_FRAME_GOLDEN2
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
178 */
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
179 int8_t ref[4];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
180 } lf_delta;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
181
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
182 /**
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
183 * These are all of the updatable probabilities for binary decisions.
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
184 * They are only implictly reset on keyframes, making it quite likely
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
185 * for an interframe to desync if a prior frame's header was corrupt
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
186 * or missing outright!
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
187 */
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
188 struct {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
189 uint8_t segmentid[3];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
190 uint8_t mbskip;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
191 uint8_t intra;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
192 uint8_t last;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
193 uint8_t golden;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
194 uint8_t pred16x16[4];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
195 uint8_t pred8x8c[3];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
196 uint8_t token[4][8][3][NUM_DCT_TOKENS-1];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
197 uint8_t mvc[2][19];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
198 } prob[2];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
199 } VP8Context;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
200
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
201 #define RL24(p) (AV_RL16(p) + ((p)[2] << 16))
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
202
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
203 static void vp8_decode_flush(AVCodecContext *avctx)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
204 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
205 VP8Context *s = avctx->priv_data;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
206 int i;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
207
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
208 for (i = 0; i < 4; i++)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
209 if (s->frames[i].data[0])
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
210 avctx->release_buffer(avctx, &s->frames[i]);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
211 memset(s->framep, 0, sizeof(s->framep));
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
212
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
213 av_freep(&s->macroblocks_base);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
214 av_freep(&s->intra4x4_pred_mode_base);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
215 av_freep(&s->top_nnz);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
216 av_freep(&s->edge_emu_buffer);
12170
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
217 av_freep(&s->top_border);
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
218 av_freep(&s->segmentation_map);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
219
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
220 s->macroblocks = NULL;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
221 s->intra4x4_pred_mode = NULL;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
222 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
223
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
224 static int update_dimensions(VP8Context *s, int width, int height)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
225 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
226 int i;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
227
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
228 if (avcodec_check_dimensions(s->avctx, width, height))
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
229 return AVERROR_INVALIDDATA;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
230
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
231 vp8_decode_flush(s->avctx);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
232
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
233 avcodec_set_dimensions(s->avctx, width, height);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
234
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
235 s->mb_width = (s->avctx->coded_width +15) / 16;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
236 s->mb_height = (s->avctx->coded_height+15) / 16;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
237
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
238 // we allocate a border around the top/left of intra4x4 modes
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
239 // this is 4 blocks for intra4x4 to keep 4-byte alignment for fill_rectangle
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
240 s->mb_stride = s->mb_width+1;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
241 s->b4_stride = 4*s->mb_stride;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
242
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
243 s->macroblocks_base = av_mallocz((s->mb_stride+s->mb_height*2+2)*sizeof(*s->macroblocks));
12222
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
244 s->filter_strength = av_mallocz(s->mb_stride*sizeof(*s->filter_strength));
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
245 s->intra4x4_pred_mode_base = av_mallocz(s->b4_stride*(4*s->mb_height+1));
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
246 s->top_nnz = av_mallocz(s->mb_width*sizeof(*s->top_nnz));
12170
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
247 s->top_border = av_mallocz((s->mb_width+1)*sizeof(*s->top_border));
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
248 s->segmentation_map = av_mallocz(s->mb_stride*s->mb_height);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
249
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
250 if (!s->macroblocks_base || !s->filter_strength || !s->intra4x4_pred_mode_base ||
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
251 !s->top_nnz || !s->top_border || !s->segmentation_map)
12169
7501f327cfd1 vp8: Check for malloc failure
conrad
parents: 12115
diff changeset
252 return AVERROR(ENOMEM);
7501f327cfd1 vp8: Check for malloc failure
conrad
parents: 12115
diff changeset
253
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
254 s->macroblocks = s->macroblocks_base + 1;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
255 s->intra4x4_pred_mode = s->intra4x4_pred_mode_base + 4 + s->b4_stride;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
256
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
257 memset(s->intra4x4_pred_mode_base, DC_PRED, s->b4_stride);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
258 for (i = 0; i < 4*s->mb_height; i++)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
259 s->intra4x4_pred_mode[i*s->b4_stride-1] = DC_PRED;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
260
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
261 return 0;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
262 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
263
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
264 static void parse_segment_info(VP8Context *s)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
265 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
266 VP56RangeCoder *c = &s->c;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
267 int i;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
268
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
269 s->segmentation.update_map = vp8_rac_get(c);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
270
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
271 if (vp8_rac_get(c)) { // update segment feature data
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
272 s->segmentation.absolute_vals = vp8_rac_get(c);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
273
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
274 for (i = 0; i < 4; i++)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
275 s->segmentation.base_quant[i] = vp8_rac_get_sint(c, 7);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
276
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
277 for (i = 0; i < 4; i++)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
278 s->segmentation.filter_level[i] = vp8_rac_get_sint(c, 6);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
279 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
280 if (s->segmentation.update_map)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
281 for (i = 0; i < 3; i++)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
282 s->prob->segmentid[i] = vp8_rac_get(c) ? vp8_rac_get_uint(c, 8) : 255;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
283 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
284
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
285 static void update_lf_deltas(VP8Context *s)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
286 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
287 VP56RangeCoder *c = &s->c;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
288 int i;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
289
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
290 for (i = 0; i < 4; i++)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
291 s->lf_delta.ref[i] = vp8_rac_get_sint(c, 6);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
292
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
293 for (i = 0; i < 4; i++)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
294 s->lf_delta.mode[i] = vp8_rac_get_sint(c, 6);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
295 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
296
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
297 static int setup_partitions(VP8Context *s, const uint8_t *buf, int buf_size)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
298 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
299 const uint8_t *sizes = buf;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
300 int i;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
301
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
302 s->num_coeff_partitions = 1 << vp8_rac_get_uint(&s->c, 2);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
303
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
304 buf += 3*(s->num_coeff_partitions-1);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
305 buf_size -= 3*(s->num_coeff_partitions-1);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
306 if (buf_size < 0)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
307 return -1;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
308
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
309 for (i = 0; i < s->num_coeff_partitions-1; i++) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
310 int size = RL24(sizes + 3*i);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
311 if (buf_size - size < 0)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
312 return -1;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
313
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
314 vp56_init_range_decoder(&s->coeff_partition[i], buf, size);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
315 buf += size;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
316 buf_size -= size;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
317 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
318 vp56_init_range_decoder(&s->coeff_partition[i], buf, buf_size);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
319
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
320 return 0;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
321 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
322
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
323 static void get_quants(VP8Context *s)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
324 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
325 VP56RangeCoder *c = &s->c;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
326 int i, base_qi;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
327
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
328 int yac_qi = vp8_rac_get_uint(c, 7);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
329 int ydc_delta = vp8_rac_get_sint(c, 4);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
330 int y2dc_delta = vp8_rac_get_sint(c, 4);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
331 int y2ac_delta = vp8_rac_get_sint(c, 4);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
332 int uvdc_delta = vp8_rac_get_sint(c, 4);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
333 int uvac_delta = vp8_rac_get_sint(c, 4);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
334
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
335 for (i = 0; i < 4; i++) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
336 if (s->segmentation.enabled) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
337 base_qi = s->segmentation.base_quant[i];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
338 if (!s->segmentation.absolute_vals)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
339 base_qi += yac_qi;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
340 } else
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
341 base_qi = yac_qi;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
342
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
343 s->qmat[i].luma_qmul[0] = vp8_dc_qlookup[av_clip(base_qi + ydc_delta , 0, 127)];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
344 s->qmat[i].luma_qmul[1] = vp8_ac_qlookup[av_clip(base_qi , 0, 127)];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
345 s->qmat[i].luma_dc_qmul[0] = 2 * vp8_dc_qlookup[av_clip(base_qi + y2dc_delta, 0, 127)];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
346 s->qmat[i].luma_dc_qmul[1] = 155 * vp8_ac_qlookup[av_clip(base_qi + y2ac_delta, 0, 127)] / 100;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
347 s->qmat[i].chroma_qmul[0] = vp8_dc_qlookup[av_clip(base_qi + uvdc_delta, 0, 127)];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
348 s->qmat[i].chroma_qmul[1] = vp8_ac_qlookup[av_clip(base_qi + uvac_delta, 0, 127)];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
349
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
350 s->qmat[i].luma_dc_qmul[1] = FFMAX(s->qmat[i].luma_dc_qmul[1], 8);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
351 s->qmat[i].chroma_qmul[0] = FFMIN(s->qmat[i].chroma_qmul[0], 132);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
352 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
353 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
354
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
355 /**
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
356 * Determine which buffers golden and altref should be updated with after this frame.
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
357 * The spec isn't clear here, so I'm going by my understanding of what libvpx does
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
358 *
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
359 * Intra frames update all 3 references
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
360 * Inter frames update VP56_FRAME_PREVIOUS if the update_last flag is set
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
361 * If the update (golden|altref) flag is set, it's updated with the current frame
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
362 * if update_last is set, and VP56_FRAME_PREVIOUS otherwise.
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
363 * If the flag is not set, the number read means:
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
364 * 0: no update
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
365 * 1: VP56_FRAME_PREVIOUS
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
366 * 2: update golden with altref, or update altref with golden
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
367 */
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
368 static VP56Frame ref_to_update(VP8Context *s, int update, VP56Frame ref)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
369 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
370 VP56RangeCoder *c = &s->c;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
371
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
372 if (update)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
373 return VP56_FRAME_CURRENT;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
374
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
375 switch (vp8_rac_get_uint(c, 2)) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
376 case 1:
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
377 return VP56_FRAME_PREVIOUS;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
378 case 2:
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
379 return (ref == VP56_FRAME_GOLDEN) ? VP56_FRAME_GOLDEN2 : VP56_FRAME_GOLDEN;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
380 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
381 return VP56_FRAME_NONE;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
382 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
383
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
384 static void update_refs(VP8Context *s)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
385 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
386 VP56RangeCoder *c = &s->c;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
387
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
388 int update_golden = vp8_rac_get(c);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
389 int update_altref = vp8_rac_get(c);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
390
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
391 s->update_golden = ref_to_update(s, update_golden, VP56_FRAME_GOLDEN);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
392 s->update_altref = ref_to_update(s, update_altref, VP56_FRAME_GOLDEN2);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
393 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
394
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
395 static int decode_frame_header(VP8Context *s, const uint8_t *buf, int buf_size)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
396 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
397 VP56RangeCoder *c = &s->c;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
398 int header_size, hscale, vscale, i, j, k, l, ret;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
399 int width = s->avctx->width;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
400 int height = s->avctx->height;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
401
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
402 s->keyframe = !(buf[0] & 1);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
403 s->profile = (buf[0]>>1) & 7;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
404 s->invisible = !(buf[0] & 0x10);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
405 header_size = RL24(buf) >> 5;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
406 buf += 3;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
407 buf_size -= 3;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
408
11974
356b20a6566d VP8 bilinear filter
conrad
parents: 11970
diff changeset
409 if (s->profile > 3)
356b20a6566d VP8 bilinear filter
conrad
parents: 11970
diff changeset
410 av_log(s->avctx, AV_LOG_WARNING, "Unknown profile %d\n", s->profile);
356b20a6566d VP8 bilinear filter
conrad
parents: 11970
diff changeset
411
356b20a6566d VP8 bilinear filter
conrad
parents: 11970
diff changeset
412 if (!s->profile)
356b20a6566d VP8 bilinear filter
conrad
parents: 11970
diff changeset
413 memcpy(s->put_pixels_tab, s->vp8dsp.put_vp8_epel_pixels_tab, sizeof(s->put_pixels_tab));
356b20a6566d VP8 bilinear filter
conrad
parents: 11970
diff changeset
414 else // profile 1-3 use bilinear, 4+ aren't defined so whatever
356b20a6566d VP8 bilinear filter
conrad
parents: 11970
diff changeset
415 memcpy(s->put_pixels_tab, s->vp8dsp.put_vp8_bilinear_pixels_tab, sizeof(s->put_pixels_tab));
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
416
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
417 if (header_size > buf_size - 7*s->keyframe) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
418 av_log(s->avctx, AV_LOG_ERROR, "Header size larger than data provided\n");
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
419 return AVERROR_INVALIDDATA;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
420 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
421
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
422 if (s->keyframe) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
423 if (RL24(buf) != 0x2a019d) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
424 av_log(s->avctx, AV_LOG_ERROR, "Invalid start code 0x%x\n", RL24(buf));
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
425 return AVERROR_INVALIDDATA;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
426 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
427 width = AV_RL16(buf+3) & 0x3fff;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
428 height = AV_RL16(buf+5) & 0x3fff;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
429 hscale = buf[4] >> 6;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
430 vscale = buf[6] >> 6;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
431 buf += 7;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
432 buf_size -= 7;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
433
11970
c7953ee47af4 vp8: warn and request sample if upscaling specified in header
mru
parents: 11950
diff changeset
434 if (hscale || vscale)
c7953ee47af4 vp8: warn and request sample if upscaling specified in header
mru
parents: 11950
diff changeset
435 av_log_missing_feature(s->avctx, "Upscaling", 1);
c7953ee47af4 vp8: warn and request sample if upscaling specified in header
mru
parents: 11950
diff changeset
436
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
437 s->update_golden = s->update_altref = VP56_FRAME_CURRENT;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
438 memcpy(s->prob->token , vp8_token_default_probs , sizeof(s->prob->token));
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
439 memcpy(s->prob->pred16x16, vp8_pred16x16_prob_inter, sizeof(s->prob->pred16x16));
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
440 memcpy(s->prob->pred8x8c , vp8_pred8x8c_prob_inter , sizeof(s->prob->pred8x8c));
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
441 memcpy(s->prob->mvc , vp8_mv_default_prob , sizeof(s->prob->mvc));
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
442 memset(&s->segmentation, 0, sizeof(s->segmentation));
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
443 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
444
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
445 if (!s->macroblocks_base || /* first frame */
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
446 width != s->avctx->width || height != s->avctx->height) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
447 if ((ret = update_dimensions(s, width, height) < 0))
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
448 return ret;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
449 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
450
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
451 vp56_init_range_decoder(c, buf, header_size);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
452 buf += header_size;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
453 buf_size -= header_size;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
454
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
455 if (s->keyframe) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
456 if (vp8_rac_get(c))
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
457 av_log(s->avctx, AV_LOG_WARNING, "Unspecified colorspace\n");
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
458 vp8_rac_get(c); // whether we can skip clamping in dsp functions
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
459 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
460
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
461 if ((s->segmentation.enabled = vp8_rac_get(c)))
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
462 parse_segment_info(s);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
463 else
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
464 s->segmentation.update_map = 0; // FIXME: move this to some init function?
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
465
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
466 s->filter.simple = vp8_rac_get(c);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
467 s->filter.level = vp8_rac_get_uint(c, 6);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
468 s->filter.sharpness = vp8_rac_get_uint(c, 3);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
469
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
470 if ((s->lf_delta.enabled = vp8_rac_get(c)))
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
471 if (vp8_rac_get(c))
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
472 update_lf_deltas(s);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
473
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
474 if (setup_partitions(s, buf, buf_size)) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
475 av_log(s->avctx, AV_LOG_ERROR, "Invalid partitions\n");
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
476 return AVERROR_INVALIDDATA;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
477 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
478
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
479 get_quants(s);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
480
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
481 if (!s->keyframe) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
482 update_refs(s);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
483 s->sign_bias[VP56_FRAME_GOLDEN] = vp8_rac_get(c);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
484 s->sign_bias[VP56_FRAME_GOLDEN2 /* altref */] = vp8_rac_get(c);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
485 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
486
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
487 // if we aren't saving this frame's probabilities for future frames,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
488 // make a copy of the current probabilities
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
489 if (!(s->update_probabilities = vp8_rac_get(c)))
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
490 s->prob[1] = s->prob[0];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
491
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
492 s->update_last = s->keyframe || vp8_rac_get(c);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
493
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
494 for (i = 0; i < 4; i++)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
495 for (j = 0; j < 8; j++)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
496 for (k = 0; k < 3; k++)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
497 for (l = 0; l < NUM_DCT_TOKENS-1; l++)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
498 if (vp56_rac_get_prob(c, vp8_token_update_probs[i][j][k][l]))
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
499 s->prob->token[i][j][k][l] = vp8_rac_get_uint(c, 8);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
500
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
501 if ((s->mbskip_enabled = vp8_rac_get(c)))
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
502 s->prob->mbskip = vp8_rac_get_uint(c, 8);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
503
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
504 if (!s->keyframe) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
505 s->prob->intra = vp8_rac_get_uint(c, 8);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
506 s->prob->last = vp8_rac_get_uint(c, 8);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
507 s->prob->golden = vp8_rac_get_uint(c, 8);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
508
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
509 if (vp8_rac_get(c))
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
510 for (i = 0; i < 4; i++)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
511 s->prob->pred16x16[i] = vp8_rac_get_uint(c, 8);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
512 if (vp8_rac_get(c))
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
513 for (i = 0; i < 3; i++)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
514 s->prob->pred8x8c[i] = vp8_rac_get_uint(c, 8);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
515
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
516 // 17.2 MV probability update
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
517 for (i = 0; i < 2; i++)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
518 for (j = 0; j < 19; j++)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
519 if (vp56_rac_get_prob(c, vp8_mv_update_prob[i][j]))
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
520 s->prob->mvc[i][j] = vp8_rac_get_nn(c);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
521 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
522
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
523 return 0;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
524 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
525
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
526 static inline void clamp_mv(VP8Context *s, VP56mv *dst, const VP56mv *src,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
527 int mb_x, int mb_y)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
528 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
529 #define MARGIN (16 << 2)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
530 dst->x = av_clip(src->x, -((mb_x << 6) + MARGIN),
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
531 ((s->mb_width - 1 - mb_x) << 6) + MARGIN);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
532 dst->y = av_clip(src->y, -((mb_y << 6) + MARGIN),
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
533 ((s->mb_height - 1 - mb_y) << 6) + MARGIN);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
534 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
535
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
536 static void find_near_mvs(VP8Context *s, VP8Macroblock *mb, int mb_x, int mb_y,
12217
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
537 VP56mv near[2], VP56mv *best, uint8_t cnt[4])
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
538 {
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
539 VP8Macroblock *mb_edge[3] = { mb + 2 /* top */,
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
540 mb - 1 /* left */,
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
541 mb + 1 /* top-left */ };
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
542 enum { EDGE_TOP, EDGE_LEFT, EDGE_TOPLEFT };
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
543 VP56mv near_mv[4] = {{ 0 }};
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
544 enum { CNT_ZERO, CNT_NEAREST, CNT_NEAR, CNT_SPLITMV };
12217
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
545 int idx = CNT_ZERO;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
546 int best_idx = CNT_ZERO;
12217
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
547 int cur_sign_bias = s->sign_bias[mb->ref_frame];
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
548 int *sign_bias = s->sign_bias;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
549
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
550 /* Process MB on top, left and top-left */
12217
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
551 #define MV_EDGE_CHECK(n)\
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
552 {\
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
553 VP8Macroblock *edge = mb_edge[n];\
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
554 int edge_ref = edge->ref_frame;\
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
555 if (edge_ref != VP56_FRAME_CURRENT) {\
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
556 uint32_t mv = AV_RN32A(&edge->mv);\
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
557 if (mv) {\
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
558 if (cur_sign_bias != sign_bias[edge_ref]) {\
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
559 /* SWAR negate of the values in mv. */\
12242
a2f6d8c61b9c VP8: fix broken sign bias code in MV pred
darkshikari
parents: 12241
diff changeset
560 mv = ~mv;\
a2f6d8c61b9c VP8: fix broken sign bias code in MV pred
darkshikari
parents: 12241
diff changeset
561 mv = ((mv&0x7fff7fff) + 0x00010001) ^ (mv&0x80008000);\
12217
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
562 }\
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
563 if (!n || mv != AV_RN32A(&near_mv[idx]))\
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
564 AV_WN32A(&near_mv[++idx], mv);\
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
565 cnt[idx] += 1 + (n != 2);\
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
566 } else\
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
567 cnt[CNT_ZERO] += 1 + (n != 2);\
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
568 }\
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
569 }
12217
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
570 MV_EDGE_CHECK(0)
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
571 MV_EDGE_CHECK(1)
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
572 MV_EDGE_CHECK(2)
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
573
12217
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
574 /* If we have three distinct MVs, merge first and last if they're the same */
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
575 if (cnt[CNT_SPLITMV] && AV_RN32A(&near_mv[1+EDGE_TOP]) == AV_RN32A(&near_mv[1+EDGE_TOPLEFT]))
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
576 cnt[CNT_NEAREST] += 1;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
577
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
578 cnt[CNT_SPLITMV] = ((mb_edge[EDGE_LEFT]->mode == VP8_MVMODE_SPLIT) +
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
579 (mb_edge[EDGE_TOP]->mode == VP8_MVMODE_SPLIT)) * 2 +
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
580 (mb_edge[EDGE_TOPLEFT]->mode == VP8_MVMODE_SPLIT);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
581
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
582 /* Swap near and nearest if necessary */
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
583 if (cnt[CNT_NEAR] > cnt[CNT_NEAREST]) {
12217
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
584 FFSWAP(uint8_t, cnt[CNT_NEAREST], cnt[CNT_NEAR]);
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
585 FFSWAP( VP56mv, near_mv[CNT_NEAREST], near_mv[CNT_NEAR]);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
586 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
587
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
588 /* Choose the best mv out of 0,0 and the nearest mv */
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
589 if (cnt[CNT_NEAREST] >= cnt[CNT_ZERO])
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
590 best_idx = CNT_NEAREST;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
591
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
592 clamp_mv(s, best, &near_mv[best_idx], mb_x, mb_y);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
593 near[0] = near_mv[CNT_NEAREST];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
594 near[1] = near_mv[CNT_NEAR];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
595 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
596
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
597 /**
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
598 * Motion vector coding, 17.1.
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
599 */
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
600 static int read_mv_component(VP56RangeCoder *c, const uint8_t *p)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
601 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
602 int x = 0;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
603
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
604 if (vp56_rac_get_prob(c, p[0])) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
605 int i;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
606
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
607 for (i = 0; i < 3; i++)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
608 x += vp56_rac_get_prob(c, p[9 + i]) << i;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
609 for (i = 9; i > 3; i--)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
610 x += vp56_rac_get_prob(c, p[9 + i]) << i;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
611 if (!(x & 0xFFF0) || vp56_rac_get_prob(c, p[12]))
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
612 x += 8;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
613 } else
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
614 x = vp8_rac_get_tree(c, vp8_small_mvtree, &p[2]);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
615
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
616 return (x && vp56_rac_get_prob(c, p[1])) ? -x : x;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
617 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
618
12219
274633916f8c Optimize partition mv decoding in VP8
darkshikari
parents: 12218
diff changeset
619 static const uint8_t *get_submv_prob(uint32_t left, uint32_t top)
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
620 {
12219
274633916f8c Optimize partition mv decoding in VP8
darkshikari
parents: 12218
diff changeset
621 if (left == top)
274633916f8c Optimize partition mv decoding in VP8
darkshikari
parents: 12218
diff changeset
622 return vp8_submv_prob[4-!!left];
274633916f8c Optimize partition mv decoding in VP8
darkshikari
parents: 12218
diff changeset
623 if (!top)
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
624 return vp8_submv_prob[2];
12219
274633916f8c Optimize partition mv decoding in VP8
darkshikari
parents: 12218
diff changeset
625 return vp8_submv_prob[1-!!left];
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
626 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
627
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
628 /**
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
629 * Split motion vector prediction, 16.4.
11990
3c51d7ac41c9 Simplify MV parsing, removes laying out 2 or 4 (16x8/8x8/8x16) MVs over all
rbultje
parents: 11989
diff changeset
630 * @returns the number of motion vectors parsed (2, 4 or 16)
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
631 */
11990
3c51d7ac41c9 Simplify MV parsing, removes laying out 2 or 4 (16x8/8x8/8x16) MVs over all
rbultje
parents: 11989
diff changeset
632 static int decode_splitmvs(VP8Context *s, VP56RangeCoder *c,
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
633 VP8Macroblock *mb, VP56mv *base_mv)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
634 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
635 int part_idx = mb->partitioning =
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
636 vp8_rac_get_tree(c, vp8_mbsplit_tree, vp8_mbsplit_prob);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
637 int n, num = vp8_mbsplit_count[part_idx];
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
638 VP8Macroblock *top_mb = &mb[2];
12219
274633916f8c Optimize partition mv decoding in VP8
darkshikari
parents: 12218
diff changeset
639 VP8Macroblock *left_mb = &mb[-1];
274633916f8c Optimize partition mv decoding in VP8
darkshikari
parents: 12218
diff changeset
640 const uint8_t *mbsplits_left = vp8_mbsplits[left_mb->partitioning],
274633916f8c Optimize partition mv decoding in VP8
darkshikari
parents: 12218
diff changeset
641 *mbsplits_top = vp8_mbsplits[top_mb->partitioning],
274633916f8c Optimize partition mv decoding in VP8
darkshikari
parents: 12218
diff changeset
642 *mbsplits_cur = vp8_mbsplits[part_idx],
11990
3c51d7ac41c9 Simplify MV parsing, removes laying out 2 or 4 (16x8/8x8/8x16) MVs over all
rbultje
parents: 11989
diff changeset
643 *firstidx = vp8_mbfirstidx[part_idx];
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
644 VP56mv *top_mv = top_mb->bmv;
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
645 VP56mv *left_mv = left_mb->bmv;
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
646 VP56mv *cur_mv = mb->bmv;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
647
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
648 for (n = 0; n < num; n++) {
11990
3c51d7ac41c9 Simplify MV parsing, removes laying out 2 or 4 (16x8/8x8/8x16) MVs over all
rbultje
parents: 11989
diff changeset
649 int k = firstidx[n];
12219
274633916f8c Optimize partition mv decoding in VP8
darkshikari
parents: 12218
diff changeset
650 uint32_t left, above;
11990
3c51d7ac41c9 Simplify MV parsing, removes laying out 2 or 4 (16x8/8x8/8x16) MVs over all
rbultje
parents: 11989
diff changeset
651 const uint8_t *submv_prob;
3c51d7ac41c9 Simplify MV parsing, removes laying out 2 or 4 (16x8/8x8/8x16) MVs over all
rbultje
parents: 11989
diff changeset
652
12219
274633916f8c Optimize partition mv decoding in VP8
darkshikari
parents: 12218
diff changeset
653 if (!(k & 3))
274633916f8c Optimize partition mv decoding in VP8
darkshikari
parents: 12218
diff changeset
654 left = AV_RN32A(&left_mv[mbsplits_left[k + 3]]);
274633916f8c Optimize partition mv decoding in VP8
darkshikari
parents: 12218
diff changeset
655 else
274633916f8c Optimize partition mv decoding in VP8
darkshikari
parents: 12218
diff changeset
656 left = AV_RN32A(&cur_mv[mbsplits_cur[k - 1]]);
274633916f8c Optimize partition mv decoding in VP8
darkshikari
parents: 12218
diff changeset
657 if (k <= 3)
274633916f8c Optimize partition mv decoding in VP8
darkshikari
parents: 12218
diff changeset
658 above = AV_RN32A(&top_mv[mbsplits_top[k + 12]]);
274633916f8c Optimize partition mv decoding in VP8
darkshikari
parents: 12218
diff changeset
659 else
274633916f8c Optimize partition mv decoding in VP8
darkshikari
parents: 12218
diff changeset
660 above = AV_RN32A(&cur_mv[mbsplits_cur[k - 4]]);
11990
3c51d7ac41c9 Simplify MV parsing, removes laying out 2 or 4 (16x8/8x8/8x16) MVs over all
rbultje
parents: 11989
diff changeset
661
3c51d7ac41c9 Simplify MV parsing, removes laying out 2 or 4 (16x8/8x8/8x16) MVs over all
rbultje
parents: 11989
diff changeset
662 submv_prob = get_submv_prob(left, above);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
663
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
664 switch (vp8_rac_get_tree(c, vp8_submv_ref_tree, submv_prob)) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
665 case VP8_SUBMVMODE_NEW4X4:
11990
3c51d7ac41c9 Simplify MV parsing, removes laying out 2 or 4 (16x8/8x8/8x16) MVs over all
rbultje
parents: 11989
diff changeset
666 mb->bmv[n].y = base_mv->y + read_mv_component(c, s->prob->mvc[0]);
3c51d7ac41c9 Simplify MV parsing, removes laying out 2 or 4 (16x8/8x8/8x16) MVs over all
rbultje
parents: 11989
diff changeset
667 mb->bmv[n].x = base_mv->x + read_mv_component(c, s->prob->mvc[1]);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
668 break;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
669 case VP8_SUBMVMODE_ZERO4X4:
12219
274633916f8c Optimize partition mv decoding in VP8
darkshikari
parents: 12218
diff changeset
670 AV_WN32A(&mb->bmv[n], 0);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
671 break;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
672 case VP8_SUBMVMODE_LEFT4X4:
12219
274633916f8c Optimize partition mv decoding in VP8
darkshikari
parents: 12218
diff changeset
673 AV_WN32A(&mb->bmv[n], left);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
674 break;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
675 case VP8_SUBMVMODE_TOP4X4:
12219
274633916f8c Optimize partition mv decoding in VP8
darkshikari
parents: 12218
diff changeset
676 AV_WN32A(&mb->bmv[n], above);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
677 break;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
678 }
11990
3c51d7ac41c9 Simplify MV parsing, removes laying out 2 or 4 (16x8/8x8/8x16) MVs over all
rbultje
parents: 11989
diff changeset
679 }
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
680
11990
3c51d7ac41c9 Simplify MV parsing, removes laying out 2 or 4 (16x8/8x8/8x16) MVs over all
rbultje
parents: 11989
diff changeset
681 return num;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
682 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
683
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
684 static inline void decode_intra4x4_modes(VP56RangeCoder *c, uint8_t *intra4x4,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
685 int stride, int keyframe)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
686 {
12221
45852dac8338 Avoid tracking i4x4 modes in P-frames in VP8
darkshikari
parents: 12220
diff changeset
687 int x, y, t, l, i;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
688
12221
45852dac8338 Avoid tracking i4x4 modes in P-frames in VP8
darkshikari
parents: 12220
diff changeset
689 if (keyframe) {
45852dac8338 Avoid tracking i4x4 modes in P-frames in VP8
darkshikari
parents: 12220
diff changeset
690 const uint8_t *ctx;
45852dac8338 Avoid tracking i4x4 modes in P-frames in VP8
darkshikari
parents: 12220
diff changeset
691 for (y = 0; y < 4; y++) {
45852dac8338 Avoid tracking i4x4 modes in P-frames in VP8
darkshikari
parents: 12220
diff changeset
692 for (x = 0; x < 4; x++) {
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
693 t = intra4x4[x - stride];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
694 l = intra4x4[x - 1];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
695 ctx = vp8_pred4x4_prob_intra[t][l];
12221
45852dac8338 Avoid tracking i4x4 modes in P-frames in VP8
darkshikari
parents: 12220
diff changeset
696 intra4x4[x] = vp8_rac_get_tree(c, vp8_pred4x4_tree, ctx);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
697 }
12221
45852dac8338 Avoid tracking i4x4 modes in P-frames in VP8
darkshikari
parents: 12220
diff changeset
698 intra4x4 += stride;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
699 }
12221
45852dac8338 Avoid tracking i4x4 modes in P-frames in VP8
darkshikari
parents: 12220
diff changeset
700 } else {
45852dac8338 Avoid tracking i4x4 modes in P-frames in VP8
darkshikari
parents: 12220
diff changeset
701 for (i = 0; i < 16; i++)
45852dac8338 Avoid tracking i4x4 modes in P-frames in VP8
darkshikari
parents: 12220
diff changeset
702 intra4x4[i] = vp8_rac_get_tree(c, vp8_pred4x4_tree, vp8_pred4x4_prob_inter);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
703 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
704 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
705
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
706 static void decode_mb_mode(VP8Context *s, VP8Macroblock *mb, int mb_x, int mb_y,
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
707 uint8_t *intra4x4, uint8_t *segment)
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
708 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
709 VP56RangeCoder *c = &s->c;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
710
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
711 if (s->segmentation.update_map)
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
712 *segment = vp8_rac_get_tree(c, vp8_segmentid_tree, s->prob->segmentid);
12224
5b7d690b761b VP8: Don't store segment in macroblock struct anymore.
darkshikari
parents: 12223
diff changeset
713 s->segment = *segment;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
714
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
715 mb->skip = s->mbskip_enabled ? vp56_rac_get_prob(c, s->prob->mbskip) : 0;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
716
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
717 if (s->keyframe) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
718 mb->mode = vp8_rac_get_tree(c, vp8_pred16x16_tree_intra, vp8_pred16x16_prob_intra);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
719
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
720 if (mb->mode == MODE_I4x4) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
721 decode_intra4x4_modes(c, intra4x4, s->b4_stride, 1);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
722 } else
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
723 fill_rectangle(intra4x4, 4, 4, s->b4_stride, vp8_pred4x4_mode[mb->mode], 1);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
724
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
725 s->chroma_pred_mode = vp8_rac_get_tree(c, vp8_pred8x8c_tree, vp8_pred8x8c_prob_intra);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
726 mb->ref_frame = VP56_FRAME_CURRENT;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
727 } else if (vp56_rac_get_prob(c, s->prob->intra)) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
728 VP56mv near[2], best;
12217
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
729 uint8_t cnt[4] = { 0 };
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
730 uint8_t p[4];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
731
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
732 // inter MB, 16.2
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
733 if (vp56_rac_get_prob(c, s->prob->last))
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
734 mb->ref_frame = vp56_rac_get_prob(c, s->prob->golden) ?
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
735 VP56_FRAME_GOLDEN2 /* altref */ : VP56_FRAME_GOLDEN;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
736 else
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
737 mb->ref_frame = VP56_FRAME_PREVIOUS;
12231
d3f3897ddb5c Smarter VP8 prefetching
darkshikari
parents: 12230
diff changeset
738 s->ref_count[mb->ref_frame-1]++;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
739
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
740 // motion vectors, 16.3
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
741 find_near_mvs(s, mb, mb_x, mb_y, near, &best, cnt);
12217
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
742 p[0] = vp8_mode_contexts[cnt[0]][0];
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
743 p[1] = vp8_mode_contexts[cnt[1]][1];
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
744 p[2] = vp8_mode_contexts[cnt[2]][2];
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12215
diff changeset
745 p[3] = vp8_mode_contexts[cnt[3]][3];
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
746 mb->mode = vp8_rac_get_tree(c, vp8_pred16x16_tree_mvinter, p);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
747 switch (mb->mode) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
748 case VP8_MVMODE_SPLIT:
11990
3c51d7ac41c9 Simplify MV parsing, removes laying out 2 or 4 (16x8/8x8/8x16) MVs over all
rbultje
parents: 11989
diff changeset
749 mb->mv = mb->bmv[decode_splitmvs(s, c, mb, &best) - 1];
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
750 break;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
751 case VP8_MVMODE_ZERO:
12225
c3e11b3108d7 Eliminate a pointless memset for intra blocks in P-frames in VP8
darkshikari
parents: 12224
diff changeset
752 AV_WN32A(&mb->mv, 0);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
753 break;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
754 case VP8_MVMODE_NEAREST:
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
755 clamp_mv(s, &mb->mv, &near[0], mb_x, mb_y);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
756 break;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
757 case VP8_MVMODE_NEAR:
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
758 clamp_mv(s, &mb->mv, &near[1], mb_x, mb_y);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
759 break;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
760 case VP8_MVMODE_NEW:
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
761 mb->mv.y = best.y + read_mv_component(c, s->prob->mvc[0]);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
762 mb->mv.x = best.x + read_mv_component(c, s->prob->mvc[1]);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
763 break;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
764 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
765 if (mb->mode != VP8_MVMODE_SPLIT) {
11990
3c51d7ac41c9 Simplify MV parsing, removes laying out 2 or 4 (16x8/8x8/8x16) MVs over all
rbultje
parents: 11989
diff changeset
766 mb->partitioning = VP8_SPLITMVMODE_NONE;
3c51d7ac41c9 Simplify MV parsing, removes laying out 2 or 4 (16x8/8x8/8x16) MVs over all
rbultje
parents: 11989
diff changeset
767 mb->bmv[0] = mb->mv;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
768 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
769 } else {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
770 // intra MB, 16.1
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
771 mb->mode = vp8_rac_get_tree(c, vp8_pred16x16_tree_inter, s->prob->pred16x16);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
772
12220
0f635b1f7861 Avoid useless fill_rectangle in P-frames in VP8
darkshikari
parents: 12219
diff changeset
773 if (mb->mode == MODE_I4x4)
12221
45852dac8338 Avoid tracking i4x4 modes in P-frames in VP8
darkshikari
parents: 12220
diff changeset
774 decode_intra4x4_modes(c, intra4x4, 4, 0);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
775
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
776 s->chroma_pred_mode = vp8_rac_get_tree(c, vp8_pred8x8c_tree, s->prob->pred8x8c);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
777 mb->ref_frame = VP56_FRAME_CURRENT;
12225
c3e11b3108d7 Eliminate a pointless memset for intra blocks in P-frames in VP8
darkshikari
parents: 12224
diff changeset
778 mb->partitioning = VP8_SPLITMVMODE_NONE;
c3e11b3108d7 Eliminate a pointless memset for intra blocks in P-frames in VP8
darkshikari
parents: 12224
diff changeset
779 AV_WN32A(&mb->bmv[0], 0);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
780 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
781 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
782
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
783 /**
12115
e97aba4d16ea Add missing doxy for function arguments.
rbultje
parents: 12081
diff changeset
784 * @param c arithmetic bitstream reader context
e97aba4d16ea Add missing doxy for function arguments.
rbultje
parents: 12081
diff changeset
785 * @param block destination for block coefficients
e97aba4d16ea Add missing doxy for function arguments.
rbultje
parents: 12081
diff changeset
786 * @param probs probabilities to use when reading trees from the bitstream
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
787 * @param i initial coeff index, 0 unless a separate DC block is coded
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
788 * @param zero_nhood the initial prediction context for number of surrounding
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
789 * all-zero blocks (only left/top, so 0-2)
12062
372f7fed2806 Avoid square brackets in Doxygen comments; Doxygen chokes on them.
diego
parents: 11990
diff changeset
790 * @param qmul array holding the dc/ac dequant factor at position 0/1
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
791 * @return 0 if no coeffs were decoded
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
792 * otherwise, the index of the last coeff decoded plus one
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
793 */
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
794 static int decode_block_coeffs(VP56RangeCoder *c, DCTELEM block[16],
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
795 uint8_t probs[8][3][NUM_DCT_TOKENS-1],
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
796 int i, int zero_nhood, int16_t qmul[2])
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
797 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
798 int token, nonzero = 0;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
799 int offset = 0;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
800
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
801 for (; i < 16; i++) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
802 token = vp8_rac_get_tree_with_offset(c, vp8_coeff_tree, probs[vp8_coeff_band[i]][zero_nhood], offset);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
803
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
804 if (token == DCT_EOB)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
805 break;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
806 else if (token >= DCT_CAT1) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
807 int cat = token-DCT_CAT1;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
808 token = vp8_rac_get_coeff(c, vp8_dct_cat_prob[cat]);
12229
cf675a4d5195 Eliminate a LUT in escape decoding in VP8 decode_block_coeffs
darkshikari
parents: 12228
diff changeset
809 token += 3 + (2<<cat);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
810 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
811
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
812 // after the first token, the non-zero prediction context becomes
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
813 // based on the last decoded coeff
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
814 if (!token) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
815 zero_nhood = 0;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
816 offset = 1;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
817 continue;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
818 } else if (token == 1)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
819 zero_nhood = 1;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
820 else
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
821 zero_nhood = 2;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
822
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
823 // todo: full [16] qmat? load into register?
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
824 block[zigzag_scan[i]] = (vp8_rac_get(c) ? -token : token) * qmul[!!i];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
825 nonzero = i+1;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
826 offset = 0;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
827 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
828 return nonzero;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
829 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
830
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
831 static void decode_mb_coeffs(VP8Context *s, VP56RangeCoder *c, VP8Macroblock *mb,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
832 uint8_t t_nnz[9], uint8_t l_nnz[9])
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
833 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
834 LOCAL_ALIGNED_16(DCTELEM, dc,[16]);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
835 int i, x, y, luma_start = 0, luma_ctx = 3;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
836 int nnz_pred, nnz, nnz_total = 0;
12224
5b7d690b761b VP8: Don't store segment in macroblock struct anymore.
darkshikari
parents: 12223
diff changeset
837 int segment = s->segment;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
838
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
839 if (mb->mode != MODE_I4x4 && mb->mode != VP8_MVMODE_SPLIT) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
840 AV_ZERO128(dc);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
841 AV_ZERO128(dc+8);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
842 nnz_pred = t_nnz[8] + l_nnz[8];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
843
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
844 // decode DC values and do hadamard
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
845 nnz = decode_block_coeffs(c, dc, s->prob->token[1], 0, nnz_pred,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
846 s->qmat[segment].luma_dc_qmul);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
847 l_nnz[8] = t_nnz[8] = !!nnz;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
848 nnz_total += nnz;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
849 s->vp8dsp.vp8_luma_dc_wht(s->block, dc);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
850 luma_start = 1;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
851 luma_ctx = 0;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
852 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
853
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
854 // luma blocks
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
855 for (y = 0; y < 4; y++)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
856 for (x = 0; x < 4; x++) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
857 nnz_pred = l_nnz[y] + t_nnz[x];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
858 nnz = decode_block_coeffs(c, s->block[y][x], s->prob->token[luma_ctx], luma_start,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
859 nnz_pred, s->qmat[segment].luma_qmul);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
860 // nnz+luma_start may be one more than the actual last index, but we don't care
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
861 s->non_zero_count_cache[y][x] = nnz + luma_start;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
862 t_nnz[x] = l_nnz[y] = !!nnz;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
863 nnz_total += nnz;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
864 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
865
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
866 // chroma blocks
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
867 // TODO: what to do about dimensions? 2nd dim for luma is x,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
868 // but for chroma it's (y<<1)|x
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
869 for (i = 4; i < 6; i++)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
870 for (y = 0; y < 2; y++)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
871 for (x = 0; x < 2; x++) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
872 nnz_pred = l_nnz[i+2*y] + t_nnz[i+2*x];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
873 nnz = decode_block_coeffs(c, s->block[i][(y<<1)+x], s->prob->token[2], 0,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
874 nnz_pred, s->qmat[segment].chroma_qmul);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
875 s->non_zero_count_cache[i][(y<<1)+x] = nnz;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
876 t_nnz[i+2*x] = l_nnz[i+2*y] = !!nnz;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
877 nnz_total += nnz;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
878 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
879
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
880 // if there were no coded coeffs despite the macroblock not being marked skip,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
881 // we MUST not do the inner loop filter and should not do IDCT
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
882 // Since skip isn't used for bitstream prediction, just manually set it.
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
883 if (!nnz_total)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
884 mb->skip = 1;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
885 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
886
12170
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
887 static av_always_inline
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
888 void backup_mb_border(uint8_t *top_border, uint8_t *src_y, uint8_t *src_cb, uint8_t *src_cr,
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
889 int linesize, int uvlinesize, int simple)
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
890 {
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
891 AV_COPY128(top_border, src_y + 15*linesize);
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
892 if (!simple) {
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
893 AV_COPY64(top_border+16, src_cb + 7*uvlinesize);
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
894 AV_COPY64(top_border+24, src_cr + 7*uvlinesize);
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
895 }
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
896 }
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
897
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
898 static av_always_inline
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
899 void xchg_mb_border(uint8_t *top_border, uint8_t *src_y, uint8_t *src_cb, uint8_t *src_cr,
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
900 int linesize, int uvlinesize, int mb_x, int mb_y, int mb_width,
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
901 int simple, int xchg)
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
902 {
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
903 uint8_t *top_border_m1 = top_border-32; // for TL prediction
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
904 src_y -= linesize;
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
905 src_cb -= uvlinesize;
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
906 src_cr -= uvlinesize;
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
907
12202
3465e53116e5 vp8: indent
mru
parents: 12201
diff changeset
908 #define XCHG(a,b,xchg) do { \
3465e53116e5 vp8: indent
mru
parents: 12201
diff changeset
909 if (xchg) AV_SWAP64(b,a); \
3465e53116e5 vp8: indent
mru
parents: 12201
diff changeset
910 else AV_COPY64(b,a); \
3465e53116e5 vp8: indent
mru
parents: 12201
diff changeset
911 } while (0)
12170
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
912
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
913 XCHG(top_border_m1+8, src_y-8, xchg);
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
914 XCHG(top_border, src_y, xchg);
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
915 XCHG(top_border+8, src_y+8, 1);
12201
c4b53914f286 vp8: add do { } while(0) around XCHG() macro to avoid confusing if/else
mru
parents: 12200
diff changeset
916 if (mb_x < mb_width-1)
12170
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
917 XCHG(top_border+32, src_y+16, 1);
12201
c4b53914f286 vp8: add do { } while(0) around XCHG() macro to avoid confusing if/else
mru
parents: 12200
diff changeset
918
12170
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
919 // only copy chroma for normal loop filter
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
920 // or to initialize the top row to 127
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
921 if (!simple || !mb_y) {
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
922 XCHG(top_border_m1+16, src_cb-8, xchg);
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
923 XCHG(top_border_m1+24, src_cr-8, xchg);
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
924 XCHG(top_border+16, src_cb, 1);
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
925 XCHG(top_border+24, src_cr, 1);
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
926 }
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
927 }
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
928
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
929 static int check_intra_pred_mode(int mode, int mb_x, int mb_y)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
930 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
931 if (mode == DC_PRED8x8) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
932 if (!(mb_x|mb_y))
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
933 mode = DC_128_PRED8x8;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
934 else if (!mb_y)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
935 mode = LEFT_DC_PRED8x8;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
936 else if (!mb_x)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
937 mode = TOP_DC_PRED8x8;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
938 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
939 return mode;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
940 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
941
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
942 static void intra_predict(VP8Context *s, uint8_t *dst[3], VP8Macroblock *mb,
12221
45852dac8338 Avoid tracking i4x4 modes in P-frames in VP8
darkshikari
parents: 12220
diff changeset
943 uint8_t *intra4x4, int mb_x, int mb_y)
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
944 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
945 int x, y, mode, nnz, tr;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
946
12170
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
947 // for the first row, we need to run xchg_mb_border to init the top edge to 127
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
948 // otherwise, skip it if we aren't going to deblock
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
949 if (s->deblock_filter || !mb_y)
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
950 xchg_mb_border(s->top_border[mb_x+1], dst[0], dst[1], dst[2],
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
951 s->linesize, s->uvlinesize, mb_x, mb_y, s->mb_width,
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
952 s->filter.simple, 1);
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
953
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
954 if (mb->mode < MODE_I4x4) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
955 mode = check_intra_pred_mode(mb->mode, mb_x, mb_y);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
956 s->hpc.pred16x16[mode](dst[0], s->linesize);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
957 } else {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
958 uint8_t *ptr = dst[0];
12221
45852dac8338 Avoid tracking i4x4 modes in P-frames in VP8
darkshikari
parents: 12220
diff changeset
959 int stride = s->keyframe ? s->b4_stride : 4;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
960
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
961 // all blocks on the right edge of the macroblock use bottom edge
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
962 // the top macroblock for their topright edge
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
963 uint8_t *tr_right = ptr - s->linesize + 16;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
964
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
965 // if we're on the right edge of the frame, said edge is extended
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
966 // from the top macroblock
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
967 if (mb_x == s->mb_width-1) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
968 tr = tr_right[-1]*0x01010101;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
969 tr_right = (uint8_t *)&tr;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
970 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
971
12234
bba849c2a113 VP8: avoid a memset for non-i4x4 blocks with no coefficients
darkshikari
parents: 12233
diff changeset
972 if (mb->skip)
bba849c2a113 VP8: avoid a memset for non-i4x4 blocks with no coefficients
darkshikari
parents: 12233
diff changeset
973 AV_ZERO128(s->non_zero_count_cache);
bba849c2a113 VP8: avoid a memset for non-i4x4 blocks with no coefficients
darkshikari
parents: 12233
diff changeset
974
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
975 for (y = 0; y < 4; y++) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
976 uint8_t *topright = ptr + 4 - s->linesize;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
977 for (x = 0; x < 4; x++) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
978 if (x == 3)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
979 topright = tr_right;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
980
12221
45852dac8338 Avoid tracking i4x4 modes in P-frames in VP8
darkshikari
parents: 12220
diff changeset
981 s->hpc.pred4x4[intra4x4[x]](ptr+4*x, topright, s->linesize);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
982
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
983 nnz = s->non_zero_count_cache[y][x];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
984 if (nnz) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
985 if (nnz == 1)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
986 s->vp8dsp.vp8_idct_dc_add(ptr+4*x, s->block[y][x], s->linesize);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
987 else
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
988 s->vp8dsp.vp8_idct_add(ptr+4*x, s->block[y][x], s->linesize);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
989 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
990 topright += 4;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
991 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
992
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
993 ptr += 4*s->linesize;
12221
45852dac8338 Avoid tracking i4x4 modes in P-frames in VP8
darkshikari
parents: 12220
diff changeset
994 intra4x4 += stride;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
995 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
996 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
997
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
998 mode = check_intra_pred_mode(s->chroma_pred_mode, mb_x, mb_y);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
999 s->hpc.pred8x8[mode](dst[1], s->uvlinesize);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1000 s->hpc.pred8x8[mode](dst[2], s->uvlinesize);
12170
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
1001
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
1002 if (s->deblock_filter || !mb_y)
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
1003 xchg_mb_border(s->top_border[mb_x+1], dst[0], dst[1], dst[2],
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
1004 s->linesize, s->uvlinesize, mb_x, mb_y, s->mb_width,
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
1005 s->filter.simple, 0);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1006 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1007
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1008 /**
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1009 * Generic MC function.
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1010 *
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1011 * @param s VP8 decoding context
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1012 * @param luma 1 for luma (Y) planes, 0 for chroma (Cb/Cr) planes
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1013 * @param dst target buffer for block data at block position
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1014 * @param src reference picture buffer at origin (0, 0)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1015 * @param mv motion vector (relative to block position) to get pixel data from
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1016 * @param x_off horizontal position of block from origin (0, 0)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1017 * @param y_off vertical position of block from origin (0, 0)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1018 * @param block_w width of block (16, 8 or 4)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1019 * @param block_h height of block (always same as block_w)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1020 * @param width width of src/dst plane data
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1021 * @param height height of src/dst plane data
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1022 * @param linesize size of a single line of plane data, including padding
12115
e97aba4d16ea Add missing doxy for function arguments.
rbultje
parents: 12081
diff changeset
1023 * @param mc_func motion compensation function pointers (bilinear or sixtap MC)
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1024 */
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1025 static inline void vp8_mc(VP8Context *s, int luma,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1026 uint8_t *dst, uint8_t *src, const VP56mv *mv,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1027 int x_off, int y_off, int block_w, int block_h,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1028 int width, int height, int linesize,
11950
56aba5a9761c Make VP8 DSP functions take two strides
darkshikari
parents: 11947
diff changeset
1029 vp8_mc_func mc_func[3][3])
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1030 {
12218
1696e915ae2e Take shortcuts for mv0 case in VP8 MC
darkshikari
parents: 12217
diff changeset
1031 if (AV_RN32A(mv)) {
1696e915ae2e Take shortcuts for mv0 case in VP8 MC
darkshikari
parents: 12217
diff changeset
1032 static const uint8_t idx[8] = { 0, 1, 2, 1, 2, 1, 2, 1 };
1696e915ae2e Take shortcuts for mv0 case in VP8 MC
darkshikari
parents: 12217
diff changeset
1033 int mx = (mv->x << luma)&7, mx_idx = idx[mx];
1696e915ae2e Take shortcuts for mv0 case in VP8 MC
darkshikari
parents: 12217
diff changeset
1034 int my = (mv->y << luma)&7, my_idx = idx[my];
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1035
12218
1696e915ae2e Take shortcuts for mv0 case in VP8 MC
darkshikari
parents: 12217
diff changeset
1036 x_off += mv->x >> (3 - luma);
1696e915ae2e Take shortcuts for mv0 case in VP8 MC
darkshikari
parents: 12217
diff changeset
1037 y_off += mv->y >> (3 - luma);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1038
12218
1696e915ae2e Take shortcuts for mv0 case in VP8 MC
darkshikari
parents: 12217
diff changeset
1039 // edge emulation
1696e915ae2e Take shortcuts for mv0 case in VP8 MC
darkshikari
parents: 12217
diff changeset
1040 src += y_off * linesize + x_off;
1696e915ae2e Take shortcuts for mv0 case in VP8 MC
darkshikari
parents: 12217
diff changeset
1041 if (x_off < 2 || x_off >= width - block_w - 3 ||
1696e915ae2e Take shortcuts for mv0 case in VP8 MC
darkshikari
parents: 12217
diff changeset
1042 y_off < 2 || y_off >= height - block_h - 3) {
1696e915ae2e Take shortcuts for mv0 case in VP8 MC
darkshikari
parents: 12217
diff changeset
1043 ff_emulated_edge_mc(s->edge_emu_buffer, src - 2 * linesize - 2, linesize,
1696e915ae2e Take shortcuts for mv0 case in VP8 MC
darkshikari
parents: 12217
diff changeset
1044 block_w + 5, block_h + 5,
1696e915ae2e Take shortcuts for mv0 case in VP8 MC
darkshikari
parents: 12217
diff changeset
1045 x_off - 2, y_off - 2, width, height);
1696e915ae2e Take shortcuts for mv0 case in VP8 MC
darkshikari
parents: 12217
diff changeset
1046 src = s->edge_emu_buffer + 2 + linesize * 2;
1696e915ae2e Take shortcuts for mv0 case in VP8 MC
darkshikari
parents: 12217
diff changeset
1047 }
1696e915ae2e Take shortcuts for mv0 case in VP8 MC
darkshikari
parents: 12217
diff changeset
1048 mc_func[my_idx][mx_idx](dst, linesize, src, linesize, block_h, mx, my);
1696e915ae2e Take shortcuts for mv0 case in VP8 MC
darkshikari
parents: 12217
diff changeset
1049 } else
1696e915ae2e Take shortcuts for mv0 case in VP8 MC
darkshikari
parents: 12217
diff changeset
1050 mc_func[0][0](dst, linesize, src + y_off * linesize + x_off, linesize, block_h, 0, 0);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1051 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1052
11989
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1053 static inline void vp8_mc_part(VP8Context *s, uint8_t *dst[3],
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1054 AVFrame *ref_frame, int x_off, int y_off,
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1055 int bx_off, int by_off,
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1056 int block_w, int block_h,
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1057 int width, int height, VP56mv *mv)
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1058 {
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1059 VP56mv uvmv = *mv;
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1060
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1061 /* Y */
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1062 vp8_mc(s, 1, dst[0] + by_off * s->linesize + bx_off,
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1063 ref_frame->data[0], mv, x_off + bx_off, y_off + by_off,
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1064 block_w, block_h, width, height, s->linesize,
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1065 s->put_pixels_tab[block_w == 8]);
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1066
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1067 /* U/V */
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1068 if (s->profile == 3) {
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1069 uvmv.x &= ~7;
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1070 uvmv.y &= ~7;
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1071 }
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1072 x_off >>= 1; y_off >>= 1;
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1073 bx_off >>= 1; by_off >>= 1;
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1074 width >>= 1; height >>= 1;
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1075 block_w >>= 1; block_h >>= 1;
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1076 vp8_mc(s, 0, dst[1] + by_off * s->uvlinesize + bx_off,
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1077 ref_frame->data[1], &uvmv, x_off + bx_off, y_off + by_off,
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1078 block_w, block_h, width, height, s->uvlinesize,
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1079 s->put_pixels_tab[1 + (block_w == 4)]);
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1080 vp8_mc(s, 0, dst[2] + by_off * s->uvlinesize + bx_off,
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1081 ref_frame->data[2], &uvmv, x_off + bx_off, y_off + by_off,
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1082 block_w, block_h, width, height, s->uvlinesize,
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1083 s->put_pixels_tab[1 + (block_w == 4)]);
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1084 }
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1085
12215
58d828f9810f Add prefetching to VP8 decoder
darkshikari
parents: 12202
diff changeset
1086 /* Fetch pixels for estimated mv 4 macroblocks ahead.
58d828f9810f Add prefetching to VP8 decoder
darkshikari
parents: 12202
diff changeset
1087 * Optimized for 64-byte cache lines. Inspired by ffh264 prefetch_motion. */
12237
f0c4dc49c8f1 VP8: smarter prefetching
darkshikari
parents: 12235
diff changeset
1088 static inline void prefetch_motion(VP8Context *s, VP8Macroblock *mb, int mb_x, int mb_y, int mb_xy, int ref)
12215
58d828f9810f Add prefetching to VP8 decoder
darkshikari
parents: 12202
diff changeset
1089 {
12237
f0c4dc49c8f1 VP8: smarter prefetching
darkshikari
parents: 12235
diff changeset
1090 /* Don't prefetch refs that haven't been used very often this frame. */
f0c4dc49c8f1 VP8: smarter prefetching
darkshikari
parents: 12235
diff changeset
1091 if (s->ref_count[ref-1] > (mb_xy >> 5)) {
12231
d3f3897ddb5c Smarter VP8 prefetching
darkshikari
parents: 12230
diff changeset
1092 int x_off = mb_x << 4, y_off = mb_y << 4;
d3f3897ddb5c Smarter VP8 prefetching
darkshikari
parents: 12230
diff changeset
1093 int mx = mb->mv.x + x_off + 8;
d3f3897ddb5c Smarter VP8 prefetching
darkshikari
parents: 12230
diff changeset
1094 int my = mb->mv.y + y_off;
d3f3897ddb5c Smarter VP8 prefetching
darkshikari
parents: 12230
diff changeset
1095 uint8_t **src= s->framep[ref]->data;
d3f3897ddb5c Smarter VP8 prefetching
darkshikari
parents: 12230
diff changeset
1096 int off= mx + (my + (mb_x&3)*4)*s->linesize + 64;
d3f3897ddb5c Smarter VP8 prefetching
darkshikari
parents: 12230
diff changeset
1097 s->dsp.prefetch(src[0]+off, s->linesize, 4);
d3f3897ddb5c Smarter VP8 prefetching
darkshikari
parents: 12230
diff changeset
1098 off= (mx>>1) + ((my>>1) + (mb_x&7))*s->uvlinesize + 64;
d3f3897ddb5c Smarter VP8 prefetching
darkshikari
parents: 12230
diff changeset
1099 s->dsp.prefetch(src[1]+off, src[2]-src[1], 2);
d3f3897ddb5c Smarter VP8 prefetching
darkshikari
parents: 12230
diff changeset
1100 }
12215
58d828f9810f Add prefetching to VP8 decoder
darkshikari
parents: 12202
diff changeset
1101 }
58d828f9810f Add prefetching to VP8 decoder
darkshikari
parents: 12202
diff changeset
1102
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1103 /**
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1104 * Apply motion vectors to prediction buffer, chapter 18.
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1105 */
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1106 static void inter_predict(VP8Context *s, uint8_t *dst[3], VP8Macroblock *mb,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1107 int mb_x, int mb_y)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1108 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1109 int x_off = mb_x << 4, y_off = mb_y << 4;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1110 int width = 16*s->mb_width, height = 16*s->mb_height;
12228
9c63566f623f Eliminate some repeated dereferences in VP8 inter_predict
darkshikari
parents: 12225
diff changeset
1111 AVFrame *ref = s->framep[mb->ref_frame];
9c63566f623f Eliminate some repeated dereferences in VP8 inter_predict
darkshikari
parents: 12225
diff changeset
1112 VP56mv *bmv = mb->bmv;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1113
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1114 if (mb->mode < VP8_MVMODE_SPLIT) {
12228
9c63566f623f Eliminate some repeated dereferences in VP8 inter_predict
darkshikari
parents: 12225
diff changeset
1115 vp8_mc_part(s, dst, ref, x_off, y_off,
11989
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1116 0, 0, 16, 16, width, height, &mb->mv);
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1117 } else switch (mb->partitioning) {
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1118 case VP8_SPLITMVMODE_4x4: {
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1119 int x, y;
11989
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1120 VP56mv uvmv;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1121
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1122 /* Y */
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1123 for (y = 0; y < 4; y++) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1124 for (x = 0; x < 4; x++) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1125 vp8_mc(s, 1, dst[0] + 4*y*s->linesize + x*4,
12228
9c63566f623f Eliminate some repeated dereferences in VP8 inter_predict
darkshikari
parents: 12225
diff changeset
1126 ref->data[0], &bmv[4*y + x],
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1127 4*x + x_off, 4*y + y_off, 4, 4,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1128 width, height, s->linesize,
11974
356b20a6566d VP8 bilinear filter
conrad
parents: 11970
diff changeset
1129 s->put_pixels_tab[2]);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1130 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1131 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1132
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1133 /* U/V */
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1134 x_off >>= 1; y_off >>= 1; width >>= 1; height >>= 1;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1135 for (y = 0; y < 2; y++) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1136 for (x = 0; x < 2; x++) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1137 uvmv.x = mb->bmv[ 2*y * 4 + 2*x ].x +
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1138 mb->bmv[ 2*y * 4 + 2*x+1].x +
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1139 mb->bmv[(2*y+1) * 4 + 2*x ].x +
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1140 mb->bmv[(2*y+1) * 4 + 2*x+1].x;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1141 uvmv.y = mb->bmv[ 2*y * 4 + 2*x ].y +
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1142 mb->bmv[ 2*y * 4 + 2*x+1].y +
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1143 mb->bmv[(2*y+1) * 4 + 2*x ].y +
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1144 mb->bmv[(2*y+1) * 4 + 2*x+1].y;
11937
bc617cceacb1 avoid conditional and division in chroma MV calculation
stefang
parents: 11921
diff changeset
1145 uvmv.x = (uvmv.x + 2 + (uvmv.x >> (INT_BIT-1))) >> 2;
bc617cceacb1 avoid conditional and division in chroma MV calculation
stefang
parents: 11921
diff changeset
1146 uvmv.y = (uvmv.y + 2 + (uvmv.y >> (INT_BIT-1))) >> 2;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1147 if (s->profile == 3) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1148 uvmv.x &= ~7;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1149 uvmv.y &= ~7;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1150 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1151 vp8_mc(s, 0, dst[1] + 4*y*s->uvlinesize + x*4,
12228
9c63566f623f Eliminate some repeated dereferences in VP8 inter_predict
darkshikari
parents: 12225
diff changeset
1152 ref->data[1], &uvmv,
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1153 4*x + x_off, 4*y + y_off, 4, 4,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1154 width, height, s->uvlinesize,
11974
356b20a6566d VP8 bilinear filter
conrad
parents: 11970
diff changeset
1155 s->put_pixels_tab[2]);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1156 vp8_mc(s, 0, dst[2] + 4*y*s->uvlinesize + x*4,
12228
9c63566f623f Eliminate some repeated dereferences in VP8 inter_predict
darkshikari
parents: 12225
diff changeset
1157 ref->data[2], &uvmv,
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1158 4*x + x_off, 4*y + y_off, 4, 4,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1159 width, height, s->uvlinesize,
11974
356b20a6566d VP8 bilinear filter
conrad
parents: 11970
diff changeset
1160 s->put_pixels_tab[2]);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1161 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1162 }
11989
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1163 break;
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1164 }
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1165 case VP8_SPLITMVMODE_16x8:
12228
9c63566f623f Eliminate some repeated dereferences in VP8 inter_predict
darkshikari
parents: 12225
diff changeset
1166 vp8_mc_part(s, dst, ref, x_off, y_off,
9c63566f623f Eliminate some repeated dereferences in VP8 inter_predict
darkshikari
parents: 12225
diff changeset
1167 0, 0, 16, 8, width, height, &bmv[0]);
9c63566f623f Eliminate some repeated dereferences in VP8 inter_predict
darkshikari
parents: 12225
diff changeset
1168 vp8_mc_part(s, dst, ref, x_off, y_off,
9c63566f623f Eliminate some repeated dereferences in VP8 inter_predict
darkshikari
parents: 12225
diff changeset
1169 0, 8, 16, 8, width, height, &bmv[1]);
11989
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1170 break;
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1171 case VP8_SPLITMVMODE_8x16:
12228
9c63566f623f Eliminate some repeated dereferences in VP8 inter_predict
darkshikari
parents: 12225
diff changeset
1172 vp8_mc_part(s, dst, ref, x_off, y_off,
9c63566f623f Eliminate some repeated dereferences in VP8 inter_predict
darkshikari
parents: 12225
diff changeset
1173 0, 0, 8, 16, width, height, &bmv[0]);
9c63566f623f Eliminate some repeated dereferences in VP8 inter_predict
darkshikari
parents: 12225
diff changeset
1174 vp8_mc_part(s, dst, ref, x_off, y_off,
9c63566f623f Eliminate some repeated dereferences in VP8 inter_predict
darkshikari
parents: 12225
diff changeset
1175 8, 0, 8, 16, width, height, &bmv[1]);
11989
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1176 break;
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1177 case VP8_SPLITMVMODE_8x8:
12228
9c63566f623f Eliminate some repeated dereferences in VP8 inter_predict
darkshikari
parents: 12225
diff changeset
1178 vp8_mc_part(s, dst, ref, x_off, y_off,
9c63566f623f Eliminate some repeated dereferences in VP8 inter_predict
darkshikari
parents: 12225
diff changeset
1179 0, 0, 8, 8, width, height, &bmv[0]);
9c63566f623f Eliminate some repeated dereferences in VP8 inter_predict
darkshikari
parents: 12225
diff changeset
1180 vp8_mc_part(s, dst, ref, x_off, y_off,
9c63566f623f Eliminate some repeated dereferences in VP8 inter_predict
darkshikari
parents: 12225
diff changeset
1181 8, 0, 8, 8, width, height, &bmv[1]);
9c63566f623f Eliminate some repeated dereferences in VP8 inter_predict
darkshikari
parents: 12225
diff changeset
1182 vp8_mc_part(s, dst, ref, x_off, y_off,
9c63566f623f Eliminate some repeated dereferences in VP8 inter_predict
darkshikari
parents: 12225
diff changeset
1183 0, 8, 8, 8, width, height, &bmv[2]);
9c63566f623f Eliminate some repeated dereferences in VP8 inter_predict
darkshikari
parents: 12225
diff changeset
1184 vp8_mc_part(s, dst, ref, x_off, y_off,
9c63566f623f Eliminate some repeated dereferences in VP8 inter_predict
darkshikari
parents: 12225
diff changeset
1185 8, 8, 8, 8, width, height, &bmv[3]);
11989
176c5deb6756 Optimize split MC, so we don't always do 4x4 blocks of 4x4pixels each, but
rbultje
parents: 11974
diff changeset
1186 break;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1187 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1188 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1189
12238
1a7903913e9b VP8: 30% faster idct_mb
darkshikari
parents: 12237
diff changeset
1190 static void idct_mb(VP8Context *s, uint8_t *dst[3], VP8Macroblock *mb)
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1191 {
12240
e6ade5e849c9 VP8: Clean up some variable shadowing.
darkshikari
parents: 12238
diff changeset
1192 int x, y, ch;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1193
12238
1a7903913e9b VP8: 30% faster idct_mb
darkshikari
parents: 12237
diff changeset
1194 if (mb->mode != MODE_I4x4) {
1a7903913e9b VP8: 30% faster idct_mb
darkshikari
parents: 12237
diff changeset
1195 uint8_t *y_dst = dst[0];
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1196 for (y = 0; y < 4; y++) {
12240
e6ade5e849c9 VP8: Clean up some variable shadowing.
darkshikari
parents: 12238
diff changeset
1197 uint32_t nnz4 = AV_RN32A(s->non_zero_count_cache[y]);
e6ade5e849c9 VP8: Clean up some variable shadowing.
darkshikari
parents: 12238
diff changeset
1198 if (nnz4) {
e6ade5e849c9 VP8: Clean up some variable shadowing.
darkshikari
parents: 12238
diff changeset
1199 if (nnz4&~0x01010101) {
12238
1a7903913e9b VP8: 30% faster idct_mb
darkshikari
parents: 12237
diff changeset
1200 for (x = 0; x < 4; x++) {
12240
e6ade5e849c9 VP8: Clean up some variable shadowing.
darkshikari
parents: 12238
diff changeset
1201 int nnz = s->non_zero_count_cache[y][x];
12238
1a7903913e9b VP8: 30% faster idct_mb
darkshikari
parents: 12237
diff changeset
1202 if (nnz) {
1a7903913e9b VP8: 30% faster idct_mb
darkshikari
parents: 12237
diff changeset
1203 if (nnz == 1)
1a7903913e9b VP8: 30% faster idct_mb
darkshikari
parents: 12237
diff changeset
1204 s->vp8dsp.vp8_idct_dc_add(y_dst+4*x, s->block[y][x], s->linesize);
1a7903913e9b VP8: 30% faster idct_mb
darkshikari
parents: 12237
diff changeset
1205 else
1a7903913e9b VP8: 30% faster idct_mb
darkshikari
parents: 12237
diff changeset
1206 s->vp8dsp.vp8_idct_add(y_dst+4*x, s->block[y][x], s->linesize);
1a7903913e9b VP8: 30% faster idct_mb
darkshikari
parents: 12237
diff changeset
1207 }
1a7903913e9b VP8: 30% faster idct_mb
darkshikari
parents: 12237
diff changeset
1208 }
1a7903913e9b VP8: 30% faster idct_mb
darkshikari
parents: 12237
diff changeset
1209 } else {
12241
c7f6ddcc5c01 VP8: optimize DC-only chroma case in the same way as luma.
darkshikari
parents: 12240
diff changeset
1210 s->vp8dsp.vp8_idct_dc_add4y(y_dst, s->block[y], s->linesize);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1211 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1212 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1213 y_dst += 4*s->linesize;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1214 }
12238
1a7903913e9b VP8: 30% faster idct_mb
darkshikari
parents: 12237
diff changeset
1215 }
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1216
12238
1a7903913e9b VP8: 30% faster idct_mb
darkshikari
parents: 12237
diff changeset
1217 for (ch = 0; ch < 2; ch++) {
12241
c7f6ddcc5c01 VP8: optimize DC-only chroma case in the same way as luma.
darkshikari
parents: 12240
diff changeset
1218 uint32_t nnz4 = AV_RN32A(s->non_zero_count_cache[4+ch]);
c7f6ddcc5c01 VP8: optimize DC-only chroma case in the same way as luma.
darkshikari
parents: 12240
diff changeset
1219 if (nnz4) {
12238
1a7903913e9b VP8: 30% faster idct_mb
darkshikari
parents: 12237
diff changeset
1220 uint8_t *ch_dst = dst[1+ch];
12241
c7f6ddcc5c01 VP8: optimize DC-only chroma case in the same way as luma.
darkshikari
parents: 12240
diff changeset
1221 if (nnz4&~0x01010101) {
c7f6ddcc5c01 VP8: optimize DC-only chroma case in the same way as luma.
darkshikari
parents: 12240
diff changeset
1222 for (y = 0; y < 2; y++) {
c7f6ddcc5c01 VP8: optimize DC-only chroma case in the same way as luma.
darkshikari
parents: 12240
diff changeset
1223 for (x = 0; x < 2; x++) {
c7f6ddcc5c01 VP8: optimize DC-only chroma case in the same way as luma.
darkshikari
parents: 12240
diff changeset
1224 int nnz = s->non_zero_count_cache[4+ch][(y<<1)+x];
c7f6ddcc5c01 VP8: optimize DC-only chroma case in the same way as luma.
darkshikari
parents: 12240
diff changeset
1225 if (nnz) {
c7f6ddcc5c01 VP8: optimize DC-only chroma case in the same way as luma.
darkshikari
parents: 12240
diff changeset
1226 if (nnz == 1)
c7f6ddcc5c01 VP8: optimize DC-only chroma case in the same way as luma.
darkshikari
parents: 12240
diff changeset
1227 s->vp8dsp.vp8_idct_dc_add(ch_dst+4*x, s->block[4+ch][(y<<1)+x], s->uvlinesize);
c7f6ddcc5c01 VP8: optimize DC-only chroma case in the same way as luma.
darkshikari
parents: 12240
diff changeset
1228 else
c7f6ddcc5c01 VP8: optimize DC-only chroma case in the same way as luma.
darkshikari
parents: 12240
diff changeset
1229 s->vp8dsp.vp8_idct_add(ch_dst+4*x, s->block[4+ch][(y<<1)+x], s->uvlinesize);
c7f6ddcc5c01 VP8: optimize DC-only chroma case in the same way as luma.
darkshikari
parents: 12240
diff changeset
1230 }
12238
1a7903913e9b VP8: 30% faster idct_mb
darkshikari
parents: 12237
diff changeset
1231 }
12241
c7f6ddcc5c01 VP8: optimize DC-only chroma case in the same way as luma.
darkshikari
parents: 12240
diff changeset
1232 ch_dst += 4*s->uvlinesize;
12238
1a7903913e9b VP8: 30% faster idct_mb
darkshikari
parents: 12237
diff changeset
1233 }
12241
c7f6ddcc5c01 VP8: optimize DC-only chroma case in the same way as luma.
darkshikari
parents: 12240
diff changeset
1234 } else {
c7f6ddcc5c01 VP8: optimize DC-only chroma case in the same way as luma.
darkshikari
parents: 12240
diff changeset
1235 s->vp8dsp.vp8_idct_dc_add4uv(ch_dst, s->block[4+ch], s->uvlinesize);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1236 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1237 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1238 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1239 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1240
12222
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
1241 static void filter_level_for_mb(VP8Context *s, VP8Macroblock *mb, VP8FilterStrength *f )
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1242 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1243 int interior_limit, filter_level;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1244
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1245 if (s->segmentation.enabled) {
12224
5b7d690b761b VP8: Don't store segment in macroblock struct anymore.
darkshikari
parents: 12223
diff changeset
1246 filter_level = s->segmentation.filter_level[s->segment];
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1247 if (!s->segmentation.absolute_vals)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1248 filter_level += s->filter.level;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1249 } else
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1250 filter_level = s->filter.level;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1251
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1252 if (s->lf_delta.enabled) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1253 filter_level += s->lf_delta.ref[mb->ref_frame];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1254
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1255 if (mb->ref_frame == VP56_FRAME_CURRENT) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1256 if (mb->mode == MODE_I4x4)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1257 filter_level += s->lf_delta.mode[0];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1258 } else {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1259 if (mb->mode == VP8_MVMODE_ZERO)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1260 filter_level += s->lf_delta.mode[1];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1261 else if (mb->mode == VP8_MVMODE_SPLIT)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1262 filter_level += s->lf_delta.mode[3];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1263 else
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1264 filter_level += s->lf_delta.mode[2];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1265 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1266 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1267 filter_level = av_clip(filter_level, 0, 63);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1268
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1269 interior_limit = filter_level;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1270 if (s->filter.sharpness) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1271 interior_limit >>= s->filter.sharpness > 4 ? 2 : 1;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1272 interior_limit = FFMIN(interior_limit, 9 - s->filter.sharpness);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1273 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1274 interior_limit = FFMAX(interior_limit, 1);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1275
12222
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
1276 f->filter_level = filter_level;
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
1277 f->inner_limit = interior_limit;
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
1278 f->inner_filter = !mb->skip || mb->mode == MODE_I4x4 || mb->mode == VP8_MVMODE_SPLIT;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1279 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1280
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
1281 static void filter_mb(VP8Context *s, uint8_t *dst[3], VP8FilterStrength *f, int mb_x, int mb_y)
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1282 {
12222
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
1283 int mbedge_lim, bedge_lim, hev_thresh;
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
1284 int filter_level = f->filter_level;
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
1285 int inner_limit = f->inner_limit;
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
1286 int inner_filter = f->inner_filter;
12233
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1287 int linesize = s->linesize;
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1288 int uvlinesize = s->uvlinesize;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1289
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1290 if (!filter_level)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1291 return;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1292
12081
812e23197d64 VP8: Move calculation of outer filter limit out of dsp functions for normal
conrad
parents: 12062
diff changeset
1293 mbedge_lim = 2*(filter_level+2) + inner_limit;
812e23197d64 VP8: Move calculation of outer filter limit out of dsp functions for normal
conrad
parents: 12062
diff changeset
1294 bedge_lim = 2* filter_level + inner_limit;
12222
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
1295 hev_thresh = filter_level >= 15;
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
1296
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
1297 if (s->keyframe) {
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
1298 if (filter_level >= 40)
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
1299 hev_thresh = 2;
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
1300 } else {
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
1301 if (filter_level >= 40)
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
1302 hev_thresh = 3;
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
1303 else if (filter_level >= 20)
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
1304 hev_thresh = 2;
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
1305 }
12081
812e23197d64 VP8: Move calculation of outer filter limit out of dsp functions for normal
conrad
parents: 12062
diff changeset
1306
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1307 if (mb_x) {
12233
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1308 s->vp8dsp.vp8_h_loop_filter16y(dst[0], linesize,
12194
80b142c2e9f7 Change function prototypes for width=8 inner and mbedge loopfilter functions
rbultje
parents: 12170
diff changeset
1309 mbedge_lim, inner_limit, hev_thresh);
12233
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1310 s->vp8dsp.vp8_h_loop_filter8uv(dst[1], dst[2], uvlinesize,
12194
80b142c2e9f7 Change function prototypes for width=8 inner and mbedge loopfilter functions
rbultje
parents: 12170
diff changeset
1311 mbedge_lim, inner_limit, hev_thresh);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1312 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1313
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
1314 if (inner_filter) {
12233
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1315 s->vp8dsp.vp8_h_loop_filter16y_inner(dst[0]+ 4, linesize, bedge_lim,
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1316 inner_limit, hev_thresh);
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1317 s->vp8dsp.vp8_h_loop_filter16y_inner(dst[0]+ 8, linesize, bedge_lim,
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1318 inner_limit, hev_thresh);
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1319 s->vp8dsp.vp8_h_loop_filter16y_inner(dst[0]+12, linesize, bedge_lim,
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1320 inner_limit, hev_thresh);
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1321 s->vp8dsp.vp8_h_loop_filter8uv_inner(dst[1] + 4, dst[2] + 4,
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1322 uvlinesize, bedge_lim,
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1323 inner_limit, hev_thresh);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1324 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1325
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1326 if (mb_y) {
12233
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1327 s->vp8dsp.vp8_v_loop_filter16y(dst[0], linesize,
12194
80b142c2e9f7 Change function prototypes for width=8 inner and mbedge loopfilter functions
rbultje
parents: 12170
diff changeset
1328 mbedge_lim, inner_limit, hev_thresh);
12233
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1329 s->vp8dsp.vp8_v_loop_filter8uv(dst[1], dst[2], uvlinesize,
12194
80b142c2e9f7 Change function prototypes for width=8 inner and mbedge loopfilter functions
rbultje
parents: 12170
diff changeset
1330 mbedge_lim, inner_limit, hev_thresh);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1331 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1332
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
1333 if (inner_filter) {
12233
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1334 s->vp8dsp.vp8_v_loop_filter16y_inner(dst[0]+ 4*linesize,
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1335 linesize, bedge_lim,
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1336 inner_limit, hev_thresh);
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1337 s->vp8dsp.vp8_v_loop_filter16y_inner(dst[0]+ 8*linesize,
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1338 linesize, bedge_lim,
12194
80b142c2e9f7 Change function prototypes for width=8 inner and mbedge loopfilter functions
rbultje
parents: 12170
diff changeset
1339 inner_limit, hev_thresh);
12233
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1340 s->vp8dsp.vp8_v_loop_filter16y_inner(dst[0]+12*linesize,
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1341 linesize, bedge_lim,
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1342 inner_limit, hev_thresh);
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1343 s->vp8dsp.vp8_v_loop_filter8uv_inner(dst[1] + 4 * uvlinesize,
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1344 dst[2] + 4 * uvlinesize,
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1345 uvlinesize, bedge_lim,
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1346 inner_limit, hev_thresh);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1347 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1348 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1349
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
1350 static void filter_mb_simple(VP8Context *s, uint8_t *dst, VP8FilterStrength *f, int mb_x, int mb_y)
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1351 {
12222
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
1352 int mbedge_lim, bedge_lim;
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
1353 int filter_level = f->filter_level;
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
1354 int inner_limit = f->inner_limit;
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
1355 int inner_filter = f->inner_filter;
12233
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1356 int linesize = s->linesize;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1357
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1358 if (!filter_level)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1359 return;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1360
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1361 mbedge_lim = 2*(filter_level+2) + inner_limit;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1362 bedge_lim = 2* filter_level + inner_limit;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1363
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1364 if (mb_x)
12233
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1365 s->vp8dsp.vp8_h_loop_filter_simple(dst, linesize, mbedge_lim);
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
1366 if (inner_filter) {
12233
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1367 s->vp8dsp.vp8_h_loop_filter_simple(dst+ 4, linesize, bedge_lim);
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1368 s->vp8dsp.vp8_h_loop_filter_simple(dst+ 8, linesize, bedge_lim);
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1369 s->vp8dsp.vp8_h_loop_filter_simple(dst+12, linesize, bedge_lim);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1370 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1371
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1372 if (mb_y)
12233
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1373 s->vp8dsp.vp8_v_loop_filter_simple(dst, linesize, mbedge_lim);
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
1374 if (inner_filter) {
12233
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1375 s->vp8dsp.vp8_v_loop_filter_simple(dst+ 4*linesize, linesize, bedge_lim);
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1376 s->vp8dsp.vp8_v_loop_filter_simple(dst+ 8*linesize, linesize, bedge_lim);
10b02cbc3cc2 Get rid of more unnecessary dereferences in VP8 deblocking
darkshikari
parents: 12232
diff changeset
1377 s->vp8dsp.vp8_v_loop_filter_simple(dst+12*linesize, linesize, bedge_lim);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1378 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1379 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1380
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1381 static void filter_mb_row(VP8Context *s, int mb_y)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1382 {
12222
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
1383 VP8FilterStrength *f = s->filter_strength;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1384 uint8_t *dst[3] = {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1385 s->framep[VP56_FRAME_CURRENT]->data[0] + 16*mb_y*s->linesize,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1386 s->framep[VP56_FRAME_CURRENT]->data[1] + 8*mb_y*s->uvlinesize,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1387 s->framep[VP56_FRAME_CURRENT]->data[2] + 8*mb_y*s->uvlinesize
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1388 };
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1389 int mb_x;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1390
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1391 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
12170
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
1392 backup_mb_border(s->top_border[mb_x+1], dst[0], dst[1], dst[2], s->linesize, s->uvlinesize, 0);
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
1393 filter_mb(s, dst, f++, mb_x, mb_y);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1394 dst[0] += 16;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1395 dst[1] += 8;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1396 dst[2] += 8;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1397 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1398 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1399
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1400 static void filter_mb_row_simple(VP8Context *s, int mb_y)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1401 {
12222
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
1402 VP8FilterStrength *f = s->filter_strength;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1403 uint8_t *dst = s->framep[VP56_FRAME_CURRENT]->data[0] + 16*mb_y*s->linesize;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1404 int mb_x;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1405
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1406 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
12170
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
1407 backup_mb_border(s->top_border[mb_x+1], dst, NULL, NULL, s->linesize, 0, 1);
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
1408 filter_mb_simple(s, dst, f++, mb_x, mb_y);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1409 dst += 16;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1410 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1411 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1412
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1413 static int vp8_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1414 AVPacket *avpkt)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1415 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1416 VP8Context *s = avctx->priv_data;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1417 int ret, mb_x, mb_y, i, y, referenced;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1418 enum AVDiscard skip_thresh;
12232
870599d1eb36 Shut up a GCC warning in VP8
darkshikari
parents: 12231
diff changeset
1419 AVFrame *curframe = NULL;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1420
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1421 if ((ret = decode_frame_header(s, avpkt->data, avpkt->size)) < 0)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1422 return ret;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1423
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1424 referenced = s->update_last || s->update_golden == VP56_FRAME_CURRENT
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1425 || s->update_altref == VP56_FRAME_CURRENT;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1426
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1427 skip_thresh = !referenced ? AVDISCARD_NONREF :
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1428 !s->keyframe ? AVDISCARD_NONKEY : AVDISCARD_ALL;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1429
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1430 if (avctx->skip_frame >= skip_thresh) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1431 s->invisible = 1;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1432 goto skip_decode;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1433 }
12170
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
1434 s->deblock_filter = s->filter.level && avctx->skip_loop_filter < skip_thresh;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1435
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1436 for (i = 0; i < 4; i++)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1437 if (&s->frames[i] != s->framep[VP56_FRAME_PREVIOUS] &&
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1438 &s->frames[i] != s->framep[VP56_FRAME_GOLDEN] &&
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1439 &s->frames[i] != s->framep[VP56_FRAME_GOLDEN2]) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1440 curframe = s->framep[VP56_FRAME_CURRENT] = &s->frames[i];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1441 break;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1442 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1443 if (curframe->data[0])
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1444 avctx->release_buffer(avctx, curframe);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1445
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1446 curframe->key_frame = s->keyframe;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1447 curframe->pict_type = s->keyframe ? FF_I_TYPE : FF_P_TYPE;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1448 curframe->reference = referenced ? 3 : 0;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1449 if ((ret = avctx->get_buffer(avctx, curframe))) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1450 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed!\n");
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1451 return ret;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1452 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1453
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1454 // Given that arithmetic probabilities are updated every frame, it's quite likely
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1455 // that the values we have on a random interframe are complete junk if we didn't
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1456 // start decode on a keyframe. So just don't display anything rather than junk.
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1457 if (!s->keyframe && (!s->framep[VP56_FRAME_PREVIOUS] ||
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1458 !s->framep[VP56_FRAME_GOLDEN] ||
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1459 !s->framep[VP56_FRAME_GOLDEN2])) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1460 av_log(avctx, AV_LOG_WARNING, "Discarding interframe without a prior keyframe!\n");
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1461 return AVERROR_INVALIDDATA;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1462 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1463
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1464 s->linesize = curframe->linesize[0];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1465 s->uvlinesize = curframe->linesize[1];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1466
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1467 if (!s->edge_emu_buffer)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1468 s->edge_emu_buffer = av_malloc(21*s->linesize);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1469
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1470 memset(s->top_nnz, 0, s->mb_width*sizeof(*s->top_nnz));
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1471
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
1472 /* Zero macroblock structures for top/left prediction from outside the frame. */
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
1473 memset(s->macroblocks, 0, (s->mb_width + s->mb_height*2)*sizeof(*s->macroblocks));
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
1474
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1475 // top edge of 127 for intra prediction
12170
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
1476 memset(s->top_border, 127, (s->mb_width+1)*sizeof(*s->top_border));
12231
d3f3897ddb5c Smarter VP8 prefetching
darkshikari
parents: 12230
diff changeset
1477 memset(s->ref_count, 0, sizeof(s->ref_count));
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1478
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1479 for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1480 VP56RangeCoder *c = &s->coeff_partition[mb_y & (s->num_coeff_partitions-1)];
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
1481 VP8Macroblock *mb = s->macroblocks + (s->mb_height - mb_y - 1)*2;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1482 uint8_t *intra4x4 = s->intra4x4_pred_mode + 4*mb_y*s->b4_stride;
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
1483 uint8_t *segment_map = s->segmentation_map + mb_y*s->mb_stride;
12237
f0c4dc49c8f1 VP8: smarter prefetching
darkshikari
parents: 12235
diff changeset
1484 int mb_xy = mb_y * s->mb_stride;
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1485 uint8_t *dst[3] = {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1486 curframe->data[0] + 16*mb_y*s->linesize,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1487 curframe->data[1] + 8*mb_y*s->uvlinesize,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1488 curframe->data[2] + 8*mb_y*s->uvlinesize
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1489 };
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1490
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1491 memset(s->left_nnz, 0, sizeof(s->left_nnz));
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1492
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1493 // left edge of 129 for intra prediction
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1494 if (!(avctx->flags & CODEC_FLAG_EMU_EDGE))
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1495 for (i = 0; i < 3; i++)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1496 for (y = 0; y < 16>>!!i; y++)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1497 dst[i][y*curframe->linesize[i]-1] = 129;
12170
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
1498 if (mb_y)
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
1499 memset(s->top_border, 129, sizeof(*s->top_border));
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1500
12237
f0c4dc49c8f1 VP8: smarter prefetching
darkshikari
parents: 12235
diff changeset
1501 for (mb_x = 0; mb_x < s->mb_width; mb_x++, mb_xy++, mb++) {
12221
45852dac8338 Avoid tracking i4x4 modes in P-frames in VP8
darkshikari
parents: 12220
diff changeset
1502 uint8_t *intra4x4_mb = s->keyframe ? intra4x4 + 4*mb_x : s->intra4x4_pred_mode_mb;
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
1503 uint8_t *segment_mb = segment_map+mb_x;
12221
45852dac8338 Avoid tracking i4x4 modes in P-frames in VP8
darkshikari
parents: 12220
diff changeset
1504
12215
58d828f9810f Add prefetching to VP8 decoder
darkshikari
parents: 12202
diff changeset
1505 /* Prefetch the current frame, 4 MBs ahead */
58d828f9810f Add prefetching to VP8 decoder
darkshikari
parents: 12202
diff changeset
1506 s->dsp.prefetch(dst[0] + (mb_x&3)*4*s->linesize + 64, s->linesize, 4);
58d828f9810f Add prefetching to VP8 decoder
darkshikari
parents: 12202
diff changeset
1507 s->dsp.prefetch(dst[1] + (mb_x&7)*s->uvlinesize + 64, dst[2] - dst[1], 2);
58d828f9810f Add prefetching to VP8 decoder
darkshikari
parents: 12202
diff changeset
1508
12223
93e27a5401de Convert VP8 macroblock structures to a ring buffer.
darkshikari
parents: 12222
diff changeset
1509 decode_mb_mode(s, mb, mb_x, mb_y, intra4x4_mb, segment_mb);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1510
12237
f0c4dc49c8f1 VP8: smarter prefetching
darkshikari
parents: 12235
diff changeset
1511 prefetch_motion(s, mb, mb_x, mb_y, mb_xy, VP56_FRAME_PREVIOUS);
12231
d3f3897ddb5c Smarter VP8 prefetching
darkshikari
parents: 12230
diff changeset
1512
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1513 if (!mb->skip)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1514 decode_mb_coeffs(s, c, mb, s->top_nnz[mb_x], s->left_nnz);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1515
12225
c3e11b3108d7 Eliminate a pointless memset for intra blocks in P-frames in VP8
darkshikari
parents: 12224
diff changeset
1516 if (mb->mode <= MODE_I4x4)
12221
45852dac8338 Avoid tracking i4x4 modes in P-frames in VP8
darkshikari
parents: 12220
diff changeset
1517 intra_predict(s, dst, mb, intra4x4_mb, mb_x, mb_y);
12225
c3e11b3108d7 Eliminate a pointless memset for intra blocks in P-frames in VP8
darkshikari
parents: 12224
diff changeset
1518 else
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1519 inter_predict(s, dst, mb, mb_x, mb_y);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1520
12237
f0c4dc49c8f1 VP8: smarter prefetching
darkshikari
parents: 12235
diff changeset
1521 prefetch_motion(s, mb, mb_x, mb_y, mb_xy, VP56_FRAME_GOLDEN);
12231
d3f3897ddb5c Smarter VP8 prefetching
darkshikari
parents: 12230
diff changeset
1522
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1523 if (!mb->skip) {
12238
1a7903913e9b VP8: 30% faster idct_mb
darkshikari
parents: 12237
diff changeset
1524 idct_mb(s, dst, mb);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1525 } else {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1526 AV_ZERO64(s->left_nnz);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1527 AV_WN64(s->top_nnz[mb_x], 0); // array of 9, so unaligned
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1528
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1529 // Reset DC block predictors if they would exist if the mb had coefficients
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1530 if (mb->mode != MODE_I4x4 && mb->mode != VP8_MVMODE_SPLIT) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1531 s->left_nnz[8] = 0;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1532 s->top_nnz[mb_x][8] = 0;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1533 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1534 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1535
12222
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
1536 if (s->deblock_filter)
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
1537 filter_level_for_mb(s, mb, &s->filter_strength[mb_x]);
7acdbfd2a222 Calculate deblock strength per-MB instead of per-row
darkshikari
parents: 12221
diff changeset
1538
12237
f0c4dc49c8f1 VP8: smarter prefetching
darkshikari
parents: 12235
diff changeset
1539 prefetch_motion(s, mb, mb_x, mb_y, mb_xy, VP56_FRAME_GOLDEN2);
12231
d3f3897ddb5c Smarter VP8 prefetching
darkshikari
parents: 12230
diff changeset
1540
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1541 dst[0] += 16;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1542 dst[1] += 8;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1543 dst[2] += 8;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1544 }
12170
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
1545 if (s->deblock_filter) {
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1546 if (s->filter.simple)
12170
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
1547 filter_mb_row_simple(s, mb_y);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1548 else
12170
6f0db2eeaf70 vp8: Save mb border needed for intra prediction so that loop filter can run
conrad
parents: 12169
diff changeset
1549 filter_mb_row(s, mb_y);
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1550 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1551 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1552
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1553 skip_decode:
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1554 // if future frames don't use the updated probabilities,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1555 // reset them to the values we saved
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1556 if (!s->update_probabilities)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1557 s->prob[0] = s->prob[1];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1558
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1559 // check if golden and altref are swapped
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1560 if (s->update_altref == VP56_FRAME_GOLDEN &&
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1561 s->update_golden == VP56_FRAME_GOLDEN2)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1562 FFSWAP(AVFrame *, s->framep[VP56_FRAME_GOLDEN], s->framep[VP56_FRAME_GOLDEN2]);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1563 else {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1564 if (s->update_altref != VP56_FRAME_NONE)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1565 s->framep[VP56_FRAME_GOLDEN2] = s->framep[s->update_altref];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1566
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1567 if (s->update_golden != VP56_FRAME_NONE)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1568 s->framep[VP56_FRAME_GOLDEN] = s->framep[s->update_golden];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1569 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1570
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1571 if (s->update_last) // move cur->prev
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1572 s->framep[VP56_FRAME_PREVIOUS] = s->framep[VP56_FRAME_CURRENT];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1573
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1574 // release no longer referenced frames
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1575 for (i = 0; i < 4; i++)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1576 if (s->frames[i].data[0] &&
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1577 &s->frames[i] != s->framep[VP56_FRAME_CURRENT] &&
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1578 &s->frames[i] != s->framep[VP56_FRAME_PREVIOUS] &&
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1579 &s->frames[i] != s->framep[VP56_FRAME_GOLDEN] &&
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1580 &s->frames[i] != s->framep[VP56_FRAME_GOLDEN2])
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1581 avctx->release_buffer(avctx, &s->frames[i]);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1582
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1583 if (!s->invisible) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1584 *(AVFrame*)data = *s->framep[VP56_FRAME_CURRENT];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1585 *data_size = sizeof(AVFrame);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1586 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1587
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1588 return avpkt->size;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1589 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1590
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1591 static av_cold int vp8_decode_init(AVCodecContext *avctx)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1592 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1593 VP8Context *s = avctx->priv_data;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1594
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1595 s->avctx = avctx;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1596 avctx->pix_fmt = PIX_FMT_YUV420P;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1597
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1598 dsputil_init(&s->dsp, avctx);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1599 ff_h264_pred_init(&s->hpc, CODEC_ID_VP8);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1600 ff_vp8dsp_init(&s->vp8dsp);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1601
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1602 // intra pred needs edge emulation among other things
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1603 if (avctx->flags&CODEC_FLAG_EMU_EDGE) {
11947
fc9e4874a12c fix typo in vp8 decoder error message
darkshikari
parents: 11937
diff changeset
1604 av_log(avctx, AV_LOG_ERROR, "Edge emulation not supported\n");
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1605 return AVERROR_PATCHWELCOME;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1606 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1607
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1608 return 0;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1609 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1610
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1611 static av_cold int vp8_decode_free(AVCodecContext *avctx)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1612 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1613 vp8_decode_flush(avctx);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1614 return 0;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1615 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1616
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1617 AVCodec vp8_decoder = {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1618 "vp8",
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1619 AVMEDIA_TYPE_VIDEO,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1620 CODEC_ID_VP8,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1621 sizeof(VP8Context),
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1622 vp8_decode_init,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1623 NULL,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1624 vp8_decode_free,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1625 vp8_decode_frame,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1626 CODEC_CAP_DR1,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1627 .flush = vp8_decode_flush,
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1628 .long_name = NULL_IF_CONFIG_SMALL("On2 VP8"),
f2007d7c3f1d Native VP8 decoder.
rbultje
parents:
diff changeset
1629 };