| 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 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 &cpi->fn_ptr[BLOCK_16X16], 0, &best_ref_mv1, ref_mv); | 171 &cpi->fn_ptr[BLOCK_16X16], 0, &best_ref_mv1, ref_mv); |
| 172 | 172 |
| 173 // Ignore mv costing by sending NULL pointer instead of cost array | 173 // Ignore mv costing by sending NULL pointer instead of cost array |
| 174 bestsme = cpi->find_fractional_mv_step(x, ref_mv, | 174 bestsme = cpi->find_fractional_mv_step(x, ref_mv, |
| 175 &best_ref_mv1, | 175 &best_ref_mv1, |
| 176 cpi->common.allow_high_precision_mv, | 176 cpi->common.allow_high_precision_mv, |
| 177 x->errorperbit, | 177 x->errorperbit, |
| 178 &cpi->fn_ptr[BLOCK_16X16], | 178 &cpi->fn_ptr[BLOCK_16X16], |
| 179 0, mv_sf->subpel_iters_per_step, | 179 0, mv_sf->subpel_iters_per_step, |
| 180 NULL, NULL, | 180 NULL, NULL, |
| 181 &distortion, &sse); | 181 &distortion, &sse, NULL, 0, 0); |
| 182 | 182 |
| 183 // Restore input state | 183 // Restore input state |
| 184 x->plane[0].src = src; | 184 x->plane[0].src = src; |
| 185 xd->plane[0].pre[0] = pre; | 185 xd->plane[0].pre[0] = pre; |
| 186 | 186 |
| 187 return bestsme; | 187 return bestsme; |
| 188 } | 188 } |
| 189 | 189 |
| 190 static void temporal_filter_iterate_c(VP9_COMP *cpi, | 190 static void temporal_filter_iterate_c(VP9_COMP *cpi, |
| 191 int frame_count, | 191 int frame_count, |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 348 } | 348 } |
| 349 mb_y_offset += 16 * (f->y_stride - mb_cols); | 349 mb_y_offset += 16 * (f->y_stride - mb_cols); |
| 350 mb_uv_offset += mb_uv_height * f->uv_stride - mb_uv_width * mb_cols; | 350 mb_uv_offset += mb_uv_height * f->uv_stride - mb_uv_width * mb_cols; |
| 351 } | 351 } |
| 352 | 352 |
| 353 // Restore input state | 353 // Restore input state |
| 354 for (i = 0; i < MAX_MB_PLANE; i++) | 354 for (i = 0; i < MAX_MB_PLANE; i++) |
| 355 mbd->plane[i].pre[0].buf = input_buffer[i]; | 355 mbd->plane[i].pre[0].buf = input_buffer[i]; |
| 356 } | 356 } |
| 357 | 357 |
| 358 void vp9_temporal_filter_prepare(VP9_COMP *cpi, int distance) { | 358 // Apply buffer limits and context specific adjustments to arnr filter. |
| 359 VP9_COMMON *const cm = &cpi->common; | 359 static void adjust_arnr_filter(VP9_COMP *cpi, |
| 360 int frame = 0; | 360 int distance, int group_boost) { |
| 361 int frames_to_blur_backward = 0; | 361 const int frames_after_arf = |
| 362 int frames_to_blur_forward = 0; | 362 vp9_lookahead_depth(cpi->lookahead) - distance - 1; |
| 363 int frames_to_blur = 0; | 363 int frames_fwd = (cpi->oxcf.arnr_max_frames - 1) >> 1; |
| 364 int start_frame = 0; | 364 int frames_bwd; |
| 365 int strength = cpi->active_arnr_strength; | |
| 366 int blur_type = cpi->oxcf.arnr_type; | |
| 367 int max_frames = cpi->active_arnr_frames; | |
| 368 const int num_frames_backward = distance; | |
| 369 const int num_frames_forward = vp9_lookahead_depth(cpi->lookahead) | |
| 370 - (num_frames_backward + 1); | |
| 371 struct scale_factors sf; | |
| 372 | |
| 373 switch (blur_type) { | |
| 374 case 1: | |
| 375 // Backward Blur | |
| 376 frames_to_blur_backward = num_frames_backward; | |
| 377 | |
| 378 if (frames_to_blur_backward >= max_frames) | |
| 379 frames_to_blur_backward = max_frames - 1; | |
| 380 | |
| 381 frames_to_blur = frames_to_blur_backward + 1; | |
| 382 break; | |
| 383 | |
| 384 case 2: | |
| 385 // Forward Blur | |
| 386 frames_to_blur_forward = num_frames_forward; | |
| 387 | |
| 388 if (frames_to_blur_forward >= max_frames) | |
| 389 frames_to_blur_forward = max_frames - 1; | |
| 390 | |
| 391 frames_to_blur = frames_to_blur_forward + 1; | |
| 392 break; | |
| 393 | |
| 394 case 3: | |
| 395 default: | |
| 396 // Center Blur | |
| 397 frames_to_blur_forward = num_frames_forward; | |
| 398 frames_to_blur_backward = num_frames_backward; | |
| 399 | |
| 400 if (frames_to_blur_forward > frames_to_blur_backward) | |
| 401 frames_to_blur_forward = frames_to_blur_backward; | |
| 402 | |
| 403 if (frames_to_blur_backward > frames_to_blur_forward) | |
| 404 frames_to_blur_backward = frames_to_blur_forward; | |
| 405 | |
| 406 // When max_frames is even we have 1 more frame backward than forward | |
| 407 if (frames_to_blur_forward > (max_frames - 1) / 2) | |
| 408 frames_to_blur_forward = ((max_frames - 1) / 2); | |
| 409 | |
| 410 if (frames_to_blur_backward > (max_frames / 2)) | |
| 411 frames_to_blur_backward = (max_frames / 2); | |
| 412 | |
| 413 frames_to_blur = frames_to_blur_backward + frames_to_blur_forward + 1; | |
| 414 break; | |
| 415 } | |
| 416 | |
| 417 start_frame = distance + frames_to_blur_forward; | |
| 418 | |
| 419 #ifdef DEBUGFWG | |
| 420 // DEBUG FWG | |
| 421 printf( | |
| 422 "max:%d FBCK:%d FFWD:%d ftb:%d ftbbck:%d ftbfwd:%d sei:%d lasei:%d " | |
| 423 "start:%d", | |
| 424 max_frames, num_frames_backward, num_frames_forward, frames_to_blur, | |
| 425 frames_to_blur_backward, frames_to_blur_forward, cpi->source_encode_index, | |
| 426 cpi->last_alt_ref_sei, start_frame); | |
| 427 #endif | |
| 428 | |
| 429 // Setup scaling factors. Scaling on each of the arnr frames is not supported | |
| 430 vp9_setup_scale_factors_for_frame(&sf, | |
| 431 get_frame_new_buffer(cm)->y_crop_width, | |
| 432 get_frame_new_buffer(cm)->y_crop_height, | |
| 433 cm->width, cm->height); | |
| 434 | |
| 435 // Setup frame pointers, NULL indicates frame not included in filter | |
| 436 vp9_zero(cpi->frames); | |
| 437 for (frame = 0; frame < frames_to_blur; frame++) { | |
| 438 int which_buffer = start_frame - frame; | |
| 439 struct lookahead_entry *buf = vp9_lookahead_peek(cpi->lookahead, | |
| 440 which_buffer); | |
| 441 cpi->frames[frames_to_blur - 1 - frame] = &buf->img; | |
| 442 } | |
| 443 | |
| 444 temporal_filter_iterate_c(cpi, frames_to_blur, frames_to_blur_backward, | |
| 445 strength, &sf); | |
| 446 } | |
| 447 | |
| 448 void vp9_configure_arnr_filter(VP9_COMP *cpi, | |
| 449 const unsigned int frames_to_arnr, | |
| 450 const int group_boost) { | |
| 451 int half_gf_int; | |
| 452 int frames_after_arf; | |
| 453 int frames_bwd = cpi->oxcf.arnr_max_frames - 1; | |
| 454 int frames_fwd = cpi->oxcf.arnr_max_frames - 1; | |
| 455 int q; | 365 int q; |
| 456 | 366 |
| 457 // Define the arnr filter width for this group of frames. We only | 367 // Define the forward and backwards filter limits for this arnr group. |
| 458 // filter frames that lie within a distance of half the GF interval | 368 if (frames_fwd > frames_after_arf) |
| 459 // from the ARF frame. We also have to trap cases where the filter | 369 frames_fwd = frames_after_arf; |
| 460 // extends beyond the end of the lookahead buffer. | 370 if (frames_fwd > distance) |
| 461 // Note: frames_to_arnr parameter is the offset of the arnr | 371 frames_fwd = distance; |
| 462 // frame from the current frame. | |
| 463 half_gf_int = cpi->rc.baseline_gf_interval >> 1; | |
| 464 frames_after_arf = vp9_lookahead_depth(cpi->lookahead) | |
| 465 - frames_to_arnr - 1; | |
| 466 | 372 |
| 467 switch (cpi->oxcf.arnr_type) { | 373 frames_bwd = frames_fwd; |
| 468 case 1: // Backward filter | |
| 469 frames_fwd = 0; | |
| 470 if (frames_bwd > half_gf_int) | |
| 471 frames_bwd = half_gf_int; | |
| 472 break; | |
| 473 | 374 |
| 474 case 2: // Forward filter | 375 // For even length filter there is one more frame backward |
| 475 if (frames_fwd > half_gf_int) | 376 // than forward: e.g. len=6 ==> bbbAff, len=7 ==> bbbAfff. |
| 476 frames_fwd = half_gf_int; | 377 if (frames_bwd < distance) |
| 477 if (frames_fwd > frames_after_arf) | 378 frames_bwd += (cpi->oxcf.arnr_max_frames + 1) & 0x1; |
| 478 frames_fwd = frames_after_arf; | |
| 479 frames_bwd = 0; | |
| 480 break; | |
| 481 | 379 |
| 482 case 3: // Centered filter | 380 // Set the baseline active filter size. |
| 483 default: | |
| 484 frames_fwd >>= 1; | |
| 485 if (frames_fwd > frames_after_arf) | |
| 486 frames_fwd = frames_after_arf; | |
| 487 if (frames_fwd > half_gf_int) | |
| 488 frames_fwd = half_gf_int; | |
| 489 | |
| 490 frames_bwd = frames_fwd; | |
| 491 | |
| 492 // For even length filter there is one more frame backward | |
| 493 // than forward: e.g. len=6 ==> bbbAff, len=7 ==> bbbAfff. | |
| 494 if (frames_bwd < half_gf_int) | |
| 495 frames_bwd += (cpi->oxcf.arnr_max_frames + 1) & 0x1; | |
| 496 break; | |
| 497 } | |
| 498 | |
| 499 cpi->active_arnr_frames = frames_bwd + 1 + frames_fwd; | 381 cpi->active_arnr_frames = frames_bwd + 1 + frames_fwd; |
| 500 | 382 |
| 501 // Adjust the strength based on active max q | 383 // Adjust the strength based on active max q. |
| 502 if (cpi->common.current_video_frame > 1) | 384 if (cpi->common.current_video_frame > 1) |
| 503 q = ((int)vp9_convert_qindex_to_q( | 385 q = ((int)vp9_convert_qindex_to_q( |
| 504 cpi->rc.avg_frame_qindex[INTER_FRAME])); | 386 cpi->rc.avg_frame_qindex[INTER_FRAME])); |
| 505 else | 387 else |
| 506 q = ((int)vp9_convert_qindex_to_q( | 388 q = ((int)vp9_convert_qindex_to_q( |
| 507 cpi->rc.avg_frame_qindex[KEY_FRAME])); | 389 cpi->rc.avg_frame_qindex[KEY_FRAME])); |
| 508 if (q > 16) { | 390 if (q > 16) { |
| 509 cpi->active_arnr_strength = cpi->oxcf.arnr_strength; | 391 cpi->active_arnr_strength = cpi->oxcf.arnr_strength; |
| 510 } else { | 392 } else { |
| 511 cpi->active_arnr_strength = cpi->oxcf.arnr_strength - ((16 - q) / 2); | 393 cpi->active_arnr_strength = cpi->oxcf.arnr_strength - ((16 - q) / 2); |
| 512 if (cpi->active_arnr_strength < 0) | 394 if (cpi->active_arnr_strength < 0) |
| 513 cpi->active_arnr_strength = 0; | 395 cpi->active_arnr_strength = 0; |
| 514 } | 396 } |
| 515 | 397 |
| 516 // Adjust number of frames in filter and strength based on gf boost level. | 398 // Adjust number of frames in filter and strength based on gf boost level. |
| 517 if (cpi->active_arnr_frames > (group_boost / 150)) { | 399 if (cpi->active_arnr_frames > (group_boost / 150)) { |
| 518 cpi->active_arnr_frames = (group_boost / 150); | 400 cpi->active_arnr_frames = (group_boost / 150); |
| 519 cpi->active_arnr_frames += !(cpi->active_arnr_frames & 1); | 401 cpi->active_arnr_frames += !(cpi->active_arnr_frames & 1); |
| 520 } | 402 } |
| 521 if (cpi->active_arnr_strength > (group_boost / 300)) { | 403 if (cpi->active_arnr_strength > (group_boost / 300)) { |
| 522 cpi->active_arnr_strength = (group_boost / 300); | 404 cpi->active_arnr_strength = (group_boost / 300); |
| 523 } | 405 } |
| 406 |
| 407 // Adjustments for second level arf in multi arf case. |
| 408 if (cpi->pass == 2 && cpi->multi_arf_allowed) { |
| 409 const GF_GROUP *const gf_group = &cpi->twopass.gf_group; |
| 410 if (gf_group->rf_level[gf_group->index] != GF_ARF_STD) { |
| 411 cpi->active_arnr_strength >>= 1; |
| 412 } |
| 413 } |
| 524 } | 414 } |
| 415 |
| 416 void vp9_temporal_filter(VP9_COMP *cpi, int distance) { |
| 417 VP9_COMMON *const cm = &cpi->common; |
| 418 RATE_CONTROL *const rc = &cpi->rc; |
| 419 int frame; |
| 420 int frames_to_blur; |
| 421 int start_frame; |
| 422 int strength; |
| 423 int frames_to_blur_backward; |
| 424 int frames_to_blur_forward; |
| 425 struct scale_factors sf; |
| 426 |
| 427 // Apply context specific adjustments to the arnr filter parameters. |
| 428 adjust_arnr_filter(cpi, distance, rc->gfu_boost); |
| 429 strength = cpi->active_arnr_strength; |
| 430 frames_to_blur = cpi->active_arnr_frames; |
| 431 frames_to_blur_backward = (frames_to_blur / 2); |
| 432 frames_to_blur_forward = ((frames_to_blur - 1) / 2); |
| 433 start_frame = distance + frames_to_blur_forward; |
| 434 |
| 435 // Setup scaling factors. Scaling on each of the arnr frames not supported. |
| 436 vp9_setup_scale_factors_for_frame(&sf, |
| 437 get_frame_new_buffer(cm)->y_crop_width, |
| 438 get_frame_new_buffer(cm)->y_crop_height, |
| 439 cm->width, cm->height); |
| 440 |
| 441 // Setup frame pointers, NULL indicates frame not included in filter. |
| 442 vp9_zero(cpi->frames); |
| 443 for (frame = 0; frame < frames_to_blur; ++frame) { |
| 444 const int which_buffer = start_frame - frame; |
| 445 struct lookahead_entry *buf = vp9_lookahead_peek(cpi->lookahead, |
| 446 which_buffer); |
| 447 cpi->frames[frames_to_blur - 1 - frame] = &buf->img; |
| 448 } |
| 449 |
| 450 temporal_filter_iterate_c(cpi, frames_to_blur, frames_to_blur_backward, |
| 451 strength, &sf); |
| 452 } |
| OLD | NEW |