Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * libjingle | 2 * libjingle |
| 3 * Copyright 2004 Google Inc. | 3 * Copyright 2004 Google Inc. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions are met: | 6 * modification, are permitted provided that the following conditions are met: |
| 7 * | 7 * |
| 8 * 1. Redistributions of source code must retain the above copyright notice, | 8 * 1. Redistributions of source code must retain the above copyright notice, |
| 9 * this list of conditions and the following disclaimer. | 9 * this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright notice, | 10 * 2. Redistributions in binary form must reproduce the above copyright notice, |
| (...skipping 1653 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1664 ASSERT_EQ("H264", updated_vcd->codecs()[0].name); | 1664 ASSERT_EQ("H264", updated_vcd->codecs()[0].name); |
| 1665 ASSERT_EQ(std::string(cricket::kRtxCodecName), updated_vcd->codecs()[1].name); | 1665 ASSERT_EQ(std::string(cricket::kRtxCodecName), updated_vcd->codecs()[1].name); |
| 1666 int new_h264_pl_type = updated_vcd->codecs()[0].id; | 1666 int new_h264_pl_type = updated_vcd->codecs()[0].id; |
| 1667 EXPECT_NE(used_pl_type, new_h264_pl_type); | 1667 EXPECT_NE(used_pl_type, new_h264_pl_type); |
| 1668 VideoCodec rtx = updated_vcd->codecs()[1]; | 1668 VideoCodec rtx = updated_vcd->codecs()[1]; |
| 1669 int pt_referenced_by_rtx = rtc::FromString<int>( | 1669 int pt_referenced_by_rtx = rtc::FromString<int>( |
| 1670 rtx.params[cricket::kCodecParamAssociatedPayloadType]); | 1670 rtx.params[cricket::kCodecParamAssociatedPayloadType]); |
| 1671 EXPECT_EQ(new_h264_pl_type, pt_referenced_by_rtx); | 1671 EXPECT_EQ(new_h264_pl_type, pt_referenced_by_rtx); |
| 1672 } | 1672 } |
| 1673 | 1673 |
| 1674 // Create an updated offer with RTX after creating an answer to an offer | |
| 1675 // without RTX, and with different default payload types. | |
| 1676 // Verify that the added RTX codec references the correct payload type. | |
| 1677 TEST_F(MediaSessionDescriptionFactoryTest, | |
| 1678 RespondentCreatesOfferWithRtxAfterCreatingAnswerWithoutRtx) { | |
| 1679 MediaSessionOptions opts; | |
| 1680 opts.recv_video = true; | |
| 1681 opts.recv_audio = true; | |
| 1682 | |
| 1683 std::vector<VideoCodec> f2_codecs = MAKE_VECTOR(kVideoCodecs2); | |
| 1684 // This creates rtx for H264 with the payload type |f2_| uses. | |
| 1685 AddRtxCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs2[0].id), &f2_codecs); | |
| 1686 f2_.set_video_codecs(f2_codecs); | |
| 1687 | |
| 1688 rtc::scoped_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr)); | |
| 1689 ASSERT_TRUE(offer.get() != nullptr); | |
| 1690 rtc::scoped_ptr<SessionDescription> answer( | |
| 1691 f2_.CreateAnswer(offer.get(), opts, nullptr)); | |
| 1692 | |
| 1693 const VideoContentDescription* vcd = | |
| 1694 GetFirstVideoContentDescription(answer.get()); | |
| 1695 | |
| 1696 std::vector<VideoCodec> expected_codecs = MAKE_VECTOR(kVideoCodecsAnswer); | |
| 1697 EXPECT_EQ(expected_codecs, vcd->codecs()); | |
| 1698 | |
| 1699 // Now, ensure that the RTX codec is created correctly when |f2_| creates an | |
| 1700 // updated offer, even though the default payload types are different from | |
| 1701 // those of |f1_|. | |
| 1702 rtc::scoped_ptr<SessionDescription> updated_offer( | |
| 1703 f2_.CreateOffer(opts, answer.get())); | |
| 1704 ASSERT_TRUE(updated_offer); | |
| 1705 | |
| 1706 const VideoContentDescription* updated_vcd = | |
| 1707 GetFirstVideoContentDescription(updated_offer.get()); | |
| 1708 | |
| 1709 // New offer should attempt to add H263, and RTX for H264. | |
| 1710 expected_codecs.push_back(kVideoCodecs2[1]); | |
| 1711 AddRtxCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs1[1].id), | |
| 1712 &expected_codecs); | |
| 1713 EXPECT_EQ(expected_codecs, updated_vcd->codecs()); | |
| 1714 } | |
| 1715 | |
| 1674 // Test that RTX is ignored when there is no associated payload type parameter. | 1716 // Test that RTX is ignored when there is no associated payload type parameter. |
| 1675 TEST_F(MediaSessionDescriptionFactoryTest, RtxWithoutApt) { | 1717 TEST_F(MediaSessionDescriptionFactoryTest, RtxWithoutApt) { |
| 1676 MediaSessionOptions opts; | 1718 MediaSessionOptions opts; |
| 1677 opts.recv_video = true; | 1719 opts.recv_video = true; |
| 1678 opts.recv_audio = false; | 1720 opts.recv_audio = false; |
| 1679 std::vector<VideoCodec> f1_codecs = MAKE_VECTOR(kVideoCodecs1); | 1721 std::vector<VideoCodec> f1_codecs = MAKE_VECTOR(kVideoCodecs1); |
| 1680 // This creates RTX without associated payload type parameter. | 1722 // This creates RTX without associated payload type parameter. |
| 1681 AddRtxCodec(VideoCodec(126, cricket::kRtxCodecName, 0, 0, 0, 0), &f1_codecs); | 1723 AddRtxCodec(VideoCodec(126, cricket::kRtxCodecName, 0, 0, 0, 0), &f1_codecs); |
| 1682 f1_.set_video_codecs(f1_codecs); | 1724 f1_.set_video_codecs(f1_codecs); |
| 1683 | 1725 |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1772 f2_.CreateAnswer(offer.get(), opts, NULL)); | 1814 f2_.CreateAnswer(offer.get(), opts, NULL)); |
| 1773 const VideoContentDescription* vcd = | 1815 const VideoContentDescription* vcd = |
| 1774 GetFirstVideoContentDescription(answer.get()); | 1816 GetFirstVideoContentDescription(answer.get()); |
| 1775 std::vector<VideoCodec> expected_codecs = MAKE_VECTOR(kVideoCodecsAnswer); | 1817 std::vector<VideoCodec> expected_codecs = MAKE_VECTOR(kVideoCodecsAnswer); |
| 1776 AddRtxCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id), | 1818 AddRtxCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id), |
| 1777 &expected_codecs); | 1819 &expected_codecs); |
| 1778 | 1820 |
| 1779 EXPECT_EQ(expected_codecs, vcd->codecs()); | 1821 EXPECT_EQ(expected_codecs, vcd->codecs()); |
| 1780 } | 1822 } |
| 1781 | 1823 |
| 1824 // Test that after one RTX codec has been negotiated, a new offer can attempt | |
| 1825 // to add another. | |
|
Taylor Brandstetter
2016/01/21 21:15:05
Question for Peter: I'm assuming this is allowed,
| |
| 1826 TEST_F(MediaSessionDescriptionFactoryTest, AddSecondRtxInNewOffer) { | |
| 1827 MediaSessionOptions opts; | |
| 1828 opts.recv_video = true; | |
| 1829 opts.recv_audio = false; | |
| 1830 std::vector<VideoCodec> f1_codecs = MAKE_VECTOR(kVideoCodecs1); | |
| 1831 // This creates RTX for H264 for the offerer. | |
| 1832 AddRtxCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id), &f1_codecs); | |
| 1833 f1_.set_video_codecs(f1_codecs); | |
| 1834 | |
| 1835 rtc::scoped_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr)); | |
| 1836 ASSERT_TRUE(offer); | |
| 1837 const VideoContentDescription* vcd = | |
| 1838 GetFirstVideoContentDescription(offer.get()); | |
| 1839 | |
| 1840 std::vector<VideoCodec> expected_codecs = MAKE_VECTOR(kVideoCodecs1); | |
| 1841 AddRtxCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id), | |
| 1842 &expected_codecs); | |
| 1843 EXPECT_EQ(expected_codecs, vcd->codecs()); | |
| 1844 | |
| 1845 // Now, attempt to add RTX for H264-SVC. | |
| 1846 AddRtxCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs1[0].id), &f1_codecs); | |
| 1847 f1_.set_video_codecs(f1_codecs); | |
| 1848 | |
| 1849 rtc::scoped_ptr<SessionDescription> updated_offer( | |
| 1850 f1_.CreateOffer(opts, offer.get())); | |
| 1851 ASSERT_TRUE(updated_offer); | |
| 1852 vcd = GetFirstVideoContentDescription(updated_offer.get()); | |
| 1853 | |
| 1854 AddRtxCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs1[0].id), | |
| 1855 &expected_codecs); | |
| 1856 EXPECT_EQ(expected_codecs, vcd->codecs()); | |
| 1857 } | |
| 1858 | |
| 1782 // Test that when RTX is used in conjunction with simulcast, an RTX ssrc is | 1859 // Test that when RTX is used in conjunction with simulcast, an RTX ssrc is |
| 1783 // generated for each simulcast ssrc and correctly grouped. | 1860 // generated for each simulcast ssrc and correctly grouped. |
| 1784 TEST_F(MediaSessionDescriptionFactoryTest, SimSsrcsGenerateMultipleRtxSsrcs) { | 1861 TEST_F(MediaSessionDescriptionFactoryTest, SimSsrcsGenerateMultipleRtxSsrcs) { |
| 1785 MediaSessionOptions opts; | 1862 MediaSessionOptions opts; |
| 1786 opts.recv_video = true; | 1863 opts.recv_video = true; |
| 1787 opts.recv_audio = false; | 1864 opts.recv_audio = false; |
| 1788 | 1865 |
| 1789 // Add simulcast streams. | 1866 // Add simulcast streams. |
| 1790 opts.AddSendVideoStream("stream1", "stream1label", 3); | 1867 opts.AddSendVideoStream("stream1", "stream1label", 3); |
| 1791 | 1868 |
| (...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2335 const ContentInfo* audio_content = GetFirstAudioContent(updated_offer.get()); | 2412 const ContentInfo* audio_content = GetFirstAudioContent(updated_offer.get()); |
| 2336 const ContentInfo* video_content = GetFirstVideoContent(updated_offer.get()); | 2413 const ContentInfo* video_content = GetFirstVideoContent(updated_offer.get()); |
| 2337 const ContentInfo* data_content = GetFirstDataContent(updated_offer.get()); | 2414 const ContentInfo* data_content = GetFirstDataContent(updated_offer.get()); |
| 2338 ASSERT_TRUE(audio_content != nullptr); | 2415 ASSERT_TRUE(audio_content != nullptr); |
| 2339 ASSERT_TRUE(video_content != nullptr); | 2416 ASSERT_TRUE(video_content != nullptr); |
| 2340 ASSERT_TRUE(data_content != nullptr); | 2417 ASSERT_TRUE(data_content != nullptr); |
| 2341 EXPECT_EQ("audio_modified", audio_content->name); | 2418 EXPECT_EQ("audio_modified", audio_content->name); |
| 2342 EXPECT_EQ("video_modified", video_content->name); | 2419 EXPECT_EQ("video_modified", video_content->name); |
| 2343 EXPECT_EQ("data_modified", data_content->name); | 2420 EXPECT_EQ("data_modified", data_content->name); |
| 2344 } | 2421 } |
| OLD | NEW |