OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
269 | 269 |
270 decode_block(plane, block, bsize, ss_txfrm_size, arg); | 270 decode_block(plane, block, bsize, ss_txfrm_size, arg); |
271 } | 271 } |
272 | 272 |
273 static void decode_atom(VP9D_COMP *pbi, MACROBLOCKD *xd, | 273 static void decode_atom(VP9D_COMP *pbi, MACROBLOCKD *xd, |
274 int mi_row, int mi_col, | 274 int mi_row, int mi_col, |
275 vp9_reader *r, BLOCK_SIZE_TYPE bsize) { | 275 vp9_reader *r, BLOCK_SIZE_TYPE bsize) { |
276 MB_MODE_INFO *const mbmi = &xd->mode_info_context->mbmi; | 276 MB_MODE_INFO *const mbmi = &xd->mode_info_context->mbmi; |
277 | 277 |
278 assert(mbmi->ref_frame[0] != INTRA_FRAME); | 278 assert(mbmi->ref_frame[0] != INTRA_FRAME); |
279 | 279 vp9_setup_interp_filters(xd, mbmi->interp_filter, &pbi->common); |
280 if ((pbi->common.frame_type != KEY_FRAME) && (!pbi->common.intra_only)) | |
281 vp9_setup_interp_filters(xd, mbmi->interp_filter, &pbi->common); | |
282 | 280 |
283 // prediction | 281 // prediction |
284 vp9_build_inter_predictors_sb(xd, mi_row, mi_col, bsize); | 282 vp9_build_inter_predictors_sb(xd, mi_row, mi_col, bsize); |
285 | 283 |
286 if (mbmi->mb_skip_coeff) { | 284 if (mbmi->mb_skip_coeff) { |
287 vp9_reset_sb_tokens_context(xd, bsize); | 285 vp9_reset_sb_tokens_context(xd, bsize); |
288 } else { | 286 } else { |
289 if (xd->segmentation_enabled) | 287 if (xd->segmentation_enabled) |
290 mb_init_dequantizer(&pbi->common, xd); | 288 mb_init_dequantizer(&pbi->common, xd); |
291 | 289 |
(...skipping 28 matching lines...) Expand all Loading... |
320 const int bw = 1 << bwl, bh = 1 << bhl; | 318 const int bw = 1 << bwl, bh = 1 << bhl; |
321 int n, eobtotal; | 319 int n, eobtotal; |
322 VP9_COMMON *const pc = &pbi->common; | 320 VP9_COMMON *const pc = &pbi->common; |
323 MODE_INFO *const mi = xd->mode_info_context; | 321 MODE_INFO *const mi = xd->mode_info_context; |
324 MB_MODE_INFO *const mbmi = &mi->mbmi; | 322 MB_MODE_INFO *const mbmi = &mi->mbmi; |
325 const int mis = pc->mode_info_stride; | 323 const int mis = pc->mode_info_stride; |
326 | 324 |
327 assert(mbmi->sb_type == bsize); | 325 assert(mbmi->sb_type == bsize); |
328 assert(mbmi->ref_frame[0] != INTRA_FRAME); | 326 assert(mbmi->ref_frame[0] != INTRA_FRAME); |
329 | 327 |
330 if (pbi->common.frame_type != KEY_FRAME) | 328 vp9_setup_interp_filters(xd, mbmi->interp_filter, pc); |
331 vp9_setup_interp_filters(xd, mbmi->interp_filter, pc); | |
332 | 329 |
333 // generate prediction | 330 // generate prediction |
334 vp9_build_inter_predictors_sb(xd, mi_row, mi_col, bsize); | 331 vp9_build_inter_predictors_sb(xd, mi_row, mi_col, bsize); |
335 | 332 |
336 if (mbmi->mb_skip_coeff) { | 333 if (mbmi->mb_skip_coeff) { |
337 vp9_reset_sb_tokens_context(xd, bsize); | 334 vp9_reset_sb_tokens_context(xd, bsize); |
338 } else { | 335 } else { |
339 // re-initialize macroblock dequantizer before detokenization | 336 // re-initialize macroblock dequantizer before detokenization |
340 if (xd->segmentation_enabled) | 337 if (xd->segmentation_enabled) |
341 mb_init_dequantizer(pc, xd); | 338 mb_init_dequantizer(pc, xd); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
385 set_mi_row_col(cm, xd, mi_row, bh, mi_col, bw); | 382 set_mi_row_col(cm, xd, mi_row, bh, mi_col, bw); |
386 | 383 |
387 setup_dst_planes(xd, &cm->yv12_fb[cm->new_fb_idx], mi_row, mi_col); | 384 setup_dst_planes(xd, &cm->yv12_fb[cm->new_fb_idx], mi_row, mi_col); |
388 } | 385 } |
389 | 386 |
390 static void set_refs(VP9D_COMP *pbi, int mi_row, int mi_col) { | 387 static void set_refs(VP9D_COMP *pbi, int mi_row, int mi_col) { |
391 VP9_COMMON *const cm = &pbi->common; | 388 VP9_COMMON *const cm = &pbi->common; |
392 MACROBLOCKD *const xd = &pbi->mb; | 389 MACROBLOCKD *const xd = &pbi->mb; |
393 MB_MODE_INFO *const mbmi = &xd->mode_info_context->mbmi; | 390 MB_MODE_INFO *const mbmi = &xd->mode_info_context->mbmi; |
394 | 391 |
395 if (mbmi->ref_frame[0] > INTRA_FRAME) { | 392 // Select the appropriate reference frame for this MB |
| 393 const int fb_idx = cm->active_ref_idx[mbmi->ref_frame[0] - 1]; |
| 394 const YV12_BUFFER_CONFIG *cfg = &cm->yv12_fb[fb_idx]; |
| 395 xd->scale_factor[0] = cm->active_ref_scale[mbmi->ref_frame[0] - 1]; |
| 396 xd->scale_factor_uv[0] = cm->active_ref_scale[mbmi->ref_frame[0] - 1]; |
| 397 setup_pre_planes(xd, cfg, NULL, mi_row, mi_col, xd->scale_factor, |
| 398 xd->scale_factor_uv); |
| 399 xd->corrupted |= cfg->corrupted; |
| 400 |
| 401 if (mbmi->ref_frame[1] > INTRA_FRAME) { |
396 // Select the appropriate reference frame for this MB | 402 // Select the appropriate reference frame for this MB |
397 const int fb_idx = cm->active_ref_idx[mbmi->ref_frame[0] - 1]; | 403 const int second_fb_idx = cm->active_ref_idx[mbmi->ref_frame[1] - 1]; |
398 const YV12_BUFFER_CONFIG *cfg = &cm->yv12_fb[fb_idx]; | 404 const YV12_BUFFER_CONFIG *second_cfg = &cm->yv12_fb[second_fb_idx]; |
399 xd->scale_factor[0] = cm->active_ref_scale[mbmi->ref_frame[0] - 1]; | 405 xd->scale_factor[1] = cm->active_ref_scale[mbmi->ref_frame[1] - 1]; |
400 xd->scale_factor_uv[0] = cm->active_ref_scale[mbmi->ref_frame[0] - 1]; | 406 xd->scale_factor_uv[1] = cm->active_ref_scale[mbmi->ref_frame[1] - 1]; |
401 setup_pre_planes(xd, cfg, NULL, mi_row, mi_col, | 407 setup_pre_planes(xd, NULL, second_cfg, mi_row, mi_col, xd->scale_factor, |
402 xd->scale_factor, xd->scale_factor_uv); | 408 xd->scale_factor_uv); |
403 xd->corrupted |= cfg->corrupted; | 409 xd->corrupted |= second_cfg->corrupted; |
404 | |
405 if (mbmi->ref_frame[1] > INTRA_FRAME) { | |
406 // Select the appropriate reference frame for this MB | |
407 const int second_fb_idx = cm->active_ref_idx[mbmi->ref_frame[1] - 1]; | |
408 const YV12_BUFFER_CONFIG *second_cfg = &cm->yv12_fb[second_fb_idx]; | |
409 xd->scale_factor[1] = cm->active_ref_scale[mbmi->ref_frame[1] - 1]; | |
410 xd->scale_factor_uv[1] = cm->active_ref_scale[mbmi->ref_frame[1] - 1]; | |
411 setup_pre_planes(xd, NULL, second_cfg, mi_row, mi_col, | |
412 xd->scale_factor, xd->scale_factor_uv); | |
413 xd->corrupted |= second_cfg->corrupted; | |
414 } | |
415 } | 410 } |
416 } | 411 } |
417 | 412 |
418 static void decode_modes_b(VP9D_COMP *pbi, int mi_row, int mi_col, | 413 static void decode_modes_b(VP9D_COMP *pbi, int mi_row, int mi_col, |
419 vp9_reader *r, BLOCK_SIZE_TYPE bsize) { | 414 vp9_reader *r, BLOCK_SIZE_TYPE bsize) { |
420 MACROBLOCKD *const xd = &pbi->mb; | 415 MACROBLOCKD *const xd = &pbi->mb; |
421 | 416 |
422 if (bsize < BLOCK_SIZE_SB8X8) | 417 if (bsize < BLOCK_SIZE_SB8X8) |
423 if (xd->ab_index > 0) | 418 if (xd->ab_index > 0) |
424 return; | 419 return; |
425 set_offsets(pbi, bsize, mi_row, mi_col); | 420 set_offsets(pbi, bsize, mi_row, mi_col); |
426 vp9_decode_mb_mode_mv(pbi, xd, mi_row, mi_col, r); | 421 vp9_decode_mb_mode_mv(pbi, xd, mi_row, mi_col, r); |
427 set_refs(pbi, mi_row, mi_col); | |
428 | 422 |
429 if (xd->mode_info_context->mbmi.ref_frame[0] == INTRA_FRAME) | 423 if (xd->mode_info_context->mbmi.ref_frame[0] == INTRA_FRAME) { |
430 decode_sb_intra(pbi, xd, mi_row, mi_col, r, (bsize < BLOCK_SIZE_SB8X8) ? | 424 decode_sb_intra(pbi, xd, mi_row, mi_col, r, (bsize < BLOCK_SIZE_SB8X8) ? |
431 BLOCK_SIZE_SB8X8 : bsize); | 425 BLOCK_SIZE_SB8X8 : bsize); |
432 else if (bsize < BLOCK_SIZE_SB8X8) | 426 } else { |
433 decode_atom(pbi, xd, mi_row, mi_col, r, BLOCK_SIZE_SB8X8); | 427 set_refs(pbi, mi_row, mi_col); |
434 else | 428 if (bsize < BLOCK_SIZE_SB8X8) |
435 decode_sb(pbi, xd, mi_row, mi_col, r, bsize); | 429 decode_atom(pbi, xd, mi_row, mi_col, r, BLOCK_SIZE_SB8X8); |
436 | 430 else |
| 431 decode_sb(pbi, xd, mi_row, mi_col, r, bsize); |
| 432 } |
437 xd->corrupted |= vp9_reader_has_error(r); | 433 xd->corrupted |= vp9_reader_has_error(r); |
438 } | 434 } |
439 | 435 |
440 static void decode_modes_sb(VP9D_COMP *pbi, int mi_row, int mi_col, | 436 static void decode_modes_sb(VP9D_COMP *pbi, int mi_row, int mi_col, |
441 vp9_reader* r, BLOCK_SIZE_TYPE bsize) { | 437 vp9_reader* r, BLOCK_SIZE_TYPE bsize) { |
442 VP9_COMMON *const pc = &pbi->common; | 438 VP9_COMMON *const pc = &pbi->common; |
443 MACROBLOCKD *const xd = &pbi->mb; | 439 MACROBLOCKD *const xd = &pbi->mb; |
444 int bs = (1 << mi_width_log2(bsize)) / 2, n; | 440 int bs = (1 << mi_width_log2(bsize)) / 2, n; |
445 PARTITION_TYPE partition = PARTITION_NONE; | 441 PARTITION_TYPE partition = PARTITION_NONE; |
446 BLOCK_SIZE_TYPE subsize; | 442 BLOCK_SIZE_TYPE subsize; |
(...skipping 733 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1180 "A stream must start with a complete key frame"); | 1176 "A stream must start with a complete key frame"); |
1181 } | 1177 } |
1182 | 1178 |
1183 // Adaptation | 1179 // Adaptation |
1184 if (!pc->error_resilient_mode && !pc->frame_parallel_decoding_mode) { | 1180 if (!pc->error_resilient_mode && !pc->frame_parallel_decoding_mode) { |
1185 vp9_adapt_coef_probs(pc); | 1181 vp9_adapt_coef_probs(pc); |
1186 | 1182 |
1187 if ((!keyframe) && (!pc->intra_only)) { | 1183 if ((!keyframe) && (!pc->intra_only)) { |
1188 vp9_adapt_mode_probs(pc); | 1184 vp9_adapt_mode_probs(pc); |
1189 vp9_adapt_mode_context(pc); | 1185 vp9_adapt_mode_context(pc); |
1190 vp9_adapt_nmv_probs(pc, xd->allow_high_precision_mv); | 1186 vp9_adapt_mv_probs(pc, xd->allow_high_precision_mv); |
1191 } | 1187 } |
1192 } | 1188 } |
1193 | 1189 |
1194 if (pc->refresh_frame_context) | 1190 if (pc->refresh_frame_context) |
1195 pc->frame_contexts[pc->frame_context_idx] = pc->fc; | 1191 pc->frame_contexts[pc->frame_context_idx] = pc->fc; |
1196 | 1192 |
1197 *p_data_end = vp9_reader_find_end(&residual_bc); | 1193 *p_data_end = vp9_reader_find_end(&residual_bc); |
1198 return 0; | 1194 return 0; |
1199 } | 1195 } |
OLD | NEW |