| @@ -494,7 +494,31 @@ class LoopfilterOnePassCbrSvc : public OnePassCbrSvc, · 493 unmodified lines |
| 494 | virtual void PreEncodeFrameHook(::libvpx_test::VideoSource *video, | 494 | virtual void PreEncodeFrameHook(::libvpx_test::VideoSource *video, |
| 495 | ::libvpx_test::Encoder *encoder) { | 495 | ::libvpx_test::Encoder *encoder) { |
| 496 | PreEncodeFrameHookSetup(video, encoder); | 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 | virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) { | 524 | virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) { |
| @@ -524,6 +548,35 @@ class LoopfilterOnePassCbrSvc : public OnePassCbrSvc, · 23 unmodified lines |
| 524 | int num_nonref_frames_; | 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 | TEST_P(LoopfilterOnePassCbrSvc, OnePassCbrSvc1SL3TLLoopfilterOff) { | 580 | TEST_P(LoopfilterOnePassCbrSvc, OnePassCbrSvc1SL3TLLoopfilterOff) { |
| 528 | SetSvcConfig(1, 3); | 581 | SetSvcConfig(1, 3); |
| 529 | cfg_.rc_buf_initial_sz = 500; | 582 | cfg_.rc_buf_initial_sz = 500; |
| @@ -542,7 +595,37 @@ TEST_P(LoopfilterOnePassCbrSvc, OnePassCbrSvc1SL3TLLoopfilterOff) { · 12 unmodified lines |
| 542 | cfg_.ts_rate_decimator[1] = 2; | 595 | cfg_.ts_rate_decimator[1] = 2; |
| 543 | cfg_.ts_rate_decimator[2] = 1; | 596 | cfg_.ts_rate_decimator[2] = 1; |
| 544 | cfg_.temporal_layering_mode = 3; | 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 | ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1, | 629 | ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1, |
| 547 | 0, 400); | 630 | 0, 400); |
| 548 | cfg_.rc_target_bitrate = 600; | 631 | cfg_.rc_target_bitrate = 600; |