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

Side by Side Diff: webrtc/video/video_send_stream_tests.cc

Issue 1437463002: Add tests for vp9 (non-flexible mode) using different spatial and temporal configurations. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 5 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
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2013 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 #include <algorithm> // max 10 #include <algorithm> // max
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 const VideoFrame& frame2); 51 const VideoFrame& frame2);
52 void ExpectEqualFramesVector(const std::vector<VideoFrame>& frames1, 52 void ExpectEqualFramesVector(const std::vector<VideoFrame>& frames1,
53 const std::vector<VideoFrame>& frames2); 53 const std::vector<VideoFrame>& frames2);
54 VideoFrame CreateVideoFrame(int width, int height, uint8_t data); 54 VideoFrame CreateVideoFrame(int width, int height, uint8_t data);
55 55
56 class VideoSendStreamTest : public test::CallTest { 56 class VideoSendStreamTest : public test::CallTest {
57 protected: 57 protected:
58 void TestNackRetransmission(uint32_t retransmit_ssrc, 58 void TestNackRetransmission(uint32_t retransmit_ssrc,
59 uint8_t retransmit_payload_type); 59 uint8_t retransmit_payload_type);
60 void TestPacketFragmentationSize(VideoFormat format, bool with_fec); 60 void TestPacketFragmentationSize(VideoFormat format, bool with_fec);
61
62 void TestVp9NonFlexMode(uint8_t num_temporal_layers,
63 uint8_t num_spatial_layers);
61 }; 64 };
62 65
63 TEST_F(VideoSendStreamTest, CanStartStartedStream) { 66 TEST_F(VideoSendStreamTest, CanStartStartedStream) {
64 Call::Config call_config; 67 Call::Config call_config;
65 CreateSenderCall(call_config); 68 CreateSenderCall(call_config);
66 69
67 test::NullTransport transport; 70 test::NullTransport transport;
68 CreateSendConfig(1, &transport); 71 CreateSendConfig(1, &transport);
69 CreateStreams(); 72 CreateStreams();
70 send_stream_->Start(); 73 send_stream_->Start();
(...skipping 1713 matching lines...) Expand 10 before | Expand all | Expand 10 after
1784 const std::vector<VideoReceiveStream*>& receive_streams) override { 1787 const std::vector<VideoReceiveStream*>& receive_streams) override {
1785 send_stream_ = send_stream; 1788 send_stream_ = send_stream;
1786 } 1789 }
1787 1790
1788 VideoSendStream* send_stream_; 1791 VideoSendStream* send_stream_;
1789 } test; 1792 } test;
1790 1793
1791 RunBaseTest(&test, FakeNetworkPipe::Config()); 1794 RunBaseTest(&test, FakeNetworkPipe::Config());
1792 } 1795 }
1793 1796
1794 class VP9HeaderObeserver : public test::SendTest { 1797 class Vp9HeaderObserver : public test::SendTest {
1795 public: 1798 public:
1796 VP9HeaderObeserver() 1799 Vp9HeaderObserver()
1797 : SendTest(VideoSendStreamTest::kDefaultTimeoutMs), 1800 : SendTest(VideoSendStreamTest::kDefaultTimeoutMs),
1798 vp9_encoder_(VP9Encoder::Create()), 1801 vp9_encoder_(VP9Encoder::Create()),
1799 vp9_settings_(VideoEncoder::GetDefaultVp9Settings()) { 1802 vp9_settings_(VideoEncoder::GetDefaultVp9Settings()),
1800 vp9_settings_.numberOfTemporalLayers = 1; 1803 packets_sent_(0),
1801 vp9_settings_.numberOfSpatialLayers = 2; 1804 frames_sent_(0) {}
1802 }
1803 1805
1804 virtual void ModifyConfigsHook( 1806 virtual void ModifyConfigsHook(
1805 VideoSendStream::Config* send_config, 1807 VideoSendStream::Config* send_config,
1806 std::vector<VideoReceiveStream::Config>* receive_configs, 1808 std::vector<VideoReceiveStream::Config>* receive_configs,
1807 VideoEncoderConfig* encoder_config) {} 1809 VideoEncoderConfig* encoder_config) {}
1808 1810
1809 virtual void InspectHeader(RTPVideoHeaderVP9* vp9videoHeader) = 0; 1811 virtual void InspectHeader(const RTPVideoHeaderVP9& vp9) = 0;
1810 1812
1811 private: 1813 private:
1812 const int kVp9PayloadType = 105; 1814 const int kVp9PayloadType = 105;
1813 1815
1814 void ModifyConfigs(VideoSendStream::Config* send_config, 1816 void ModifyConfigs(VideoSendStream::Config* send_config,
1815 std::vector<VideoReceiveStream::Config>* receive_configs, 1817 std::vector<VideoReceiveStream::Config>* receive_configs,
1816 VideoEncoderConfig* encoder_config) override { 1818 VideoEncoderConfig* encoder_config) override {
1817 encoder_config->encoder_specific_settings = &vp9_settings_; 1819 encoder_config->encoder_specific_settings = &vp9_settings_;
1818 encoder_config->content_type = VideoEncoderConfig::ContentType::kScreen;
1819 send_config->encoder_settings.encoder = vp9_encoder_.get(); 1820 send_config->encoder_settings.encoder = vp9_encoder_.get();
1820 send_config->encoder_settings.payload_name = "VP9"; 1821 send_config->encoder_settings.payload_name = "VP9";
1821 send_config->encoder_settings.payload_type = kVp9PayloadType; 1822 send_config->encoder_settings.payload_type = kVp9PayloadType;
1822 ModifyConfigsHook(send_config, receive_configs, encoder_config); 1823 ModifyConfigsHook(send_config, receive_configs, encoder_config);
1824 EXPECT_EQ(1u, encoder_config->streams.size());
1825 encoder_config->streams[0].temporal_layer_thresholds_bps.resize(
1826 vp9_settings_.numberOfTemporalLayers - 1);
1827 encoder_config_ = *encoder_config;
1823 } 1828 }
1824 1829
1825 void PerformTest() override { 1830 void PerformTest() override {
1826 EXPECT_EQ(kEventSignaled, Wait()) 1831 EXPECT_EQ(kEventSignaled, Wait())
1827 << "Test timed out waiting for VP9 packet"; 1832 << "Test timed out waiting for VP9 packet";
1828 } 1833 }
1829 1834
1830 Action OnSendRtp(const uint8_t* packet, size_t length) override { 1835 Action OnSendRtp(const uint8_t* packet, size_t length) override {
1831 RTPHeader header; 1836 RTPHeader header;
1832 EXPECT_TRUE(parser_->Parse(packet, length, &header)); 1837 EXPECT_TRUE(parser_->Parse(packet, length, &header));
1833 1838
1834 if (header.payloadType == kVp9PayloadType) { 1839 EXPECT_EQ(kVp9PayloadType, header.payloadType);
1835 RtpDepacketizerVp9 vp9depacketizer; 1840 const uint8_t* payload = packet + header.headerLength;
1836 RtpDepacketizer::ParsedPayload vp9payload; 1841 size_t payload_length = length - header.headerLength - header.paddingLength;
1837 const uint8_t* vp9_packet = packet + header.headerLength; 1842
1838 size_t payload_length = 1843 bool new_packet = packets_sent_ == 0 ||
1839 length - header.headerLength - header.paddingLength; 1844 IsNewerSequenceNumber(header.sequenceNumber,
1840 1845 last_header_.sequenceNumber);
1841 if (payload_length > 0) { 1846 if (payload_length > 0 && new_packet) {
1842 bool parse_vp9header_successful = 1847 RtpDepacketizer::ParsedPayload parsed;
1843 vp9depacketizer.Parse(&vp9payload, vp9_packet, payload_length); 1848 RtpDepacketizerVp9 depacketizer;
1844 bool is_vp9_codec_type = 1849 EXPECT_TRUE(depacketizer.Parse(&parsed, payload, payload_length));
1845 vp9payload.type.Video.codec == RtpVideoCodecTypes::kRtpVideoVp9; 1850 EXPECT_EQ(RtpVideoCodecTypes::kRtpVideoVp9, parsed.type.Video.codec);
1846 EXPECT_TRUE(parse_vp9header_successful); 1851 // Verify common fields for all configurations.
1847 EXPECT_TRUE(is_vp9_codec_type); 1852 VerifyCommonHeader(parsed.type.Video.codecHeader.VP9);
1848 1853 CompareConsecutiveFrames(header, parsed.type.Video);
1849 RTPVideoHeaderVP9* vp9videoHeader = 1854 // Verify configuration specific settings.
1850 &vp9payload.type.Video.codecHeader.VP9; 1855 InspectHeader(parsed.type.Video.codecHeader.VP9);
1851 if (parse_vp9header_successful && is_vp9_codec_type) { 1856
1852 InspectHeader(vp9videoHeader); 1857 ++packets_sent_;
1853 } else { 1858 if (header.markerBit) {
1854 observation_complete_->Set(); 1859 ++frames_sent_;
1855 }
1856 } 1860 }
1857 } 1861 last_header_ = header;
1858 1862 last_vp9_ = parsed.type.Video.codecHeader.VP9;
1863 }
1859 return SEND_PACKET; 1864 return SEND_PACKET;
1860 } 1865 }
1861 1866
1862 protected: 1867 protected:
1868 bool ContinuousPictureId(const RTPVideoHeaderVP9& vp9) const {
1869 if (last_vp9_.picture_id > vp9.picture_id) {
1870 return vp9.picture_id == 0; // Wrap.
1871 } else {
1872 return vp9.picture_id == last_vp9_.picture_id + 1;
1873 }
1874 }
1875
1876 void VerifySpatialIdxWithinFrame(const RTPVideoHeaderVP9& vp9) const {
1877 if (frames_sent_ == 0)
1878 return;
1879
1880 bool new_layer = vp9.spatial_idx != last_vp9_.spatial_idx;
1881 EXPECT_EQ(new_layer, vp9.beginning_of_frame);
1882 EXPECT_EQ(new_layer, last_vp9_.end_of_frame);
1883 EXPECT_EQ(new_layer ? last_vp9_.spatial_idx + 1 : last_vp9_.spatial_idx,
1884 vp9.spatial_idx);
1885 }
1886
1887 void VerifyFixedTemporalLayerStructure(const RTPVideoHeaderVP9& vp9,
1888 uint8_t num_layers) const {
1889 switch (num_layers) {
1890 case 0:
1891 VerifyTemporalLayerStructure0(vp9);
1892 break;
1893 case 1:
1894 VerifyTemporalLayerStructure1(vp9);
1895 break;
1896 case 2:
1897 VerifyTemporalLayerStructure2(vp9);
1898 break;
1899 case 3:
1900 VerifyTemporalLayerStructure3(vp9);
1901 break;
1902 default:
1903 RTC_NOTREACHED();
1904 }
1905 }
1906
1907 void VerifyTemporalLayerStructure0(const RTPVideoHeaderVP9& vp9) const {
1908 EXPECT_EQ(kNoTl0PicIdx, vp9.tl0_pic_idx);
1909 EXPECT_EQ(kNoTemporalIdx, vp9.temporal_idx); // no tid
1910 EXPECT_FALSE(vp9.temporal_up_switch);
1911 }
1912
1913 void VerifyTemporalLayerStructure1(const RTPVideoHeaderVP9& vp9) const {
1914 EXPECT_NE(kNoTl0PicIdx, vp9.tl0_pic_idx);
1915 EXPECT_EQ(0, vp9.temporal_idx); // 0,0,0,...
1916 EXPECT_FALSE(vp9.temporal_up_switch);
1917 }
1918
1919 void VerifyTemporalLayerStructure2(const RTPVideoHeaderVP9& vp9) const {
1920 EXPECT_NE(kNoTl0PicIdx, vp9.tl0_pic_idx);
1921 EXPECT_GE(vp9.temporal_idx, 0); // 0,1,0,1,...
1922 EXPECT_LE(vp9.temporal_idx, 1);
1923 EXPECT_EQ(vp9.temporal_idx > 0, vp9.temporal_up_switch);
1924 if (IsNewPictureId(vp9)) {
1925 uint8_t expected_tid =
1926 (IsKeyFrame(vp9) || last_vp9_.temporal_idx == 1) ? 0 : 1;
1927 EXPECT_EQ(expected_tid, vp9.temporal_idx);
1928 }
1929 }
1930
1931 void VerifyTemporalLayerStructure3(const RTPVideoHeaderVP9& vp9) const {
1932 EXPECT_NE(kNoTl0PicIdx, vp9.tl0_pic_idx);
1933 EXPECT_GE(vp9.temporal_idx, 0); // 0,2,1,2,...
1934 EXPECT_LE(vp9.temporal_idx, 2);
1935 if (IsNewPictureId(vp9) && !IsKeyFrame(vp9)) {
1936 EXPECT_NE(vp9.temporal_idx, last_vp9_.temporal_idx);
1937 switch (vp9.temporal_idx) {
1938 case 0:
1939 EXPECT_EQ(2, last_vp9_.temporal_idx);
1940 EXPECT_FALSE(vp9.temporal_up_switch);
1941 break;
1942 case 1:
1943 EXPECT_EQ(2, last_vp9_.temporal_idx);
1944 EXPECT_TRUE(vp9.temporal_up_switch);
1945 break;
1946 case 2:
1947 EXPECT_EQ(last_vp9_.temporal_idx == 0, vp9.temporal_up_switch);
1948 break;
1949 }
1950 }
1951 }
1952
1953 void VerifyTl0Idx(const RTPVideoHeaderVP9& vp9) const {
1954 if (vp9.tl0_pic_idx == kNoTl0PicIdx)
1955 return;
1956
1957 uint8_t expected_tl0_idx = last_vp9_.tl0_pic_idx;
1958 if (vp9.temporal_idx == 0)
1959 ++expected_tl0_idx;
1960 EXPECT_EQ(expected_tl0_idx, vp9.tl0_pic_idx);
1961 }
1962
1963 bool IsNewPictureId(const RTPVideoHeaderVP9& vp9) const {
1964 return frames_sent_ > 0 && (vp9.picture_id != last_vp9_.picture_id);
1965 }
1966
1967 bool IsKeyFrame(const RTPVideoHeaderVP9& vp9) const {
stefan-webrtc 2015/11/23 10:27:13 I'm not sure if !inter_pic_predicted is enough to
åsapersson 2015/11/23 15:01:49 For the second example (layer frame using inter-la
1968 return !vp9.inter_pic_predicted; // P
1969 }
1970
1971 bool IsFirstPacketInKeyFrame(const RTPVideoHeaderVP9& vp9) const {
1972 return IsKeyFrame(vp9) && vp9.beginning_of_frame && vp9.spatial_idx == 0;
1973 }
1974
1975 // Flexible mode (F=1): Non-flexible mode (F=0):
1976 //
1977 // +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
1978 // |I|P|L|F|B|E|V|-| |I|P|L|F|B|E|V|-|
1979 // +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
1980 // I: |M| PICTURE ID | I: |M| PICTURE ID |
1981 // +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
1982 // M: | EXTENDED PID | M: | EXTENDED PID |
1983 // +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
1984 // L: | T |U| S |D| L: | T |U| S |D|
1985 // +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
1986 // P,F: | P_DIFF |X|N| | TL0PICIDX |
1987 // +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
1988 // X: |EXTENDED P_DIFF| V: | SS .. |
1989 // +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
1990 // V: | SS .. |
1991 // +-+-+-+-+-+-+-+-+
1992 void VerifyCommonHeader(const RTPVideoHeaderVP9& vp9) const {
1993 EXPECT_EQ(kMaxTwoBytePictureId, vp9.max_picture_id); // M:1
1994 EXPECT_NE(kNoPictureId, vp9.picture_id); // I:1
1995 EXPECT_EQ(vp9_settings_.flexibleMode, vp9.flexible_mode); // F
1996 EXPECT_GE(vp9.spatial_idx, 0); // S
1997 EXPECT_LT(vp9.spatial_idx, vp9_settings_.numberOfSpatialLayers);
1998 if (vp9.ss_data_available) // V
1999 VerifySsData(vp9);
2000
2001 if (packets_sent_ == 0)
2002 EXPECT_TRUE(IsFirstPacketInKeyFrame(vp9));
2003 if (frames_sent_ == 0)
2004 EXPECT_TRUE(IsKeyFrame(vp9));
2005
2006 if (IsKeyFrame(vp9)) {
2007 EXPECT_TRUE(vp9.temporal_idx == 0 || vp9.temporal_idx == kNoTemporalIdx);
2008 EXPECT_FALSE(vp9.temporal_up_switch);
2009 }
2010 }
2011
2012 // Scalability structure (SS).
2013 //
2014 // +-+-+-+-+-+-+-+-+
2015 // V: | N_S |Y|G|-|-|-|
2016 // +-+-+-+-+-+-+-+-+
2017 // Y: | WIDTH | N_S + 1 times
2018 // +-+-+-+-+-+-+-+-+
2019 // | HEIGHT |
2020 // +-+-+-+-+-+-+-+-+
2021 // G: | N_G |
2022 // +-+-+-+-+-+-+-+-+
2023 // N_G: | T |U| R |-|-| N_G times
2024 // +-+-+-+-+-+-+-+-+
2025 // | P_DIFF | R times
2026 // +-+-+-+-+-+-+-+-+
2027 void VerifySsData(const RTPVideoHeaderVP9& vp9) const {
2028 EXPECT_TRUE(vp9.ss_data_available); // V
2029 EXPECT_EQ(vp9_settings_.numberOfSpatialLayers, // N_S + 1
2030 vp9.num_spatial_layers);
2031 EXPECT_TRUE(vp9.spatial_layer_resolution_present); // Y:1
2032 size_t expected_width = encoder_config_.streams[0].width;
2033 size_t expected_height = encoder_config_.streams[0].height;
2034 for (int i = vp9.num_spatial_layers - 1; i >= 0; --i) {
2035 EXPECT_EQ(expected_width, vp9.width[i]); // WIDTH
2036 EXPECT_EQ(expected_height, vp9.height[i]); // HEIGHT
2037 expected_width /= 2;
2038 expected_height /= 2;
2039 }
2040 }
2041
2042 void CompareConsecutiveFrames(const RTPHeader& header,
2043 const RTPVideoHeader& video) const {
2044 const RTPVideoHeaderVP9& vp9 = video.codecHeader.VP9;
2045
2046 bool new_frame = packets_sent_ == 0 ||
2047 IsNewerTimestamp(header.timestamp, last_header_.timestamp);
2048 EXPECT_EQ(new_frame, video.isFirstPacket);
2049 if (!new_frame) {
2050 EXPECT_FALSE(last_header_.markerBit);
2051 EXPECT_EQ(last_header_.timestamp, header.timestamp);
2052 EXPECT_EQ(last_vp9_.picture_id, vp9.picture_id);
2053 EXPECT_EQ(last_vp9_.temporal_idx, vp9.temporal_idx);
2054 EXPECT_EQ(last_vp9_.tl0_pic_idx, vp9.tl0_pic_idx);
2055 VerifySpatialIdxWithinFrame(vp9);
2056 return;
2057 }
2058 // New frame.
2059 EXPECT_TRUE(vp9.beginning_of_frame);
2060
2061 // Compare with last packet in previous frame.
2062 if (frames_sent_ == 0)
2063 return;
2064 EXPECT_TRUE(last_vp9_.end_of_frame);
2065 EXPECT_TRUE(last_header_.markerBit);
2066 EXPECT_TRUE(ContinuousPictureId(vp9));
2067 VerifyTl0Idx(vp9);
2068 }
2069
1863 rtc::scoped_ptr<VP9Encoder> vp9_encoder_; 2070 rtc::scoped_ptr<VP9Encoder> vp9_encoder_;
1864 VideoCodecVP9 vp9_settings_; 2071 VideoCodecVP9 vp9_settings_;
2072 webrtc::VideoEncoderConfig encoder_config_;
2073 RTPHeader last_header_;
2074 RTPVideoHeaderVP9 last_vp9_;
2075 size_t packets_sent_;
2076 size_t frames_sent_;
1865 }; 2077 };
1866 2078
1867 TEST_F(VideoSendStreamTest, DISABLED_VP9FlexMode) { 2079 TEST_F(VideoSendStreamTest, Vp9NonFlexMode_1Tl1SLayers) {
1868 class FlexibleMode : public VP9HeaderObeserver { 2080 const uint8_t kNumTemporalLayers = 1;
2081 const uint8_t kNumSpatialLayers = 1;
2082 TestVp9NonFlexMode(kNumTemporalLayers, kNumSpatialLayers);
2083 }
2084
2085 TEST_F(VideoSendStreamTest, Vp9NonFlexMode_2Tl1SLayers) {
2086 const uint8_t kNumTemporalLayers = 2;
2087 const uint8_t kNumSpatialLayers = 1;
2088 TestVp9NonFlexMode(kNumTemporalLayers, kNumSpatialLayers);
2089 }
2090
2091 TEST_F(VideoSendStreamTest, Vp9NonFlexMode_3Tl1SLayers) {
2092 const uint8_t kNumTemporalLayers = 3;
2093 const uint8_t kNumSpatialLayers = 1;
2094 TestVp9NonFlexMode(kNumTemporalLayers, kNumSpatialLayers);
2095 }
2096
2097 TEST_F(VideoSendStreamTest, Vp9NonFlexMode_1Tl2SLayers) {
2098 const uint8_t kNumTemporalLayers = 1;
2099 const uint8_t kNumSpatialLayers = 2;
2100 TestVp9NonFlexMode(kNumTemporalLayers, kNumSpatialLayers);
2101 }
2102
2103 TEST_F(VideoSendStreamTest, Vp9NonFlexMode_2Tl2SLayers) {
2104 const uint8_t kNumTemporalLayers = 2;
2105 const uint8_t kNumSpatialLayers = 2;
2106 TestVp9NonFlexMode(kNumTemporalLayers, kNumSpatialLayers);
2107 }
2108
2109 TEST_F(VideoSendStreamTest, Vp9NonFlexMode_3Tl2SLayers) {
2110 const uint8_t kNumTemporalLayers = 3;
2111 const uint8_t kNumSpatialLayers = 2;
2112 TestVp9NonFlexMode(kNumTemporalLayers, kNumSpatialLayers);
2113 }
2114
2115 void VideoSendStreamTest::TestVp9NonFlexMode(uint8_t num_temporal_layers,
2116 uint8_t num_spatial_layers) {
2117 static const size_t kNumFramesToSend = 100;
2118 // Set to < kNumFramesToSend and coprime to length of temporal layer
2119 // structures to verify temporal id reset on key frame.
2120 static const int kKeyFrameInterval = 31;
2121 class NonFlexibleMode : public Vp9HeaderObserver {
2122 public:
2123 NonFlexibleMode(uint8_t num_temporal_layers, uint8_t num_spatial_layers)
2124 : num_temporal_layers_(num_temporal_layers),
2125 num_spatial_layers_(num_spatial_layers),
2126 l_field_(num_temporal_layers > 1 || num_spatial_layers > 1) {
2127 }
1869 void ModifyConfigsHook( 2128 void ModifyConfigsHook(
1870 VideoSendStream::Config* send_config, 2129 VideoSendStream::Config* send_config,
1871 std::vector<VideoReceiveStream::Config>* receive_configs, 2130 std::vector<VideoReceiveStream::Config>* receive_configs,
1872 VideoEncoderConfig* encoder_config) override { 2131 VideoEncoderConfig* encoder_config) override {
1873 vp9_settings_.flexibleMode = true; 2132 vp9_settings_.flexibleMode = false;
1874 } 2133 vp9_settings_.frameDroppingOn = false;
1875 2134 vp9_settings_.keyFrameInterval = kKeyFrameInterval;
1876 void InspectHeader(RTPVideoHeaderVP9* vp9videoHeader) override { 2135 vp9_settings_.numberOfTemporalLayers = num_temporal_layers_;
1877 EXPECT_TRUE(vp9videoHeader->flexible_mode); 2136 vp9_settings_.numberOfSpatialLayers = num_spatial_layers_;
1878 observation_complete_->Set(); 2137 }
1879 } 2138
1880 } test; 2139 void InspectHeader(const RTPVideoHeaderVP9& vp9) override {
2140 EXPECT_EQ(IsFirstPacketInKeyFrame(vp9), vp9.ss_data_available);
2141 EXPECT_EQ(vp9.spatial_idx > 0, vp9.inter_layer_predicted); // D
2142
2143 if (IsNewPictureId(vp9)) {
2144 EXPECT_EQ(0, vp9.spatial_idx);
2145 EXPECT_EQ(num_spatial_layers_ - 1, last_vp9_.spatial_idx);
2146 }
2147
2148 VerifyFixedTemporalLayerStructure(vp9,
2149 l_field_ ? num_temporal_layers_ : 0);
2150
2151 if (frames_sent_ > kNumFramesToSend)
2152 observation_complete_->Set();
2153 }
2154 const uint8_t num_temporal_layers_;
2155 const uint8_t num_spatial_layers_;
2156 const bool l_field_;
2157 } test(num_temporal_layers, num_spatial_layers);
1881 2158
1882 RunBaseTest(&test, FakeNetworkPipe::Config()); 2159 RunBaseTest(&test, FakeNetworkPipe::Config());
1883 } 2160 }
1884 2161
1885 TEST_F(VideoSendStreamTest, VP9FlexModeHasPictureId) { 2162 TEST_F(VideoSendStreamTest, Vp9FlexModeRefCount) {
1886 class FlexibleMode : public VP9HeaderObeserver { 2163 class FlexibleMode : public Vp9HeaderObserver {
1887 void ModifyConfigsHook( 2164 void ModifyConfigsHook(
1888 VideoSendStream::Config* send_config, 2165 VideoSendStream::Config* send_config,
1889 std::vector<VideoReceiveStream::Config>* receive_configs, 2166 std::vector<VideoReceiveStream::Config>* receive_configs,
1890 VideoEncoderConfig* encoder_config) override { 2167 VideoEncoderConfig* encoder_config) override {
2168 encoder_config->content_type = VideoEncoderConfig::ContentType::kScreen;
1891 vp9_settings_.flexibleMode = true; 2169 vp9_settings_.flexibleMode = true;
1892 } 2170 vp9_settings_.numberOfTemporalLayers = 1;
1893 2171 vp9_settings_.numberOfSpatialLayers = 2;
1894 void InspectHeader(RTPVideoHeaderVP9* vp9videoHeader) override { 2172 }
1895 EXPECT_NE(vp9videoHeader->picture_id, kNoPictureId); 2173
1896 observation_complete_->Set(); 2174 void InspectHeader(const RTPVideoHeaderVP9& vp9_header) override {
1897 } 2175 EXPECT_TRUE(vp9_header.flexible_mode);
1898 } test; 2176 EXPECT_EQ(kNoTl0PicIdx, vp9_header.tl0_pic_idx);
1899 2177 if (vp9_header.inter_pic_predicted) {
1900 RunBaseTest(&test, FakeNetworkPipe::Config()); 2178 EXPECT_GT(vp9_header.num_ref_pics, 0u);
1901 }
1902
1903 TEST_F(VideoSendStreamTest, VP9FlexModeRefCount) {
1904 class FlexibleMode : public VP9HeaderObeserver {
1905 void ModifyConfigsHook(
1906 VideoSendStream::Config* send_config,
1907 std::vector<VideoReceiveStream::Config>* receive_configs,
1908 VideoEncoderConfig* encoder_config) override {
1909 vp9_settings_.flexibleMode = true;
1910 }
1911
1912 void InspectHeader(RTPVideoHeaderVP9* vp9videoHeader) override {
1913 EXPECT_TRUE(vp9videoHeader->flexible_mode);
1914 if (vp9videoHeader->inter_pic_predicted) {
1915 EXPECT_GT(vp9videoHeader->num_ref_pics, 0u);
1916 observation_complete_->Set(); 2179 observation_complete_->Set();
1917 } 2180 }
1918 } 2181 }
1919 } test; 2182 } test;
1920 2183
1921 RunBaseTest(&test, FakeNetworkPipe::Config()); 2184 RunBaseTest(&test, FakeNetworkPipe::Config());
1922 }
1923
1924 TEST_F(VideoSendStreamTest, VP9FlexModeRefs) {
1925 class FlexibleMode : public VP9HeaderObeserver {
1926 void ModifyConfigsHook(
1927 VideoSendStream::Config* send_config,
1928 std::vector<VideoReceiveStream::Config>* receive_configs,
1929 VideoEncoderConfig* encoder_config) override {
1930 vp9_settings_.flexibleMode = true;
1931 }
1932
1933 void InspectHeader(RTPVideoHeaderVP9* vp9videoHeader) override {
1934 EXPECT_TRUE(vp9videoHeader->flexible_mode);
1935 if (vp9videoHeader->inter_pic_predicted) {
1936 EXPECT_GT(vp9videoHeader->num_ref_pics, 0u);
1937 observation_complete_->Set();
1938 }
1939 }
1940
1941 } test;
1942
1943 RunBaseTest(&test, FakeNetworkPipe::Config());
1944 } 2185 }
1945 2186
1946 } // namespace webrtc 2187 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698