annotate ffmpeg/libavcodec/vp8.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
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, &copy);
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 };