yading@10
|
1 /*
|
yading@10
|
2 * VP8 compatible video decoder
|
yading@10
|
3 *
|
yading@10
|
4 * Copyright (C) 2010 David Conrad
|
yading@10
|
5 * Copyright (C) 2010 Ronald S. Bultje
|
yading@10
|
6 * Copyright (C) 2010 Jason Garrett-Glaser
|
yading@10
|
7 * Copyright (C) 2012 Daniel Kang
|
yading@10
|
8 *
|
yading@10
|
9 * This file is part of FFmpeg.
|
yading@10
|
10 *
|
yading@10
|
11 * FFmpeg is free software; you can redistribute it and/or
|
yading@10
|
12 * modify it under the terms of the GNU Lesser General Public
|
yading@10
|
13 * License as published by the Free Software Foundation; either
|
yading@10
|
14 * version 2.1 of the License, or (at your option) any later version.
|
yading@10
|
15 *
|
yading@10
|
16 * FFmpeg is distributed in the hope that it will be useful,
|
yading@10
|
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@10
|
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@10
|
19 * Lesser General Public License for more details.
|
yading@10
|
20 *
|
yading@10
|
21 * You should have received a copy of the GNU Lesser General Public
|
yading@10
|
22 * License along with FFmpeg; if not, write to the Free Software
|
yading@10
|
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@10
|
24 */
|
yading@10
|
25
|
yading@10
|
26 #include "libavutil/imgutils.h"
|
yading@10
|
27 #include "avcodec.h"
|
yading@10
|
28 #include "internal.h"
|
yading@10
|
29 #include "vp8.h"
|
yading@10
|
30 #include "vp8data.h"
|
yading@10
|
31 #include "rectangle.h"
|
yading@10
|
32 #include "thread.h"
|
yading@10
|
33
|
yading@10
|
34 #if ARCH_ARM
|
yading@10
|
35 # include "arm/vp8.h"
|
yading@10
|
36 #endif
|
yading@10
|
37
|
yading@10
|
38 static void free_buffers(VP8Context *s)
|
yading@10
|
39 {
|
yading@10
|
40 int i;
|
yading@10
|
41 if (s->thread_data)
|
yading@10
|
42 for (i = 0; i < MAX_THREADS; i++) {
|
yading@10
|
43 #if HAVE_THREADS
|
yading@10
|
44 pthread_cond_destroy(&s->thread_data[i].cond);
|
yading@10
|
45 pthread_mutex_destroy(&s->thread_data[i].lock);
|
yading@10
|
46 #endif
|
yading@10
|
47 av_freep(&s->thread_data[i].filter_strength);
|
yading@10
|
48 av_freep(&s->thread_data[i].edge_emu_buffer);
|
yading@10
|
49 }
|
yading@10
|
50 av_freep(&s->thread_data);
|
yading@10
|
51 av_freep(&s->macroblocks_base);
|
yading@10
|
52 av_freep(&s->intra4x4_pred_mode_top);
|
yading@10
|
53 av_freep(&s->top_nnz);
|
yading@10
|
54 av_freep(&s->top_border);
|
yading@10
|
55
|
yading@10
|
56 s->macroblocks = NULL;
|
yading@10
|
57 }
|
yading@10
|
58
|
yading@10
|
59 static int vp8_alloc_frame(VP8Context *s, VP8Frame *f, int ref)
|
yading@10
|
60 {
|
yading@10
|
61 int ret;
|
yading@10
|
62 if ((ret = ff_thread_get_buffer(s->avctx, &f->tf,
|
yading@10
|
63 ref ? AV_GET_BUFFER_FLAG_REF : 0)) < 0)
|
yading@10
|
64 return ret;
|
yading@10
|
65 if (!(f->seg_map = av_buffer_allocz(s->mb_width * s->mb_height))) {
|
yading@10
|
66 ff_thread_release_buffer(s->avctx, &f->tf);
|
yading@10
|
67 return AVERROR(ENOMEM);
|
yading@10
|
68 }
|
yading@10
|
69 return 0;
|
yading@10
|
70 }
|
yading@10
|
71
|
yading@10
|
72 static void vp8_release_frame(VP8Context *s, VP8Frame *f)
|
yading@10
|
73 {
|
yading@10
|
74 av_buffer_unref(&f->seg_map);
|
yading@10
|
75 ff_thread_release_buffer(s->avctx, &f->tf);
|
yading@10
|
76 }
|
yading@10
|
77
|
yading@10
|
78 static int vp8_ref_frame(VP8Context *s, VP8Frame *dst, VP8Frame *src)
|
yading@10
|
79 {
|
yading@10
|
80 int ret;
|
yading@10
|
81
|
yading@10
|
82 vp8_release_frame(s, dst);
|
yading@10
|
83
|
yading@10
|
84 if ((ret = ff_thread_ref_frame(&dst->tf, &src->tf)) < 0)
|
yading@10
|
85 return ret;
|
yading@10
|
86 if (src->seg_map &&
|
yading@10
|
87 !(dst->seg_map = av_buffer_ref(src->seg_map))) {
|
yading@10
|
88 vp8_release_frame(s, dst);
|
yading@10
|
89 return AVERROR(ENOMEM);
|
yading@10
|
90 }
|
yading@10
|
91
|
yading@10
|
92 return 0;
|
yading@10
|
93 }
|
yading@10
|
94
|
yading@10
|
95
|
yading@10
|
96 static void vp8_decode_flush_impl(AVCodecContext *avctx, int free_mem)
|
yading@10
|
97 {
|
yading@10
|
98 VP8Context *s = avctx->priv_data;
|
yading@10
|
99 int i;
|
yading@10
|
100
|
yading@10
|
101 for (i = 0; i < FF_ARRAY_ELEMS(s->frames); i++)
|
yading@10
|
102 vp8_release_frame(s, &s->frames[i]);
|
yading@10
|
103 memset(s->framep, 0, sizeof(s->framep));
|
yading@10
|
104
|
yading@10
|
105 if (free_mem)
|
yading@10
|
106 free_buffers(s);
|
yading@10
|
107 }
|
yading@10
|
108
|
yading@10
|
109 static void vp8_decode_flush(AVCodecContext *avctx)
|
yading@10
|
110 {
|
yading@10
|
111 vp8_decode_flush_impl(avctx, 0);
|
yading@10
|
112 }
|
yading@10
|
113
|
yading@10
|
114 static int update_dimensions(VP8Context *s, int width, int height)
|
yading@10
|
115 {
|
yading@10
|
116 AVCodecContext *avctx = s->avctx;
|
yading@10
|
117 int i;
|
yading@10
|
118
|
yading@10
|
119 if (width != s->avctx->width || ((width+15)/16 != s->mb_width || (height+15)/16 != s->mb_height) && s->macroblocks_base ||
|
yading@10
|
120 height != s->avctx->height) {
|
yading@10
|
121 if (av_image_check_size(width, height, 0, s->avctx))
|
yading@10
|
122 return AVERROR_INVALIDDATA;
|
yading@10
|
123
|
yading@10
|
124 vp8_decode_flush_impl(s->avctx, 1);
|
yading@10
|
125
|
yading@10
|
126 avcodec_set_dimensions(s->avctx, width, height);
|
yading@10
|
127 }
|
yading@10
|
128
|
yading@10
|
129 s->mb_width = (s->avctx->coded_width +15) / 16;
|
yading@10
|
130 s->mb_height = (s->avctx->coded_height+15) / 16;
|
yading@10
|
131
|
yading@10
|
132 s->mb_layout = (avctx->active_thread_type == FF_THREAD_SLICE) && (FFMIN(s->num_coeff_partitions, avctx->thread_count) > 1);
|
yading@10
|
133 if (!s->mb_layout) { // Frame threading and one thread
|
yading@10
|
134 s->macroblocks_base = av_mallocz((s->mb_width+s->mb_height*2+1)*sizeof(*s->macroblocks));
|
yading@10
|
135 s->intra4x4_pred_mode_top = av_mallocz(s->mb_width*4);
|
yading@10
|
136 }
|
yading@10
|
137 else // Sliced threading
|
yading@10
|
138 s->macroblocks_base = av_mallocz((s->mb_width+2)*(s->mb_height+2)*sizeof(*s->macroblocks));
|
yading@10
|
139 s->top_nnz = av_mallocz(s->mb_width*sizeof(*s->top_nnz));
|
yading@10
|
140 s->top_border = av_mallocz((s->mb_width+1)*sizeof(*s->top_border));
|
yading@10
|
141 s->thread_data = av_mallocz(MAX_THREADS*sizeof(VP8ThreadData));
|
yading@10
|
142
|
yading@10
|
143 for (i = 0; i < MAX_THREADS; i++) {
|
yading@10
|
144 s->thread_data[i].filter_strength = av_mallocz(s->mb_width*sizeof(*s->thread_data[0].filter_strength));
|
yading@10
|
145 #if HAVE_THREADS
|
yading@10
|
146 pthread_mutex_init(&s->thread_data[i].lock, NULL);
|
yading@10
|
147 pthread_cond_init(&s->thread_data[i].cond, NULL);
|
yading@10
|
148 #endif
|
yading@10
|
149 }
|
yading@10
|
150
|
yading@10
|
151 if (!s->macroblocks_base || !s->top_nnz || !s->top_border ||
|
yading@10
|
152 (!s->intra4x4_pred_mode_top && !s->mb_layout))
|
yading@10
|
153 return AVERROR(ENOMEM);
|
yading@10
|
154
|
yading@10
|
155 s->macroblocks = s->macroblocks_base + 1;
|
yading@10
|
156
|
yading@10
|
157 return 0;
|
yading@10
|
158 }
|
yading@10
|
159
|
yading@10
|
160 static void parse_segment_info(VP8Context *s)
|
yading@10
|
161 {
|
yading@10
|
162 VP56RangeCoder *c = &s->c;
|
yading@10
|
163 int i;
|
yading@10
|
164
|
yading@10
|
165 s->segmentation.update_map = vp8_rac_get(c);
|
yading@10
|
166
|
yading@10
|
167 if (vp8_rac_get(c)) { // update segment feature data
|
yading@10
|
168 s->segmentation.absolute_vals = vp8_rac_get(c);
|
yading@10
|
169
|
yading@10
|
170 for (i = 0; i < 4; i++)
|
yading@10
|
171 s->segmentation.base_quant[i] = vp8_rac_get_sint(c, 7);
|
yading@10
|
172
|
yading@10
|
173 for (i = 0; i < 4; i++)
|
yading@10
|
174 s->segmentation.filter_level[i] = vp8_rac_get_sint(c, 6);
|
yading@10
|
175 }
|
yading@10
|
176 if (s->segmentation.update_map)
|
yading@10
|
177 for (i = 0; i < 3; i++)
|
yading@10
|
178 s->prob->segmentid[i] = vp8_rac_get(c) ? vp8_rac_get_uint(c, 8) : 255;
|
yading@10
|
179 }
|
yading@10
|
180
|
yading@10
|
181 static void update_lf_deltas(VP8Context *s)
|
yading@10
|
182 {
|
yading@10
|
183 VP56RangeCoder *c = &s->c;
|
yading@10
|
184 int i;
|
yading@10
|
185
|
yading@10
|
186 for (i = 0; i < 4; i++) {
|
yading@10
|
187 if (vp8_rac_get(c)) {
|
yading@10
|
188 s->lf_delta.ref[i] = vp8_rac_get_uint(c, 6);
|
yading@10
|
189
|
yading@10
|
190 if (vp8_rac_get(c))
|
yading@10
|
191 s->lf_delta.ref[i] = -s->lf_delta.ref[i];
|
yading@10
|
192 }
|
yading@10
|
193 }
|
yading@10
|
194
|
yading@10
|
195 for (i = MODE_I4x4; i <= VP8_MVMODE_SPLIT; i++) {
|
yading@10
|
196 if (vp8_rac_get(c)) {
|
yading@10
|
197 s->lf_delta.mode[i] = vp8_rac_get_uint(c, 6);
|
yading@10
|
198
|
yading@10
|
199 if (vp8_rac_get(c))
|
yading@10
|
200 s->lf_delta.mode[i] = -s->lf_delta.mode[i];
|
yading@10
|
201 }
|
yading@10
|
202 }
|
yading@10
|
203 }
|
yading@10
|
204
|
yading@10
|
205 static int setup_partitions(VP8Context *s, const uint8_t *buf, int buf_size)
|
yading@10
|
206 {
|
yading@10
|
207 const uint8_t *sizes = buf;
|
yading@10
|
208 int i;
|
yading@10
|
209
|
yading@10
|
210 s->num_coeff_partitions = 1 << vp8_rac_get_uint(&s->c, 2);
|
yading@10
|
211
|
yading@10
|
212 buf += 3*(s->num_coeff_partitions-1);
|
yading@10
|
213 buf_size -= 3*(s->num_coeff_partitions-1);
|
yading@10
|
214 if (buf_size < 0)
|
yading@10
|
215 return -1;
|
yading@10
|
216
|
yading@10
|
217 for (i = 0; i < s->num_coeff_partitions-1; i++) {
|
yading@10
|
218 int size = AV_RL24(sizes + 3*i);
|
yading@10
|
219 if (buf_size - size < 0)
|
yading@10
|
220 return -1;
|
yading@10
|
221
|
yading@10
|
222 ff_vp56_init_range_decoder(&s->coeff_partition[i], buf, size);
|
yading@10
|
223 buf += size;
|
yading@10
|
224 buf_size -= size;
|
yading@10
|
225 }
|
yading@10
|
226 ff_vp56_init_range_decoder(&s->coeff_partition[i], buf, buf_size);
|
yading@10
|
227
|
yading@10
|
228 return 0;
|
yading@10
|
229 }
|
yading@10
|
230
|
yading@10
|
231 static void get_quants(VP8Context *s)
|
yading@10
|
232 {
|
yading@10
|
233 VP56RangeCoder *c = &s->c;
|
yading@10
|
234 int i, base_qi;
|
yading@10
|
235
|
yading@10
|
236 int yac_qi = vp8_rac_get_uint(c, 7);
|
yading@10
|
237 int ydc_delta = vp8_rac_get_sint(c, 4);
|
yading@10
|
238 int y2dc_delta = vp8_rac_get_sint(c, 4);
|
yading@10
|
239 int y2ac_delta = vp8_rac_get_sint(c, 4);
|
yading@10
|
240 int uvdc_delta = vp8_rac_get_sint(c, 4);
|
yading@10
|
241 int uvac_delta = vp8_rac_get_sint(c, 4);
|
yading@10
|
242
|
yading@10
|
243 for (i = 0; i < 4; i++) {
|
yading@10
|
244 if (s->segmentation.enabled) {
|
yading@10
|
245 base_qi = s->segmentation.base_quant[i];
|
yading@10
|
246 if (!s->segmentation.absolute_vals)
|
yading@10
|
247 base_qi += yac_qi;
|
yading@10
|
248 } else
|
yading@10
|
249 base_qi = yac_qi;
|
yading@10
|
250
|
yading@10
|
251 s->qmat[i].luma_qmul[0] = vp8_dc_qlookup[av_clip_uintp2(base_qi + ydc_delta , 7)];
|
yading@10
|
252 s->qmat[i].luma_qmul[1] = vp8_ac_qlookup[av_clip_uintp2(base_qi , 7)];
|
yading@10
|
253 s->qmat[i].luma_dc_qmul[0] = 2 * vp8_dc_qlookup[av_clip_uintp2(base_qi + y2dc_delta, 7)];
|
yading@10
|
254 /* 101581>>16 is equivalent to 155/100 */
|
yading@10
|
255 s->qmat[i].luma_dc_qmul[1] = (101581 * vp8_ac_qlookup[av_clip_uintp2(base_qi + y2ac_delta, 7)]) >> 16;
|
yading@10
|
256 s->qmat[i].chroma_qmul[0] = vp8_dc_qlookup[av_clip_uintp2(base_qi + uvdc_delta, 7)];
|
yading@10
|
257 s->qmat[i].chroma_qmul[1] = vp8_ac_qlookup[av_clip_uintp2(base_qi + uvac_delta, 7)];
|
yading@10
|
258
|
yading@10
|
259 s->qmat[i].luma_dc_qmul[1] = FFMAX(s->qmat[i].luma_dc_qmul[1], 8);
|
yading@10
|
260 s->qmat[i].chroma_qmul[0] = FFMIN(s->qmat[i].chroma_qmul[0], 132);
|
yading@10
|
261 }
|
yading@10
|
262 }
|
yading@10
|
263
|
yading@10
|
264 /**
|
yading@10
|
265 * Determine which buffers golden and altref should be updated with after this frame.
|
yading@10
|
266 * The spec isn't clear here, so I'm going by my understanding of what libvpx does
|
yading@10
|
267 *
|
yading@10
|
268 * Intra frames update all 3 references
|
yading@10
|
269 * Inter frames update VP56_FRAME_PREVIOUS if the update_last flag is set
|
yading@10
|
270 * If the update (golden|altref) flag is set, it's updated with the current frame
|
yading@10
|
271 * if update_last is set, and VP56_FRAME_PREVIOUS otherwise.
|
yading@10
|
272 * If the flag is not set, the number read means:
|
yading@10
|
273 * 0: no update
|
yading@10
|
274 * 1: VP56_FRAME_PREVIOUS
|
yading@10
|
275 * 2: update golden with altref, or update altref with golden
|
yading@10
|
276 */
|
yading@10
|
277 static VP56Frame ref_to_update(VP8Context *s, int update, VP56Frame ref)
|
yading@10
|
278 {
|
yading@10
|
279 VP56RangeCoder *c = &s->c;
|
yading@10
|
280
|
yading@10
|
281 if (update)
|
yading@10
|
282 return VP56_FRAME_CURRENT;
|
yading@10
|
283
|
yading@10
|
284 switch (vp8_rac_get_uint(c, 2)) {
|
yading@10
|
285 case 1:
|
yading@10
|
286 return VP56_FRAME_PREVIOUS;
|
yading@10
|
287 case 2:
|
yading@10
|
288 return (ref == VP56_FRAME_GOLDEN) ? VP56_FRAME_GOLDEN2 : VP56_FRAME_GOLDEN;
|
yading@10
|
289 }
|
yading@10
|
290 return VP56_FRAME_NONE;
|
yading@10
|
291 }
|
yading@10
|
292
|
yading@10
|
293 static void update_refs(VP8Context *s)
|
yading@10
|
294 {
|
yading@10
|
295 VP56RangeCoder *c = &s->c;
|
yading@10
|
296
|
yading@10
|
297 int update_golden = vp8_rac_get(c);
|
yading@10
|
298 int update_altref = vp8_rac_get(c);
|
yading@10
|
299
|
yading@10
|
300 s->update_golden = ref_to_update(s, update_golden, VP56_FRAME_GOLDEN);
|
yading@10
|
301 s->update_altref = ref_to_update(s, update_altref, VP56_FRAME_GOLDEN2);
|
yading@10
|
302 }
|
yading@10
|
303
|
yading@10
|
304 static int decode_frame_header(VP8Context *s, const uint8_t *buf, int buf_size)
|
yading@10
|
305 {
|
yading@10
|
306 VP56RangeCoder *c = &s->c;
|
yading@10
|
307 int header_size, hscale, vscale, i, j, k, l, m, ret;
|
yading@10
|
308 int width = s->avctx->width;
|
yading@10
|
309 int height = s->avctx->height;
|
yading@10
|
310
|
yading@10
|
311 s->keyframe = !(buf[0] & 1);
|
yading@10
|
312 s->profile = (buf[0]>>1) & 7;
|
yading@10
|
313 s->invisible = !(buf[0] & 0x10);
|
yading@10
|
314 header_size = AV_RL24(buf) >> 5;
|
yading@10
|
315 buf += 3;
|
yading@10
|
316 buf_size -= 3;
|
yading@10
|
317
|
yading@10
|
318 if (s->profile > 3)
|
yading@10
|
319 av_log(s->avctx, AV_LOG_WARNING, "Unknown profile %d\n", s->profile);
|
yading@10
|
320
|
yading@10
|
321 if (!s->profile)
|
yading@10
|
322 memcpy(s->put_pixels_tab, s->vp8dsp.put_vp8_epel_pixels_tab, sizeof(s->put_pixels_tab));
|
yading@10
|
323 else // profile 1-3 use bilinear, 4+ aren't defined so whatever
|
yading@10
|
324 memcpy(s->put_pixels_tab, s->vp8dsp.put_vp8_bilinear_pixels_tab, sizeof(s->put_pixels_tab));
|
yading@10
|
325
|
yading@10
|
326 if (header_size > buf_size - 7*s->keyframe) {
|
yading@10
|
327 av_log(s->avctx, AV_LOG_ERROR, "Header size larger than data provided\n");
|
yading@10
|
328 return AVERROR_INVALIDDATA;
|
yading@10
|
329 }
|
yading@10
|
330
|
yading@10
|
331 if (s->keyframe) {
|
yading@10
|
332 if (AV_RL24(buf) != 0x2a019d) {
|
yading@10
|
333 av_log(s->avctx, AV_LOG_ERROR, "Invalid start code 0x%x\n", AV_RL24(buf));
|
yading@10
|
334 return AVERROR_INVALIDDATA;
|
yading@10
|
335 }
|
yading@10
|
336 width = AV_RL16(buf+3) & 0x3fff;
|
yading@10
|
337 height = AV_RL16(buf+5) & 0x3fff;
|
yading@10
|
338 hscale = buf[4] >> 6;
|
yading@10
|
339 vscale = buf[6] >> 6;
|
yading@10
|
340 buf += 7;
|
yading@10
|
341 buf_size -= 7;
|
yading@10
|
342
|
yading@10
|
343 if (hscale || vscale)
|
yading@10
|
344 avpriv_request_sample(s->avctx, "Upscaling");
|
yading@10
|
345
|
yading@10
|
346 s->update_golden = s->update_altref = VP56_FRAME_CURRENT;
|
yading@10
|
347 for (i = 0; i < 4; i++)
|
yading@10
|
348 for (j = 0; j < 16; j++)
|
yading@10
|
349 memcpy(s->prob->token[i][j], vp8_token_default_probs[i][vp8_coeff_band[j]],
|
yading@10
|
350 sizeof(s->prob->token[i][j]));
|
yading@10
|
351 memcpy(s->prob->pred16x16, vp8_pred16x16_prob_inter, sizeof(s->prob->pred16x16));
|
yading@10
|
352 memcpy(s->prob->pred8x8c , vp8_pred8x8c_prob_inter , sizeof(s->prob->pred8x8c));
|
yading@10
|
353 memcpy(s->prob->mvc , vp8_mv_default_prob , sizeof(s->prob->mvc));
|
yading@10
|
354 memset(&s->segmentation, 0, sizeof(s->segmentation));
|
yading@10
|
355 memset(&s->lf_delta, 0, sizeof(s->lf_delta));
|
yading@10
|
356 }
|
yading@10
|
357
|
yading@10
|
358 ff_vp56_init_range_decoder(c, buf, header_size);
|
yading@10
|
359 buf += header_size;
|
yading@10
|
360 buf_size -= header_size;
|
yading@10
|
361
|
yading@10
|
362 if (s->keyframe) {
|
yading@10
|
363 if (vp8_rac_get(c))
|
yading@10
|
364 av_log(s->avctx, AV_LOG_WARNING, "Unspecified colorspace\n");
|
yading@10
|
365 vp8_rac_get(c); // whether we can skip clamping in dsp functions
|
yading@10
|
366 }
|
yading@10
|
367
|
yading@10
|
368 if ((s->segmentation.enabled = vp8_rac_get(c)))
|
yading@10
|
369 parse_segment_info(s);
|
yading@10
|
370 else
|
yading@10
|
371 s->segmentation.update_map = 0; // FIXME: move this to some init function?
|
yading@10
|
372
|
yading@10
|
373 s->filter.simple = vp8_rac_get(c);
|
yading@10
|
374 s->filter.level = vp8_rac_get_uint(c, 6);
|
yading@10
|
375 s->filter.sharpness = vp8_rac_get_uint(c, 3);
|
yading@10
|
376
|
yading@10
|
377 if ((s->lf_delta.enabled = vp8_rac_get(c)))
|
yading@10
|
378 if (vp8_rac_get(c))
|
yading@10
|
379 update_lf_deltas(s);
|
yading@10
|
380
|
yading@10
|
381 if (setup_partitions(s, buf, buf_size)) {
|
yading@10
|
382 av_log(s->avctx, AV_LOG_ERROR, "Invalid partitions\n");
|
yading@10
|
383 return AVERROR_INVALIDDATA;
|
yading@10
|
384 }
|
yading@10
|
385
|
yading@10
|
386 if (!s->macroblocks_base || /* first frame */
|
yading@10
|
387 width != s->avctx->width || height != s->avctx->height || (width+15)/16 != s->mb_width || (height+15)/16 != s->mb_height) {
|
yading@10
|
388 if ((ret = update_dimensions(s, width, height)) < 0)
|
yading@10
|
389 return ret;
|
yading@10
|
390 }
|
yading@10
|
391
|
yading@10
|
392 get_quants(s);
|
yading@10
|
393
|
yading@10
|
394 if (!s->keyframe) {
|
yading@10
|
395 update_refs(s);
|
yading@10
|
396 s->sign_bias[VP56_FRAME_GOLDEN] = vp8_rac_get(c);
|
yading@10
|
397 s->sign_bias[VP56_FRAME_GOLDEN2 /* altref */] = vp8_rac_get(c);
|
yading@10
|
398 }
|
yading@10
|
399
|
yading@10
|
400 // if we aren't saving this frame's probabilities for future frames,
|
yading@10
|
401 // make a copy of the current probabilities
|
yading@10
|
402 if (!(s->update_probabilities = vp8_rac_get(c)))
|
yading@10
|
403 s->prob[1] = s->prob[0];
|
yading@10
|
404
|
yading@10
|
405 s->update_last = s->keyframe || vp8_rac_get(c);
|
yading@10
|
406
|
yading@10
|
407 for (i = 0; i < 4; i++)
|
yading@10
|
408 for (j = 0; j < 8; j++)
|
yading@10
|
409 for (k = 0; k < 3; k++)
|
yading@10
|
410 for (l = 0; l < NUM_DCT_TOKENS-1; l++)
|
yading@10
|
411 if (vp56_rac_get_prob_branchy(c, vp8_token_update_probs[i][j][k][l])) {
|
yading@10
|
412 int prob = vp8_rac_get_uint(c, 8);
|
yading@10
|
413 for (m = 0; vp8_coeff_band_indexes[j][m] >= 0; m++)
|
yading@10
|
414 s->prob->token[i][vp8_coeff_band_indexes[j][m]][k][l] = prob;
|
yading@10
|
415 }
|
yading@10
|
416
|
yading@10
|
417 if ((s->mbskip_enabled = vp8_rac_get(c)))
|
yading@10
|
418 s->prob->mbskip = vp8_rac_get_uint(c, 8);
|
yading@10
|
419
|
yading@10
|
420 if (!s->keyframe) {
|
yading@10
|
421 s->prob->intra = vp8_rac_get_uint(c, 8);
|
yading@10
|
422 s->prob->last = vp8_rac_get_uint(c, 8);
|
yading@10
|
423 s->prob->golden = vp8_rac_get_uint(c, 8);
|
yading@10
|
424
|
yading@10
|
425 if (vp8_rac_get(c))
|
yading@10
|
426 for (i = 0; i < 4; i++)
|
yading@10
|
427 s->prob->pred16x16[i] = vp8_rac_get_uint(c, 8);
|
yading@10
|
428 if (vp8_rac_get(c))
|
yading@10
|
429 for (i = 0; i < 3; i++)
|
yading@10
|
430 s->prob->pred8x8c[i] = vp8_rac_get_uint(c, 8);
|
yading@10
|
431
|
yading@10
|
432 // 17.2 MV probability update
|
yading@10
|
433 for (i = 0; i < 2; i++)
|
yading@10
|
434 for (j = 0; j < 19; j++)
|
yading@10
|
435 if (vp56_rac_get_prob_branchy(c, vp8_mv_update_prob[i][j]))
|
yading@10
|
436 s->prob->mvc[i][j] = vp8_rac_get_nn(c);
|
yading@10
|
437 }
|
yading@10
|
438
|
yading@10
|
439 return 0;
|
yading@10
|
440 }
|
yading@10
|
441
|
yading@10
|
442 static av_always_inline void clamp_mv(VP8Context *s, VP56mv *dst, const VP56mv *src)
|
yading@10
|
443 {
|
yading@10
|
444 dst->x = av_clip(src->x, s->mv_min.x, s->mv_max.x);
|
yading@10
|
445 dst->y = av_clip(src->y, s->mv_min.y, s->mv_max.y);
|
yading@10
|
446 }
|
yading@10
|
447
|
yading@10
|
448 /**
|
yading@10
|
449 * Motion vector coding, 17.1.
|
yading@10
|
450 */
|
yading@10
|
451 static int read_mv_component(VP56RangeCoder *c, const uint8_t *p)
|
yading@10
|
452 {
|
yading@10
|
453 int bit, x = 0;
|
yading@10
|
454
|
yading@10
|
455 if (vp56_rac_get_prob_branchy(c, p[0])) {
|
yading@10
|
456 int i;
|
yading@10
|
457
|
yading@10
|
458 for (i = 0; i < 3; i++)
|
yading@10
|
459 x += vp56_rac_get_prob(c, p[9 + i]) << i;
|
yading@10
|
460 for (i = 9; i > 3; i--)
|
yading@10
|
461 x += vp56_rac_get_prob(c, p[9 + i]) << i;
|
yading@10
|
462 if (!(x & 0xFFF0) || vp56_rac_get_prob(c, p[12]))
|
yading@10
|
463 x += 8;
|
yading@10
|
464 } else {
|
yading@10
|
465 // small_mvtree
|
yading@10
|
466 const uint8_t *ps = p+2;
|
yading@10
|
467 bit = vp56_rac_get_prob(c, *ps);
|
yading@10
|
468 ps += 1 + 3*bit;
|
yading@10
|
469 x += 4*bit;
|
yading@10
|
470 bit = vp56_rac_get_prob(c, *ps);
|
yading@10
|
471 ps += 1 + bit;
|
yading@10
|
472 x += 2*bit;
|
yading@10
|
473 x += vp56_rac_get_prob(c, *ps);
|
yading@10
|
474 }
|
yading@10
|
475
|
yading@10
|
476 return (x && vp56_rac_get_prob(c, p[1])) ? -x : x;
|
yading@10
|
477 }
|
yading@10
|
478
|
yading@10
|
479 static av_always_inline
|
yading@10
|
480 const uint8_t *get_submv_prob(uint32_t left, uint32_t top)
|
yading@10
|
481 {
|
yading@10
|
482 if (left == top)
|
yading@10
|
483 return vp8_submv_prob[4-!!left];
|
yading@10
|
484 if (!top)
|
yading@10
|
485 return vp8_submv_prob[2];
|
yading@10
|
486 return vp8_submv_prob[1-!!left];
|
yading@10
|
487 }
|
yading@10
|
488
|
yading@10
|
489 /**
|
yading@10
|
490 * Split motion vector prediction, 16.4.
|
yading@10
|
491 * @returns the number of motion vectors parsed (2, 4 or 16)
|
yading@10
|
492 */
|
yading@10
|
493 static av_always_inline
|
yading@10
|
494 int decode_splitmvs(VP8Context *s, VP56RangeCoder *c, VP8Macroblock *mb, int layout)
|
yading@10
|
495 {
|
yading@10
|
496 int part_idx;
|
yading@10
|
497 int n, num;
|
yading@10
|
498 VP8Macroblock *top_mb;
|
yading@10
|
499 VP8Macroblock *left_mb = &mb[-1];
|
yading@10
|
500 const uint8_t *mbsplits_left = vp8_mbsplits[left_mb->partitioning],
|
yading@10
|
501 *mbsplits_top,
|
yading@10
|
502 *mbsplits_cur, *firstidx;
|
yading@10
|
503 VP56mv *top_mv;
|
yading@10
|
504 VP56mv *left_mv = left_mb->bmv;
|
yading@10
|
505 VP56mv *cur_mv = mb->bmv;
|
yading@10
|
506
|
yading@10
|
507 if (!layout) // layout is inlined, s->mb_layout is not
|
yading@10
|
508 top_mb = &mb[2];
|
yading@10
|
509 else
|
yading@10
|
510 top_mb = &mb[-s->mb_width-1];
|
yading@10
|
511 mbsplits_top = vp8_mbsplits[top_mb->partitioning];
|
yading@10
|
512 top_mv = top_mb->bmv;
|
yading@10
|
513
|
yading@10
|
514 if (vp56_rac_get_prob_branchy(c, vp8_mbsplit_prob[0])) {
|
yading@10
|
515 if (vp56_rac_get_prob_branchy(c, vp8_mbsplit_prob[1])) {
|
yading@10
|
516 part_idx = VP8_SPLITMVMODE_16x8 + vp56_rac_get_prob(c, vp8_mbsplit_prob[2]);
|
yading@10
|
517 } else {
|
yading@10
|
518 part_idx = VP8_SPLITMVMODE_8x8;
|
yading@10
|
519 }
|
yading@10
|
520 } else {
|
yading@10
|
521 part_idx = VP8_SPLITMVMODE_4x4;
|
yading@10
|
522 }
|
yading@10
|
523
|
yading@10
|
524 num = vp8_mbsplit_count[part_idx];
|
yading@10
|
525 mbsplits_cur = vp8_mbsplits[part_idx],
|
yading@10
|
526 firstidx = vp8_mbfirstidx[part_idx];
|
yading@10
|
527 mb->partitioning = part_idx;
|
yading@10
|
528
|
yading@10
|
529 for (n = 0; n < num; n++) {
|
yading@10
|
530 int k = firstidx[n];
|
yading@10
|
531 uint32_t left, above;
|
yading@10
|
532 const uint8_t *submv_prob;
|
yading@10
|
533
|
yading@10
|
534 if (!(k & 3))
|
yading@10
|
535 left = AV_RN32A(&left_mv[mbsplits_left[k + 3]]);
|
yading@10
|
536 else
|
yading@10
|
537 left = AV_RN32A(&cur_mv[mbsplits_cur[k - 1]]);
|
yading@10
|
538 if (k <= 3)
|
yading@10
|
539 above = AV_RN32A(&top_mv[mbsplits_top[k + 12]]);
|
yading@10
|
540 else
|
yading@10
|
541 above = AV_RN32A(&cur_mv[mbsplits_cur[k - 4]]);
|
yading@10
|
542
|
yading@10
|
543 submv_prob = get_submv_prob(left, above);
|
yading@10
|
544
|
yading@10
|
545 if (vp56_rac_get_prob_branchy(c, submv_prob[0])) {
|
yading@10
|
546 if (vp56_rac_get_prob_branchy(c, submv_prob[1])) {
|
yading@10
|
547 if (vp56_rac_get_prob_branchy(c, submv_prob[2])) {
|
yading@10
|
548 mb->bmv[n].y = mb->mv.y + read_mv_component(c, s->prob->mvc[0]);
|
yading@10
|
549 mb->bmv[n].x = mb->mv.x + read_mv_component(c, s->prob->mvc[1]);
|
yading@10
|
550 } else {
|
yading@10
|
551 AV_ZERO32(&mb->bmv[n]);
|
yading@10
|
552 }
|
yading@10
|
553 } else {
|
yading@10
|
554 AV_WN32A(&mb->bmv[n], above);
|
yading@10
|
555 }
|
yading@10
|
556 } else {
|
yading@10
|
557 AV_WN32A(&mb->bmv[n], left);
|
yading@10
|
558 }
|
yading@10
|
559 }
|
yading@10
|
560
|
yading@10
|
561 return num;
|
yading@10
|
562 }
|
yading@10
|
563
|
yading@10
|
564 static av_always_inline
|
yading@10
|
565 void decode_mvs(VP8Context *s, VP8Macroblock *mb, int mb_x, int mb_y, int layout)
|
yading@10
|
566 {
|
yading@10
|
567 VP8Macroblock *mb_edge[3] = { 0 /* top */,
|
yading@10
|
568 mb - 1 /* left */,
|
yading@10
|
569 0 /* top-left */ };
|
yading@10
|
570 enum { CNT_ZERO, CNT_NEAREST, CNT_NEAR, CNT_SPLITMV };
|
yading@10
|
571 enum { VP8_EDGE_TOP, VP8_EDGE_LEFT, VP8_EDGE_TOPLEFT };
|
yading@10
|
572 int idx = CNT_ZERO;
|
yading@10
|
573 int cur_sign_bias = s->sign_bias[mb->ref_frame];
|
yading@10
|
574 int8_t *sign_bias = s->sign_bias;
|
yading@10
|
575 VP56mv near_mv[4];
|
yading@10
|
576 uint8_t cnt[4] = { 0 };
|
yading@10
|
577 VP56RangeCoder *c = &s->c;
|
yading@10
|
578
|
yading@10
|
579 if (!layout) { // layout is inlined (s->mb_layout is not)
|
yading@10
|
580 mb_edge[0] = mb + 2;
|
yading@10
|
581 mb_edge[2] = mb + 1;
|
yading@10
|
582 }
|
yading@10
|
583 else {
|
yading@10
|
584 mb_edge[0] = mb - s->mb_width-1;
|
yading@10
|
585 mb_edge[2] = mb - s->mb_width-2;
|
yading@10
|
586 }
|
yading@10
|
587
|
yading@10
|
588 AV_ZERO32(&near_mv[0]);
|
yading@10
|
589 AV_ZERO32(&near_mv[1]);
|
yading@10
|
590 AV_ZERO32(&near_mv[2]);
|
yading@10
|
591
|
yading@10
|
592 /* Process MB on top, left and top-left */
|
yading@10
|
593 #define MV_EDGE_CHECK(n)\
|
yading@10
|
594 {\
|
yading@10
|
595 VP8Macroblock *edge = mb_edge[n];\
|
yading@10
|
596 int edge_ref = edge->ref_frame;\
|
yading@10
|
597 if (edge_ref != VP56_FRAME_CURRENT) {\
|
yading@10
|
598 uint32_t mv = AV_RN32A(&edge->mv);\
|
yading@10
|
599 if (mv) {\
|
yading@10
|
600 if (cur_sign_bias != sign_bias[edge_ref]) {\
|
yading@10
|
601 /* SWAR negate of the values in mv. */\
|
yading@10
|
602 mv = ~mv;\
|
yading@10
|
603 mv = ((mv&0x7fff7fff) + 0x00010001) ^ (mv&0x80008000);\
|
yading@10
|
604 }\
|
yading@10
|
605 if (!n || mv != AV_RN32A(&near_mv[idx]))\
|
yading@10
|
606 AV_WN32A(&near_mv[++idx], mv);\
|
yading@10
|
607 cnt[idx] += 1 + (n != 2);\
|
yading@10
|
608 } else\
|
yading@10
|
609 cnt[CNT_ZERO] += 1 + (n != 2);\
|
yading@10
|
610 }\
|
yading@10
|
611 }
|
yading@10
|
612
|
yading@10
|
613 MV_EDGE_CHECK(0)
|
yading@10
|
614 MV_EDGE_CHECK(1)
|
yading@10
|
615 MV_EDGE_CHECK(2)
|
yading@10
|
616
|
yading@10
|
617 mb->partitioning = VP8_SPLITMVMODE_NONE;
|
yading@10
|
618 if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[CNT_ZERO]][0])) {
|
yading@10
|
619 mb->mode = VP8_MVMODE_MV;
|
yading@10
|
620
|
yading@10
|
621 /* If we have three distinct MVs, merge first and last if they're the same */
|
yading@10
|
622 if (cnt[CNT_SPLITMV] && AV_RN32A(&near_mv[1 + VP8_EDGE_TOP]) == AV_RN32A(&near_mv[1 + VP8_EDGE_TOPLEFT]))
|
yading@10
|
623 cnt[CNT_NEAREST] += 1;
|
yading@10
|
624
|
yading@10
|
625 /* Swap near and nearest if necessary */
|
yading@10
|
626 if (cnt[CNT_NEAR] > cnt[CNT_NEAREST]) {
|
yading@10
|
627 FFSWAP(uint8_t, cnt[CNT_NEAREST], cnt[CNT_NEAR]);
|
yading@10
|
628 FFSWAP( VP56mv, near_mv[CNT_NEAREST], near_mv[CNT_NEAR]);
|
yading@10
|
629 }
|
yading@10
|
630
|
yading@10
|
631 if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[CNT_NEAREST]][1])) {
|
yading@10
|
632 if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[CNT_NEAR]][2])) {
|
yading@10
|
633
|
yading@10
|
634 /* Choose the best mv out of 0,0 and the nearest mv */
|
yading@10
|
635 clamp_mv(s, &mb->mv, &near_mv[CNT_ZERO + (cnt[CNT_NEAREST] >= cnt[CNT_ZERO])]);
|
yading@10
|
636 cnt[CNT_SPLITMV] = ((mb_edge[VP8_EDGE_LEFT]->mode == VP8_MVMODE_SPLIT) +
|
yading@10
|
637 (mb_edge[VP8_EDGE_TOP]->mode == VP8_MVMODE_SPLIT)) * 2 +
|
yading@10
|
638 (mb_edge[VP8_EDGE_TOPLEFT]->mode == VP8_MVMODE_SPLIT);
|
yading@10
|
639
|
yading@10
|
640 if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[CNT_SPLITMV]][3])) {
|
yading@10
|
641 mb->mode = VP8_MVMODE_SPLIT;
|
yading@10
|
642 mb->mv = mb->bmv[decode_splitmvs(s, c, mb, layout) - 1];
|
yading@10
|
643 } else {
|
yading@10
|
644 mb->mv.y += read_mv_component(c, s->prob->mvc[0]);
|
yading@10
|
645 mb->mv.x += read_mv_component(c, s->prob->mvc[1]);
|
yading@10
|
646 mb->bmv[0] = mb->mv;
|
yading@10
|
647 }
|
yading@10
|
648 } else {
|
yading@10
|
649 clamp_mv(s, &mb->mv, &near_mv[CNT_NEAR]);
|
yading@10
|
650 mb->bmv[0] = mb->mv;
|
yading@10
|
651 }
|
yading@10
|
652 } else {
|
yading@10
|
653 clamp_mv(s, &mb->mv, &near_mv[CNT_NEAREST]);
|
yading@10
|
654 mb->bmv[0] = mb->mv;
|
yading@10
|
655 }
|
yading@10
|
656 } else {
|
yading@10
|
657 mb->mode = VP8_MVMODE_ZERO;
|
yading@10
|
658 AV_ZERO32(&mb->mv);
|
yading@10
|
659 mb->bmv[0] = mb->mv;
|
yading@10
|
660 }
|
yading@10
|
661 }
|
yading@10
|
662
|
yading@10
|
663 static av_always_inline
|
yading@10
|
664 void decode_intra4x4_modes(VP8Context *s, VP56RangeCoder *c, VP8Macroblock *mb,
|
yading@10
|
665 int mb_x, int keyframe, int layout)
|
yading@10
|
666 {
|
yading@10
|
667 uint8_t *intra4x4 = mb->intra4x4_pred_mode_mb;
|
yading@10
|
668
|
yading@10
|
669 if (layout == 1) {
|
yading@10
|
670 VP8Macroblock *mb_top = mb - s->mb_width - 1;
|
yading@10
|
671 memcpy(mb->intra4x4_pred_mode_top, mb_top->intra4x4_pred_mode_top, 4);
|
yading@10
|
672 }
|
yading@10
|
673 if (keyframe) {
|
yading@10
|
674 int x, y;
|
yading@10
|
675 uint8_t* top;
|
yading@10
|
676 uint8_t* const left = s->intra4x4_pred_mode_left;
|
yading@10
|
677 if (layout == 1)
|
yading@10
|
678 top = mb->intra4x4_pred_mode_top;
|
yading@10
|
679 else
|
yading@10
|
680 top = s->intra4x4_pred_mode_top + 4 * mb_x;
|
yading@10
|
681 for (y = 0; y < 4; y++) {
|
yading@10
|
682 for (x = 0; x < 4; x++) {
|
yading@10
|
683 const uint8_t *ctx;
|
yading@10
|
684 ctx = vp8_pred4x4_prob_intra[top[x]][left[y]];
|
yading@10
|
685 *intra4x4 = vp8_rac_get_tree(c, vp8_pred4x4_tree, ctx);
|
yading@10
|
686 left[y] = top[x] = *intra4x4;
|
yading@10
|
687 intra4x4++;
|
yading@10
|
688 }
|
yading@10
|
689 }
|
yading@10
|
690 } else {
|
yading@10
|
691 int i;
|
yading@10
|
692 for (i = 0; i < 16; i++)
|
yading@10
|
693 intra4x4[i] = vp8_rac_get_tree(c, vp8_pred4x4_tree, vp8_pred4x4_prob_inter);
|
yading@10
|
694 }
|
yading@10
|
695 }
|
yading@10
|
696
|
yading@10
|
697 static av_always_inline
|
yading@10
|
698 void decode_mb_mode(VP8Context *s, VP8Macroblock *mb, int mb_x, int mb_y,
|
yading@10
|
699 uint8_t *segment, uint8_t *ref, int layout)
|
yading@10
|
700 {
|
yading@10
|
701 VP56RangeCoder *c = &s->c;
|
yading@10
|
702
|
yading@10
|
703 if (s->segmentation.update_map) {
|
yading@10
|
704 int bit = vp56_rac_get_prob(c, s->prob->segmentid[0]);
|
yading@10
|
705 *segment = vp56_rac_get_prob(c, s->prob->segmentid[1+bit]) + 2*bit;
|
yading@10
|
706 } else if (s->segmentation.enabled)
|
yading@10
|
707 *segment = ref ? *ref : *segment;
|
yading@10
|
708 mb->segment = *segment;
|
yading@10
|
709
|
yading@10
|
710 mb->skip = s->mbskip_enabled ? vp56_rac_get_prob(c, s->prob->mbskip) : 0;
|
yading@10
|
711
|
yading@10
|
712 if (s->keyframe) {
|
yading@10
|
713 mb->mode = vp8_rac_get_tree(c, vp8_pred16x16_tree_intra, vp8_pred16x16_prob_intra);
|
yading@10
|
714
|
yading@10
|
715 if (mb->mode == MODE_I4x4) {
|
yading@10
|
716 decode_intra4x4_modes(s, c, mb, mb_x, 1, layout);
|
yading@10
|
717 } else {
|
yading@10
|
718 const uint32_t modes = vp8_pred4x4_mode[mb->mode] * 0x01010101u;
|
yading@10
|
719 if (s->mb_layout == 1)
|
yading@10
|
720 AV_WN32A(mb->intra4x4_pred_mode_top, modes);
|
yading@10
|
721 else
|
yading@10
|
722 AV_WN32A(s->intra4x4_pred_mode_top + 4 * mb_x, modes);
|
yading@10
|
723 AV_WN32A( s->intra4x4_pred_mode_left, modes);
|
yading@10
|
724 }
|
yading@10
|
725
|
yading@10
|
726 mb->chroma_pred_mode = vp8_rac_get_tree(c, vp8_pred8x8c_tree, vp8_pred8x8c_prob_intra);
|
yading@10
|
727 mb->ref_frame = VP56_FRAME_CURRENT;
|
yading@10
|
728 } else if (vp56_rac_get_prob_branchy(c, s->prob->intra)) {
|
yading@10
|
729 // inter MB, 16.2
|
yading@10
|
730 if (vp56_rac_get_prob_branchy(c, s->prob->last))
|
yading@10
|
731 mb->ref_frame = vp56_rac_get_prob(c, s->prob->golden) ?
|
yading@10
|
732 VP56_FRAME_GOLDEN2 /* altref */ : VP56_FRAME_GOLDEN;
|
yading@10
|
733 else
|
yading@10
|
734 mb->ref_frame = VP56_FRAME_PREVIOUS;
|
yading@10
|
735 s->ref_count[mb->ref_frame-1]++;
|
yading@10
|
736
|
yading@10
|
737 // motion vectors, 16.3
|
yading@10
|
738 decode_mvs(s, mb, mb_x, mb_y, layout);
|
yading@10
|
739 } else {
|
yading@10
|
740 // intra MB, 16.1
|
yading@10
|
741 mb->mode = vp8_rac_get_tree(c, vp8_pred16x16_tree_inter, s->prob->pred16x16);
|
yading@10
|
742
|
yading@10
|
743 if (mb->mode == MODE_I4x4)
|
yading@10
|
744 decode_intra4x4_modes(s, c, mb, mb_x, 0, layout);
|
yading@10
|
745
|
yading@10
|
746 mb->chroma_pred_mode = vp8_rac_get_tree(c, vp8_pred8x8c_tree, s->prob->pred8x8c);
|
yading@10
|
747 mb->ref_frame = VP56_FRAME_CURRENT;
|
yading@10
|
748 mb->partitioning = VP8_SPLITMVMODE_NONE;
|
yading@10
|
749 AV_ZERO32(&mb->bmv[0]);
|
yading@10
|
750 }
|
yading@10
|
751 }
|
yading@10
|
752
|
yading@10
|
753 #ifndef decode_block_coeffs_internal
|
yading@10
|
754 /**
|
yading@10
|
755 * @param r arithmetic bitstream reader context
|
yading@10
|
756 * @param block destination for block coefficients
|
yading@10
|
757 * @param probs probabilities to use when reading trees from the bitstream
|
yading@10
|
758 * @param i initial coeff index, 0 unless a separate DC block is coded
|
yading@10
|
759 * @param qmul array holding the dc/ac dequant factor at position 0/1
|
yading@10
|
760 * @return 0 if no coeffs were decoded
|
yading@10
|
761 * otherwise, the index of the last coeff decoded plus one
|
yading@10
|
762 */
|
yading@10
|
763 static int decode_block_coeffs_internal(VP56RangeCoder *r, int16_t block[16],
|
yading@10
|
764 uint8_t probs[16][3][NUM_DCT_TOKENS-1],
|
yading@10
|
765 int i, uint8_t *token_prob, int16_t qmul[2])
|
yading@10
|
766 {
|
yading@10
|
767 VP56RangeCoder c = *r;
|
yading@10
|
768 goto skip_eob;
|
yading@10
|
769 do {
|
yading@10
|
770 int coeff;
|
yading@10
|
771 if (!vp56_rac_get_prob_branchy(&c, token_prob[0])) // DCT_EOB
|
yading@10
|
772 break;
|
yading@10
|
773
|
yading@10
|
774 skip_eob:
|
yading@10
|
775 if (!vp56_rac_get_prob_branchy(&c, token_prob[1])) { // DCT_0
|
yading@10
|
776 if (++i == 16)
|
yading@10
|
777 break; // invalid input; blocks should end with EOB
|
yading@10
|
778 token_prob = probs[i][0];
|
yading@10
|
779 goto skip_eob;
|
yading@10
|
780 }
|
yading@10
|
781
|
yading@10
|
782 if (!vp56_rac_get_prob_branchy(&c, token_prob[2])) { // DCT_1
|
yading@10
|
783 coeff = 1;
|
yading@10
|
784 token_prob = probs[i+1][1];
|
yading@10
|
785 } else {
|
yading@10
|
786 if (!vp56_rac_get_prob_branchy(&c, token_prob[3])) { // DCT 2,3,4
|
yading@10
|
787 coeff = vp56_rac_get_prob_branchy(&c, token_prob[4]);
|
yading@10
|
788 if (coeff)
|
yading@10
|
789 coeff += vp56_rac_get_prob(&c, token_prob[5]);
|
yading@10
|
790 coeff += 2;
|
yading@10
|
791 } else {
|
yading@10
|
792 // DCT_CAT*
|
yading@10
|
793 if (!vp56_rac_get_prob_branchy(&c, token_prob[6])) {
|
yading@10
|
794 if (!vp56_rac_get_prob_branchy(&c, token_prob[7])) { // DCT_CAT1
|
yading@10
|
795 coeff = 5 + vp56_rac_get_prob(&c, vp8_dct_cat1_prob[0]);
|
yading@10
|
796 } else { // DCT_CAT2
|
yading@10
|
797 coeff = 7;
|
yading@10
|
798 coeff += vp56_rac_get_prob(&c, vp8_dct_cat2_prob[0]) << 1;
|
yading@10
|
799 coeff += vp56_rac_get_prob(&c, vp8_dct_cat2_prob[1]);
|
yading@10
|
800 }
|
yading@10
|
801 } else { // DCT_CAT3 and up
|
yading@10
|
802 int a = vp56_rac_get_prob(&c, token_prob[8]);
|
yading@10
|
803 int b = vp56_rac_get_prob(&c, token_prob[9+a]);
|
yading@10
|
804 int cat = (a<<1) + b;
|
yading@10
|
805 coeff = 3 + (8<<cat);
|
yading@10
|
806 coeff += vp8_rac_get_coeff(&c, ff_vp8_dct_cat_prob[cat]);
|
yading@10
|
807 }
|
yading@10
|
808 }
|
yading@10
|
809 token_prob = probs[i+1][2];
|
yading@10
|
810 }
|
yading@10
|
811 block[zigzag_scan[i]] = (vp8_rac_get(&c) ? -coeff : coeff) * qmul[!!i];
|
yading@10
|
812 } while (++i < 16);
|
yading@10
|
813
|
yading@10
|
814 *r = c;
|
yading@10
|
815 return i;
|
yading@10
|
816 }
|
yading@10
|
817 #endif
|
yading@10
|
818
|
yading@10
|
819 /**
|
yading@10
|
820 * @param c arithmetic bitstream reader context
|
yading@10
|
821 * @param block destination for block coefficients
|
yading@10
|
822 * @param probs probabilities to use when reading trees from the bitstream
|
yading@10
|
823 * @param i initial coeff index, 0 unless a separate DC block is coded
|
yading@10
|
824 * @param zero_nhood the initial prediction context for number of surrounding
|
yading@10
|
825 * all-zero blocks (only left/top, so 0-2)
|
yading@10
|
826 * @param qmul array holding the dc/ac dequant factor at position 0/1
|
yading@10
|
827 * @return 0 if no coeffs were decoded
|
yading@10
|
828 * otherwise, the index of the last coeff decoded plus one
|
yading@10
|
829 */
|
yading@10
|
830 static av_always_inline
|
yading@10
|
831 int decode_block_coeffs(VP56RangeCoder *c, int16_t block[16],
|
yading@10
|
832 uint8_t probs[16][3][NUM_DCT_TOKENS-1],
|
yading@10
|
833 int i, int zero_nhood, int16_t qmul[2])
|
yading@10
|
834 {
|
yading@10
|
835 uint8_t *token_prob = probs[i][zero_nhood];
|
yading@10
|
836 if (!vp56_rac_get_prob_branchy(c, token_prob[0])) // DCT_EOB
|
yading@10
|
837 return 0;
|
yading@10
|
838 return decode_block_coeffs_internal(c, block, probs, i, token_prob, qmul);
|
yading@10
|
839 }
|
yading@10
|
840
|
yading@10
|
841 static av_always_inline
|
yading@10
|
842 void decode_mb_coeffs(VP8Context *s, VP8ThreadData *td, VP56RangeCoder *c, VP8Macroblock *mb,
|
yading@10
|
843 uint8_t t_nnz[9], uint8_t l_nnz[9])
|
yading@10
|
844 {
|
yading@10
|
845 int i, x, y, luma_start = 0, luma_ctx = 3;
|
yading@10
|
846 int nnz_pred, nnz, nnz_total = 0;
|
yading@10
|
847 int segment = mb->segment;
|
yading@10
|
848 int block_dc = 0;
|
yading@10
|
849
|
yading@10
|
850 if (mb->mode != MODE_I4x4 && mb->mode != VP8_MVMODE_SPLIT) {
|
yading@10
|
851 nnz_pred = t_nnz[8] + l_nnz[8];
|
yading@10
|
852
|
yading@10
|
853 // decode DC values and do hadamard
|
yading@10
|
854 nnz = decode_block_coeffs(c, td->block_dc, s->prob->token[1], 0, nnz_pred,
|
yading@10
|
855 s->qmat[segment].luma_dc_qmul);
|
yading@10
|
856 l_nnz[8] = t_nnz[8] = !!nnz;
|
yading@10
|
857 if (nnz) {
|
yading@10
|
858 nnz_total += nnz;
|
yading@10
|
859 block_dc = 1;
|
yading@10
|
860 if (nnz == 1)
|
yading@10
|
861 s->vp8dsp.vp8_luma_dc_wht_dc(td->block, td->block_dc);
|
yading@10
|
862 else
|
yading@10
|
863 s->vp8dsp.vp8_luma_dc_wht(td->block, td->block_dc);
|
yading@10
|
864 }
|
yading@10
|
865 luma_start = 1;
|
yading@10
|
866 luma_ctx = 0;
|
yading@10
|
867 }
|
yading@10
|
868
|
yading@10
|
869 // luma blocks
|
yading@10
|
870 for (y = 0; y < 4; y++)
|
yading@10
|
871 for (x = 0; x < 4; x++) {
|
yading@10
|
872 nnz_pred = l_nnz[y] + t_nnz[x];
|
yading@10
|
873 nnz = decode_block_coeffs(c, td->block[y][x], s->prob->token[luma_ctx], luma_start,
|
yading@10
|
874 nnz_pred, s->qmat[segment].luma_qmul);
|
yading@10
|
875 // nnz+block_dc may be one more than the actual last index, but we don't care
|
yading@10
|
876 td->non_zero_count_cache[y][x] = nnz + block_dc;
|
yading@10
|
877 t_nnz[x] = l_nnz[y] = !!nnz;
|
yading@10
|
878 nnz_total += nnz;
|
yading@10
|
879 }
|
yading@10
|
880
|
yading@10
|
881 // chroma blocks
|
yading@10
|
882 // TODO: what to do about dimensions? 2nd dim for luma is x,
|
yading@10
|
883 // but for chroma it's (y<<1)|x
|
yading@10
|
884 for (i = 4; i < 6; i++)
|
yading@10
|
885 for (y = 0; y < 2; y++)
|
yading@10
|
886 for (x = 0; x < 2; x++) {
|
yading@10
|
887 nnz_pred = l_nnz[i+2*y] + t_nnz[i+2*x];
|
yading@10
|
888 nnz = decode_block_coeffs(c, td->block[i][(y<<1)+x], s->prob->token[2], 0,
|
yading@10
|
889 nnz_pred, s->qmat[segment].chroma_qmul);
|
yading@10
|
890 td->non_zero_count_cache[i][(y<<1)+x] = nnz;
|
yading@10
|
891 t_nnz[i+2*x] = l_nnz[i+2*y] = !!nnz;
|
yading@10
|
892 nnz_total += nnz;
|
yading@10
|
893 }
|
yading@10
|
894
|
yading@10
|
895 // if there were no coded coeffs despite the macroblock not being marked skip,
|
yading@10
|
896 // we MUST not do the inner loop filter and should not do IDCT
|
yading@10
|
897 // Since skip isn't used for bitstream prediction, just manually set it.
|
yading@10
|
898 if (!nnz_total)
|
yading@10
|
899 mb->skip = 1;
|
yading@10
|
900 }
|
yading@10
|
901
|
yading@10
|
902 static av_always_inline
|
yading@10
|
903 void backup_mb_border(uint8_t *top_border, uint8_t *src_y, uint8_t *src_cb, uint8_t *src_cr,
|
yading@10
|
904 int linesize, int uvlinesize, int simple)
|
yading@10
|
905 {
|
yading@10
|
906 AV_COPY128(top_border, src_y + 15*linesize);
|
yading@10
|
907 if (!simple) {
|
yading@10
|
908 AV_COPY64(top_border+16, src_cb + 7*uvlinesize);
|
yading@10
|
909 AV_COPY64(top_border+24, src_cr + 7*uvlinesize);
|
yading@10
|
910 }
|
yading@10
|
911 }
|
yading@10
|
912
|
yading@10
|
913 static av_always_inline
|
yading@10
|
914 void xchg_mb_border(uint8_t *top_border, uint8_t *src_y, uint8_t *src_cb, uint8_t *src_cr,
|
yading@10
|
915 int linesize, int uvlinesize, int mb_x, int mb_y, int mb_width,
|
yading@10
|
916 int simple, int xchg)
|
yading@10
|
917 {
|
yading@10
|
918 uint8_t *top_border_m1 = top_border-32; // for TL prediction
|
yading@10
|
919 src_y -= linesize;
|
yading@10
|
920 src_cb -= uvlinesize;
|
yading@10
|
921 src_cr -= uvlinesize;
|
yading@10
|
922
|
yading@10
|
923 #define XCHG(a,b,xchg) do { \
|
yading@10
|
924 if (xchg) AV_SWAP64(b,a); \
|
yading@10
|
925 else AV_COPY64(b,a); \
|
yading@10
|
926 } while (0)
|
yading@10
|
927
|
yading@10
|
928 XCHG(top_border_m1+8, src_y-8, xchg);
|
yading@10
|
929 XCHG(top_border, src_y, xchg);
|
yading@10
|
930 XCHG(top_border+8, src_y+8, 1);
|
yading@10
|
931 if (mb_x < mb_width-1)
|
yading@10
|
932 XCHG(top_border+32, src_y+16, 1);
|
yading@10
|
933
|
yading@10
|
934 // only copy chroma for normal loop filter
|
yading@10
|
935 // or to initialize the top row to 127
|
yading@10
|
936 if (!simple || !mb_y) {
|
yading@10
|
937 XCHG(top_border_m1+16, src_cb-8, xchg);
|
yading@10
|
938 XCHG(top_border_m1+24, src_cr-8, xchg);
|
yading@10
|
939 XCHG(top_border+16, src_cb, 1);
|
yading@10
|
940 XCHG(top_border+24, src_cr, 1);
|
yading@10
|
941 }
|
yading@10
|
942 }
|
yading@10
|
943
|
yading@10
|
944 static av_always_inline
|
yading@10
|
945 int check_dc_pred8x8_mode(int mode, int mb_x, int mb_y)
|
yading@10
|
946 {
|
yading@10
|
947 if (!mb_x) {
|
yading@10
|
948 return mb_y ? TOP_DC_PRED8x8 : DC_128_PRED8x8;
|
yading@10
|
949 } else {
|
yading@10
|
950 return mb_y ? mode : LEFT_DC_PRED8x8;
|
yading@10
|
951 }
|
yading@10
|
952 }
|
yading@10
|
953
|
yading@10
|
954 static av_always_inline
|
yading@10
|
955 int check_tm_pred8x8_mode(int mode, int mb_x, int mb_y)
|
yading@10
|
956 {
|
yading@10
|
957 if (!mb_x) {
|
yading@10
|
958 return mb_y ? VERT_PRED8x8 : DC_129_PRED8x8;
|
yading@10
|
959 } else {
|
yading@10
|
960 return mb_y ? mode : HOR_PRED8x8;
|
yading@10
|
961 }
|
yading@10
|
962 }
|
yading@10
|
963
|
yading@10
|
964 static av_always_inline
|
yading@10
|
965 int check_intra_pred8x8_mode(int mode, int mb_x, int mb_y)
|
yading@10
|
966 {
|
yading@10
|
967 if (mode == DC_PRED8x8) {
|
yading@10
|
968 return check_dc_pred8x8_mode(mode, mb_x, mb_y);
|
yading@10
|
969 } else {
|
yading@10
|
970 return mode;
|
yading@10
|
971 }
|
yading@10
|
972 }
|
yading@10
|
973
|
yading@10
|
974 static av_always_inline
|
yading@10
|
975 int check_intra_pred8x8_mode_emuedge(int mode, int mb_x, int mb_y)
|
yading@10
|
976 {
|
yading@10
|
977 switch (mode) {
|
yading@10
|
978 case DC_PRED8x8:
|
yading@10
|
979 return check_dc_pred8x8_mode(mode, mb_x, mb_y);
|
yading@10
|
980 case VERT_PRED8x8:
|
yading@10
|
981 return !mb_y ? DC_127_PRED8x8 : mode;
|
yading@10
|
982 case HOR_PRED8x8:
|
yading@10
|
983 return !mb_x ? DC_129_PRED8x8 : mode;
|
yading@10
|
984 case PLANE_PRED8x8 /*TM*/:
|
yading@10
|
985 return check_tm_pred8x8_mode(mode, mb_x, mb_y);
|
yading@10
|
986 }
|
yading@10
|
987 return mode;
|
yading@10
|
988 }
|
yading@10
|
989
|
yading@10
|
990 static av_always_inline
|
yading@10
|
991 int check_tm_pred4x4_mode(int mode, int mb_x, int mb_y)
|
yading@10
|
992 {
|
yading@10
|
993 if (!mb_x) {
|
yading@10
|
994 return mb_y ? VERT_VP8_PRED : DC_129_PRED;
|
yading@10
|
995 } else {
|
yading@10
|
996 return mb_y ? mode : HOR_VP8_PRED;
|
yading@10
|
997 }
|
yading@10
|
998 }
|
yading@10
|
999
|
yading@10
|
1000 static av_always_inline
|
yading@10
|
1001 int check_intra_pred4x4_mode_emuedge(int mode, int mb_x, int mb_y, int *copy_buf)
|
yading@10
|
1002 {
|
yading@10
|
1003 switch (mode) {
|
yading@10
|
1004 case VERT_PRED:
|
yading@10
|
1005 if (!mb_x && mb_y) {
|
yading@10
|
1006 *copy_buf = 1;
|
yading@10
|
1007 return mode;
|
yading@10
|
1008 }
|
yading@10
|
1009 /* fall-through */
|
yading@10
|
1010 case DIAG_DOWN_LEFT_PRED:
|
yading@10
|
1011 case VERT_LEFT_PRED:
|
yading@10
|
1012 return !mb_y ? DC_127_PRED : mode;
|
yading@10
|
1013 case HOR_PRED:
|
yading@10
|
1014 if (!mb_y) {
|
yading@10
|
1015 *copy_buf = 1;
|
yading@10
|
1016 return mode;
|
yading@10
|
1017 }
|
yading@10
|
1018 /* fall-through */
|
yading@10
|
1019 case HOR_UP_PRED:
|
yading@10
|
1020 return !mb_x ? DC_129_PRED : mode;
|
yading@10
|
1021 case TM_VP8_PRED:
|
yading@10
|
1022 return check_tm_pred4x4_mode(mode, mb_x, mb_y);
|
yading@10
|
1023 case DC_PRED: // 4x4 DC doesn't use the same "H.264-style" exceptions as 16x16/8x8 DC
|
yading@10
|
1024 case DIAG_DOWN_RIGHT_PRED:
|
yading@10
|
1025 case VERT_RIGHT_PRED:
|
yading@10
|
1026 case HOR_DOWN_PRED:
|
yading@10
|
1027 if (!mb_y || !mb_x)
|
yading@10
|
1028 *copy_buf = 1;
|
yading@10
|
1029 return mode;
|
yading@10
|
1030 }
|
yading@10
|
1031 return mode;
|
yading@10
|
1032 }
|
yading@10
|
1033
|
yading@10
|
1034 static av_always_inline
|
yading@10
|
1035 void intra_predict(VP8Context *s, VP8ThreadData *td, uint8_t *dst[3],
|
yading@10
|
1036 VP8Macroblock *mb, int mb_x, int mb_y)
|
yading@10
|
1037 {
|
yading@10
|
1038 AVCodecContext *avctx = s->avctx;
|
yading@10
|
1039 int x, y, mode, nnz;
|
yading@10
|
1040 uint32_t tr;
|
yading@10
|
1041
|
yading@10
|
1042 // for the first row, we need to run xchg_mb_border to init the top edge to 127
|
yading@10
|
1043 // otherwise, skip it if we aren't going to deblock
|
yading@10
|
1044 if (!(avctx->flags & CODEC_FLAG_EMU_EDGE && !mb_y) && (s->deblock_filter || !mb_y) && td->thread_nr == 0)
|
yading@10
|
1045 xchg_mb_border(s->top_border[mb_x+1], dst[0], dst[1], dst[2],
|
yading@10
|
1046 s->linesize, s->uvlinesize, mb_x, mb_y, s->mb_width,
|
yading@10
|
1047 s->filter.simple, 1);
|
yading@10
|
1048
|
yading@10
|
1049 if (mb->mode < MODE_I4x4) {
|
yading@10
|
1050 if (avctx->flags & CODEC_FLAG_EMU_EDGE) { // tested
|
yading@10
|
1051 mode = check_intra_pred8x8_mode_emuedge(mb->mode, mb_x, mb_y);
|
yading@10
|
1052 } else {
|
yading@10
|
1053 mode = check_intra_pred8x8_mode(mb->mode, mb_x, mb_y);
|
yading@10
|
1054 }
|
yading@10
|
1055 s->hpc.pred16x16[mode](dst[0], s->linesize);
|
yading@10
|
1056 } else {
|
yading@10
|
1057 uint8_t *ptr = dst[0];
|
yading@10
|
1058 uint8_t *intra4x4 = mb->intra4x4_pred_mode_mb;
|
yading@10
|
1059 uint8_t tr_top[4] = { 127, 127, 127, 127 };
|
yading@10
|
1060
|
yading@10
|
1061 // all blocks on the right edge of the macroblock use bottom edge
|
yading@10
|
1062 // the top macroblock for their topright edge
|
yading@10
|
1063 uint8_t *tr_right = ptr - s->linesize + 16;
|
yading@10
|
1064
|
yading@10
|
1065 // if we're on the right edge of the frame, said edge is extended
|
yading@10
|
1066 // from the top macroblock
|
yading@10
|
1067 if (!(!mb_y && avctx->flags & CODEC_FLAG_EMU_EDGE) &&
|
yading@10
|
1068 mb_x == s->mb_width-1) {
|
yading@10
|
1069 tr = tr_right[-1]*0x01010101u;
|
yading@10
|
1070 tr_right = (uint8_t *)&tr;
|
yading@10
|
1071 }
|
yading@10
|
1072
|
yading@10
|
1073 if (mb->skip)
|
yading@10
|
1074 AV_ZERO128(td->non_zero_count_cache);
|
yading@10
|
1075
|
yading@10
|
1076 for (y = 0; y < 4; y++) {
|
yading@10
|
1077 uint8_t *topright = ptr + 4 - s->linesize;
|
yading@10
|
1078 for (x = 0; x < 4; x++) {
|
yading@10
|
1079 int copy = 0, linesize = s->linesize;
|
yading@10
|
1080 uint8_t *dst = ptr+4*x;
|
yading@10
|
1081 DECLARE_ALIGNED(4, uint8_t, copy_dst)[5*8];
|
yading@10
|
1082
|
yading@10
|
1083 if ((y == 0 || x == 3) && mb_y == 0 && avctx->flags & CODEC_FLAG_EMU_EDGE) {
|
yading@10
|
1084 topright = tr_top;
|
yading@10
|
1085 } else if (x == 3)
|
yading@10
|
1086 topright = tr_right;
|
yading@10
|
1087
|
yading@10
|
1088 if (avctx->flags & CODEC_FLAG_EMU_EDGE) { // mb_x+x or mb_y+y is a hack but works
|
yading@10
|
1089 mode = check_intra_pred4x4_mode_emuedge(intra4x4[x], mb_x + x, mb_y + y, ©);
|
yading@10
|
1090 if (copy) {
|
yading@10
|
1091 dst = copy_dst + 12;
|
yading@10
|
1092 linesize = 8;
|
yading@10
|
1093 if (!(mb_y + y)) {
|
yading@10
|
1094 copy_dst[3] = 127U;
|
yading@10
|
1095 AV_WN32A(copy_dst+4, 127U * 0x01010101U);
|
yading@10
|
1096 } else {
|
yading@10
|
1097 AV_COPY32(copy_dst+4, ptr+4*x-s->linesize);
|
yading@10
|
1098 if (!(mb_x + x)) {
|
yading@10
|
1099 copy_dst[3] = 129U;
|
yading@10
|
1100 } else {
|
yading@10
|
1101 copy_dst[3] = ptr[4*x-s->linesize-1];
|
yading@10
|
1102 }
|
yading@10
|
1103 }
|
yading@10
|
1104 if (!(mb_x + x)) {
|
yading@10
|
1105 copy_dst[11] =
|
yading@10
|
1106 copy_dst[19] =
|
yading@10
|
1107 copy_dst[27] =
|
yading@10
|
1108 copy_dst[35] = 129U;
|
yading@10
|
1109 } else {
|
yading@10
|
1110 copy_dst[11] = ptr[4*x -1];
|
yading@10
|
1111 copy_dst[19] = ptr[4*x+s->linesize -1];
|
yading@10
|
1112 copy_dst[27] = ptr[4*x+s->linesize*2-1];
|
yading@10
|
1113 copy_dst[35] = ptr[4*x+s->linesize*3-1];
|
yading@10
|
1114 }
|
yading@10
|
1115 }
|
yading@10
|
1116 } else {
|
yading@10
|
1117 mode = intra4x4[x];
|
yading@10
|
1118 }
|
yading@10
|
1119 s->hpc.pred4x4[mode](dst, topright, linesize);
|
yading@10
|
1120 if (copy) {
|
yading@10
|
1121 AV_COPY32(ptr+4*x , copy_dst+12);
|
yading@10
|
1122 AV_COPY32(ptr+4*x+s->linesize , copy_dst+20);
|
yading@10
|
1123 AV_COPY32(ptr+4*x+s->linesize*2, copy_dst+28);
|
yading@10
|
1124 AV_COPY32(ptr+4*x+s->linesize*3, copy_dst+36);
|
yading@10
|
1125 }
|
yading@10
|
1126
|
yading@10
|
1127 nnz = td->non_zero_count_cache[y][x];
|
yading@10
|
1128 if (nnz) {
|
yading@10
|
1129 if (nnz == 1)
|
yading@10
|
1130 s->vp8dsp.vp8_idct_dc_add(ptr+4*x, td->block[y][x], s->linesize);
|
yading@10
|
1131 else
|
yading@10
|
1132 s->vp8dsp.vp8_idct_add(ptr+4*x, td->block[y][x], s->linesize);
|
yading@10
|
1133 }
|
yading@10
|
1134 topright += 4;
|
yading@10
|
1135 }
|
yading@10
|
1136
|
yading@10
|
1137 ptr += 4*s->linesize;
|
yading@10
|
1138 intra4x4 += 4;
|
yading@10
|
1139 }
|
yading@10
|
1140 }
|
yading@10
|
1141
|
yading@10
|
1142 if (avctx->flags & CODEC_FLAG_EMU_EDGE) {
|
yading@10
|
1143 mode = check_intra_pred8x8_mode_emuedge(mb->chroma_pred_mode, mb_x, mb_y);
|
yading@10
|
1144 } else {
|
yading@10
|
1145 mode = check_intra_pred8x8_mode(mb->chroma_pred_mode, mb_x, mb_y);
|
yading@10
|
1146 }
|
yading@10
|
1147 s->hpc.pred8x8[mode](dst[1], s->uvlinesize);
|
yading@10
|
1148 s->hpc.pred8x8[mode](dst[2], s->uvlinesize);
|
yading@10
|
1149
|
yading@10
|
1150 if (!(avctx->flags & CODEC_FLAG_EMU_EDGE && !mb_y) && (s->deblock_filter || !mb_y) && td->thread_nr == 0)
|
yading@10
|
1151 xchg_mb_border(s->top_border[mb_x+1], dst[0], dst[1], dst[2],
|
yading@10
|
1152 s->linesize, s->uvlinesize, mb_x, mb_y, s->mb_width,
|
yading@10
|
1153 s->filter.simple, 0);
|
yading@10
|
1154 }
|
yading@10
|
1155
|
yading@10
|
1156 static const uint8_t subpel_idx[3][8] = {
|
yading@10
|
1157 { 0, 1, 2, 1, 2, 1, 2, 1 }, // nr. of left extra pixels,
|
yading@10
|
1158 // also function pointer index
|
yading@10
|
1159 { 0, 3, 5, 3, 5, 3, 5, 3 }, // nr. of extra pixels required
|
yading@10
|
1160 { 0, 2, 3, 2, 3, 2, 3, 2 }, // nr. of right extra pixels
|
yading@10
|
1161 };
|
yading@10
|
1162
|
yading@10
|
1163 /**
|
yading@10
|
1164 * luma MC function
|
yading@10
|
1165 *
|
yading@10
|
1166 * @param s VP8 decoding context
|
yading@10
|
1167 * @param dst target buffer for block data at block position
|
yading@10
|
1168 * @param ref reference picture buffer at origin (0, 0)
|
yading@10
|
1169 * @param mv motion vector (relative to block position) to get pixel data from
|
yading@10
|
1170 * @param x_off horizontal position of block from origin (0, 0)
|
yading@10
|
1171 * @param y_off vertical position of block from origin (0, 0)
|
yading@10
|
1172 * @param block_w width of block (16, 8 or 4)
|
yading@10
|
1173 * @param block_h height of block (always same as block_w)
|
yading@10
|
1174 * @param width width of src/dst plane data
|
yading@10
|
1175 * @param height height of src/dst plane data
|
yading@10
|
1176 * @param linesize size of a single line of plane data, including padding
|
yading@10
|
1177 * @param mc_func motion compensation function pointers (bilinear or sixtap MC)
|
yading@10
|
1178 */
|
yading@10
|
1179 static av_always_inline
|
yading@10
|
1180 void vp8_mc_luma(VP8Context *s, VP8ThreadData *td, uint8_t *dst,
|
yading@10
|
1181 ThreadFrame *ref, const VP56mv *mv,
|
yading@10
|
1182 int x_off, int y_off, int block_w, int block_h,
|
yading@10
|
1183 int width, int height, int linesize,
|
yading@10
|
1184 vp8_mc_func mc_func[3][3])
|
yading@10
|
1185 {
|
yading@10
|
1186 uint8_t *src = ref->f->data[0];
|
yading@10
|
1187
|
yading@10
|
1188 if (AV_RN32A(mv)) {
|
yading@10
|
1189
|
yading@10
|
1190 int mx = (mv->x << 1)&7, mx_idx = subpel_idx[0][mx];
|
yading@10
|
1191 int my = (mv->y << 1)&7, my_idx = subpel_idx[0][my];
|
yading@10
|
1192
|
yading@10
|
1193 x_off += mv->x >> 2;
|
yading@10
|
1194 y_off += mv->y >> 2;
|
yading@10
|
1195
|
yading@10
|
1196 // edge emulation
|
yading@10
|
1197 ff_thread_await_progress(ref, (3 + y_off + block_h + subpel_idx[2][my]) >> 4, 0);
|
yading@10
|
1198 src += y_off * linesize + x_off;
|
yading@10
|
1199 if (x_off < mx_idx || x_off >= width - block_w - subpel_idx[2][mx] ||
|
yading@10
|
1200 y_off < my_idx || y_off >= height - block_h - subpel_idx[2][my]) {
|
yading@10
|
1201 s->vdsp.emulated_edge_mc(td->edge_emu_buffer, src - my_idx * linesize - mx_idx, linesize,
|
yading@10
|
1202 block_w + subpel_idx[1][mx], block_h + subpel_idx[1][my],
|
yading@10
|
1203 x_off - mx_idx, y_off - my_idx, width, height);
|
yading@10
|
1204 src = td->edge_emu_buffer + mx_idx + linesize * my_idx;
|
yading@10
|
1205 }
|
yading@10
|
1206 mc_func[my_idx][mx_idx](dst, linesize, src, linesize, block_h, mx, my);
|
yading@10
|
1207 } else {
|
yading@10
|
1208 ff_thread_await_progress(ref, (3 + y_off + block_h) >> 4, 0);
|
yading@10
|
1209 mc_func[0][0](dst, linesize, src + y_off * linesize + x_off, linesize, block_h, 0, 0);
|
yading@10
|
1210 }
|
yading@10
|
1211 }
|
yading@10
|
1212
|
yading@10
|
1213 /**
|
yading@10
|
1214 * chroma MC function
|
yading@10
|
1215 *
|
yading@10
|
1216 * @param s VP8 decoding context
|
yading@10
|
1217 * @param dst1 target buffer for block data at block position (U plane)
|
yading@10
|
1218 * @param dst2 target buffer for block data at block position (V plane)
|
yading@10
|
1219 * @param ref reference picture buffer at origin (0, 0)
|
yading@10
|
1220 * @param mv motion vector (relative to block position) to get pixel data from
|
yading@10
|
1221 * @param x_off horizontal position of block from origin (0, 0)
|
yading@10
|
1222 * @param y_off vertical position of block from origin (0, 0)
|
yading@10
|
1223 * @param block_w width of block (16, 8 or 4)
|
yading@10
|
1224 * @param block_h height of block (always same as block_w)
|
yading@10
|
1225 * @param width width of src/dst plane data
|
yading@10
|
1226 * @param height height of src/dst plane data
|
yading@10
|
1227 * @param linesize size of a single line of plane data, including padding
|
yading@10
|
1228 * @param mc_func motion compensation function pointers (bilinear or sixtap MC)
|
yading@10
|
1229 */
|
yading@10
|
1230 static av_always_inline
|
yading@10
|
1231 void vp8_mc_chroma(VP8Context *s, VP8ThreadData *td, uint8_t *dst1, uint8_t *dst2,
|
yading@10
|
1232 ThreadFrame *ref, const VP56mv *mv, int x_off, int y_off,
|
yading@10
|
1233 int block_w, int block_h, int width, int height, int linesize,
|
yading@10
|
1234 vp8_mc_func mc_func[3][3])
|
yading@10
|
1235 {
|
yading@10
|
1236 uint8_t *src1 = ref->f->data[1], *src2 = ref->f->data[2];
|
yading@10
|
1237
|
yading@10
|
1238 if (AV_RN32A(mv)) {
|
yading@10
|
1239 int mx = mv->x&7, mx_idx = subpel_idx[0][mx];
|
yading@10
|
1240 int my = mv->y&7, my_idx = subpel_idx[0][my];
|
yading@10
|
1241
|
yading@10
|
1242 x_off += mv->x >> 3;
|
yading@10
|
1243 y_off += mv->y >> 3;
|
yading@10
|
1244
|
yading@10
|
1245 // edge emulation
|
yading@10
|
1246 src1 += y_off * linesize + x_off;
|
yading@10
|
1247 src2 += y_off * linesize + x_off;
|
yading@10
|
1248 ff_thread_await_progress(ref, (3 + y_off + block_h + subpel_idx[2][my]) >> 3, 0);
|
yading@10
|
1249 if (x_off < mx_idx || x_off >= width - block_w - subpel_idx[2][mx] ||
|
yading@10
|
1250 y_off < my_idx || y_off >= height - block_h - subpel_idx[2][my]) {
|
yading@10
|
1251 s->vdsp.emulated_edge_mc(td->edge_emu_buffer, src1 - my_idx * linesize - mx_idx, linesize,
|
yading@10
|
1252 block_w + subpel_idx[1][mx], block_h + subpel_idx[1][my],
|
yading@10
|
1253 x_off - mx_idx, y_off - my_idx, width, height);
|
yading@10
|
1254 src1 = td->edge_emu_buffer + mx_idx + linesize * my_idx;
|
yading@10
|
1255 mc_func[my_idx][mx_idx](dst1, linesize, src1, linesize, block_h, mx, my);
|
yading@10
|
1256
|
yading@10
|
1257 s->vdsp.emulated_edge_mc(td->edge_emu_buffer, src2 - my_idx * linesize - mx_idx, linesize,
|
yading@10
|
1258 block_w + subpel_idx[1][mx], block_h + subpel_idx[1][my],
|
yading@10
|
1259 x_off - mx_idx, y_off - my_idx, width, height);
|
yading@10
|
1260 src2 = td->edge_emu_buffer + mx_idx + linesize * my_idx;
|
yading@10
|
1261 mc_func[my_idx][mx_idx](dst2, linesize, src2, linesize, block_h, mx, my);
|
yading@10
|
1262 } else {
|
yading@10
|
1263 mc_func[my_idx][mx_idx](dst1, linesize, src1, linesize, block_h, mx, my);
|
yading@10
|
1264 mc_func[my_idx][mx_idx](dst2, linesize, src2, linesize, block_h, mx, my);
|
yading@10
|
1265 }
|
yading@10
|
1266 } else {
|
yading@10
|
1267 ff_thread_await_progress(ref, (3 + y_off + block_h) >> 3, 0);
|
yading@10
|
1268 mc_func[0][0](dst1, linesize, src1 + y_off * linesize + x_off, linesize, block_h, 0, 0);
|
yading@10
|
1269 mc_func[0][0](dst2, linesize, src2 + y_off * linesize + x_off, linesize, block_h, 0, 0);
|
yading@10
|
1270 }
|
yading@10
|
1271 }
|
yading@10
|
1272
|
yading@10
|
1273 static av_always_inline
|
yading@10
|
1274 void vp8_mc_part(VP8Context *s, VP8ThreadData *td, uint8_t *dst[3],
|
yading@10
|
1275 ThreadFrame *ref_frame, int x_off, int y_off,
|
yading@10
|
1276 int bx_off, int by_off,
|
yading@10
|
1277 int block_w, int block_h,
|
yading@10
|
1278 int width, int height, VP56mv *mv)
|
yading@10
|
1279 {
|
yading@10
|
1280 VP56mv uvmv = *mv;
|
yading@10
|
1281
|
yading@10
|
1282 /* Y */
|
yading@10
|
1283 vp8_mc_luma(s, td, dst[0] + by_off * s->linesize + bx_off,
|
yading@10
|
1284 ref_frame, mv, x_off + bx_off, y_off + by_off,
|
yading@10
|
1285 block_w, block_h, width, height, s->linesize,
|
yading@10
|
1286 s->put_pixels_tab[block_w == 8]);
|
yading@10
|
1287
|
yading@10
|
1288 /* U/V */
|
yading@10
|
1289 if (s->profile == 3) {
|
yading@10
|
1290 uvmv.x &= ~7;
|
yading@10
|
1291 uvmv.y &= ~7;
|
yading@10
|
1292 }
|
yading@10
|
1293 x_off >>= 1; y_off >>= 1;
|
yading@10
|
1294 bx_off >>= 1; by_off >>= 1;
|
yading@10
|
1295 width >>= 1; height >>= 1;
|
yading@10
|
1296 block_w >>= 1; block_h >>= 1;
|
yading@10
|
1297 vp8_mc_chroma(s, td, dst[1] + by_off * s->uvlinesize + bx_off,
|
yading@10
|
1298 dst[2] + by_off * s->uvlinesize + bx_off, ref_frame,
|
yading@10
|
1299 &uvmv, x_off + bx_off, y_off + by_off,
|
yading@10
|
1300 block_w, block_h, width, height, s->uvlinesize,
|
yading@10
|
1301 s->put_pixels_tab[1 + (block_w == 4)]);
|
yading@10
|
1302 }
|
yading@10
|
1303
|
yading@10
|
1304 /* Fetch pixels for estimated mv 4 macroblocks ahead.
|
yading@10
|
1305 * Optimized for 64-byte cache lines. Inspired by ffh264 prefetch_motion. */
|
yading@10
|
1306 static av_always_inline void prefetch_motion(VP8Context *s, VP8Macroblock *mb, int mb_x, int mb_y, int mb_xy, int ref)
|
yading@10
|
1307 {
|
yading@10
|
1308 /* Don't prefetch refs that haven't been used very often this frame. */
|
yading@10
|
1309 if (s->ref_count[ref-1] > (mb_xy >> 5)) {
|
yading@10
|
1310 int x_off = mb_x << 4, y_off = mb_y << 4;
|
yading@10
|
1311 int mx = (mb->mv.x>>2) + x_off + 8;
|
yading@10
|
1312 int my = (mb->mv.y>>2) + y_off;
|
yading@10
|
1313 uint8_t **src= s->framep[ref]->tf.f->data;
|
yading@10
|
1314 int off= mx + (my + (mb_x&3)*4)*s->linesize + 64;
|
yading@10
|
1315 /* For threading, a ff_thread_await_progress here might be useful, but
|
yading@10
|
1316 * it actually slows down the decoder. Since a bad prefetch doesn't
|
yading@10
|
1317 * generate bad decoder output, we don't run it here. */
|
yading@10
|
1318 s->vdsp.prefetch(src[0]+off, s->linesize, 4);
|
yading@10
|
1319 off= (mx>>1) + ((my>>1) + (mb_x&7))*s->uvlinesize + 64;
|
yading@10
|
1320 s->vdsp.prefetch(src[1]+off, src[2]-src[1], 2);
|
yading@10
|
1321 }
|
yading@10
|
1322 }
|
yading@10
|
1323
|
yading@10
|
1324 /**
|
yading@10
|
1325 * Apply motion vectors to prediction buffer, chapter 18.
|
yading@10
|
1326 */
|
yading@10
|
1327 static av_always_inline
|
yading@10
|
1328 void inter_predict(VP8Context *s, VP8ThreadData *td, uint8_t *dst[3],
|
yading@10
|
1329 VP8Macroblock *mb, int mb_x, int mb_y)
|
yading@10
|
1330 {
|
yading@10
|
1331 int x_off = mb_x << 4, y_off = mb_y << 4;
|
yading@10
|
1332 int width = 16*s->mb_width, height = 16*s->mb_height;
|
yading@10
|
1333 ThreadFrame *ref = &s->framep[mb->ref_frame]->tf;
|
yading@10
|
1334 VP56mv *bmv = mb->bmv;
|
yading@10
|
1335
|
yading@10
|
1336 switch (mb->partitioning) {
|
yading@10
|
1337 case VP8_SPLITMVMODE_NONE:
|
yading@10
|
1338 vp8_mc_part(s, td, dst, ref, x_off, y_off,
|
yading@10
|
1339 0, 0, 16, 16, width, height, &mb->mv);
|
yading@10
|
1340 break;
|
yading@10
|
1341 case VP8_SPLITMVMODE_4x4: {
|
yading@10
|
1342 int x, y;
|
yading@10
|
1343 VP56mv uvmv;
|
yading@10
|
1344
|
yading@10
|
1345 /* Y */
|
yading@10
|
1346 for (y = 0; y < 4; y++) {
|
yading@10
|
1347 for (x = 0; x < 4; x++) {
|
yading@10
|
1348 vp8_mc_luma(s, td, dst[0] + 4*y*s->linesize + x*4,
|
yading@10
|
1349 ref, &bmv[4*y + x],
|
yading@10
|
1350 4*x + x_off, 4*y + y_off, 4, 4,
|
yading@10
|
1351 width, height, s->linesize,
|
yading@10
|
1352 s->put_pixels_tab[2]);
|
yading@10
|
1353 }
|
yading@10
|
1354 }
|
yading@10
|
1355
|
yading@10
|
1356 /* U/V */
|
yading@10
|
1357 x_off >>= 1; y_off >>= 1; width >>= 1; height >>= 1;
|
yading@10
|
1358 for (y = 0; y < 2; y++) {
|
yading@10
|
1359 for (x = 0; x < 2; x++) {
|
yading@10
|
1360 uvmv.x = mb->bmv[ 2*y * 4 + 2*x ].x +
|
yading@10
|
1361 mb->bmv[ 2*y * 4 + 2*x+1].x +
|
yading@10
|
1362 mb->bmv[(2*y+1) * 4 + 2*x ].x +
|
yading@10
|
1363 mb->bmv[(2*y+1) * 4 + 2*x+1].x;
|
yading@10
|
1364 uvmv.y = mb->bmv[ 2*y * 4 + 2*x ].y +
|
yading@10
|
1365 mb->bmv[ 2*y * 4 + 2*x+1].y +
|
yading@10
|
1366 mb->bmv[(2*y+1) * 4 + 2*x ].y +
|
yading@10
|
1367 mb->bmv[(2*y+1) * 4 + 2*x+1].y;
|
yading@10
|
1368 uvmv.x = (uvmv.x + 2 + (uvmv.x >> (INT_BIT-1))) >> 2;
|
yading@10
|
1369 uvmv.y = (uvmv.y + 2 + (uvmv.y >> (INT_BIT-1))) >> 2;
|
yading@10
|
1370 if (s->profile == 3) {
|
yading@10
|
1371 uvmv.x &= ~7;
|
yading@10
|
1372 uvmv.y &= ~7;
|
yading@10
|
1373 }
|
yading@10
|
1374 vp8_mc_chroma(s, td, dst[1] + 4*y*s->uvlinesize + x*4,
|
yading@10
|
1375 dst[2] + 4*y*s->uvlinesize + x*4, ref, &uvmv,
|
yading@10
|
1376 4*x + x_off, 4*y + y_off, 4, 4,
|
yading@10
|
1377 width, height, s->uvlinesize,
|
yading@10
|
1378 s->put_pixels_tab[2]);
|
yading@10
|
1379 }
|
yading@10
|
1380 }
|
yading@10
|
1381 break;
|
yading@10
|
1382 }
|
yading@10
|
1383 case VP8_SPLITMVMODE_16x8:
|
yading@10
|
1384 vp8_mc_part(s, td, dst, ref, x_off, y_off,
|
yading@10
|
1385 0, 0, 16, 8, width, height, &bmv[0]);
|
yading@10
|
1386 vp8_mc_part(s, td, dst, ref, x_off, y_off,
|
yading@10
|
1387 0, 8, 16, 8, width, height, &bmv[1]);
|
yading@10
|
1388 break;
|
yading@10
|
1389 case VP8_SPLITMVMODE_8x16:
|
yading@10
|
1390 vp8_mc_part(s, td, dst, ref, x_off, y_off,
|
yading@10
|
1391 0, 0, 8, 16, width, height, &bmv[0]);
|
yading@10
|
1392 vp8_mc_part(s, td, dst, ref, x_off, y_off,
|
yading@10
|
1393 8, 0, 8, 16, width, height, &bmv[1]);
|
yading@10
|
1394 break;
|
yading@10
|
1395 case VP8_SPLITMVMODE_8x8:
|
yading@10
|
1396 vp8_mc_part(s, td, dst, ref, x_off, y_off,
|
yading@10
|
1397 0, 0, 8, 8, width, height, &bmv[0]);
|
yading@10
|
1398 vp8_mc_part(s, td, dst, ref, x_off, y_off,
|
yading@10
|
1399 8, 0, 8, 8, width, height, &bmv[1]);
|
yading@10
|
1400 vp8_mc_part(s, td, dst, ref, x_off, y_off,
|
yading@10
|
1401 0, 8, 8, 8, width, height, &bmv[2]);
|
yading@10
|
1402 vp8_mc_part(s, td, dst, ref, x_off, y_off,
|
yading@10
|
1403 8, 8, 8, 8, width, height, &bmv[3]);
|
yading@10
|
1404 break;
|
yading@10
|
1405 }
|
yading@10
|
1406 }
|
yading@10
|
1407
|
yading@10
|
1408 static av_always_inline void idct_mb(VP8Context *s, VP8ThreadData *td,
|
yading@10
|
1409 uint8_t *dst[3], VP8Macroblock *mb)
|
yading@10
|
1410 {
|
yading@10
|
1411 int x, y, ch;
|
yading@10
|
1412
|
yading@10
|
1413 if (mb->mode != MODE_I4x4) {
|
yading@10
|
1414 uint8_t *y_dst = dst[0];
|
yading@10
|
1415 for (y = 0; y < 4; y++) {
|
yading@10
|
1416 uint32_t nnz4 = AV_RL32(td->non_zero_count_cache[y]);
|
yading@10
|
1417 if (nnz4) {
|
yading@10
|
1418 if (nnz4&~0x01010101) {
|
yading@10
|
1419 for (x = 0; x < 4; x++) {
|
yading@10
|
1420 if ((uint8_t)nnz4 == 1)
|
yading@10
|
1421 s->vp8dsp.vp8_idct_dc_add(y_dst+4*x, td->block[y][x], s->linesize);
|
yading@10
|
1422 else if((uint8_t)nnz4 > 1)
|
yading@10
|
1423 s->vp8dsp.vp8_idct_add(y_dst+4*x, td->block[y][x], s->linesize);
|
yading@10
|
1424 nnz4 >>= 8;
|
yading@10
|
1425 if (!nnz4)
|
yading@10
|
1426 break;
|
yading@10
|
1427 }
|
yading@10
|
1428 } else {
|
yading@10
|
1429 s->vp8dsp.vp8_idct_dc_add4y(y_dst, td->block[y], s->linesize);
|
yading@10
|
1430 }
|
yading@10
|
1431 }
|
yading@10
|
1432 y_dst += 4*s->linesize;
|
yading@10
|
1433 }
|
yading@10
|
1434 }
|
yading@10
|
1435
|
yading@10
|
1436 for (ch = 0; ch < 2; ch++) {
|
yading@10
|
1437 uint32_t nnz4 = AV_RL32(td->non_zero_count_cache[4+ch]);
|
yading@10
|
1438 if (nnz4) {
|
yading@10
|
1439 uint8_t *ch_dst = dst[1+ch];
|
yading@10
|
1440 if (nnz4&~0x01010101) {
|
yading@10
|
1441 for (y = 0; y < 2; y++) {
|
yading@10
|
1442 for (x = 0; x < 2; x++) {
|
yading@10
|
1443 if ((uint8_t)nnz4 == 1)
|
yading@10
|
1444 s->vp8dsp.vp8_idct_dc_add(ch_dst+4*x, td->block[4+ch][(y<<1)+x], s->uvlinesize);
|
yading@10
|
1445 else if((uint8_t)nnz4 > 1)
|
yading@10
|
1446 s->vp8dsp.vp8_idct_add(ch_dst+4*x, td->block[4+ch][(y<<1)+x], s->uvlinesize);
|
yading@10
|
1447 nnz4 >>= 8;
|
yading@10
|
1448 if (!nnz4)
|
yading@10
|
1449 goto chroma_idct_end;
|
yading@10
|
1450 }
|
yading@10
|
1451 ch_dst += 4*s->uvlinesize;
|
yading@10
|
1452 }
|
yading@10
|
1453 } else {
|
yading@10
|
1454 s->vp8dsp.vp8_idct_dc_add4uv(ch_dst, td->block[4+ch], s->uvlinesize);
|
yading@10
|
1455 }
|
yading@10
|
1456 }
|
yading@10
|
1457 chroma_idct_end: ;
|
yading@10
|
1458 }
|
yading@10
|
1459 }
|
yading@10
|
1460
|
yading@10
|
1461 static av_always_inline void filter_level_for_mb(VP8Context *s, VP8Macroblock *mb, VP8FilterStrength *f )
|
yading@10
|
1462 {
|
yading@10
|
1463 int interior_limit, filter_level;
|
yading@10
|
1464
|
yading@10
|
1465 if (s->segmentation.enabled) {
|
yading@10
|
1466 filter_level = s->segmentation.filter_level[mb->segment];
|
yading@10
|
1467 if (!s->segmentation.absolute_vals)
|
yading@10
|
1468 filter_level += s->filter.level;
|
yading@10
|
1469 } else
|
yading@10
|
1470 filter_level = s->filter.level;
|
yading@10
|
1471
|
yading@10
|
1472 if (s->lf_delta.enabled) {
|
yading@10
|
1473 filter_level += s->lf_delta.ref[mb->ref_frame];
|
yading@10
|
1474 filter_level += s->lf_delta.mode[mb->mode];
|
yading@10
|
1475 }
|
yading@10
|
1476
|
yading@10
|
1477 filter_level = av_clip_uintp2(filter_level, 6);
|
yading@10
|
1478
|
yading@10
|
1479 interior_limit = filter_level;
|
yading@10
|
1480 if (s->filter.sharpness) {
|
yading@10
|
1481 interior_limit >>= (s->filter.sharpness + 3) >> 2;
|
yading@10
|
1482 interior_limit = FFMIN(interior_limit, 9 - s->filter.sharpness);
|
yading@10
|
1483 }
|
yading@10
|
1484 interior_limit = FFMAX(interior_limit, 1);
|
yading@10
|
1485
|
yading@10
|
1486 f->filter_level = filter_level;
|
yading@10
|
1487 f->inner_limit = interior_limit;
|
yading@10
|
1488 f->inner_filter = !mb->skip || mb->mode == MODE_I4x4 || mb->mode == VP8_MVMODE_SPLIT;
|
yading@10
|
1489 }
|
yading@10
|
1490
|
yading@10
|
1491 static av_always_inline void filter_mb(VP8Context *s, uint8_t *dst[3], VP8FilterStrength *f, int mb_x, int mb_y)
|
yading@10
|
1492 {
|
yading@10
|
1493 int mbedge_lim, bedge_lim, hev_thresh;
|
yading@10
|
1494 int filter_level = f->filter_level;
|
yading@10
|
1495 int inner_limit = f->inner_limit;
|
yading@10
|
1496 int inner_filter = f->inner_filter;
|
yading@10
|
1497 int linesize = s->linesize;
|
yading@10
|
1498 int uvlinesize = s->uvlinesize;
|
yading@10
|
1499 static const uint8_t hev_thresh_lut[2][64] = {
|
yading@10
|
1500 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
|
yading@10
|
1501 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
yading@10
|
1502 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
|
yading@10
|
1503 3, 3, 3, 3 },
|
yading@10
|
1504 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
|
yading@10
|
1505 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
yading@10
|
1506 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
yading@10
|
1507 2, 2, 2, 2 }
|
yading@10
|
1508 };
|
yading@10
|
1509
|
yading@10
|
1510 if (!filter_level)
|
yading@10
|
1511 return;
|
yading@10
|
1512
|
yading@10
|
1513 bedge_lim = 2*filter_level + inner_limit;
|
yading@10
|
1514 mbedge_lim = bedge_lim + 4;
|
yading@10
|
1515
|
yading@10
|
1516 hev_thresh = hev_thresh_lut[s->keyframe][filter_level];
|
yading@10
|
1517
|
yading@10
|
1518 if (mb_x) {
|
yading@10
|
1519 s->vp8dsp.vp8_h_loop_filter16y(dst[0], linesize,
|
yading@10
|
1520 mbedge_lim, inner_limit, hev_thresh);
|
yading@10
|
1521 s->vp8dsp.vp8_h_loop_filter8uv(dst[1], dst[2], uvlinesize,
|
yading@10
|
1522 mbedge_lim, inner_limit, hev_thresh);
|
yading@10
|
1523 }
|
yading@10
|
1524
|
yading@10
|
1525 if (inner_filter) {
|
yading@10
|
1526 s->vp8dsp.vp8_h_loop_filter16y_inner(dst[0]+ 4, linesize, bedge_lim,
|
yading@10
|
1527 inner_limit, hev_thresh);
|
yading@10
|
1528 s->vp8dsp.vp8_h_loop_filter16y_inner(dst[0]+ 8, linesize, bedge_lim,
|
yading@10
|
1529 inner_limit, hev_thresh);
|
yading@10
|
1530 s->vp8dsp.vp8_h_loop_filter16y_inner(dst[0]+12, linesize, bedge_lim,
|
yading@10
|
1531 inner_limit, hev_thresh);
|
yading@10
|
1532 s->vp8dsp.vp8_h_loop_filter8uv_inner(dst[1] + 4, dst[2] + 4,
|
yading@10
|
1533 uvlinesize, bedge_lim,
|
yading@10
|
1534 inner_limit, hev_thresh);
|
yading@10
|
1535 }
|
yading@10
|
1536
|
yading@10
|
1537 if (mb_y) {
|
yading@10
|
1538 s->vp8dsp.vp8_v_loop_filter16y(dst[0], linesize,
|
yading@10
|
1539 mbedge_lim, inner_limit, hev_thresh);
|
yading@10
|
1540 s->vp8dsp.vp8_v_loop_filter8uv(dst[1], dst[2], uvlinesize,
|
yading@10
|
1541 mbedge_lim, inner_limit, hev_thresh);
|
yading@10
|
1542 }
|
yading@10
|
1543
|
yading@10
|
1544 if (inner_filter) {
|
yading@10
|
1545 s->vp8dsp.vp8_v_loop_filter16y_inner(dst[0]+ 4*linesize,
|
yading@10
|
1546 linesize, bedge_lim,
|
yading@10
|
1547 inner_limit, hev_thresh);
|
yading@10
|
1548 s->vp8dsp.vp8_v_loop_filter16y_inner(dst[0]+ 8*linesize,
|
yading@10
|
1549 linesize, bedge_lim,
|
yading@10
|
1550 inner_limit, hev_thresh);
|
yading@10
|
1551 s->vp8dsp.vp8_v_loop_filter16y_inner(dst[0]+12*linesize,
|
yading@10
|
1552 linesize, bedge_lim,
|
yading@10
|
1553 inner_limit, hev_thresh);
|
yading@10
|
1554 s->vp8dsp.vp8_v_loop_filter8uv_inner(dst[1] + 4 * uvlinesize,
|
yading@10
|
1555 dst[2] + 4 * uvlinesize,
|
yading@10
|
1556 uvlinesize, bedge_lim,
|
yading@10
|
1557 inner_limit, hev_thresh);
|
yading@10
|
1558 }
|
yading@10
|
1559 }
|
yading@10
|
1560
|
yading@10
|
1561 static av_always_inline void filter_mb_simple(VP8Context *s, uint8_t *dst, VP8FilterStrength *f, int mb_x, int mb_y)
|
yading@10
|
1562 {
|
yading@10
|
1563 int mbedge_lim, bedge_lim;
|
yading@10
|
1564 int filter_level = f->filter_level;
|
yading@10
|
1565 int inner_limit = f->inner_limit;
|
yading@10
|
1566 int inner_filter = f->inner_filter;
|
yading@10
|
1567 int linesize = s->linesize;
|
yading@10
|
1568
|
yading@10
|
1569 if (!filter_level)
|
yading@10
|
1570 return;
|
yading@10
|
1571
|
yading@10
|
1572 bedge_lim = 2*filter_level + inner_limit;
|
yading@10
|
1573 mbedge_lim = bedge_lim + 4;
|
yading@10
|
1574
|
yading@10
|
1575 if (mb_x)
|
yading@10
|
1576 s->vp8dsp.vp8_h_loop_filter_simple(dst, linesize, mbedge_lim);
|
yading@10
|
1577 if (inner_filter) {
|
yading@10
|
1578 s->vp8dsp.vp8_h_loop_filter_simple(dst+ 4, linesize, bedge_lim);
|
yading@10
|
1579 s->vp8dsp.vp8_h_loop_filter_simple(dst+ 8, linesize, bedge_lim);
|
yading@10
|
1580 s->vp8dsp.vp8_h_loop_filter_simple(dst+12, linesize, bedge_lim);
|
yading@10
|
1581 }
|
yading@10
|
1582
|
yading@10
|
1583 if (mb_y)
|
yading@10
|
1584 s->vp8dsp.vp8_v_loop_filter_simple(dst, linesize, mbedge_lim);
|
yading@10
|
1585 if (inner_filter) {
|
yading@10
|
1586 s->vp8dsp.vp8_v_loop_filter_simple(dst+ 4*linesize, linesize, bedge_lim);
|
yading@10
|
1587 s->vp8dsp.vp8_v_loop_filter_simple(dst+ 8*linesize, linesize, bedge_lim);
|
yading@10
|
1588 s->vp8dsp.vp8_v_loop_filter_simple(dst+12*linesize, linesize, bedge_lim);
|
yading@10
|
1589 }
|
yading@10
|
1590 }
|
yading@10
|
1591
|
yading@10
|
1592 #define MARGIN (16 << 2)
|
yading@10
|
1593 static void vp8_decode_mv_mb_modes(AVCodecContext *avctx, VP8Frame *curframe,
|
yading@10
|
1594 VP8Frame *prev_frame)
|
yading@10
|
1595 {
|
yading@10
|
1596 VP8Context *s = avctx->priv_data;
|
yading@10
|
1597 int mb_x, mb_y;
|
yading@10
|
1598
|
yading@10
|
1599 s->mv_min.y = -MARGIN;
|
yading@10
|
1600 s->mv_max.y = ((s->mb_height - 1) << 6) + MARGIN;
|
yading@10
|
1601 for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
|
yading@10
|
1602 VP8Macroblock *mb = s->macroblocks_base + ((s->mb_width+1)*(mb_y + 1) + 1);
|
yading@10
|
1603 int mb_xy = mb_y*s->mb_width;
|
yading@10
|
1604
|
yading@10
|
1605 AV_WN32A(s->intra4x4_pred_mode_left, DC_PRED*0x01010101);
|
yading@10
|
1606
|
yading@10
|
1607 s->mv_min.x = -MARGIN;
|
yading@10
|
1608 s->mv_max.x = ((s->mb_width - 1) << 6) + MARGIN;
|
yading@10
|
1609 for (mb_x = 0; mb_x < s->mb_width; mb_x++, mb_xy++, mb++) {
|
yading@10
|
1610 if (mb_y == 0)
|
yading@10
|
1611 AV_WN32A((mb-s->mb_width-1)->intra4x4_pred_mode_top, DC_PRED*0x01010101);
|
yading@10
|
1612 decode_mb_mode(s, mb, mb_x, mb_y, curframe->seg_map->data + mb_xy,
|
yading@10
|
1613 prev_frame && prev_frame->seg_map ?
|
yading@10
|
1614 prev_frame->seg_map->data + mb_xy : NULL, 1);
|
yading@10
|
1615 s->mv_min.x -= 64;
|
yading@10
|
1616 s->mv_max.x -= 64;
|
yading@10
|
1617 }
|
yading@10
|
1618 s->mv_min.y -= 64;
|
yading@10
|
1619 s->mv_max.y -= 64;
|
yading@10
|
1620 }
|
yading@10
|
1621 }
|
yading@10
|
1622
|
yading@10
|
1623 #if HAVE_THREADS
|
yading@10
|
1624 #define check_thread_pos(td, otd, mb_x_check, mb_y_check)\
|
yading@10
|
1625 do {\
|
yading@10
|
1626 int tmp = (mb_y_check << 16) | (mb_x_check & 0xFFFF);\
|
yading@10
|
1627 if (otd->thread_mb_pos < tmp) {\
|
yading@10
|
1628 pthread_mutex_lock(&otd->lock);\
|
yading@10
|
1629 td->wait_mb_pos = tmp;\
|
yading@10
|
1630 do {\
|
yading@10
|
1631 if (otd->thread_mb_pos >= tmp)\
|
yading@10
|
1632 break;\
|
yading@10
|
1633 pthread_cond_wait(&otd->cond, &otd->lock);\
|
yading@10
|
1634 } while (1);\
|
yading@10
|
1635 td->wait_mb_pos = INT_MAX;\
|
yading@10
|
1636 pthread_mutex_unlock(&otd->lock);\
|
yading@10
|
1637 }\
|
yading@10
|
1638 } while(0);
|
yading@10
|
1639
|
yading@10
|
1640 #define update_pos(td, mb_y, mb_x)\
|
yading@10
|
1641 do {\
|
yading@10
|
1642 int pos = (mb_y << 16) | (mb_x & 0xFFFF);\
|
yading@10
|
1643 int sliced_threading = (avctx->active_thread_type == FF_THREAD_SLICE) && (num_jobs > 1);\
|
yading@10
|
1644 int is_null = (next_td == NULL) || (prev_td == NULL);\
|
yading@10
|
1645 int pos_check = (is_null) ? 1 :\
|
yading@10
|
1646 (next_td != td && pos >= next_td->wait_mb_pos) ||\
|
yading@10
|
1647 (prev_td != td && pos >= prev_td->wait_mb_pos);\
|
yading@10
|
1648 td->thread_mb_pos = pos;\
|
yading@10
|
1649 if (sliced_threading && pos_check) {\
|
yading@10
|
1650 pthread_mutex_lock(&td->lock);\
|
yading@10
|
1651 pthread_cond_broadcast(&td->cond);\
|
yading@10
|
1652 pthread_mutex_unlock(&td->lock);\
|
yading@10
|
1653 }\
|
yading@10
|
1654 } while(0);
|
yading@10
|
1655 #else
|
yading@10
|
1656 #define check_thread_pos(td, otd, mb_x_check, mb_y_check)
|
yading@10
|
1657 #define update_pos(td, mb_y, mb_x)
|
yading@10
|
1658 #endif
|
yading@10
|
1659
|
yading@10
|
1660 static void vp8_decode_mb_row_no_filter(AVCodecContext *avctx, void *tdata,
|
yading@10
|
1661 int jobnr, int threadnr)
|
yading@10
|
1662 {
|
yading@10
|
1663 VP8Context *s = avctx->priv_data;
|
yading@10
|
1664 VP8ThreadData *prev_td, *next_td, *td = &s->thread_data[threadnr];
|
yading@10
|
1665 int mb_y = td->thread_mb_pos>>16;
|
yading@10
|
1666 int i, y, mb_x, mb_xy = mb_y*s->mb_width;
|
yading@10
|
1667 int num_jobs = s->num_jobs;
|
yading@10
|
1668 VP8Frame *curframe = s->curframe, *prev_frame = s->prev_frame;
|
yading@10
|
1669 VP56RangeCoder *c = &s->coeff_partition[mb_y & (s->num_coeff_partitions-1)];
|
yading@10
|
1670 VP8Macroblock *mb;
|
yading@10
|
1671 uint8_t *dst[3] = {
|
yading@10
|
1672 curframe->tf.f->data[0] + 16*mb_y*s->linesize,
|
yading@10
|
1673 curframe->tf.f->data[1] + 8*mb_y*s->uvlinesize,
|
yading@10
|
1674 curframe->tf.f->data[2] + 8*mb_y*s->uvlinesize
|
yading@10
|
1675 };
|
yading@10
|
1676 if (mb_y == 0) prev_td = td;
|
yading@10
|
1677 else prev_td = &s->thread_data[(jobnr + num_jobs - 1)%num_jobs];
|
yading@10
|
1678 if (mb_y == s->mb_height-1) next_td = td;
|
yading@10
|
1679 else next_td = &s->thread_data[(jobnr + 1)%num_jobs];
|
yading@10
|
1680 if (s->mb_layout == 1)
|
yading@10
|
1681 mb = s->macroblocks_base + ((s->mb_width+1)*(mb_y + 1) + 1);
|
yading@10
|
1682 else {
|
yading@10
|
1683 mb = s->macroblocks + (s->mb_height - mb_y - 1)*2;
|
yading@10
|
1684 memset(mb - 1, 0, sizeof(*mb)); // zero left macroblock
|
yading@10
|
1685 AV_WN32A(s->intra4x4_pred_mode_left, DC_PRED*0x01010101);
|
yading@10
|
1686 }
|
yading@10
|
1687
|
yading@10
|
1688 memset(td->left_nnz, 0, sizeof(td->left_nnz));
|
yading@10
|
1689 // left edge of 129 for intra prediction
|
yading@10
|
1690 if (!(avctx->flags & CODEC_FLAG_EMU_EDGE)) {
|
yading@10
|
1691 for (i = 0; i < 3; i++)
|
yading@10
|
1692 for (y = 0; y < 16>>!!i; y++)
|
yading@10
|
1693 dst[i][y*curframe->tf.f->linesize[i]-1] = 129;
|
yading@10
|
1694 if (mb_y == 1) {
|
yading@10
|
1695 s->top_border[0][15] = s->top_border[0][23] = s->top_border[0][31] = 129;
|
yading@10
|
1696 }
|
yading@10
|
1697 }
|
yading@10
|
1698
|
yading@10
|
1699 s->mv_min.x = -MARGIN;
|
yading@10
|
1700 s->mv_max.x = ((s->mb_width - 1) << 6) + MARGIN;
|
yading@10
|
1701
|
yading@10
|
1702 for (mb_x = 0; mb_x < s->mb_width; mb_x++, mb_xy++, mb++) {
|
yading@10
|
1703 // Wait for previous thread to read mb_x+2, and reach mb_y-1.
|
yading@10
|
1704 if (prev_td != td) {
|
yading@10
|
1705 if (threadnr != 0) {
|
yading@10
|
1706 check_thread_pos(td, prev_td, mb_x+1, mb_y-1);
|
yading@10
|
1707 } else {
|
yading@10
|
1708 check_thread_pos(td, prev_td, (s->mb_width+3) + (mb_x+1), mb_y-1);
|
yading@10
|
1709 }
|
yading@10
|
1710 }
|
yading@10
|
1711
|
yading@10
|
1712 s->vdsp.prefetch(dst[0] + (mb_x&3)*4*s->linesize + 64, s->linesize, 4);
|
yading@10
|
1713 s->vdsp.prefetch(dst[1] + (mb_x&7)*s->uvlinesize + 64, dst[2] - dst[1], 2);
|
yading@10
|
1714
|
yading@10
|
1715 if (!s->mb_layout)
|
yading@10
|
1716 decode_mb_mode(s, mb, mb_x, mb_y, curframe->seg_map->data + mb_xy,
|
yading@10
|
1717 prev_frame && prev_frame->seg_map ?
|
yading@10
|
1718 prev_frame->seg_map->data + mb_xy : NULL, 0);
|
yading@10
|
1719
|
yading@10
|
1720 prefetch_motion(s, mb, mb_x, mb_y, mb_xy, VP56_FRAME_PREVIOUS);
|
yading@10
|
1721
|
yading@10
|
1722 if (!mb->skip)
|
yading@10
|
1723 decode_mb_coeffs(s, td, c, mb, s->top_nnz[mb_x], td->left_nnz);
|
yading@10
|
1724
|
yading@10
|
1725 if (mb->mode <= MODE_I4x4)
|
yading@10
|
1726 intra_predict(s, td, dst, mb, mb_x, mb_y);
|
yading@10
|
1727 else
|
yading@10
|
1728 inter_predict(s, td, dst, mb, mb_x, mb_y);
|
yading@10
|
1729
|
yading@10
|
1730 prefetch_motion(s, mb, mb_x, mb_y, mb_xy, VP56_FRAME_GOLDEN);
|
yading@10
|
1731
|
yading@10
|
1732 if (!mb->skip) {
|
yading@10
|
1733 idct_mb(s, td, dst, mb);
|
yading@10
|
1734 } else {
|
yading@10
|
1735 AV_ZERO64(td->left_nnz);
|
yading@10
|
1736 AV_WN64(s->top_nnz[mb_x], 0); // array of 9, so unaligned
|
yading@10
|
1737
|
yading@10
|
1738 // Reset DC block predictors if they would exist if the mb had coefficients
|
yading@10
|
1739 if (mb->mode != MODE_I4x4 && mb->mode != VP8_MVMODE_SPLIT) {
|
yading@10
|
1740 td->left_nnz[8] = 0;
|
yading@10
|
1741 s->top_nnz[mb_x][8] = 0;
|
yading@10
|
1742 }
|
yading@10
|
1743 }
|
yading@10
|
1744
|
yading@10
|
1745 if (s->deblock_filter)
|
yading@10
|
1746 filter_level_for_mb(s, mb, &td->filter_strength[mb_x]);
|
yading@10
|
1747
|
yading@10
|
1748 if (s->deblock_filter && num_jobs != 1 && threadnr == num_jobs-1) {
|
yading@10
|
1749 if (s->filter.simple)
|
yading@10
|
1750 backup_mb_border(s->top_border[mb_x+1], dst[0], NULL, NULL, s->linesize, 0, 1);
|
yading@10
|
1751 else
|
yading@10
|
1752 backup_mb_border(s->top_border[mb_x+1], dst[0], dst[1], dst[2], s->linesize, s->uvlinesize, 0);
|
yading@10
|
1753 }
|
yading@10
|
1754
|
yading@10
|
1755 prefetch_motion(s, mb, mb_x, mb_y, mb_xy, VP56_FRAME_GOLDEN2);
|
yading@10
|
1756
|
yading@10
|
1757 dst[0] += 16;
|
yading@10
|
1758 dst[1] += 8;
|
yading@10
|
1759 dst[2] += 8;
|
yading@10
|
1760 s->mv_min.x -= 64;
|
yading@10
|
1761 s->mv_max.x -= 64;
|
yading@10
|
1762
|
yading@10
|
1763 if (mb_x == s->mb_width+1) {
|
yading@10
|
1764 update_pos(td, mb_y, s->mb_width+3);
|
yading@10
|
1765 } else {
|
yading@10
|
1766 update_pos(td, mb_y, mb_x);
|
yading@10
|
1767 }
|
yading@10
|
1768 }
|
yading@10
|
1769 }
|
yading@10
|
1770
|
yading@10
|
1771 static void vp8_filter_mb_row(AVCodecContext *avctx, void *tdata,
|
yading@10
|
1772 int jobnr, int threadnr)
|
yading@10
|
1773 {
|
yading@10
|
1774 VP8Context *s = avctx->priv_data;
|
yading@10
|
1775 VP8ThreadData *td = &s->thread_data[threadnr];
|
yading@10
|
1776 int mb_x, mb_y = td->thread_mb_pos>>16, num_jobs = s->num_jobs;
|
yading@10
|
1777 AVFrame *curframe = s->curframe->tf.f;
|
yading@10
|
1778 VP8Macroblock *mb;
|
yading@10
|
1779 VP8ThreadData *prev_td, *next_td;
|
yading@10
|
1780 uint8_t *dst[3] = {
|
yading@10
|
1781 curframe->data[0] + 16*mb_y*s->linesize,
|
yading@10
|
1782 curframe->data[1] + 8*mb_y*s->uvlinesize,
|
yading@10
|
1783 curframe->data[2] + 8*mb_y*s->uvlinesize
|
yading@10
|
1784 };
|
yading@10
|
1785
|
yading@10
|
1786 if (s->mb_layout == 1)
|
yading@10
|
1787 mb = s->macroblocks_base + ((s->mb_width+1)*(mb_y + 1) + 1);
|
yading@10
|
1788 else
|
yading@10
|
1789 mb = s->macroblocks + (s->mb_height - mb_y - 1)*2;
|
yading@10
|
1790
|
yading@10
|
1791 if (mb_y == 0) prev_td = td;
|
yading@10
|
1792 else prev_td = &s->thread_data[(jobnr + num_jobs - 1)%num_jobs];
|
yading@10
|
1793 if (mb_y == s->mb_height-1) next_td = td;
|
yading@10
|
1794 else next_td = &s->thread_data[(jobnr + 1)%num_jobs];
|
yading@10
|
1795
|
yading@10
|
1796 for (mb_x = 0; mb_x < s->mb_width; mb_x++, mb++) {
|
yading@10
|
1797 VP8FilterStrength *f = &td->filter_strength[mb_x];
|
yading@10
|
1798 if (prev_td != td) {
|
yading@10
|
1799 check_thread_pos(td, prev_td, (mb_x+1) + (s->mb_width+3), mb_y-1);
|
yading@10
|
1800 }
|
yading@10
|
1801 if (next_td != td)
|
yading@10
|
1802 if (next_td != &s->thread_data[0]) {
|
yading@10
|
1803 check_thread_pos(td, next_td, mb_x+1, mb_y+1);
|
yading@10
|
1804 }
|
yading@10
|
1805
|
yading@10
|
1806 if (num_jobs == 1) {
|
yading@10
|
1807 if (s->filter.simple)
|
yading@10
|
1808 backup_mb_border(s->top_border[mb_x+1], dst[0], NULL, NULL, s->linesize, 0, 1);
|
yading@10
|
1809 else
|
yading@10
|
1810 backup_mb_border(s->top_border[mb_x+1], dst[0], dst[1], dst[2], s->linesize, s->uvlinesize, 0);
|
yading@10
|
1811 }
|
yading@10
|
1812
|
yading@10
|
1813 if (s->filter.simple)
|
yading@10
|
1814 filter_mb_simple(s, dst[0], f, mb_x, mb_y);
|
yading@10
|
1815 else
|
yading@10
|
1816 filter_mb(s, dst, f, mb_x, mb_y);
|
yading@10
|
1817 dst[0] += 16;
|
yading@10
|
1818 dst[1] += 8;
|
yading@10
|
1819 dst[2] += 8;
|
yading@10
|
1820
|
yading@10
|
1821 update_pos(td, mb_y, (s->mb_width+3) + mb_x);
|
yading@10
|
1822 }
|
yading@10
|
1823 }
|
yading@10
|
1824
|
yading@10
|
1825 static int vp8_decode_mb_row_sliced(AVCodecContext *avctx, void *tdata,
|
yading@10
|
1826 int jobnr, int threadnr)
|
yading@10
|
1827 {
|
yading@10
|
1828 VP8Context *s = avctx->priv_data;
|
yading@10
|
1829 VP8ThreadData *td = &s->thread_data[jobnr];
|
yading@10
|
1830 VP8ThreadData *next_td = NULL, *prev_td = NULL;
|
yading@10
|
1831 VP8Frame *curframe = s->curframe;
|
yading@10
|
1832 int mb_y, num_jobs = s->num_jobs;
|
yading@10
|
1833 td->thread_nr = threadnr;
|
yading@10
|
1834 for (mb_y = jobnr; mb_y < s->mb_height; mb_y += num_jobs) {
|
yading@10
|
1835 if (mb_y >= s->mb_height) break;
|
yading@10
|
1836 td->thread_mb_pos = mb_y<<16;
|
yading@10
|
1837 vp8_decode_mb_row_no_filter(avctx, tdata, jobnr, threadnr);
|
yading@10
|
1838 if (s->deblock_filter)
|
yading@10
|
1839 vp8_filter_mb_row(avctx, tdata, jobnr, threadnr);
|
yading@10
|
1840 update_pos(td, mb_y, INT_MAX & 0xFFFF);
|
yading@10
|
1841
|
yading@10
|
1842 s->mv_min.y -= 64;
|
yading@10
|
1843 s->mv_max.y -= 64;
|
yading@10
|
1844
|
yading@10
|
1845 if (avctx->active_thread_type == FF_THREAD_FRAME)
|
yading@10
|
1846 ff_thread_report_progress(&curframe->tf, mb_y, 0);
|
yading@10
|
1847 }
|
yading@10
|
1848
|
yading@10
|
1849 return 0;
|
yading@10
|
1850 }
|
yading@10
|
1851
|
yading@10
|
1852 static int vp8_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
|
yading@10
|
1853 AVPacket *avpkt)
|
yading@10
|
1854 {
|
yading@10
|
1855 VP8Context *s = avctx->priv_data;
|
yading@10
|
1856 int ret, i, referenced, num_jobs;
|
yading@10
|
1857 enum AVDiscard skip_thresh;
|
yading@10
|
1858 VP8Frame *av_uninit(curframe), *prev_frame;
|
yading@10
|
1859
|
yading@10
|
1860 if ((ret = decode_frame_header(s, avpkt->data, avpkt->size)) < 0)
|
yading@10
|
1861 goto err;
|
yading@10
|
1862
|
yading@10
|
1863 prev_frame = s->framep[VP56_FRAME_CURRENT];
|
yading@10
|
1864
|
yading@10
|
1865 referenced = s->update_last || s->update_golden == VP56_FRAME_CURRENT
|
yading@10
|
1866 || s->update_altref == VP56_FRAME_CURRENT;
|
yading@10
|
1867
|
yading@10
|
1868 skip_thresh = !referenced ? AVDISCARD_NONREF :
|
yading@10
|
1869 !s->keyframe ? AVDISCARD_NONKEY : AVDISCARD_ALL;
|
yading@10
|
1870
|
yading@10
|
1871 if (avctx->skip_frame >= skip_thresh) {
|
yading@10
|
1872 s->invisible = 1;
|
yading@10
|
1873 memcpy(&s->next_framep[0], &s->framep[0], sizeof(s->framep[0]) * 4);
|
yading@10
|
1874 goto skip_decode;
|
yading@10
|
1875 }
|
yading@10
|
1876 s->deblock_filter = s->filter.level && avctx->skip_loop_filter < skip_thresh;
|
yading@10
|
1877
|
yading@10
|
1878 // release no longer referenced frames
|
yading@10
|
1879 for (i = 0; i < 5; i++)
|
yading@10
|
1880 if (s->frames[i].tf.f->data[0] &&
|
yading@10
|
1881 &s->frames[i] != prev_frame &&
|
yading@10
|
1882 &s->frames[i] != s->framep[VP56_FRAME_PREVIOUS] &&
|
yading@10
|
1883 &s->frames[i] != s->framep[VP56_FRAME_GOLDEN] &&
|
yading@10
|
1884 &s->frames[i] != s->framep[VP56_FRAME_GOLDEN2])
|
yading@10
|
1885 vp8_release_frame(s, &s->frames[i]);
|
yading@10
|
1886
|
yading@10
|
1887 // find a free buffer
|
yading@10
|
1888 for (i = 0; i < 5; i++)
|
yading@10
|
1889 if (&s->frames[i] != prev_frame &&
|
yading@10
|
1890 &s->frames[i] != s->framep[VP56_FRAME_PREVIOUS] &&
|
yading@10
|
1891 &s->frames[i] != s->framep[VP56_FRAME_GOLDEN] &&
|
yading@10
|
1892 &s->frames[i] != s->framep[VP56_FRAME_GOLDEN2]) {
|
yading@10
|
1893 curframe = s->framep[VP56_FRAME_CURRENT] = &s->frames[i];
|
yading@10
|
1894 break;
|
yading@10
|
1895 }
|
yading@10
|
1896 if (i == 5) {
|
yading@10
|
1897 av_log(avctx, AV_LOG_FATAL, "Ran out of free frames!\n");
|
yading@10
|
1898 abort();
|
yading@10
|
1899 }
|
yading@10
|
1900 if (curframe->tf.f->data[0])
|
yading@10
|
1901 vp8_release_frame(s, curframe);
|
yading@10
|
1902
|
yading@10
|
1903 // Given that arithmetic probabilities are updated every frame, it's quite likely
|
yading@10
|
1904 // that the values we have on a random interframe are complete junk if we didn't
|
yading@10
|
1905 // start decode on a keyframe. So just don't display anything rather than junk.
|
yading@10
|
1906 if (!s->keyframe && (!s->framep[VP56_FRAME_PREVIOUS] ||
|
yading@10
|
1907 !s->framep[VP56_FRAME_GOLDEN] ||
|
yading@10
|
1908 !s->framep[VP56_FRAME_GOLDEN2])) {
|
yading@10
|
1909 av_log(avctx, AV_LOG_WARNING, "Discarding interframe without a prior keyframe!\n");
|
yading@10
|
1910 ret = AVERROR_INVALIDDATA;
|
yading@10
|
1911 goto err;
|
yading@10
|
1912 }
|
yading@10
|
1913
|
yading@10
|
1914 curframe->tf.f->key_frame = s->keyframe;
|
yading@10
|
1915 curframe->tf.f->pict_type = s->keyframe ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P;
|
yading@10
|
1916 if ((ret = vp8_alloc_frame(s, curframe, referenced)) < 0)
|
yading@10
|
1917 goto err;
|
yading@10
|
1918
|
yading@10
|
1919 // check if golden and altref are swapped
|
yading@10
|
1920 if (s->update_altref != VP56_FRAME_NONE) {
|
yading@10
|
1921 s->next_framep[VP56_FRAME_GOLDEN2] = s->framep[s->update_altref];
|
yading@10
|
1922 } else {
|
yading@10
|
1923 s->next_framep[VP56_FRAME_GOLDEN2] = s->framep[VP56_FRAME_GOLDEN2];
|
yading@10
|
1924 }
|
yading@10
|
1925 if (s->update_golden != VP56_FRAME_NONE) {
|
yading@10
|
1926 s->next_framep[VP56_FRAME_GOLDEN] = s->framep[s->update_golden];
|
yading@10
|
1927 } else {
|
yading@10
|
1928 s->next_framep[VP56_FRAME_GOLDEN] = s->framep[VP56_FRAME_GOLDEN];
|
yading@10
|
1929 }
|
yading@10
|
1930 if (s->update_last) {
|
yading@10
|
1931 s->next_framep[VP56_FRAME_PREVIOUS] = curframe;
|
yading@10
|
1932 } else {
|
yading@10
|
1933 s->next_framep[VP56_FRAME_PREVIOUS] = s->framep[VP56_FRAME_PREVIOUS];
|
yading@10
|
1934 }
|
yading@10
|
1935 s->next_framep[VP56_FRAME_CURRENT] = curframe;
|
yading@10
|
1936
|
yading@10
|
1937 ff_thread_finish_setup(avctx);
|
yading@10
|
1938
|
yading@10
|
1939 s->linesize = curframe->tf.f->linesize[0];
|
yading@10
|
1940 s->uvlinesize = curframe->tf.f->linesize[1];
|
yading@10
|
1941
|
yading@10
|
1942 if (!s->thread_data[0].edge_emu_buffer)
|
yading@10
|
1943 for (i = 0; i < MAX_THREADS; i++)
|
yading@10
|
1944 s->thread_data[i].edge_emu_buffer = av_malloc(21*s->linesize);
|
yading@10
|
1945
|
yading@10
|
1946 memset(s->top_nnz, 0, s->mb_width*sizeof(*s->top_nnz));
|
yading@10
|
1947 /* Zero macroblock structures for top/top-left prediction from outside the frame. */
|
yading@10
|
1948 if (!s->mb_layout)
|
yading@10
|
1949 memset(s->macroblocks + s->mb_height*2 - 1, 0, (s->mb_width+1)*sizeof(*s->macroblocks));
|
yading@10
|
1950 if (!s->mb_layout && s->keyframe)
|
yading@10
|
1951 memset(s->intra4x4_pred_mode_top, DC_PRED, s->mb_width*4);
|
yading@10
|
1952
|
yading@10
|
1953 // top edge of 127 for intra prediction
|
yading@10
|
1954 if (!(avctx->flags & CODEC_FLAG_EMU_EDGE)) {
|
yading@10
|
1955 s->top_border[0][15] = s->top_border[0][23] = 127;
|
yading@10
|
1956 s->top_border[0][31] = 127;
|
yading@10
|
1957 memset(s->top_border[1], 127, s->mb_width*sizeof(*s->top_border));
|
yading@10
|
1958 }
|
yading@10
|
1959 memset(s->ref_count, 0, sizeof(s->ref_count));
|
yading@10
|
1960
|
yading@10
|
1961
|
yading@10
|
1962 // Make sure the previous frame has read its segmentation map,
|
yading@10
|
1963 // if we re-use the same map.
|
yading@10
|
1964 if (prev_frame && s->segmentation.enabled && !s->segmentation.update_map)
|
yading@10
|
1965 ff_thread_await_progress(&prev_frame->tf, 1, 0);
|
yading@10
|
1966
|
yading@10
|
1967 if (s->mb_layout == 1)
|
yading@10
|
1968 vp8_decode_mv_mb_modes(avctx, curframe, prev_frame);
|
yading@10
|
1969
|
yading@10
|
1970 if (avctx->active_thread_type == FF_THREAD_FRAME)
|
yading@10
|
1971 num_jobs = 1;
|
yading@10
|
1972 else
|
yading@10
|
1973 num_jobs = FFMIN(s->num_coeff_partitions, avctx->thread_count);
|
yading@10
|
1974 s->num_jobs = num_jobs;
|
yading@10
|
1975 s->curframe = curframe;
|
yading@10
|
1976 s->prev_frame = prev_frame;
|
yading@10
|
1977 s->mv_min.y = -MARGIN;
|
yading@10
|
1978 s->mv_max.y = ((s->mb_height - 1) << 6) + MARGIN;
|
yading@10
|
1979 for (i = 0; i < MAX_THREADS; i++) {
|
yading@10
|
1980 s->thread_data[i].thread_mb_pos = 0;
|
yading@10
|
1981 s->thread_data[i].wait_mb_pos = INT_MAX;
|
yading@10
|
1982 }
|
yading@10
|
1983 avctx->execute2(avctx, vp8_decode_mb_row_sliced, s->thread_data, NULL, num_jobs);
|
yading@10
|
1984
|
yading@10
|
1985 ff_thread_report_progress(&curframe->tf, INT_MAX, 0);
|
yading@10
|
1986 memcpy(&s->framep[0], &s->next_framep[0], sizeof(s->framep[0]) * 4);
|
yading@10
|
1987
|
yading@10
|
1988 skip_decode:
|
yading@10
|
1989 // if future frames don't use the updated probabilities,
|
yading@10
|
1990 // reset them to the values we saved
|
yading@10
|
1991 if (!s->update_probabilities)
|
yading@10
|
1992 s->prob[0] = s->prob[1];
|
yading@10
|
1993
|
yading@10
|
1994 if (!s->invisible) {
|
yading@10
|
1995 if ((ret = av_frame_ref(data, curframe->tf.f)) < 0)
|
yading@10
|
1996 return ret;
|
yading@10
|
1997 *got_frame = 1;
|
yading@10
|
1998 }
|
yading@10
|
1999
|
yading@10
|
2000 return avpkt->size;
|
yading@10
|
2001 err:
|
yading@10
|
2002 memcpy(&s->next_framep[0], &s->framep[0], sizeof(s->framep[0]) * 4);
|
yading@10
|
2003 return ret;
|
yading@10
|
2004 }
|
yading@10
|
2005
|
yading@10
|
2006 static av_cold int vp8_decode_free(AVCodecContext *avctx)
|
yading@10
|
2007 {
|
yading@10
|
2008 VP8Context *s = avctx->priv_data;
|
yading@10
|
2009 int i;
|
yading@10
|
2010
|
yading@10
|
2011 vp8_decode_flush_impl(avctx, 1);
|
yading@10
|
2012 for (i = 0; i < FF_ARRAY_ELEMS(s->frames); i++)
|
yading@10
|
2013 av_frame_free(&s->frames[i].tf.f);
|
yading@10
|
2014
|
yading@10
|
2015 return 0;
|
yading@10
|
2016 }
|
yading@10
|
2017
|
yading@10
|
2018 static av_cold int vp8_init_frames(VP8Context *s)
|
yading@10
|
2019 {
|
yading@10
|
2020 int i;
|
yading@10
|
2021 for (i = 0; i < FF_ARRAY_ELEMS(s->frames); i++) {
|
yading@10
|
2022 s->frames[i].tf.f = av_frame_alloc();
|
yading@10
|
2023 if (!s->frames[i].tf.f)
|
yading@10
|
2024 return AVERROR(ENOMEM);
|
yading@10
|
2025 }
|
yading@10
|
2026 return 0;
|
yading@10
|
2027 }
|
yading@10
|
2028
|
yading@10
|
2029 static av_cold int vp8_decode_init(AVCodecContext *avctx)
|
yading@10
|
2030 {
|
yading@10
|
2031 VP8Context *s = avctx->priv_data;
|
yading@10
|
2032 int ret;
|
yading@10
|
2033
|
yading@10
|
2034 s->avctx = avctx;
|
yading@10
|
2035 avctx->pix_fmt = AV_PIX_FMT_YUV420P;
|
yading@10
|
2036 avctx->internal->allocate_progress = 1;
|
yading@10
|
2037
|
yading@10
|
2038 ff_videodsp_init(&s->vdsp, 8);
|
yading@10
|
2039 ff_h264_pred_init(&s->hpc, AV_CODEC_ID_VP8, 8, 1);
|
yading@10
|
2040 ff_vp8dsp_init(&s->vp8dsp);
|
yading@10
|
2041
|
yading@10
|
2042 if ((ret = vp8_init_frames(s)) < 0) {
|
yading@10
|
2043 vp8_decode_free(avctx);
|
yading@10
|
2044 return ret;
|
yading@10
|
2045 }
|
yading@10
|
2046
|
yading@10
|
2047 return 0;
|
yading@10
|
2048 }
|
yading@10
|
2049
|
yading@10
|
2050 static av_cold int vp8_decode_init_thread_copy(AVCodecContext *avctx)
|
yading@10
|
2051 {
|
yading@10
|
2052 VP8Context *s = avctx->priv_data;
|
yading@10
|
2053 int ret;
|
yading@10
|
2054
|
yading@10
|
2055 s->avctx = avctx;
|
yading@10
|
2056
|
yading@10
|
2057 if ((ret = vp8_init_frames(s)) < 0) {
|
yading@10
|
2058 vp8_decode_free(avctx);
|
yading@10
|
2059 return ret;
|
yading@10
|
2060 }
|
yading@10
|
2061
|
yading@10
|
2062 return 0;
|
yading@10
|
2063 }
|
yading@10
|
2064
|
yading@10
|
2065 #define REBASE(pic) \
|
yading@10
|
2066 pic ? pic - &s_src->frames[0] + &s->frames[0] : NULL
|
yading@10
|
2067
|
yading@10
|
2068 static int vp8_decode_update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
|
yading@10
|
2069 {
|
yading@10
|
2070 VP8Context *s = dst->priv_data, *s_src = src->priv_data;
|
yading@10
|
2071 int i;
|
yading@10
|
2072
|
yading@10
|
2073 if (s->macroblocks_base &&
|
yading@10
|
2074 (s_src->mb_width != s->mb_width || s_src->mb_height != s->mb_height)) {
|
yading@10
|
2075 free_buffers(s);
|
yading@10
|
2076 s->mb_width = s_src->mb_width;
|
yading@10
|
2077 s->mb_height = s_src->mb_height;
|
yading@10
|
2078 }
|
yading@10
|
2079
|
yading@10
|
2080 s->prob[0] = s_src->prob[!s_src->update_probabilities];
|
yading@10
|
2081 s->segmentation = s_src->segmentation;
|
yading@10
|
2082 s->lf_delta = s_src->lf_delta;
|
yading@10
|
2083 memcpy(s->sign_bias, s_src->sign_bias, sizeof(s->sign_bias));
|
yading@10
|
2084
|
yading@10
|
2085 for (i = 0; i < FF_ARRAY_ELEMS(s_src->frames); i++) {
|
yading@10
|
2086 if (s_src->frames[i].tf.f->data[0]) {
|
yading@10
|
2087 int ret = vp8_ref_frame(s, &s->frames[i], &s_src->frames[i]);
|
yading@10
|
2088 if (ret < 0)
|
yading@10
|
2089 return ret;
|
yading@10
|
2090 }
|
yading@10
|
2091 }
|
yading@10
|
2092
|
yading@10
|
2093 s->framep[0] = REBASE(s_src->next_framep[0]);
|
yading@10
|
2094 s->framep[1] = REBASE(s_src->next_framep[1]);
|
yading@10
|
2095 s->framep[2] = REBASE(s_src->next_framep[2]);
|
yading@10
|
2096 s->framep[3] = REBASE(s_src->next_framep[3]);
|
yading@10
|
2097
|
yading@10
|
2098 return 0;
|
yading@10
|
2099 }
|
yading@10
|
2100
|
yading@10
|
2101 static unsigned apply_padding(unsigned size) { return size + (size & 1); }
|
yading@10
|
2102
|
yading@10
|
2103 static int webp_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
|
yading@10
|
2104 AVPacket *avpkt)
|
yading@10
|
2105 {
|
yading@10
|
2106 const uint8_t *buf = avpkt->data;
|
yading@10
|
2107 int buf_size = avpkt->size;
|
yading@10
|
2108 AVPacket pkt = *avpkt;
|
yading@10
|
2109
|
yading@10
|
2110 if (buf_size >= 16
|
yading@10
|
2111 && AV_RL32(buf ) == AV_RL32("RIFF")
|
yading@10
|
2112 && AV_RL32(buf+ 8) == AV_RL32("WEBP")) {
|
yading@10
|
2113 unsigned riff_size = apply_padding(AV_RL32(buf+4)) + 8;
|
yading@10
|
2114 buf += 12; // Skip over main header
|
yading@10
|
2115 buf_size -= 12;
|
yading@10
|
2116 if (buf_size < 8 || riff_size < 8) {
|
yading@10
|
2117 av_log(avctx, AV_LOG_ERROR, "Incomplete header.\n");
|
yading@10
|
2118 return AVERROR_INVALIDDATA;
|
yading@10
|
2119 }
|
yading@10
|
2120 if (AV_RL32(buf) == AV_RL32("VP8L")) {
|
yading@10
|
2121 av_log(avctx, AV_LOG_ERROR, "Unsupported WebP lossless format.\n");
|
yading@10
|
2122 return AVERROR_PATCHWELCOME;
|
yading@10
|
2123 }
|
yading@10
|
2124 if (AV_RL32(buf) == AV_RL32("VP8X") && AV_RL32(buf+4) < (unsigned)buf_size) {
|
yading@10
|
2125 unsigned size = apply_padding(AV_RL32(buf+4) + 8);
|
yading@10
|
2126 buf += size;
|
yading@10
|
2127 buf_size -= size;
|
yading@10
|
2128 }
|
yading@10
|
2129 if (buf_size >= 8
|
yading@10
|
2130 && AV_RL32(buf) == AV_RL32("ALPH") && AV_RL32(buf+4) < (unsigned)buf_size) {
|
yading@10
|
2131 unsigned size = apply_padding(AV_RL32(buf+4) + 8);
|
yading@10
|
2132 buf += size;
|
yading@10
|
2133 buf_size -= size;
|
yading@10
|
2134 av_log(avctx, AV_LOG_WARNING, "Skipping alpha plane\n");
|
yading@10
|
2135 }
|
yading@10
|
2136 if (buf_size >= 8 && AV_RL32(buf) == AV_RL32("VP8 ")) {
|
yading@10
|
2137 buf += 8;
|
yading@10
|
2138 buf_size -= 8;
|
yading@10
|
2139 }
|
yading@10
|
2140 }
|
yading@10
|
2141 pkt.data = buf;
|
yading@10
|
2142 pkt.size = buf_size;
|
yading@10
|
2143
|
yading@10
|
2144 return vp8_decode_frame(avctx, data, data_size, &pkt);
|
yading@10
|
2145 }
|
yading@10
|
2146
|
yading@10
|
2147 AVCodec ff_vp8_decoder = {
|
yading@10
|
2148 .name = "vp8",
|
yading@10
|
2149 .type = AVMEDIA_TYPE_VIDEO,
|
yading@10
|
2150 .id = AV_CODEC_ID_VP8,
|
yading@10
|
2151 .priv_data_size = sizeof(VP8Context),
|
yading@10
|
2152 .init = vp8_decode_init,
|
yading@10
|
2153 .close = vp8_decode_free,
|
yading@10
|
2154 .decode = vp8_decode_frame,
|
yading@10
|
2155 .capabilities = CODEC_CAP_DR1 | CODEC_CAP_FRAME_THREADS | CODEC_CAP_SLICE_THREADS,
|
yading@10
|
2156 .flush = vp8_decode_flush,
|
yading@10
|
2157 .long_name = NULL_IF_CONFIG_SMALL("On2 VP8"),
|
yading@10
|
2158 .init_thread_copy = ONLY_IF_THREADS_ENABLED(vp8_decode_init_thread_copy),
|
yading@10
|
2159 .update_thread_context = ONLY_IF_THREADS_ENABLED(vp8_decode_update_thread_context),
|
yading@10
|
2160 };
|
yading@10
|
2161
|
yading@10
|
2162 AVCodec ff_webp_decoder = {
|
yading@10
|
2163 .name = "webp",
|
yading@10
|
2164 .type = AVMEDIA_TYPE_VIDEO,
|
yading@10
|
2165 .id = AV_CODEC_ID_WEBP,
|
yading@10
|
2166 .priv_data_size = sizeof(VP8Context),
|
yading@10
|
2167 .init = vp8_decode_init,
|
yading@10
|
2168 .close = vp8_decode_free,
|
yading@10
|
2169 .decode = webp_decode_frame,
|
yading@10
|
2170 .capabilities = CODEC_CAP_DR1 | CODEC_CAP_FRAME_THREADS | CODEC_CAP_SLICE_THREADS,
|
yading@10
|
2171 .flush = vp8_decode_flush,
|
yading@10
|
2172 .long_name = NULL_IF_CONFIG_SMALL("WebP"),
|
yading@10
|
2173 .init_thread_copy = ONLY_IF_THREADS_ENABLED(vp8_decode_init_thread_copy),
|
yading@10
|
2174 .update_thread_context = ONLY_IF_THREADS_ENABLED(vp8_decode_update_thread_context),
|
yading@10
|
2175 };
|