From: James Zern Date: Fri, 14 Apr 2017 18:28:25 +0000 (-0700) Subject: Revert "vp9: Avoid encoder loopfilter for non-reference frames." X-Git-Tag: v1.7.0~562 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e9b7f98c56b3b9c99a60eb41b83bf8346b3ad25f;p=platform%2Fupstream%2Flibvpx.git Revert "vp9: Avoid encoder loopfilter for non-reference frames." This reverts commit 863f860bfcf3bdc26eeecb299aa481d0f63d11ac. This causes encoder / decoder mismatches in various VP9/DatarateTestVP9Large.BasicRateTargeting3TemporalLayers tests BUG=webm:1408 Change-Id: Ic200c39d7ed9c0b0247ef562f5d6f7b2625f7e14 --- diff --git a/test/datarate_test.cc b/test/datarate_test.cc index ff88e99..d7f9148 100644 --- a/test/datarate_test.cc +++ b/test/datarate_test.cc @@ -1221,10 +1221,9 @@ static void assign_layer_bitrates(vpx_codec_enc_cfg_t *const enc_cfg, } } -// Check basic rate targeting for 1 pass CBR SVC: 2 spatial layers and 1 -// temporal layer, with screen content mode on and same speed setting for all -// layers. -TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc2SL1TLScreenContent1) { +// Check basic rate targeting for 1 pass CBR SVC: 2 spatial layers and 1temporal +// layer, with screen content mode on and same speed setting for all layers. +TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc2patialLayersScreenContent1) { cfg_.rc_buf_initial_sz = 500; cfg_.rc_buf_optimal_sz = 500; cfg_.rc_buf_sz = 1000; @@ -1242,7 +1241,7 @@ TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc2SL1TLScreenContent1) { svc_params_.scaling_factor_den[0] = 288; svc_params_.scaling_factor_num[1] = 288; svc_params_.scaling_factor_den[1] = 288; - cfg_.rc_dropframe_thresh = 10; + cfg_.rc_dropframe_thresh = 0; cfg_.kf_max_dist = 9999; ::libvpx_test::Y4mVideoSource video("niklas_1280_720_30.y4m", 0, 300); cfg_.rc_target_bitrate = 500; @@ -1257,7 +1256,7 @@ TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc2SL1TLScreenContent1) { // Check basic rate targeting for 1 pass CBR SVC: 2 spatial layers and // 3 temporal layers. Run CIF clip with 1 thread. -TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc2SL3TL) { +TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc2SpatialLayers) { cfg_.rc_buf_initial_sz = 500; cfg_.rc_buf_optimal_sz = 500; cfg_.rc_buf_sz = 1000; @@ -1277,7 +1276,7 @@ TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc2SL3TL) { svc_params_.scaling_factor_den[0] = 288; svc_params_.scaling_factor_num[1] = 288; svc_params_.scaling_factor_den[1] = 288; - cfg_.rc_dropframe_thresh = 0; + cfg_.rc_dropframe_thresh = 10; cfg_.kf_max_dist = 9999; ::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, 30, 1, 0, 200); @@ -1289,21 +1288,17 @@ TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc2SL3TL) { assign_layer_bitrates(&cfg_, &svc_params_, cfg_.ss_number_layers, cfg_.ts_number_layers, cfg_.temporal_layering_mode); ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - ASSERT_GE(cfg_.rc_target_bitrate, file_datarate_ * 0.82) + ASSERT_GE(cfg_.rc_target_bitrate, file_datarate_ * 0.85) << " The datarate for the file exceeds the target by too much!"; ASSERT_LE(cfg_.rc_target_bitrate, file_datarate_ * 1.15) << " The datarate for the file is lower than the target by too much!"; - // Number of temporal layers > 1, so half of the frames in this SVC pattern - // will be non-reference frame and hence encoder will avoid loopfilter. - // Since frame dropper is off, we can expcet 100 (half of the sequence) - // mismatched frames. - EXPECT_EQ(static_cast(100), GetMismatchFrames()); + EXPECT_EQ(static_cast(0), GetMismatchFrames()); } } // Check basic rate targeting for 1 pass CBR SVC with denoising. // 2 spatial layers and 3 temporal layer. Run HD clip with 2 threads. -TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc2SL3TLDenoiserOn) { +TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc2SpatialLayersDenoiserOn) { cfg_.rc_buf_initial_sz = 500; cfg_.rc_buf_optimal_sz = 500; cfg_.rc_buf_sz = 1000; @@ -1323,7 +1318,7 @@ TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc2SL3TLDenoiserOn) { svc_params_.scaling_factor_den[0] = 288; svc_params_.scaling_factor_num[1] = 288; svc_params_.scaling_factor_den[1] = 288; - cfg_.rc_dropframe_thresh = 0; + cfg_.rc_dropframe_thresh = 10; cfg_.kf_max_dist = 9999; ::libvpx_test::Y4mVideoSource video("niklas_1280_720_30.y4m", 0, 300); // TODO(marpan): Check that effective_datarate for each layer hits the @@ -1335,21 +1330,17 @@ TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc2SL3TLDenoiserOn) { assign_layer_bitrates(&cfg_, &svc_params_, cfg_.ss_number_layers, cfg_.ts_number_layers, cfg_.temporal_layering_mode); ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - ASSERT_GE(cfg_.rc_target_bitrate, file_datarate_ * 0.82) + ASSERT_GE(cfg_.rc_target_bitrate, file_datarate_ * 0.85) << " The datarate for the file exceeds the target by too much!"; ASSERT_LE(cfg_.rc_target_bitrate, file_datarate_ * 1.15) << " The datarate for the file is lower than the target by too much!"; - // Number of temporal layers > 1, so half of the frames in this SVC pattern - // will be non-reference frame and hence encoder will avoid loopfilter. - // Since frame dropper is off, we can expcet 150 (half of the sequence) - // mismatched frames. - EXPECT_EQ(static_cast(150), GetMismatchFrames()); + EXPECT_EQ(static_cast(0), GetMismatchFrames()); } } // Check basic rate targeting for 1 pass CBR SVC: 2 spatial layers and 3 // temporal layers. Run CIF clip with 1 thread, and few short key frame periods. -TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc2SL3TLSmallKf) { +TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc2SpatialLayersSmallKf) { cfg_.rc_buf_initial_sz = 500; cfg_.rc_buf_optimal_sz = 500; cfg_.rc_buf_sz = 1000; @@ -1385,12 +1376,13 @@ TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc2SL3TLSmallKf) { << " The datarate for the file exceeds the target by too much!"; ASSERT_LE(cfg_.rc_target_bitrate, file_datarate_ * 1.15) << " The datarate for the file is lower than the target by too much!"; + EXPECT_EQ(static_cast(0), GetMismatchFrames()); } } // Check basic rate targeting for 1 pass CBR SVC: 2 spatial layers and // 3 temporal layers. Run HD clip with 4 threads. -TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc2SL3TL4threads) { +TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc2SpatialLayers4threads) { cfg_.rc_buf_initial_sz = 500; cfg_.rc_buf_optimal_sz = 500; cfg_.rc_buf_sz = 1000; @@ -1410,7 +1402,7 @@ TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc2SL3TL4threads) { svc_params_.scaling_factor_den[0] = 288; svc_params_.scaling_factor_num[1] = 288; svc_params_.scaling_factor_den[1] = 288; - cfg_.rc_dropframe_thresh = 0; + cfg_.rc_dropframe_thresh = 10; cfg_.kf_max_dist = 9999; ::libvpx_test::Y4mVideoSource video("niklas_1280_720_30.y4m", 0, 300); cfg_.rc_target_bitrate = 800; @@ -1418,20 +1410,16 @@ TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc2SL3TL4threads) { assign_layer_bitrates(&cfg_, &svc_params_, cfg_.ss_number_layers, cfg_.ts_number_layers, cfg_.temporal_layering_mode); ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - ASSERT_GE(cfg_.rc_target_bitrate, file_datarate_ * 0.82) + ASSERT_GE(cfg_.rc_target_bitrate, file_datarate_ * 0.85) << " The datarate for the file exceeds the target by too much!"; ASSERT_LE(cfg_.rc_target_bitrate, file_datarate_ * 1.15) << " The datarate for the file is lower than the target by too much!"; - // Number of temporal layers > 1, so half of the frames in this SVC pattern - // will be non-reference frame and hence encoder will avoid loopfilter. - // Since frame dropper is off, we can expcet 150 (half of the sequence) - // mismatched frames. - EXPECT_EQ(static_cast(150), GetMismatchFrames()); + EXPECT_EQ(static_cast(0), GetMismatchFrames()); } // Check basic rate targeting for 1 pass CBR SVC: 3 spatial layers and // 3 temporal layers. Run CIF clip with 1 thread. -TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc3SL3TL) { +TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc3SpatialLayers) { cfg_.rc_buf_initial_sz = 500; cfg_.rc_buf_optimal_sz = 500; cfg_.rc_buf_sz = 1000; @@ -1453,7 +1441,7 @@ TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc3SL3TL) { svc_params_.scaling_factor_den[1] = 288; svc_params_.scaling_factor_num[2] = 288; svc_params_.scaling_factor_den[2] = 288; - cfg_.rc_dropframe_thresh = 0; + cfg_.rc_dropframe_thresh = 10; cfg_.kf_max_dist = 9999; ::libvpx_test::Y4mVideoSource video("niklas_1280_720_30.y4m", 0, 300); cfg_.rc_target_bitrate = 800; @@ -1461,20 +1449,16 @@ TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc3SL3TL) { assign_layer_bitrates(&cfg_, &svc_params_, cfg_.ss_number_layers, cfg_.ts_number_layers, cfg_.temporal_layering_mode); ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - ASSERT_GE(cfg_.rc_target_bitrate, file_datarate_ * 0.82) + ASSERT_GE(cfg_.rc_target_bitrate, file_datarate_ * 0.85) << " The datarate for the file exceeds the target by too much!"; ASSERT_LE(cfg_.rc_target_bitrate, file_datarate_ * 1.22) << " The datarate for the file is lower than the target by too much!"; - // Number of temporal layers > 1, so half of the frames in this SVC pattern - // will be non-reference frame and hence encoder will avoid loopfilter. - // Since frame dropper is off, we can expcet 150 (half of the sequence) - // mismatched frames. - EXPECT_EQ(static_cast(150), GetMismatchFrames()); + EXPECT_EQ(static_cast(0), GetMismatchFrames()); } // Check basic rate targeting for 1 pass CBR SVC: 3 spatial layers and 3 // temporal layers. Run CIF clip with 1 thread, and few short key frame periods. -TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc3SL3TLSmallKf) { +TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc3SpatialLayersSmallKf) { cfg_.rc_buf_initial_sz = 500; cfg_.rc_buf_optimal_sz = 500; cfg_.rc_buf_sz = 1000; @@ -1511,12 +1495,13 @@ TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc3SL3TLSmallKf) { << " The datarate for the file exceeds the target by too much!"; ASSERT_LE(cfg_.rc_target_bitrate, file_datarate_ * 1.30) << " The datarate for the file is lower than the target by too much!"; + EXPECT_EQ(static_cast(0), GetMismatchFrames()); } } // Check basic rate targeting for 1 pass CBR SVC: 3 spatial layers and // 3 temporal layers. Run HD clip with 4 threads. -TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc3SL3TL4threads) { +TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc3SpatialLayers4threads) { cfg_.rc_buf_initial_sz = 500; cfg_.rc_buf_optimal_sz = 500; cfg_.rc_buf_sz = 1000; @@ -1538,7 +1523,7 @@ TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc3SL3TL4threads) { svc_params_.scaling_factor_den[1] = 288; svc_params_.scaling_factor_num[2] = 288; svc_params_.scaling_factor_den[2] = 288; - cfg_.rc_dropframe_thresh = 0; + cfg_.rc_dropframe_thresh = 10; cfg_.kf_max_dist = 9999; ::libvpx_test::Y4mVideoSource video("niklas_1280_720_30.y4m", 0, 300); cfg_.rc_target_bitrate = 800; @@ -1546,20 +1531,16 @@ TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc3SL3TL4threads) { assign_layer_bitrates(&cfg_, &svc_params_, cfg_.ss_number_layers, cfg_.ts_number_layers, cfg_.temporal_layering_mode); ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - ASSERT_GE(cfg_.rc_target_bitrate, file_datarate_ * 0.82) + ASSERT_GE(cfg_.rc_target_bitrate, file_datarate_ * 0.85) << " The datarate for the file exceeds the target by too much!"; ASSERT_LE(cfg_.rc_target_bitrate, file_datarate_ * 1.22) << " The datarate for the file is lower than the target by too much!"; - // Number of temporal layers > 1, so half of the frames in this SVC pattern - // will be non-reference frame and hence encoder will avoid loopfilter. - // Since frame dropper is off, we can expcet 150 (half of the sequence) - // mismatched frames. - EXPECT_EQ(static_cast(150), GetMismatchFrames()); + EXPECT_EQ(static_cast(0), GetMismatchFrames()); } // Run SVC encoder for 1 temporal layer, 2 spatial layers, with spatial // downscale 5x5. -TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc2SL1TL5x5MultipleRuns) { +TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc2SpatialLayers5x5MultipleRuns) { cfg_.rc_buf_initial_sz = 500; cfg_.rc_buf_optimal_sz = 500; cfg_.rc_buf_sz = 1000; @@ -1577,7 +1558,7 @@ TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc2SL1TL5x5MultipleRuns) { svc_params_.scaling_factor_den[0] = 1280; svc_params_.scaling_factor_num[1] = 1280; svc_params_.scaling_factor_den[1] = 1280; - cfg_.rc_dropframe_thresh = 10; + cfg_.rc_dropframe_thresh = 0; cfg_.kf_max_dist = 999999; cfg_.kf_min_dist = 0; cfg_.ss_target_bitrate[0] = 300; diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c index 7d56232..1dc70d2 100644 --- a/vp9/encoder/vp9_encoder.c +++ b/vp9/encoder/vp9_encoder.c @@ -2618,10 +2618,6 @@ static void loopfilter_frame(VP9_COMP *cpi, VP9_COMMON *cm) { MACROBLOCKD *xd = &cpi->td.mb.e_mbd; struct loopfilter *lf = &cm->lf; - const int is_reference_frame = - (cpi->refresh_last_frame || cpi->refresh_golden_frame || - cpi->refresh_alt_ref_frame); - if (xd->lossless) { lf->filter_level = 0; lf->last_filt_level = 0; @@ -2647,7 +2643,7 @@ static void loopfilter_frame(VP9_COMP *cpi, VP9_COMMON *cm) { cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer); } - if (lf->filter_level > 0 && is_reference_frame) { + if (lf->filter_level > 0) { vp9_build_mask_frame(cm, lf->filter_level, 0); if (cpi->num_workers > 1)