diff --git a/modules/video_coding/svc/create_scalability_structure.cc b/modules/video_coding/svc/create_scalability_structure.cc index d5a85e0e3c..8e939b4d13 100644 --- a/modules/video_coding/svc/create_scalability_structure.cc +++ b/modules/video_coding/svc/create_scalability_structure.cc @@ -92,6 +92,13 @@ constexpr ScalableVideoController::StreamLayersConfig kConfigL3T1 = { {1, 1, 1}, {4, 2, 1}}; +constexpr ScalableVideoController::StreamLayersConfig kConfigL3T2 = { + /*num_spatial_layers=*/3, + /*num_temporal_layers=*/2, + /*uses_reference_scaling=*/true, + {1, 1, 1}, + {4, 2, 1}}; + constexpr ScalableVideoController::StreamLayersConfig kConfigL3T3 = { /*num_spatial_layers=*/3, /*num_temporal_layers=*/3, @@ -138,6 +145,11 @@ constexpr NamedStructureFactory kFactories[] = { {ScalabilityMode::kL2T3_KEY, Create, kConfigL2T3}, {ScalabilityMode::kL3T1, Create, kConfigL3T1}, + {ScalabilityMode::kL3T1_KEY, Create, + kConfigL3T1}, + {ScalabilityMode::kL3T2, Create, kConfigL3T2}, + {ScalabilityMode::kL3T2_KEY, Create, + kConfigL3T2}, {ScalabilityMode::kL3T3, Create, kConfigL3T3}, {ScalabilityMode::kL3T3_KEY, Create, kConfigL3T3}, diff --git a/modules/video_coding/svc/scalability_structure_full_svc.cc b/modules/video_coding/svc/scalability_structure_full_svc.cc index d73f167231..a262317597 100644 --- a/modules/video_coding/svc/scalability_structure_full_svc.cc +++ b/modules/video_coding/svc/scalability_structure_full_svc.cc @@ -389,6 +389,29 @@ FrameDependencyStructure ScalabilityStructureL3T1::DependencyStructure() const { return structure; } +FrameDependencyStructure ScalabilityStructureL3T2::DependencyStructure() const { + FrameDependencyStructure structure; + structure.num_decode_targets = 6; + structure.num_chains = 3; + structure.decode_target_protected_by_chain = {0, 0, 1, 1, 2, 2}; + auto& t = structure.templates; + t.resize(9); + // Templates are shown in the order frames following them appear in the + // stream, but in `structure.templates` array templates are sorted by + // (`spatial_id`, `temporal_id`) since that is a dependency descriptor + // requirement. + t[1].S(0).T(0).Dtis("SSSSSS").ChainDiffs({0, 0, 0}); + t[4].S(1).T(0).Dtis("--SSSS").ChainDiffs({1, 1, 1}).FrameDiffs({1}); + t[7].S(2).T(0).Dtis("----SS").ChainDiffs({2, 1, 1}).FrameDiffs({1}); + t[2].S(0).T(1).Dtis("-D-R-R").ChainDiffs({3, 2, 1}).FrameDiffs({3}); + t[5].S(1).T(1).Dtis("---D-R").ChainDiffs({4, 3, 2}).FrameDiffs({3, 1}); + t[8].S(2).T(1).Dtis("-----D").ChainDiffs({5, 4, 3}).FrameDiffs({3, 1}); + t[0].S(0).T(0).Dtis("SSRRRR").ChainDiffs({6, 5, 4}).FrameDiffs({6}); + t[3].S(1).T(0).Dtis("--SSRR").ChainDiffs({1, 1, 1}).FrameDiffs({6, 1}); + t[6].S(2).T(0).Dtis("----SS").ChainDiffs({2, 1, 1}).FrameDiffs({6, 1}); + return structure; +} + FrameDependencyStructure ScalabilityStructureL3T3::DependencyStructure() const { FrameDependencyStructure structure; structure.num_decode_targets = 9; diff --git a/modules/video_coding/svc/scalability_structure_full_svc.h b/modules/video_coding/svc/scalability_structure_full_svc.h index 03141ffb10..a4ede69342 100644 --- a/modules/video_coding/svc/scalability_structure_full_svc.h +++ b/modules/video_coding/svc/scalability_structure_full_svc.h @@ -165,6 +165,16 @@ class ScalabilityStructureL3T1 : public ScalabilityStructureFullSvc { FrameDependencyStructure DependencyStructure() const override; }; +// https://www.w3.org/TR/webrtc-svc/#L3T2* +class ScalabilityStructureL3T2 : public ScalabilityStructureFullSvc { + public: + explicit ScalabilityStructureL3T2(ScalingFactor resolution_factor = {}) + : ScalabilityStructureFullSvc(3, 2, resolution_factor) {} + ~ScalabilityStructureL3T2() override = default; + + FrameDependencyStructure DependencyStructure() const override; +}; + // https://www.w3.org/TR/webrtc-svc/#L3T3* class ScalabilityStructureL3T3 : public ScalabilityStructureFullSvc { public: diff --git a/modules/video_coding/svc/scalability_structure_key_svc.cc b/modules/video_coding/svc/scalability_structure_key_svc.cc index 0ef7e8f156..0e6fecfae9 100644 --- a/modules/video_coding/svc/scalability_structure_key_svc.cc +++ b/modules/video_coding/svc/scalability_structure_key_svc.cc @@ -343,6 +343,55 @@ FrameDependencyStructure ScalabilityStructureL2T3Key::DependencyStructure() return structure; } +ScalabilityStructureL3T1Key::~ScalabilityStructureL3T1Key() = default; + +FrameDependencyStructure ScalabilityStructureL3T1Key::DependencyStructure() + const { + FrameDependencyStructure structure; + structure.num_decode_targets = 3; + structure.num_chains = 3; + structure.decode_target_protected_by_chain = {0, 1, 2}; + auto& t = structure.templates; + t.resize(6); + // Templates are shown in the order frames following them appear in the + // stream, but in `structure.templates` array templates are sorted by + // (`spatial_id`, `temporal_id`) since that is a dependency descriptor + // requirement. + t[1].S(0).Dtis("SSS").ChainDiffs({0, 0, 0}); + t[3].S(1).Dtis("-SS").ChainDiffs({1, 1, 1}).FrameDiffs({1}); + t[5].S(2).Dtis("--S").ChainDiffs({2, 1, 1}).FrameDiffs({1}); + t[0].S(0).Dtis("S--").ChainDiffs({3, 2, 1}).FrameDiffs({3}); + t[2].S(1).Dtis("-S-").ChainDiffs({1, 3, 2}).FrameDiffs({3}); + t[4].S(2).Dtis("--S").ChainDiffs({2, 1, 3}).FrameDiffs({3}); + return structure; +} + +ScalabilityStructureL3T2Key::~ScalabilityStructureL3T2Key() = default; + +FrameDependencyStructure ScalabilityStructureL3T2Key::DependencyStructure() + const { + FrameDependencyStructure structure; + structure.num_decode_targets = 6; + structure.num_chains = 3; + structure.decode_target_protected_by_chain = {0, 0, 1, 1, 2, 2}; + auto& t = structure.templates; + t.resize(9); + // Templates are shown in the order frames following them appear in the + // stream, but in `structure.templates` array templates are sorted by + // (`spatial_id`, `temporal_id`) since that is a dependency descriptor + // requirement. + t[1].S(0).T(0).Dtis("SSSSSS").ChainDiffs({0, 0, 0}); + t[4].S(1).T(0).Dtis("--SSSS").ChainDiffs({1, 1, 1}).FrameDiffs({1}); + t[7].S(2).T(0).Dtis("----SS").ChainDiffs({2, 1, 1}).FrameDiffs({1}); + t[2].S(0).T(1).Dtis("-D----").ChainDiffs({3, 2, 1}).FrameDiffs({3}); + t[5].S(1).T(1).Dtis("---D--").ChainDiffs({4, 3, 2}).FrameDiffs({3}); + t[8].S(2).T(1).Dtis("-----D").ChainDiffs({5, 4, 3}).FrameDiffs({3}); + t[0].S(0).T(0).Dtis("SS----").ChainDiffs({6, 5, 4}).FrameDiffs({6}); + t[3].S(1).T(0).Dtis("--SS--").ChainDiffs({1, 6, 5}).FrameDiffs({6}); + t[6].S(2).T(0).Dtis("----SS").ChainDiffs({2, 1, 6}).FrameDiffs({6}); + return structure; +} + ScalabilityStructureL3T3Key::~ScalabilityStructureL3T3Key() = default; FrameDependencyStructure ScalabilityStructureL3T3Key::DependencyStructure() diff --git a/modules/video_coding/svc/scalability_structure_key_svc.h b/modules/video_coding/svc/scalability_structure_key_svc.h index b66f6f83e4..54760da431 100644 --- a/modules/video_coding/svc/scalability_structure_key_svc.h +++ b/modules/video_coding/svc/scalability_structure_key_svc.h @@ -109,6 +109,22 @@ class ScalabilityStructureL2T3Key : public ScalabilityStructureKeySvc { FrameDependencyStructure DependencyStructure() const override; }; +class ScalabilityStructureL3T1Key : public ScalabilityStructureKeySvc { + public: + ScalabilityStructureL3T1Key() : ScalabilityStructureKeySvc(3, 1) {} + ~ScalabilityStructureL3T1Key() override; + + FrameDependencyStructure DependencyStructure() const override; +}; + +class ScalabilityStructureL3T2Key : public ScalabilityStructureKeySvc { + public: + ScalabilityStructureL3T2Key() : ScalabilityStructureKeySvc(3, 2) {} + ~ScalabilityStructureL3T2Key() override; + + FrameDependencyStructure DependencyStructure() const override; +}; + class ScalabilityStructureL3T3Key : public ScalabilityStructureKeySvc { public: ScalabilityStructureL3T3Key() : ScalabilityStructureKeySvc(3, 3) {} diff --git a/modules/video_coding/svc/scalability_structure_unittest.cc b/modules/video_coding/svc/scalability_structure_unittest.cc index 86d7cc0fcf..0e25ca359e 100644 --- a/modules/video_coding/svc/scalability_structure_unittest.cc +++ b/modules/video_coding/svc/scalability_structure_unittest.cc @@ -371,6 +371,7 @@ INSTANTIATE_TEST_SUITE_P( SvcTestParam{"L2T1", /*num_temporal_units=*/3}, SvcTestParam{"L2T1_KEY", /*num_temporal_units=*/3}, SvcTestParam{"L3T1", /*num_temporal_units=*/3}, + SvcTestParam{"L3T1_KEY", /*num_temporal_units=*/3}, SvcTestParam{"L3T3", /*num_temporal_units=*/8}, SvcTestParam{"S2T1", /*num_temporal_units=*/3}, SvcTestParam{"S2T3", /*num_temporal_units=*/8}, @@ -380,6 +381,8 @@ INSTANTIATE_TEST_SUITE_P( SvcTestParam{"L2T2_KEY_SHIFT", /*num_temporal_units=*/4}, SvcTestParam{"L2T3", /*num_temporal_units=*/8}, SvcTestParam{"L2T3_KEY", /*num_temporal_units=*/8}, + SvcTestParam{"L3T2", /*num_temporal_units=*/4}, + SvcTestParam{"L3T2_KEY", /*num_temporal_units=*/4}, SvcTestParam{"L3T3_KEY", /*num_temporal_units=*/8}), [](const testing::TestParamInfo& info) { return info.param.name; diff --git a/pc/peer_connection_factory_unittest.cc b/pc/peer_connection_factory_unittest.cc index 2fd8262b79..14362bfbeb 100644 --- a/pc/peer_connection_factory_unittest.cc +++ b/pc/peer_connection_factory_unittest.cc @@ -211,6 +211,9 @@ class PeerConnectionFactoryTest : public ::testing::Test { webrtc::ScalabilityMode::kL2T3, webrtc::ScalabilityMode::kL2T3_KEY, webrtc::ScalabilityMode::kL3T1, + webrtc::ScalabilityMode::kL3T1_KEY, + webrtc::ScalabilityMode::kL3T2, + webrtc::ScalabilityMode::kL3T2_KEY, webrtc::ScalabilityMode::kL3T3, webrtc::ScalabilityMode::kL3T3_KEY, webrtc::ScalabilityMode::kS2T1, diff --git a/pc/test/svc_e2e_tests.cc b/pc/test/svc_e2e_tests.cc index ee9fff7c14..607c85d32b 100644 --- a/pc/test/svc_e2e_tests.cc +++ b/pc/test/svc_e2e_tests.cc @@ -337,10 +337,10 @@ INSTANTIATE_TEST_SUITE_P( // SvcTestParameters{kVp9CodecName, "L2T3_KEY_SHIFT", 2, 3}, SvcTestParameters{kVp9CodecName, "L3T1", 3, 1}, // SvcTestParameters{kVp9CodecName, "L3T1h", 3, 1}, - // SvcTestParameters{kVp9CodecName, "L3T1_KEY", 3, 1}, - // SvcTestParameters{kVp9CodecName, "L3T2", 3, 2}, + SvcTestParameters{kVp9CodecName, "L3T1_KEY", 3, 1}, + SvcTestParameters{kVp9CodecName, "L3T2", 3, 2}, // SvcTestParameters{kVp9CodecName, "L3T2h", 3, 2}, - // SvcTestParameters{kVp9CodecName, "L3T2_KEY", 3, 2}, + SvcTestParameters{kVp9CodecName, "L3T2_KEY", 3, 2}, // SvcTestParameters{kVp9CodecName, "L3T2_KEY_SHIFT", 3, 2}, SvcTestParameters{kVp9CodecName, "L3T3", 3, 3}, // SvcTestParameters{kVp9CodecName, "L3T3h", 3, 3}, @@ -385,10 +385,10 @@ INSTANTIATE_TEST_SUITE_P( // SvcTestParameters{kAv1CodecName, "L2T3_KEY_SHIFT", 2, 3}, SvcTestParameters{kAv1CodecName, "L3T1", 3, 1}, // SvcTestParameters{kAv1CodecName, "L3T1h", 3, 1}, - // SvcTestParameters{kAv1CodecName, "L3T1_KEY", 3, 1}, - // SvcTestParameters{kAv1CodecName, "L3T2", 3, 2}, + SvcTestParameters{kAv1CodecName, "L3T1_KEY", 3, 1}, + SvcTestParameters{kAv1CodecName, "L3T2", 3, 2}, // SvcTestParameters{kAv1CodecName, "L3T2h", 3, 2}, - // SvcTestParameters{kAv1CodecName, "L3T2_KEY", 3, 2}, + SvcTestParameters{kAv1CodecName, "L3T2_KEY", 3, 2}, // SvcTestParameters{kAv1CodecName, "L3T2_KEY_SHIFT", 3, 2}, SvcTestParameters{kAv1CodecName, "L3T3", 3, 3}, // SvcTestParameters{kAv1CodecName, "L3T3h", 3, 3}, diff --git a/video/video_send_stream_tests.cc b/video/video_send_stream_tests.cc index 1286e30497..b2f3eb1185 100644 --- a/video/video_send_stream_tests.cc +++ b/video/video_send_stream_tests.cc @@ -3367,6 +3367,9 @@ INSTANTIATE_TEST_SUITE_P( {"L2T3", 2, 3, InterLayerPredMode::kOn}, {"L2T3_KEY", 2, 3, InterLayerPredMode::kOnKeyPic}, {"L3T1", 3, 1, InterLayerPredMode::kOn}, + {"L3T1_KEY", 3, 1, InterLayerPredMode::kOnKeyPic}, + {"L3T2", 3, 2, InterLayerPredMode::kOn}, + {"L3T2_KEY", 3, 2, InterLayerPredMode::kOnKeyPic}, {"L3T3", 3, 3, InterLayerPredMode::kOn}, {"L3T3_KEY", 3, 3, InterLayerPredMode::kOnKeyPic}, {"S2T1", 2, 1, InterLayerPredMode::kOff},