| @@ -494,7 +494,31 @@ class LoopfilterOnePassCbrSvc : public OnePassCbrSvc, · 493 unmodified lines |
| 494 | 494 | virtual void PreEncodeFrameHook(::libvpx_test::VideoSource *video, |
| 495 | 495 | ::libvpx_test::Encoder *encoder) { |
| 496 | 496 | PreEncodeFrameHookSetup(video, encoder); |
| 497 | | − encoder->Control(VP9E_SET_DISABLE_LOOPFILTER, loopfilter_off_); |
| 497 | + if (number_temporal_layers_ > 1 || number_spatial_layers_ > 1) { |
| 498 | + // Consider 3 cases: |
| 499 | + if (loopfilter_off_ == 0) { |
| 500 | + // loopfilter is on for all spatial layers on every superrframe. |
| 501 | + for (int i = 0; i < VPX_SS_MAX_LAYERS; ++i) { |
| 502 | + svc_params_.loopfilter_ctrl[i] = 0; |
| 503 | + } |
| 504 | + } else if (loopfilter_off_ == 1) { |
| 505 | + // loopfilter is off for non-reference frames for all spatial layers. |
| 506 | + for (int i = 0; i < VPX_SS_MAX_LAYERS; ++i) { |
| 507 | + svc_params_.loopfilter_ctrl[i] = 1; |
| 508 | + } |
| 509 | + } else { |
| 510 | + // loopfilter is off for all SL0 frames, and off only for non-reference |
| 511 | + // frames for SL > 0. |
| 512 | + svc_params_.loopfilter_ctrl[0] = 2; |
| 513 | + for (int i = 1; i < VPX_SS_MAX_LAYERS; ++i) { |
| 514 | + svc_params_.loopfilter_ctrl[i] = 1; |
| 515 | + } |
| 516 | + } |
| 517 | + encoder->Control(VP9E_SET_SVC_PARAMETERS, &svc_params_); |
| 518 | + } else if (number_temporal_layers_ == 1 && number_spatial_layers_ == 1) { |
| 519 | + // For non-SVC mode use the single layer control. |
| 520 | + encoder->Control(VP9E_SET_DISABLE_LOOPFILTER, loopfilter_off_); |
| 521 | + } |
| 498 | 522 | } |
| 499 | 523 | |
| 500 | 524 | virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) { |
| @@ -524,6 +548,35 @@ class LoopfilterOnePassCbrSvc : public OnePassCbrSvc, · 23 unmodified lines |
| 524 | 548 | int num_nonref_frames_; |
| 525 | 549 | }; |
| 526 | 550 | |
| 551 | +TEST_P(LoopfilterOnePassCbrSvc, OnePassCbrSvc1SL1TLLoopfilterOff) { |
| 552 | + SetSvcConfig(1, 1); |
| 553 | + cfg_.rc_buf_initial_sz = 500; |
| 554 | + cfg_.rc_buf_optimal_sz = 500; |
| 555 | + cfg_.rc_buf_sz = 1000; |
| 556 | + cfg_.rc_min_quantizer = 0; |
| 557 | + cfg_.rc_max_quantizer = 63; |
| 558 | + cfg_.g_threads = 1; |
| 559 | + cfg_.rc_dropframe_thresh = 0; |
| 560 | + cfg_.rc_target_bitrate = 800; |
| 561 | + cfg_.kf_max_dist = 9999; |
| 562 | + cfg_.rc_end_usage = VPX_CBR; |
| 563 | + cfg_.g_lag_in_frames = 0; |
| 564 | + cfg_.g_error_resilient = 1; |
| 565 | + cfg_.ts_rate_decimator[0] = 1; |
| 566 | + cfg_.temporal_layering_mode = 0; |
| 567 | + ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1, |
| 568 | + 0, 400); |
| 569 | + cfg_.rc_target_bitrate = 600; |
| 570 | + AssignLayerBitrates(); |
| 571 | + ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); |
| 572 | +#if CONFIG_VP9_DECODER |
| 573 | + if (loopfilter_off_ == 0) |
| 574 | + EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames()); |
| 575 | + else |
| 576 | + EXPECT_EQ(GetMismatchFrames(), 0); |
| 577 | +#endif |
| 578 | +} |
| 579 | + |
| 527 | 580 | TEST_P(LoopfilterOnePassCbrSvc, OnePassCbrSvc1SL3TLLoopfilterOff) { |
| 528 | 581 | SetSvcConfig(1, 3); |
| 529 | 582 | cfg_.rc_buf_initial_sz = 500; |
| @@ -542,7 +595,37 @@ TEST_P(LoopfilterOnePassCbrSvc, OnePassCbrSvc1SL3TLLoopfilterOff) { · 12 unmodified lines |
| 542 | 595 | cfg_.ts_rate_decimator[1] = 2; |
| 543 | 596 | cfg_.ts_rate_decimator[2] = 1; |
| 544 | 597 | cfg_.temporal_layering_mode = 3; |
| 598 | + ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1, |
| 599 | + 0, 400); |
| 600 | + cfg_.rc_target_bitrate = 600; |
| 601 | + AssignLayerBitrates(); |
| 602 | + ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); |
| 603 | +#if CONFIG_VP9_DECODER |
| 604 | + if (loopfilter_off_ == 0) |
| 605 | + EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames()); |
| 606 | + else |
| 607 | + EXPECT_EQ(GetMismatchFrames(), 0); |
| 608 | +#endif |
| 609 | +} |
| 545 | 610 | |
| 611 | +TEST_P(LoopfilterOnePassCbrSvc, OnePassCbrSvc3SL3TLLoopfilterOff) { |
| 612 | + SetSvcConfig(3, 3); |
| 613 | + cfg_.rc_buf_initial_sz = 500; |
| 614 | + cfg_.rc_buf_optimal_sz = 500; |
| 615 | + cfg_.rc_buf_sz = 1000; |
| 616 | + cfg_.rc_min_quantizer = 0; |
| 617 | + cfg_.rc_max_quantizer = 63; |
| 618 | + cfg_.g_threads = 1; |
| 619 | + cfg_.rc_dropframe_thresh = 0; |
| 620 | + cfg_.rc_target_bitrate = 800; |
| 621 | + cfg_.kf_max_dist = 9999; |
| 622 | + cfg_.rc_end_usage = VPX_CBR; |
| 623 | + cfg_.g_lag_in_frames = 0; |
| 624 | + cfg_.g_error_resilient = 1; |
| 625 | + cfg_.ts_rate_decimator[0] = 4; |
| 626 | + cfg_.ts_rate_decimator[1] = 2; |
| 627 | + cfg_.ts_rate_decimator[2] = 1; |
| 628 | + cfg_.temporal_layering_mode = 3; |
| 546 | 629 | ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1, |
| 547 | 630 | 0, 400); |
| 548 | 631 | cfg_.rc_target_bitrate = 600; |