Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Side by Side Diff: webrtc/pc/mediasession_unittest.cc

Issue 2505003003: Let MediaSession generate a FlexFEC SSRC when FlexFEC is active. (Closed)
Patch Set: Rebase. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« webrtc/pc/mediasession.cc ('K') | « webrtc/pc/mediasession.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2004 The WebRTC project authors. All Rights Reserved. 2 * Copyright 2004 The WebRTC 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 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 return mdesc && mdesc->type() == media_type; 183 return mdesc && mdesc->type() == media_type;
184 } 184 }
185 185
186 static cricket::MediaContentDirection 186 static cricket::MediaContentDirection
187 GetMediaDirection(const ContentInfo* content) { 187 GetMediaDirection(const ContentInfo* content) {
188 cricket::MediaContentDescription* desc = 188 cricket::MediaContentDescription* desc =
189 reinterpret_cast<cricket::MediaContentDescription*>(content->description); 189 reinterpret_cast<cricket::MediaContentDescription*>(content->description);
190 return desc->direction(); 190 return desc->direction();
191 } 191 }
192 192
193 static void AddRtxCodec(const VideoCodec& rtx_codec, 193 static void AddSecondaryCodec(const VideoCodec& secondary_codec,
perkj_webrtc 2016/11/17 20:41:12 Why not just AddCodec if you want to keep it at al
brandtr 2016/11/21 09:16:30 After a second thought, I don't think the the asse
194 std::vector<VideoCodec>* codecs) { 194 std::vector<VideoCodec>* codecs) {
195 ASSERT_FALSE(cricket::FindCodecById(*codecs, rtx_codec.id)); 195 ASSERT_FALSE(cricket::FindCodecById(*codecs, secondary_codec.id));
196 codecs->push_back(rtx_codec); 196 codecs->push_back(secondary_codec);
197 } 197 }
198 198
199 template <class T> 199 template <class T>
200 static std::vector<std::string> GetCodecNames(const std::vector<T>& codecs) { 200 static std::vector<std::string> GetCodecNames(const std::vector<T>& codecs) {
201 std::vector<std::string> codec_names; 201 std::vector<std::string> codec_names;
202 for (const auto& codec : codecs) { 202 for (const auto& codec : codecs) {
203 codec_names.push_back(codec.name); 203 codec_names.push_back(codec.name);
204 } 204 }
205 return codec_names; 205 return codec_names;
206 } 206 }
(...skipping 1417 matching lines...) Expand 10 before | Expand all | Expand 10 after
1624 EXPECT_EQ(video_streams[0], updated_video_streams[0]); 1624 EXPECT_EQ(video_streams[0], updated_video_streams[0]);
1625 EXPECT_EQ(kVideoTrack2, updated_video_streams[1].id); 1625 EXPECT_EQ(kVideoTrack2, updated_video_streams[1].id);
1626 // All media streams in one PeerConnection share one CNAME. 1626 // All media streams in one PeerConnection share one CNAME.
1627 EXPECT_EQ(updated_video_streams[1].cname, updated_video_streams[0].cname); 1627 EXPECT_EQ(updated_video_streams[1].cname, updated_video_streams[0].cname);
1628 1628
1629 const StreamParamsVec& updated_data_streams = updated_dcd->streams(); 1629 const StreamParamsVec& updated_data_streams = updated_dcd->streams();
1630 ASSERT_EQ(1U, updated_data_streams.size()); 1630 ASSERT_EQ(1U, updated_data_streams.size());
1631 EXPECT_TRUE(data_streams[0] == updated_data_streams[0]); 1631 EXPECT_TRUE(data_streams[0] == updated_data_streams[0]);
1632 } 1632 }
1633 1633
1634
1635 // Create an updated offer after creating an answer to the original offer and 1634 // Create an updated offer after creating an answer to the original offer and
1636 // verify that the codecs that were part of the original answer are not changed 1635 // verify that the codecs that were part of the original answer are not changed
1637 // in the updated offer. 1636 // in the updated offer.
1638 TEST_F(MediaSessionDescriptionFactoryTest, 1637 TEST_F(MediaSessionDescriptionFactoryTest,
1639 RespondentCreatesOfferAfterCreatingAnswer) { 1638 RespondentCreatesOfferAfterCreatingAnswer) {
1640 MediaSessionOptions opts; 1639 MediaSessionOptions opts;
1641 opts.recv_audio = true; 1640 opts.recv_audio = true;
1642 opts.recv_video = true; 1641 opts.recv_video = true;
1643 1642
1644 std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); 1643 std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1687 // Create an updated offer after creating an answer to the original offer and 1686 // Create an updated offer after creating an answer to the original offer and
1688 // verify that the codecs that were part of the original answer are not changed 1687 // verify that the codecs that were part of the original answer are not changed
1689 // in the updated offer. In this test Rtx is enabled. 1688 // in the updated offer. In this test Rtx is enabled.
1690 TEST_F(MediaSessionDescriptionFactoryTest, 1689 TEST_F(MediaSessionDescriptionFactoryTest,
1691 RespondentCreatesOfferAfterCreatingAnswerWithRtx) { 1690 RespondentCreatesOfferAfterCreatingAnswerWithRtx) {
1692 MediaSessionOptions opts; 1691 MediaSessionOptions opts;
1693 opts.recv_video = true; 1692 opts.recv_video = true;
1694 opts.recv_audio = false; 1693 opts.recv_audio = false;
1695 std::vector<VideoCodec> f1_codecs = MAKE_VECTOR(kVideoCodecs1); 1694 std::vector<VideoCodec> f1_codecs = MAKE_VECTOR(kVideoCodecs1);
1696 // This creates rtx for H264 with the payload type |f1_| uses. 1695 // This creates rtx for H264 with the payload type |f1_| uses.
1697 AddRtxCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id), &f1_codecs); 1696 AddSecondaryCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id),
1697 &f1_codecs);
1698 f1_.set_video_codecs(f1_codecs); 1698 f1_.set_video_codecs(f1_codecs);
1699 1699
1700 std::vector<VideoCodec> f2_codecs = MAKE_VECTOR(kVideoCodecs2); 1700 std::vector<VideoCodec> f2_codecs = MAKE_VECTOR(kVideoCodecs2);
1701 // This creates rtx for H264 with the payload type |f2_| uses. 1701 // This creates rtx for H264 with the payload type |f2_| uses.
1702 AddRtxCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs2[0].id), &f2_codecs); 1702 AddSecondaryCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs2[0].id),
1703 &f2_codecs);
1703 f2_.set_video_codecs(f2_codecs); 1704 f2_.set_video_codecs(f2_codecs);
1704 1705
1705 std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); 1706 std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
1706 ASSERT_TRUE(offer.get() != NULL); 1707 ASSERT_TRUE(offer.get() != NULL);
1707 std::unique_ptr<SessionDescription> answer( 1708 std::unique_ptr<SessionDescription> answer(
1708 f2_.CreateAnswer(offer.get(), opts, NULL)); 1709 f2_.CreateAnswer(offer.get(), opts, NULL));
1709 1710
1710 const VideoContentDescription* vcd = 1711 const VideoContentDescription* vcd =
1711 GetFirstVideoContentDescription(answer.get()); 1712 GetFirstVideoContentDescription(answer.get());
1712 1713
1713 std::vector<VideoCodec> expected_codecs = MAKE_VECTOR(kVideoCodecsAnswer); 1714 std::vector<VideoCodec> expected_codecs = MAKE_VECTOR(kVideoCodecsAnswer);
1714 AddRtxCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id), 1715 AddSecondaryCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id),
1715 &expected_codecs); 1716 &expected_codecs);
1716 1717
1717 EXPECT_EQ(expected_codecs, vcd->codecs()); 1718 EXPECT_EQ(expected_codecs, vcd->codecs());
1718 1719
1719 // Now, make sure we get same result (except for the order) if |f2_| creates 1720 // Now, make sure we get same result (except for the order) if |f2_| creates
1720 // an updated offer even though the default payload types between |f1_| and 1721 // an updated offer even though the default payload types between |f1_| and
1721 // |f2_| are different. 1722 // |f2_| are different.
1722 std::unique_ptr<SessionDescription> updated_offer( 1723 std::unique_ptr<SessionDescription> updated_offer(
1723 f2_.CreateOffer(opts, answer.get())); 1724 f2_.CreateOffer(opts, answer.get()));
1724 ASSERT_TRUE(updated_offer); 1725 ASSERT_TRUE(updated_offer);
1725 std::unique_ptr<SessionDescription> updated_answer( 1726 std::unique_ptr<SessionDescription> updated_answer(
1726 f1_.CreateAnswer(updated_offer.get(), opts, answer.get())); 1727 f1_.CreateAnswer(updated_offer.get(), opts, answer.get()));
1727 1728
1728 const VideoContentDescription* updated_vcd = 1729 const VideoContentDescription* updated_vcd =
1729 GetFirstVideoContentDescription(updated_answer.get()); 1730 GetFirstVideoContentDescription(updated_answer.get());
1730 1731
1731 EXPECT_EQ(expected_codecs, updated_vcd->codecs()); 1732 EXPECT_EQ(expected_codecs, updated_vcd->codecs());
1732 } 1733 }
1733 1734
1734 // Create an updated offer that adds video after creating an audio only answer 1735 // Create an updated offer that adds video after creating an audio only answer
1735 // to the original offer. This test verifies that if a video codec and the RTX 1736 // to the original offer. This test verifies that if a video codec and the RTX
1736 // codec have the same default payload type as an audio codec that is already in 1737 // codec have the same default payload type as an audio codec that is already in
1737 // use, the added codecs payload types are changed. 1738 // use, the added codecs payload types are changed.
1738 TEST_F(MediaSessionDescriptionFactoryTest, 1739 TEST_F(MediaSessionDescriptionFactoryTest,
1739 RespondentCreatesOfferWithVideoAndRtxAfterCreatingAudioAnswer) { 1740 RespondentCreatesOfferWithVideoAndRtxAfterCreatingAudioAnswer) {
1740 std::vector<VideoCodec> f1_codecs = MAKE_VECTOR(kVideoCodecs1); 1741 std::vector<VideoCodec> f1_codecs = MAKE_VECTOR(kVideoCodecs1);
1741 // This creates rtx for H264 with the payload type |f1_| uses. 1742 // This creates rtx for H264 with the payload type |f1_| uses.
1742 AddRtxCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id), &f1_codecs); 1743 AddSecondaryCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id),
1744 &f1_codecs);
1743 f1_.set_video_codecs(f1_codecs); 1745 f1_.set_video_codecs(f1_codecs);
1744 1746
1745 MediaSessionOptions opts; 1747 MediaSessionOptions opts;
1746 opts.recv_audio = true; 1748 opts.recv_audio = true;
1747 opts.recv_video = false; 1749 opts.recv_video = false;
1748 1750
1749 std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); 1751 std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
1750 std::unique_ptr<SessionDescription> answer( 1752 std::unique_ptr<SessionDescription> answer(
1751 f2_.CreateAnswer(offer.get(), opts, NULL)); 1753 f2_.CreateAnswer(offer.get(), opts, NULL));
1752 1754
1753 const AudioContentDescription* acd = 1755 const AudioContentDescription* acd =
1754 GetFirstAudioContentDescription(answer.get()); 1756 GetFirstAudioContentDescription(answer.get());
1755 EXPECT_EQ(MAKE_VECTOR(kAudioCodecsAnswer), acd->codecs()); 1757 EXPECT_EQ(MAKE_VECTOR(kAudioCodecsAnswer), acd->codecs());
1756 1758
1757 // Now - let |f2_| add video with RTX and let the payload type the RTX codec 1759 // Now - let |f2_| add video with RTX and let the payload type the RTX codec
1758 // reference be the same as an audio codec that was negotiated in the 1760 // reference be the same as an audio codec that was negotiated in the
1759 // first offer/answer exchange. 1761 // first offer/answer exchange.
1760 opts.recv_audio = true; 1762 opts.recv_audio = true;
1761 opts.recv_video = true; 1763 opts.recv_video = true;
1762 1764
1763 std::vector<VideoCodec> f2_codecs = MAKE_VECTOR(kVideoCodecs2); 1765 std::vector<VideoCodec> f2_codecs = MAKE_VECTOR(kVideoCodecs2);
1764 int used_pl_type = acd->codecs()[0].id; 1766 int used_pl_type = acd->codecs()[0].id;
1765 f2_codecs[0].id = used_pl_type; // Set the payload type for H264. 1767 f2_codecs[0].id = used_pl_type; // Set the payload type for H264.
1766 AddRtxCodec(VideoCodec::CreateRtxCodec(125, used_pl_type), &f2_codecs); 1768 AddSecondaryCodec(VideoCodec::CreateRtxCodec(125, used_pl_type), &f2_codecs);
1767 f2_.set_video_codecs(f2_codecs); 1769 f2_.set_video_codecs(f2_codecs);
1768 1770
1769 std::unique_ptr<SessionDescription> updated_offer( 1771 std::unique_ptr<SessionDescription> updated_offer(
1770 f2_.CreateOffer(opts, answer.get())); 1772 f2_.CreateOffer(opts, answer.get()));
1771 ASSERT_TRUE(updated_offer); 1773 ASSERT_TRUE(updated_offer);
1772 std::unique_ptr<SessionDescription> updated_answer( 1774 std::unique_ptr<SessionDescription> updated_answer(
1773 f1_.CreateAnswer(updated_offer.get(), opts, answer.get())); 1775 f1_.CreateAnswer(updated_offer.get(), opts, answer.get()));
1774 1776
1775 const AudioContentDescription* updated_acd = 1777 const AudioContentDescription* updated_acd =
1776 GetFirstAudioContentDescription(answer.get()); 1778 GetFirstAudioContentDescription(answer.get());
(...skipping 16 matching lines...) Expand all
1793 // without RTX, and with different default payload types. 1795 // without RTX, and with different default payload types.
1794 // Verify that the added RTX codec references the correct payload type. 1796 // Verify that the added RTX codec references the correct payload type.
1795 TEST_F(MediaSessionDescriptionFactoryTest, 1797 TEST_F(MediaSessionDescriptionFactoryTest,
1796 RespondentCreatesOfferWithRtxAfterCreatingAnswerWithoutRtx) { 1798 RespondentCreatesOfferWithRtxAfterCreatingAnswerWithoutRtx) {
1797 MediaSessionOptions opts; 1799 MediaSessionOptions opts;
1798 opts.recv_video = true; 1800 opts.recv_video = true;
1799 opts.recv_audio = true; 1801 opts.recv_audio = true;
1800 1802
1801 std::vector<VideoCodec> f2_codecs = MAKE_VECTOR(kVideoCodecs2); 1803 std::vector<VideoCodec> f2_codecs = MAKE_VECTOR(kVideoCodecs2);
1802 // This creates rtx for H264 with the payload type |f2_| uses. 1804 // This creates rtx for H264 with the payload type |f2_| uses.
1803 AddRtxCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs2[0].id), &f2_codecs); 1805 AddSecondaryCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs2[0].id),
1806 &f2_codecs);
1804 f2_.set_video_codecs(f2_codecs); 1807 f2_.set_video_codecs(f2_codecs);
1805 1808
1806 std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr)); 1809 std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr));
1807 ASSERT_TRUE(offer.get() != nullptr); 1810 ASSERT_TRUE(offer.get() != nullptr);
1808 std::unique_ptr<SessionDescription> answer( 1811 std::unique_ptr<SessionDescription> answer(
1809 f2_.CreateAnswer(offer.get(), opts, nullptr)); 1812 f2_.CreateAnswer(offer.get(), opts, nullptr));
1810 1813
1811 const VideoContentDescription* vcd = 1814 const VideoContentDescription* vcd =
1812 GetFirstVideoContentDescription(answer.get()); 1815 GetFirstVideoContentDescription(answer.get());
1813 1816
1814 std::vector<VideoCodec> expected_codecs = MAKE_VECTOR(kVideoCodecsAnswer); 1817 std::vector<VideoCodec> expected_codecs = MAKE_VECTOR(kVideoCodecsAnswer);
1815 EXPECT_EQ(expected_codecs, vcd->codecs()); 1818 EXPECT_EQ(expected_codecs, vcd->codecs());
1816 1819
1817 // Now, ensure that the RTX codec is created correctly when |f2_| creates an 1820 // Now, ensure that the RTX codec is created correctly when |f2_| creates an
1818 // updated offer, even though the default payload types are different from 1821 // updated offer, even though the default payload types are different from
1819 // those of |f1_|. 1822 // those of |f1_|.
1820 std::unique_ptr<SessionDescription> updated_offer( 1823 std::unique_ptr<SessionDescription> updated_offer(
1821 f2_.CreateOffer(opts, answer.get())); 1824 f2_.CreateOffer(opts, answer.get()));
1822 ASSERT_TRUE(updated_offer); 1825 ASSERT_TRUE(updated_offer);
1823 1826
1824 const VideoContentDescription* updated_vcd = 1827 const VideoContentDescription* updated_vcd =
1825 GetFirstVideoContentDescription(updated_offer.get()); 1828 GetFirstVideoContentDescription(updated_offer.get());
1826 1829
1827 // New offer should attempt to add H263, and RTX for H264. 1830 // New offer should attempt to add H263, and RTX for H264.
1828 expected_codecs.push_back(kVideoCodecs2[1]); 1831 expected_codecs.push_back(kVideoCodecs2[1]);
1829 AddRtxCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs1[1].id), 1832 AddSecondaryCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs1[1].id),
1830 &expected_codecs); 1833 &expected_codecs);
1831 EXPECT_EQ(expected_codecs, updated_vcd->codecs()); 1834 EXPECT_EQ(expected_codecs, updated_vcd->codecs());
1832 } 1835 }
1833 1836
1834 // Test that RTX is ignored when there is no associated payload type parameter. 1837 // Test that RTX is ignored when there is no associated payload type parameter.
1835 TEST_F(MediaSessionDescriptionFactoryTest, RtxWithoutApt) { 1838 TEST_F(MediaSessionDescriptionFactoryTest, RtxWithoutApt) {
1836 MediaSessionOptions opts; 1839 MediaSessionOptions opts;
1837 opts.recv_video = true; 1840 opts.recv_video = true;
1838 opts.recv_audio = false; 1841 opts.recv_audio = false;
1839 std::vector<VideoCodec> f1_codecs = MAKE_VECTOR(kVideoCodecs1); 1842 std::vector<VideoCodec> f1_codecs = MAKE_VECTOR(kVideoCodecs1);
1840 // This creates RTX without associated payload type parameter. 1843 // This creates RTX without associated payload type parameter.
1841 AddRtxCodec(VideoCodec(126, cricket::kRtxCodecName), &f1_codecs); 1844 AddSecondaryCodec(VideoCodec(126, cricket::kRtxCodecName), &f1_codecs);
1842 f1_.set_video_codecs(f1_codecs); 1845 f1_.set_video_codecs(f1_codecs);
1843 1846
1844 std::vector<VideoCodec> f2_codecs = MAKE_VECTOR(kVideoCodecs2); 1847 std::vector<VideoCodec> f2_codecs = MAKE_VECTOR(kVideoCodecs2);
1845 // This creates RTX for H264 with the payload type |f2_| uses. 1848 // This creates RTX for H264 with the payload type |f2_| uses.
1846 AddRtxCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs2[0].id), &f2_codecs); 1849 AddSecondaryCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs2[0].id),
1850 &f2_codecs);
1847 f2_.set_video_codecs(f2_codecs); 1851 f2_.set_video_codecs(f2_codecs);
1848 1852
1849 std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); 1853 std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
1850 ASSERT_TRUE(offer.get() != NULL); 1854 ASSERT_TRUE(offer.get() != NULL);
1851 // kCodecParamAssociatedPayloadType will always be added to the offer when RTX 1855 // kCodecParamAssociatedPayloadType will always be added to the offer when RTX
1852 // is selected. Manually remove kCodecParamAssociatedPayloadType so that it 1856 // is selected. Manually remove kCodecParamAssociatedPayloadType so that it
1853 // is possible to test that that RTX is dropped when 1857 // is possible to test that that RTX is dropped when
1854 // kCodecParamAssociatedPayloadType is missing in the offer. 1858 // kCodecParamAssociatedPayloadType is missing in the offer.
1855 VideoContentDescription* desc = 1859 VideoContentDescription* desc =
1856 static_cast<cricket::VideoContentDescription*>( 1860 static_cast<cricket::VideoContentDescription*>(
(...skipping 18 matching lines...) Expand all
1875 } 1879 }
1876 1880
1877 // Test that RTX will be filtered out in the answer if its associated payload 1881 // Test that RTX will be filtered out in the answer if its associated payload
1878 // type doesn't match the local value. 1882 // type doesn't match the local value.
1879 TEST_F(MediaSessionDescriptionFactoryTest, FilterOutRtxIfAptDoesntMatch) { 1883 TEST_F(MediaSessionDescriptionFactoryTest, FilterOutRtxIfAptDoesntMatch) {
1880 MediaSessionOptions opts; 1884 MediaSessionOptions opts;
1881 opts.recv_video = true; 1885 opts.recv_video = true;
1882 opts.recv_audio = false; 1886 opts.recv_audio = false;
1883 std::vector<VideoCodec> f1_codecs = MAKE_VECTOR(kVideoCodecs1); 1887 std::vector<VideoCodec> f1_codecs = MAKE_VECTOR(kVideoCodecs1);
1884 // This creates RTX for H264 in sender. 1888 // This creates RTX for H264 in sender.
1885 AddRtxCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id), &f1_codecs); 1889 AddSecondaryCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id),
1890 &f1_codecs);
1886 f1_.set_video_codecs(f1_codecs); 1891 f1_.set_video_codecs(f1_codecs);
1887 1892
1888 std::vector<VideoCodec> f2_codecs = MAKE_VECTOR(kVideoCodecs2); 1893 std::vector<VideoCodec> f2_codecs = MAKE_VECTOR(kVideoCodecs2);
1889 // This creates RTX for H263 in receiver. 1894 // This creates RTX for H263 in receiver.
1890 AddRtxCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs2[1].id), &f2_codecs); 1895 AddSecondaryCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs2[1].id),
1896 &f2_codecs);
1891 f2_.set_video_codecs(f2_codecs); 1897 f2_.set_video_codecs(f2_codecs);
1892 1898
1893 std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); 1899 std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
1894 ASSERT_TRUE(offer.get() != NULL); 1900 ASSERT_TRUE(offer.get() != NULL);
1895 // Associated payload type doesn't match, therefore, RTX codec is removed in 1901 // Associated payload type doesn't match, therefore, RTX codec is removed in
1896 // the answer. 1902 // the answer.
1897 std::unique_ptr<SessionDescription> answer( 1903 std::unique_ptr<SessionDescription> answer(
1898 f2_.CreateAnswer(offer.get(), opts, NULL)); 1904 f2_.CreateAnswer(offer.get(), opts, NULL));
1899 1905
1900 std::vector<std::string> codec_names = 1906 std::vector<std::string> codec_names =
1901 GetCodecNames(GetFirstVideoContentDescription(answer.get())->codecs()); 1907 GetCodecNames(GetFirstVideoContentDescription(answer.get())->codecs());
1902 EXPECT_EQ(codec_names.end(), std::find(codec_names.begin(), codec_names.end(), 1908 EXPECT_EQ(codec_names.end(), std::find(codec_names.begin(), codec_names.end(),
1903 cricket::kRtxCodecName)); 1909 cricket::kRtxCodecName));
1904 } 1910 }
1905 1911
1906 // Test that when multiple RTX codecs are offered, only the matched RTX codec 1912 // Test that when multiple RTX codecs are offered, only the matched RTX codec
1907 // is added in the answer, and the unsupported RTX codec is filtered out. 1913 // is added in the answer, and the unsupported RTX codec is filtered out.
1908 TEST_F(MediaSessionDescriptionFactoryTest, 1914 TEST_F(MediaSessionDescriptionFactoryTest,
1909 FilterOutUnsupportedRtxWhenCreatingAnswer) { 1915 FilterOutUnsupportedRtxWhenCreatingAnswer) {
1910 MediaSessionOptions opts; 1916 MediaSessionOptions opts;
1911 opts.recv_video = true; 1917 opts.recv_video = true;
1912 opts.recv_audio = false; 1918 opts.recv_audio = false;
1913 std::vector<VideoCodec> f1_codecs = MAKE_VECTOR(kVideoCodecs1); 1919 std::vector<VideoCodec> f1_codecs = MAKE_VECTOR(kVideoCodecs1);
1914 // This creates RTX for H264-SVC in sender. 1920 // This creates RTX for H264-SVC in sender.
1915 AddRtxCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs1[0].id), &f1_codecs); 1921 AddSecondaryCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs1[0].id),
1922 &f1_codecs);
1916 f1_.set_video_codecs(f1_codecs); 1923 f1_.set_video_codecs(f1_codecs);
1917 1924
1918 // This creates RTX for H264 in sender. 1925 // This creates RTX for H264 in sender.
1919 AddRtxCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id), &f1_codecs); 1926 AddSecondaryCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id),
1927 &f1_codecs);
1920 f1_.set_video_codecs(f1_codecs); 1928 f1_.set_video_codecs(f1_codecs);
1921 1929
1922 std::vector<VideoCodec> f2_codecs = MAKE_VECTOR(kVideoCodecs2); 1930 std::vector<VideoCodec> f2_codecs = MAKE_VECTOR(kVideoCodecs2);
1923 // This creates RTX for H264 in receiver. 1931 // This creates RTX for H264 in receiver.
1924 AddRtxCodec(VideoCodec::CreateRtxCodec(124, kVideoCodecs2[0].id), &f2_codecs); 1932 AddSecondaryCodec(VideoCodec::CreateRtxCodec(124, kVideoCodecs2[0].id),
1933 &f2_codecs);
1925 f2_.set_video_codecs(f2_codecs); 1934 f2_.set_video_codecs(f2_codecs);
1926 1935
1927 // H264-SVC codec is removed in the answer, therefore, associated RTX codec 1936 // H264-SVC codec is removed in the answer, therefore, associated RTX codec
1928 // for H264-SVC should also be removed. 1937 // for H264-SVC should also be removed.
1929 std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); 1938 std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
1930 ASSERT_TRUE(offer.get() != NULL); 1939 ASSERT_TRUE(offer.get() != NULL);
1931 std::unique_ptr<SessionDescription> answer( 1940 std::unique_ptr<SessionDescription> answer(
1932 f2_.CreateAnswer(offer.get(), opts, NULL)); 1941 f2_.CreateAnswer(offer.get(), opts, NULL));
1933 const VideoContentDescription* vcd = 1942 const VideoContentDescription* vcd =
1934 GetFirstVideoContentDescription(answer.get()); 1943 GetFirstVideoContentDescription(answer.get());
1935 std::vector<VideoCodec> expected_codecs = MAKE_VECTOR(kVideoCodecsAnswer); 1944 std::vector<VideoCodec> expected_codecs = MAKE_VECTOR(kVideoCodecsAnswer);
1936 AddRtxCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id), 1945 AddSecondaryCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id),
1937 &expected_codecs); 1946 &expected_codecs);
1938 1947
1939 EXPECT_EQ(expected_codecs, vcd->codecs()); 1948 EXPECT_EQ(expected_codecs, vcd->codecs());
1940 } 1949 }
1941 1950
1942 // Test that after one RTX codec has been negotiated, a new offer can attempt 1951 // Test that after one RTX codec has been negotiated, a new offer can attempt
1943 // to add another. 1952 // to add another.
1944 TEST_F(MediaSessionDescriptionFactoryTest, AddSecondRtxInNewOffer) { 1953 TEST_F(MediaSessionDescriptionFactoryTest, AddSecondRtxInNewOffer) {
1945 MediaSessionOptions opts; 1954 MediaSessionOptions opts;
1946 opts.recv_video = true; 1955 opts.recv_video = true;
1947 opts.recv_audio = false; 1956 opts.recv_audio = false;
1948 std::vector<VideoCodec> f1_codecs = MAKE_VECTOR(kVideoCodecs1); 1957 std::vector<VideoCodec> f1_codecs = MAKE_VECTOR(kVideoCodecs1);
1949 // This creates RTX for H264 for the offerer. 1958 // This creates RTX for H264 for the offerer.
1950 AddRtxCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id), &f1_codecs); 1959 AddSecondaryCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id),
1960 &f1_codecs);
1951 f1_.set_video_codecs(f1_codecs); 1961 f1_.set_video_codecs(f1_codecs);
1952 1962
1953 std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr)); 1963 std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr));
1954 ASSERT_TRUE(offer); 1964 ASSERT_TRUE(offer);
1955 const VideoContentDescription* vcd = 1965 const VideoContentDescription* vcd =
1956 GetFirstVideoContentDescription(offer.get()); 1966 GetFirstVideoContentDescription(offer.get());
1957 1967
1958 std::vector<VideoCodec> expected_codecs = MAKE_VECTOR(kVideoCodecs1); 1968 std::vector<VideoCodec> expected_codecs = MAKE_VECTOR(kVideoCodecs1);
1959 AddRtxCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id), 1969 AddSecondaryCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id),
1960 &expected_codecs); 1970 &expected_codecs);
1961 EXPECT_EQ(expected_codecs, vcd->codecs()); 1971 EXPECT_EQ(expected_codecs, vcd->codecs());
1962 1972
1963 // Now, attempt to add RTX for H264-SVC. 1973 // Now, attempt to add RTX for H264-SVC.
1964 AddRtxCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs1[0].id), &f1_codecs); 1974 AddSecondaryCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs1[0].id),
1975 &f1_codecs);
1965 f1_.set_video_codecs(f1_codecs); 1976 f1_.set_video_codecs(f1_codecs);
1966 1977
1967 std::unique_ptr<SessionDescription> updated_offer( 1978 std::unique_ptr<SessionDescription> updated_offer(
1968 f1_.CreateOffer(opts, offer.get())); 1979 f1_.CreateOffer(opts, offer.get()));
1969 ASSERT_TRUE(updated_offer); 1980 ASSERT_TRUE(updated_offer);
1970 vcd = GetFirstVideoContentDescription(updated_offer.get()); 1981 vcd = GetFirstVideoContentDescription(updated_offer.get());
1971 1982
1972 AddRtxCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs1[0].id), 1983 AddSecondaryCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs1[0].id),
1973 &expected_codecs); 1984 &expected_codecs);
1974 EXPECT_EQ(expected_codecs, vcd->codecs()); 1985 EXPECT_EQ(expected_codecs, vcd->codecs());
1975 } 1986 }
1976 1987
1977 // Test that when RTX is used in conjunction with simulcast, an RTX ssrc is 1988 // Test that when RTX is used in conjunction with simulcast, an RTX ssrc is
1978 // generated for each simulcast ssrc and correctly grouped. 1989 // generated for each simulcast ssrc and correctly grouped.
1979 TEST_F(MediaSessionDescriptionFactoryTest, SimSsrcsGenerateMultipleRtxSsrcs) { 1990 TEST_F(MediaSessionDescriptionFactoryTest, SimSsrcsGenerateMultipleRtxSsrcs) {
1980 MediaSessionOptions opts; 1991 MediaSessionOptions opts;
1981 opts.recv_video = true; 1992 opts.recv_video = true;
1982 opts.recv_audio = false; 1993 opts.recv_audio = false;
1983 1994
1984 // Add simulcast streams. 1995 // Add simulcast streams.
1985 opts.AddSendVideoStream("stream1", "stream1label", 3); 1996 opts.AddSendVideoStream("stream1", "stream1label", 3);
1986 1997
1987 // Use a single real codec, and then add RTX for it. 1998 // Use a single real codec, and then add RTX for it.
1988 std::vector<VideoCodec> f1_codecs; 1999 std::vector<VideoCodec> f1_codecs;
1989 f1_codecs.push_back(VideoCodec(97, "H264")); 2000 f1_codecs.push_back(VideoCodec(97, "H264"));
1990 AddRtxCodec(VideoCodec::CreateRtxCodec(125, 97), &f1_codecs); 2001 AddSecondaryCodec(VideoCodec::CreateRtxCodec(125, 97), &f1_codecs);
1991 f1_.set_video_codecs(f1_codecs); 2002 f1_.set_video_codecs(f1_codecs);
1992 2003
1993 // Ensure that the offer has an RTX ssrc for each regular ssrc, and that there 2004 // Ensure that the offer has an RTX ssrc for each regular ssrc, and that there
1994 // is a FID ssrc + grouping for each. 2005 // is a FID ssrc + grouping for each.
1995 std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); 2006 std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
1996 ASSERT_TRUE(offer.get() != NULL); 2007 ASSERT_TRUE(offer.get() != NULL);
1997 VideoContentDescription* desc = static_cast<VideoContentDescription*>( 2008 VideoContentDescription* desc = static_cast<VideoContentDescription*>(
1998 offer->GetContentDescriptionByName(cricket::CN_VIDEO)); 2009 offer->GetContentDescriptionByName(cricket::CN_VIDEO));
1999 ASSERT_TRUE(desc != NULL); 2010 ASSERT_TRUE(desc != NULL);
2000 EXPECT_TRUE(desc->multistream()); 2011 EXPECT_TRUE(desc->multistream());
2001 const StreamParamsVec& streams = desc->streams(); 2012 const StreamParamsVec& streams = desc->streams();
2002 // Single stream. 2013 // Single stream.
2003 ASSERT_EQ(1u, streams.size()); 2014 ASSERT_EQ(1u, streams.size());
2004 // Stream should have 6 ssrcs: 3 for video, 3 for RTX. 2015 // Stream should have 6 ssrcs: 3 for video, 3 for RTX.
2005 EXPECT_EQ(6u, streams[0].ssrcs.size()); 2016 EXPECT_EQ(6u, streams[0].ssrcs.size());
2006 // And should have a SIM group for the simulcast. 2017 // And should have a SIM group for the simulcast.
2007 EXPECT_TRUE(streams[0].has_ssrc_group("SIM")); 2018 EXPECT_TRUE(streams[0].has_ssrc_group("SIM"));
2008 // And a FID group for RTX. 2019 // And a FID group for RTX.
2009 EXPECT_TRUE(streams[0].has_ssrc_group("FID")); 2020 EXPECT_TRUE(streams[0].has_ssrc_group("FID"));
2010 std::vector<uint32_t> primary_ssrcs; 2021 std::vector<uint32_t> primary_ssrcs;
2011 streams[0].GetPrimarySsrcs(&primary_ssrcs); 2022 streams[0].GetPrimarySsrcs(&primary_ssrcs);
2012 EXPECT_EQ(3u, primary_ssrcs.size()); 2023 EXPECT_EQ(3u, primary_ssrcs.size());
2013 std::vector<uint32_t> fid_ssrcs; 2024 std::vector<uint32_t> fid_ssrcs;
2014 streams[0].GetFidSsrcs(primary_ssrcs, &fid_ssrcs); 2025 streams[0].GetFidSsrcs(primary_ssrcs, &fid_ssrcs);
2015 EXPECT_EQ(3u, fid_ssrcs.size()); 2026 EXPECT_EQ(3u, fid_ssrcs.size());
2016 } 2027 }
2017 2028
2029 // Test that, when the FlexFEC codec is added, a FlexFEC ssrc is created
2030 // together with a FEC-FR grouping.
2031 TEST_F(MediaSessionDescriptionFactoryTest, GenerateFlexfecSsrc) {
2032 MediaSessionOptions opts;
2033 opts.recv_video = true;
2034 opts.recv_audio = false;
2035
2036 // Add single stream.
2037 opts.AddSendVideoStream("stream1", "stream1label", 1);
2038
2039 // Use a single real codec, and then add FlexFEC for it.
2040 std::vector<VideoCodec> f1_codecs;
2041 f1_codecs.push_back(VideoCodec(97, "H264"));
2042 AddSecondaryCodec(VideoCodec(118, "flexfec-03"), &f1_codecs);
2043 f1_.set_video_codecs(f1_codecs);
2044
2045 // Ensure that the offer has a single FlexFEC ssrc and that
2046 // there is no FEC-FR ssrc + grouping for each.
2047 std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr));
2048 ASSERT_TRUE(offer.get() != nullptr);
2049 VideoContentDescription* desc = static_cast<VideoContentDescription*>(
2050 offer->GetContentDescriptionByName(cricket::CN_VIDEO));
2051 ASSERT_TRUE(desc != nullptr);
2052 EXPECT_TRUE(desc->multistream());
2053 const StreamParamsVec& streams = desc->streams();
2054 // Single stream.
2055 ASSERT_EQ(1u, streams.size());
2056 // Stream should have 2 ssrcs: 1 for video, 1 for FlexFEC.
2057 EXPECT_EQ(2u, streams[0].ssrcs.size());
2058 // And should a FEC-FR group for FlexFEC.
perkj_webrtc 2016/11/17 20:41:12 and should have
brandtr 2016/11/21 09:16:30 Done.
2059 EXPECT_TRUE(streams[0].has_ssrc_group("FEC-FR"));
2060 std::vector<uint32_t> primary_ssrcs;
2061 streams[0].GetPrimarySsrcs(&primary_ssrcs);
2062 ASSERT_EQ(1u, primary_ssrcs.size());
2063 uint32_t flexfec_ssrc;
2064 EXPECT_TRUE(streams[0].GetFecFrSsrc(primary_ssrcs[0], &flexfec_ssrc));
2065 EXPECT_NE(flexfec_ssrc, 0u);
2066 }
2067
2068 // Test that FlexFEC is disabled for simulcast.
2069 // TODO(brandtr): Remove this test when we support simulcast, either through
2070 // multiple FlexfecSenders, or through multistream protection.
2071 TEST_F(MediaSessionDescriptionFactoryTest, SimSsrcsGenerateNoFlexfecSsrcs) {
2072 MediaSessionOptions opts;
2073 opts.recv_video = true;
2074 opts.recv_audio = false;
2075
2076 // Add simulcast streams.
2077 opts.AddSendVideoStream("stream1", "stream1label", 3);
2078
2079 // Use a single real codec, and then add FlexFEC for it.
2080 std::vector<VideoCodec> f1_codecs;
2081 f1_codecs.push_back(VideoCodec(97, "H264"));
2082 AddSecondaryCodec(VideoCodec(118, "flexfec-03"), &f1_codecs);
2083 f1_.set_video_codecs(f1_codecs);
2084
2085 // Ensure that the offer has no FlexFEC ssrcs for each regular ssrc, and that
2086 // there is no FEC-FR ssrc + grouping for each.
2087 std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr));
2088 ASSERT_TRUE(offer.get() != nullptr);
2089 VideoContentDescription* desc = static_cast<VideoContentDescription*>(
2090 offer->GetContentDescriptionByName(cricket::CN_VIDEO));
2091 ASSERT_TRUE(desc != nullptr);
2092 EXPECT_FALSE(desc->multistream());
2093 const StreamParamsVec& streams = desc->streams();
2094 // Single stream.
2095 ASSERT_EQ(1u, streams.size());
2096 // Stream should have 3 ssrcs: 3 for video, 0 for FlexFEC.
2097 EXPECT_EQ(3u, streams[0].ssrcs.size());
2098 // And should have a SIM group for the simulcast.
2099 EXPECT_TRUE(streams[0].has_ssrc_group("SIM"));
2100 // And not a FEC-FR group for FlexFEC.
2101 EXPECT_FALSE(streams[0].has_ssrc_group("FEC-FR"));
2102 std::vector<uint32_t> primary_ssrcs;
2103 streams[0].GetPrimarySsrcs(&primary_ssrcs);
2104 EXPECT_EQ(3u, primary_ssrcs.size());
2105 for (uint32_t primary_ssrc : primary_ssrcs) {
2106 uint32_t flexfec_ssrc;
2107 EXPECT_FALSE(streams[0].GetFecFrSsrc(primary_ssrc, &flexfec_ssrc));
2108 }
2109 }
2110
2018 // Create an updated offer after creating an answer to the original offer and 2111 // Create an updated offer after creating an answer to the original offer and
2019 // verify that the RTP header extensions that were part of the original answer 2112 // verify that the RTP header extensions that were part of the original answer
2020 // are not changed in the updated offer. 2113 // are not changed in the updated offer.
2021 TEST_F(MediaSessionDescriptionFactoryTest, 2114 TEST_F(MediaSessionDescriptionFactoryTest,
2022 RespondentCreatesOfferAfterCreatingAnswerWithRtpExtensions) { 2115 RespondentCreatesOfferAfterCreatingAnswerWithRtpExtensions) {
2023 MediaSessionOptions opts; 2116 MediaSessionOptions opts;
2024 opts.recv_audio = true; 2117 opts.recv_audio = true;
2025 opts.recv_video = true; 2118 opts.recv_video = true;
2026 2119
2027 f1_.set_audio_rtp_header_extensions(MAKE_VECTOR(kAudioRtpExtension1)); 2120 f1_.set_audio_rtp_header_extensions(MAKE_VECTOR(kAudioRtpExtension1));
(...skipping 827 matching lines...) Expand 10 before | Expand all | Expand 10 after
2855 << ", got: " << format_codecs(acd->codecs()) 2948 << ", got: " << format_codecs(acd->codecs())
2856 << "; Offered: " << MediaContentDirectionToString(offer_direction) 2949 << "; Offered: " << MediaContentDirectionToString(offer_direction)
2857 << ", answerer wants: " 2950 << ", answerer wants: "
2858 << MediaContentDirectionToString(answer_direction) 2951 << MediaContentDirectionToString(answer_direction)
2859 << "; got: " << MediaContentDirectionToString(acd->direction()); 2952 << "; got: " << MediaContentDirectionToString(acd->direction());
2860 } else { 2953 } else {
2861 EXPECT_EQ(offer_direction, cricket::MD_INACTIVE) 2954 EXPECT_EQ(offer_direction, cricket::MD_INACTIVE)
2862 << "Only inactive offers are allowed to not generate any audio content"; 2955 << "Only inactive offers are allowed to not generate any audio content";
2863 } 2956 }
2864 } 2957 }
2865 } 2958
2959 } // namespace
2866 2960
2867 class AudioCodecsOfferTest 2961 class AudioCodecsOfferTest
2868 : public ::testing::TestWithParam<std::tr1::tuple<MediaContentDirection, 2962 : public ::testing::TestWithParam<std::tr1::tuple<MediaContentDirection,
2869 bool>> { 2963 bool>> {
2870 }; 2964 };
2871 2965
2872 TEST_P(AudioCodecsOfferTest, TestCodecsInOffer) { 2966 TEST_P(AudioCodecsOfferTest, TestCodecsInOffer) {
2873 TestAudioCodecsOffer(std::tr1::get<0>(GetParam()), 2967 TestAudioCodecsOffer(std::tr1::get<0>(GetParam()),
2874 std::tr1::get<1>(GetParam())); 2968 std::tr1::get<1>(GetParam()));
2875 } 2969 }
(...skipping 24 matching lines...) Expand all
2900 ::testing::Combine( 2994 ::testing::Combine(
2901 ::testing::Values(cricket::MD_SENDONLY, 2995 ::testing::Values(cricket::MD_SENDONLY,
2902 cricket::MD_RECVONLY, 2996 cricket::MD_RECVONLY,
2903 cricket::MD_SENDRECV, 2997 cricket::MD_SENDRECV,
2904 cricket::MD_INACTIVE), 2998 cricket::MD_INACTIVE),
2905 ::testing::Values(cricket::MD_SENDONLY, 2999 ::testing::Values(cricket::MD_SENDONLY,
2906 cricket::MD_RECVONLY, 3000 cricket::MD_RECVONLY,
2907 cricket::MD_SENDRECV, 3001 cricket::MD_SENDRECV,
2908 cricket::MD_INACTIVE), 3002 cricket::MD_INACTIVE),
2909 ::testing::Bool())); 3003 ::testing::Bool()));
OLDNEW
« webrtc/pc/mediasession.cc ('K') | « webrtc/pc/mediasession.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698