OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2011 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 |
11 #include <string.h> | 11 #include <string.h> |
12 | 12 |
13 #include <list> | 13 #include <list> |
14 | 14 |
15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
16 #include "webrtc/modules/video_coding/main/source/frame_buffer.h" | 16 #include "webrtc/modules/video_coding/main/source/frame_buffer.h" |
17 #include "webrtc/modules/video_coding/main/source/jitter_buffer.h" | 17 #include "webrtc/modules/video_coding/main/source/jitter_buffer.h" |
18 #include "webrtc/modules/video_coding/main/source/media_opt_util.h" | 18 #include "webrtc/modules/video_coding/main/source/media_opt_util.h" |
19 #include "webrtc/modules/video_coding/main/source/packet.h" | 19 #include "webrtc/modules/video_coding/main/source/packet.h" |
20 #include "webrtc/modules/video_coding/main/source/test/stream_generator.h" | 20 #include "webrtc/modules/video_coding/main/source/test/stream_generator.h" |
21 #include "webrtc/modules/video_coding/main/test/test_util.h" | 21 #include "webrtc/modules/video_coding/main/test/test_util.h" |
22 #include "webrtc/system_wrappers/interface/clock.h" | 22 #include "webrtc/system_wrappers/interface/clock.h" |
23 #include "webrtc/system_wrappers/interface/metrics.h" | 23 #include "webrtc/system_wrappers/interface/metrics.h" |
24 #include "webrtc/test/histogram.h" | 24 #include "webrtc/test/histogram.h" |
25 | 25 |
26 namespace webrtc { | 26 namespace webrtc { |
27 | 27 |
| 28 namespace { |
| 29 const uint32_t kProcessIntervalSec = 60; |
| 30 } // namespace |
| 31 |
| 32 class Vp9SsMapTest : public ::testing::Test { |
| 33 protected: |
| 34 virtual void SetUp() { |
| 35 uint16_t seq_num = 1234; |
| 36 uint32_t timestamp = 1; |
| 37 int length = 1400; |
| 38 packet_.reset(new VCMPacket(data_, length, seq_num, timestamp, true)); |
| 39 packet_->isFirstPacket = true; |
| 40 packet_->markerBit = true; |
| 41 packet_->frameType = kVideoFrameKey; |
| 42 packet_->codec = kVideoCodecVP9; |
| 43 packet_->codecSpecificHeader.codec = kRtpVideoVp9; |
| 44 packet_->codecSpecificHeader.codecHeader.VP9.flexible_mode = false; |
| 45 packet_->codecSpecificHeader.codecHeader.VP9.gof_idx = 0; |
| 46 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = kNoTemporalIdx; |
| 47 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = false; |
| 48 packet_->codecSpecificHeader.codecHeader.VP9.ss_data_available = true; |
| 49 packet_->codecSpecificHeader.codecHeader.VP9.gof.SetGofInfoVP9( |
| 50 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2.. |
| 51 } |
| 52 |
| 53 Vp9SsMap map_; |
| 54 uint8_t data_[1500]; |
| 55 rtc::scoped_ptr<VCMPacket> packet_; |
| 56 }; |
| 57 |
| 58 TEST_F(Vp9SsMapTest, Insert) { |
| 59 EXPECT_TRUE(map_.Insert(*packet_)); |
| 60 } |
| 61 |
| 62 TEST_F(Vp9SsMapTest, Insert_NoSsData) { |
| 63 packet_->codecSpecificHeader.codecHeader.VP9.ss_data_available = false; |
| 64 EXPECT_FALSE(map_.Insert(*packet_)); |
| 65 } |
| 66 |
| 67 TEST_F(Vp9SsMapTest, Find) { |
| 68 EXPECT_TRUE(map_.Insert(*packet_)); |
| 69 uint32_t timestamp; |
| 70 EXPECT_TRUE(map_.Find(packet_->timestamp, ×tamp)); |
| 71 EXPECT_EQ(packet_->timestamp, timestamp); |
| 72 } |
| 73 |
| 74 TEST_F(Vp9SsMapTest, Find_WithWrap) { |
| 75 const uint32_t kSsTimestamp1 = 0xFFFFFFFF; |
| 76 const uint32_t kSsTimestamp2 = 100; |
| 77 packet_->timestamp = kSsTimestamp1; |
| 78 EXPECT_TRUE(map_.Insert(*packet_)); |
| 79 packet_->timestamp = kSsTimestamp2; |
| 80 EXPECT_TRUE(map_.Insert(*packet_)); |
| 81 uint32_t timestamp; |
| 82 EXPECT_FALSE(map_.Find(kSsTimestamp1 - 1, ×tamp)); |
| 83 EXPECT_TRUE(map_.Find(kSsTimestamp1, ×tamp)); |
| 84 EXPECT_EQ(kSsTimestamp1, timestamp); |
| 85 EXPECT_TRUE(map_.Find(kSsTimestamp1 + 1, ×tamp)); |
| 86 EXPECT_EQ(kSsTimestamp1, timestamp); |
| 87 EXPECT_TRUE(map_.Find(kSsTimestamp2 - 1, ×tamp)); |
| 88 EXPECT_EQ(kSsTimestamp1, timestamp); |
| 89 EXPECT_TRUE(map_.Find(kSsTimestamp2, ×tamp)); |
| 90 EXPECT_EQ(kSsTimestamp2, timestamp); |
| 91 EXPECT_TRUE(map_.Find(kSsTimestamp2 + 1, ×tamp)); |
| 92 EXPECT_EQ(kSsTimestamp2, timestamp); |
| 93 } |
| 94 |
| 95 TEST_F(Vp9SsMapTest, Reset) { |
| 96 EXPECT_TRUE(map_.Insert(*packet_)); |
| 97 uint32_t timestamp; |
| 98 EXPECT_TRUE(map_.Find(packet_->timestamp, ×tamp)); |
| 99 EXPECT_EQ(packet_->timestamp, timestamp); |
| 100 |
| 101 map_.Reset(); |
| 102 EXPECT_FALSE(map_.Find(packet_->timestamp, ×tamp)); |
| 103 } |
| 104 |
| 105 TEST_F(Vp9SsMapTest, RemoveOld) { |
| 106 const uint32_t kSsTimestamp1 = 10000; |
| 107 const uint32_t kSsTimestamp2 = 20000; |
| 108 const uint32_t kSsTimestamp3 = 30000; |
| 109 packet_->timestamp = kSsTimestamp1; |
| 110 EXPECT_TRUE(map_.Insert(*packet_)); |
| 111 packet_->timestamp = kSsTimestamp2; |
| 112 EXPECT_TRUE(map_.Insert(*packet_)); |
| 113 packet_->timestamp = kSsTimestamp3; |
| 114 EXPECT_TRUE(map_.Insert(*packet_)); |
| 115 |
| 116 const uint32_t kTimestamp = kSsTimestamp1 + (kProcessIntervalSec) * 90000; |
| 117 map_.RemoveOld(kTimestamp); |
| 118 uint32_t timestamp; |
| 119 EXPECT_FALSE(map_.Find(kSsTimestamp1, ×tamp)); |
| 120 EXPECT_FALSE(map_.Find(kSsTimestamp2, ×tamp)); |
| 121 EXPECT_FALSE(map_.Find(kSsTimestamp3, ×tamp)); |
| 122 EXPECT_TRUE(map_.Find(kTimestamp, ×tamp)); |
| 123 EXPECT_EQ(kTimestamp, timestamp); |
| 124 } |
| 125 |
| 126 TEST_F(Vp9SsMapTest, RemoveOld_WithWrap) { |
| 127 uint32_t timestamp; |
| 128 const uint32_t kSsTimestamp1 = 0xFFFFFFFF; |
| 129 map_.RemoveOld(kSsTimestamp1); // No SS data, should have no effect. |
| 130 |
| 131 packet_->timestamp = kSsTimestamp1; |
| 132 EXPECT_TRUE(map_.Insert(*packet_)); |
| 133 |
| 134 map_.RemoveOld(kSsTimestamp1 - 1); |
| 135 EXPECT_TRUE(map_.Find(kSsTimestamp1, ×tamp)); |
| 136 map_.RemoveOld(kSsTimestamp1); |
| 137 EXPECT_TRUE(map_.Find(kSsTimestamp1, ×tamp)); |
| 138 |
| 139 const uint32_t kSsTimestamp2 = kSsTimestamp1 + kProcessIntervalSec * 90000; |
| 140 packet_->timestamp = kSsTimestamp2; |
| 141 EXPECT_TRUE(map_.Insert(*packet_)); |
| 142 |
| 143 map_.RemoveOld(kSsTimestamp1); |
| 144 EXPECT_TRUE(map_.Find(kSsTimestamp1, ×tamp)); |
| 145 EXPECT_TRUE(map_.Find(kSsTimestamp2, ×tamp)); |
| 146 map_.RemoveOld(kSsTimestamp2); |
| 147 EXPECT_FALSE(map_.Find(kSsTimestamp1, ×tamp)); |
| 148 EXPECT_TRUE(map_.Find(kSsTimestamp2, ×tamp)); |
| 149 } |
| 150 |
| 151 TEST_F(Vp9SsMapTest, UpdatePacket_NoSsData) { |
| 152 packet_->codecSpecificHeader.codecHeader.VP9.gof_idx = 0; |
| 153 EXPECT_FALSE(map_.UpdatePacket(packet_.get())); |
| 154 } |
| 155 |
| 156 TEST_F(Vp9SsMapTest, UpdatePacket_NoGofIdx) { |
| 157 EXPECT_TRUE(map_.Insert(*packet_)); |
| 158 packet_->codecSpecificHeader.codecHeader.VP9.gof_idx = kNoGofIdx; |
| 159 EXPECT_FALSE(map_.UpdatePacket(packet_.get())); |
| 160 } |
| 161 |
| 162 TEST_F(Vp9SsMapTest, UpdatePacket_InvalidGofIdx) { |
| 163 EXPECT_TRUE(map_.Insert(*packet_)); |
| 164 packet_->codecSpecificHeader.codecHeader.VP9.gof_idx = 4; |
| 165 EXPECT_FALSE(map_.UpdatePacket(packet_.get())); |
| 166 } |
| 167 |
| 168 TEST_F(Vp9SsMapTest, UpdatePacket) { |
| 169 EXPECT_TRUE(map_.Insert(*packet_)); // kTemporalStructureMode3: 0-2-1-2.. |
| 170 |
| 171 packet_->codecSpecificHeader.codecHeader.VP9.gof_idx = 0; |
| 172 EXPECT_TRUE(map_.UpdatePacket(packet_.get())); |
| 173 EXPECT_EQ(0, packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx); |
| 174 EXPECT_FALSE(packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch); |
| 175 EXPECT_EQ(1U, packet_->codecSpecificHeader.codecHeader.VP9.num_ref_pics); |
| 176 EXPECT_EQ(4, packet_->codecSpecificHeader.codecHeader.VP9.pid_diff[0]); |
| 177 |
| 178 packet_->codecSpecificHeader.codecHeader.VP9.gof_idx = 1; |
| 179 EXPECT_TRUE(map_.UpdatePacket(packet_.get())); |
| 180 EXPECT_EQ(2, packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx); |
| 181 EXPECT_TRUE(packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch); |
| 182 EXPECT_EQ(1U, packet_->codecSpecificHeader.codecHeader.VP9.num_ref_pics); |
| 183 EXPECT_EQ(1, packet_->codecSpecificHeader.codecHeader.VP9.pid_diff[0]); |
| 184 |
| 185 packet_->codecSpecificHeader.codecHeader.VP9.gof_idx = 2; |
| 186 EXPECT_TRUE(map_.UpdatePacket(packet_.get())); |
| 187 EXPECT_EQ(1, packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx); |
| 188 EXPECT_TRUE(packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch); |
| 189 EXPECT_EQ(1U, packet_->codecSpecificHeader.codecHeader.VP9.num_ref_pics); |
| 190 EXPECT_EQ(2, packet_->codecSpecificHeader.codecHeader.VP9.pid_diff[0]); |
| 191 |
| 192 packet_->codecSpecificHeader.codecHeader.VP9.gof_idx = 3; |
| 193 EXPECT_TRUE(map_.UpdatePacket(packet_.get())); |
| 194 EXPECT_EQ(2, packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx); |
| 195 EXPECT_FALSE(packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch); |
| 196 EXPECT_EQ(2U, packet_->codecSpecificHeader.codecHeader.VP9.num_ref_pics); |
| 197 EXPECT_EQ(1, packet_->codecSpecificHeader.codecHeader.VP9.pid_diff[0]); |
| 198 EXPECT_EQ(2, packet_->codecSpecificHeader.codecHeader.VP9.pid_diff[1]); |
| 199 } |
| 200 |
28 class TestBasicJitterBuffer : public ::testing::Test { | 201 class TestBasicJitterBuffer : public ::testing::Test { |
29 protected: | 202 protected: |
30 virtual void SetUp() { | 203 virtual void SetUp() { |
31 clock_.reset(new SimulatedClock(0)); | 204 clock_.reset(new SimulatedClock(0)); |
32 jitter_buffer_.reset(new VCMJitterBuffer( | 205 jitter_buffer_.reset(new VCMJitterBuffer( |
33 clock_.get(), | 206 clock_.get(), |
34 rtc::scoped_ptr<EventWrapper>(event_factory_.CreateEvent()))); | 207 rtc::scoped_ptr<EventWrapper>(event_factory_.CreateEvent()))); |
35 jitter_buffer_->Start(); | 208 jitter_buffer_->Start(); |
36 seq_num_ = 1234; | 209 seq_num_ = 1234; |
37 timestamp_ = 0; | 210 timestamp_ = 0; |
(...skipping 662 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
700 // Should be able to decode 3 delta frames, key frame already decoded. | 873 // Should be able to decode 3 delta frames, key frame already decoded. |
701 for (size_t i = 0; i < 3; ++i) { | 874 for (size_t i = 0; i < 3; ++i) { |
702 frame_out = DecodeCompleteFrame(); | 875 frame_out = DecodeCompleteFrame(); |
703 ASSERT_TRUE(frame_out != NULL); | 876 ASSERT_TRUE(frame_out != NULL); |
704 CheckOutFrame(frame_out, size_, false); | 877 CheckOutFrame(frame_out, size_, false); |
705 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType()); | 878 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType()); |
706 jitter_buffer_->ReleaseFrame(frame_out); | 879 jitter_buffer_->ReleaseFrame(frame_out); |
707 } | 880 } |
708 } | 881 } |
709 | 882 |
| 883 TEST_F(TestBasicJitterBuffer, TestSkipForwardVp9) { |
| 884 // Verify that JB skips forward to next base layer frame. |
| 885 // ------------------------------------------------- |
| 886 // | 65485 | 65486 | 65487 | 65488 | 65489 | ... |
| 887 // | pid:5 | pid:6 | pid:7 | pid:8 | pid:9 | ... |
| 888 // | tid:0 | tid:2 | tid:1 | tid:2 | tid:0 | ... |
| 889 // | ss | x | x | x | | |
| 890 // ------------------------------------------------- |
| 891 // |<----------tl0idx:200--------->|<---tl0idx:201--- |
| 892 |
| 893 bool re = false; |
| 894 packet_->codec = kVideoCodecVP9; |
| 895 packet_->codecSpecificHeader.codec = kRtpVideoVp9; |
| 896 packet_->isFirstPacket = true; |
| 897 packet_->markerBit = true; |
| 898 packet_->codecSpecificHeader.codecHeader.VP9.flexible_mode = false; |
| 899 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 0; |
| 900 packet_->codecSpecificHeader.codecHeader.VP9.beginning_of_frame = true; |
| 901 packet_->codecSpecificHeader.codecHeader.VP9.end_of_frame = true; |
| 902 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = kNoTemporalIdx; |
| 903 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = false; |
| 904 |
| 905 packet_->seqNum = 65485; |
| 906 packet_->timestamp = 1000; |
| 907 packet_->frameType = kVideoFrameKey; |
| 908 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 5; |
| 909 packet_->codecSpecificHeader.codecHeader.VP9.tl0_pic_idx = 200; |
| 910 packet_->codecSpecificHeader.codecHeader.VP9.gof_idx = 0; |
| 911 packet_->codecSpecificHeader.codecHeader.VP9.ss_data_available = true; |
| 912 packet_->codecSpecificHeader.codecHeader.VP9.gof.SetGofInfoVP9( |
| 913 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2.. |
| 914 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re)); |
| 915 |
| 916 // Insert next temporal layer 0. |
| 917 packet_->seqNum = 65489; |
| 918 packet_->timestamp = 13000; |
| 919 packet_->frameType = kVideoFrameDelta; |
| 920 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 9; |
| 921 packet_->codecSpecificHeader.codecHeader.VP9.tl0_pic_idx = 201; |
| 922 packet_->codecSpecificHeader.codecHeader.VP9.gof_idx = 0; |
| 923 packet_->codecSpecificHeader.codecHeader.VP9.ss_data_available = false; |
| 924 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re)); |
| 925 |
| 926 VCMEncodedFrame* frame_out = DecodeCompleteFrame(); |
| 927 EXPECT_EQ(1000U, frame_out->TimeStamp()); |
| 928 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType()); |
| 929 jitter_buffer_->ReleaseFrame(frame_out); |
| 930 |
| 931 frame_out = DecodeCompleteFrame(); |
| 932 EXPECT_EQ(13000U, frame_out->TimeStamp()); |
| 933 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType()); |
| 934 jitter_buffer_->ReleaseFrame(frame_out); |
| 935 } |
| 936 |
| 937 TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData) { |
| 938 // Verify that frames are updated with SS data when SS packet is reordered. |
| 939 // -------------------------------- |
| 940 // | 65486 | 65487 | 65485 |... |
| 941 // | pid:6 | pid:7 | pid:5 |... |
| 942 // | tid:2 | tid:1 | tid:0 |... |
| 943 // | | | ss | |
| 944 // -------------------------------- |
| 945 // |<--------tl0idx:200--------->| |
| 946 |
| 947 bool re = false; |
| 948 packet_->codec = kVideoCodecVP9; |
| 949 packet_->codecSpecificHeader.codec = kRtpVideoVp9; |
| 950 packet_->isFirstPacket = true; |
| 951 packet_->markerBit = true; |
| 952 packet_->codecSpecificHeader.codecHeader.VP9.flexible_mode = false; |
| 953 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 0; |
| 954 packet_->codecSpecificHeader.codecHeader.VP9.beginning_of_frame = true; |
| 955 packet_->codecSpecificHeader.codecHeader.VP9.end_of_frame = true; |
| 956 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = kNoTemporalIdx; |
| 957 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = false; |
| 958 packet_->codecSpecificHeader.codecHeader.VP9.tl0_pic_idx = 200; |
| 959 |
| 960 packet_->seqNum = 65486; |
| 961 packet_->timestamp = 6000; |
| 962 packet_->frameType = kVideoFrameDelta; |
| 963 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 6; |
| 964 packet_->codecSpecificHeader.codecHeader.VP9.gof_idx = 1; |
| 965 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re)); |
| 966 |
| 967 packet_->seqNum = 65487; |
| 968 packet_->timestamp = 9000; |
| 969 packet_->frameType = kVideoFrameDelta; |
| 970 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 7; |
| 971 packet_->codecSpecificHeader.codecHeader.VP9.gof_idx = 2; |
| 972 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re)); |
| 973 |
| 974 // Insert first frame with SS data. |
| 975 packet_->seqNum = 65485; |
| 976 packet_->timestamp = 3000; |
| 977 packet_->frameType = kVideoFrameKey; |
| 978 packet_->width = 352; |
| 979 packet_->height = 288; |
| 980 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 5; |
| 981 packet_->codecSpecificHeader.codecHeader.VP9.gof_idx = 0; |
| 982 packet_->codecSpecificHeader.codecHeader.VP9.ss_data_available = true; |
| 983 packet_->codecSpecificHeader.codecHeader.VP9.gof.SetGofInfoVP9( |
| 984 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2.. |
| 985 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re)); |
| 986 |
| 987 VCMEncodedFrame* frame_out = DecodeCompleteFrame(); |
| 988 EXPECT_EQ(3000U, frame_out->TimeStamp()); |
| 989 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType()); |
| 990 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx); |
| 991 EXPECT_FALSE( |
| 992 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch); |
| 993 EXPECT_EQ(1U, packet_->codecSpecificHeader.codecHeader.VP9.num_ref_pics); |
| 994 EXPECT_EQ(4, packet_->codecSpecificHeader.codecHeader.VP9.pid_diff[0]); |
| 995 jitter_buffer_->ReleaseFrame(frame_out); |
| 996 |
| 997 frame_out = DecodeCompleteFrame(); |
| 998 EXPECT_EQ(6000U, frame_out->TimeStamp()); |
| 999 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType()); |
| 1000 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx); |
| 1001 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch); |
| 1002 jitter_buffer_->ReleaseFrame(frame_out); |
| 1003 |
| 1004 frame_out = DecodeCompleteFrame(); |
| 1005 EXPECT_EQ(9000U, frame_out->TimeStamp()); |
| 1006 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType()); |
| 1007 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx); |
| 1008 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch); |
| 1009 jitter_buffer_->ReleaseFrame(frame_out); |
| 1010 } |
| 1011 |
710 TEST_F(TestBasicJitterBuffer, H264InsertStartCode) { | 1012 TEST_F(TestBasicJitterBuffer, H264InsertStartCode) { |
711 packet_->frameType = kVideoFrameKey; | 1013 packet_->frameType = kVideoFrameKey; |
712 packet_->isFirstPacket = true; | 1014 packet_->isFirstPacket = true; |
713 packet_->markerBit = false; | 1015 packet_->markerBit = false; |
714 packet_->seqNum = seq_num_; | 1016 packet_->seqNum = seq_num_; |
715 packet_->timestamp = timestamp_; | 1017 packet_->timestamp = timestamp_; |
716 packet_->insertStartCode = true; | 1018 packet_->insertStartCode = true; |
717 | 1019 |
718 bool retransmitted = false; | 1020 bool retransmitted = false; |
719 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, | 1021 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, |
(...skipping 1478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2198 | 2500 |
2199 // Stream should be decodable from this point. | 2501 // Stream should be decodable from this point. |
2200 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs); | 2502 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs); |
2201 InsertFrame(kVideoFrameDelta); | 2503 InsertFrame(kVideoFrameDelta); |
2202 EXPECT_TRUE(DecodeCompleteFrame()); | 2504 EXPECT_TRUE(DecodeCompleteFrame()); |
2203 nack_list = jitter_buffer_->GetNackList(&extended); | 2505 nack_list = jitter_buffer_->GetNackList(&extended); |
2204 EXPECT_EQ(0u, nack_list.size()); | 2506 EXPECT_EQ(0u, nack_list.size()); |
2205 } | 2507 } |
2206 | 2508 |
2207 } // namespace webrtc | 2509 } // namespace webrtc |
OLD | NEW |