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 Vp9SsMapTest() |
| 35 : packet_(data_, 1400, 1234, 1, true) {} |
| 36 |
| 37 virtual void SetUp() { |
| 38 packet_.isFirstPacket = true; |
| 39 packet_.markerBit = true; |
| 40 packet_.frameType = kVideoFrameKey; |
| 41 packet_.codec = kVideoCodecVP9; |
| 42 packet_.codecSpecificHeader.codec = kRtpVideoVp9; |
| 43 packet_.codecSpecificHeader.codecHeader.VP9.flexible_mode = false; |
| 44 packet_.codecSpecificHeader.codecHeader.VP9.gof_idx = 0; |
| 45 packet_.codecSpecificHeader.codecHeader.VP9.temporal_idx = kNoTemporalIdx; |
| 46 packet_.codecSpecificHeader.codecHeader.VP9.temporal_up_switch = false; |
| 47 packet_.codecSpecificHeader.codecHeader.VP9.ss_data_available = true; |
| 48 packet_.codecSpecificHeader.codecHeader.VP9.gof.SetGofInfoVP9( |
| 49 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2.. |
| 50 } |
| 51 |
| 52 Vp9SsMap map_; |
| 53 uint8_t data_[1500]; |
| 54 VCMPacket packet_; |
| 55 }; |
| 56 |
| 57 TEST_F(Vp9SsMapTest, Insert) { |
| 58 EXPECT_TRUE(map_.Insert(packet_)); |
| 59 } |
| 60 |
| 61 TEST_F(Vp9SsMapTest, Insert_NoSsData) { |
| 62 packet_.codecSpecificHeader.codecHeader.VP9.ss_data_available = false; |
| 63 EXPECT_FALSE(map_.Insert(packet_)); |
| 64 } |
| 65 |
| 66 TEST_F(Vp9SsMapTest, Find) { |
| 67 EXPECT_TRUE(map_.Insert(packet_)); |
| 68 Vp9SsMap::SsMap::iterator it; |
| 69 EXPECT_TRUE(map_.Find(packet_.timestamp, &it)); |
| 70 EXPECT_EQ(packet_.timestamp, it->first); |
| 71 } |
| 72 |
| 73 TEST_F(Vp9SsMapTest, Find_WithWrap) { |
| 74 const uint32_t kSsTimestamp1 = 0xFFFFFFFF; |
| 75 const uint32_t kSsTimestamp2 = 100; |
| 76 packet_.timestamp = kSsTimestamp1; |
| 77 EXPECT_TRUE(map_.Insert(packet_)); |
| 78 packet_.timestamp = kSsTimestamp2; |
| 79 EXPECT_TRUE(map_.Insert(packet_)); |
| 80 Vp9SsMap::SsMap::iterator it; |
| 81 EXPECT_FALSE(map_.Find(kSsTimestamp1 - 1, &it)); |
| 82 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it)); |
| 83 EXPECT_EQ(kSsTimestamp1, it->first); |
| 84 EXPECT_TRUE(map_.Find(0, &it)); |
| 85 EXPECT_EQ(kSsTimestamp1, it->first); |
| 86 EXPECT_TRUE(map_.Find(kSsTimestamp2 - 1, &it)); |
| 87 EXPECT_EQ(kSsTimestamp1, it->first); |
| 88 EXPECT_TRUE(map_.Find(kSsTimestamp2, &it)); |
| 89 EXPECT_EQ(kSsTimestamp2, it->first); |
| 90 EXPECT_TRUE(map_.Find(kSsTimestamp2 + 1, &it)); |
| 91 EXPECT_EQ(kSsTimestamp2, it->first); |
| 92 } |
| 93 |
| 94 TEST_F(Vp9SsMapTest, Reset) { |
| 95 EXPECT_TRUE(map_.Insert(packet_)); |
| 96 Vp9SsMap::SsMap::iterator it; |
| 97 EXPECT_TRUE(map_.Find(packet_.timestamp, &it)); |
| 98 EXPECT_EQ(packet_.timestamp, it->first); |
| 99 |
| 100 map_.Reset(); |
| 101 EXPECT_FALSE(map_.Find(packet_.timestamp, &it)); |
| 102 } |
| 103 |
| 104 TEST_F(Vp9SsMapTest, RemoveOld) { |
| 105 Vp9SsMap::SsMap::iterator it; |
| 106 const uint32_t kSsTimestamp1 = 10000; |
| 107 packet_.timestamp = kSsTimestamp1; |
| 108 EXPECT_TRUE(map_.Insert(packet_)); |
| 109 |
| 110 const uint32_t kTimestamp = kSsTimestamp1 + kProcessIntervalSec * 90000; |
| 111 map_.RemoveOld(kTimestamp - 1); // Interval not passed. |
| 112 EXPECT_TRUE(map_.Find(kSsTimestamp1, &it)); // Should not been removed. |
| 113 |
| 114 map_.RemoveOld(kTimestamp); |
| 115 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it)); |
| 116 EXPECT_TRUE(map_.Find(kTimestamp, &it)); |
| 117 EXPECT_EQ(kTimestamp, it->first); |
| 118 } |
| 119 |
| 120 TEST_F(Vp9SsMapTest, RemoveOld_WithWrap) { |
| 121 Vp9SsMap::SsMap::iterator it; |
| 122 const uint32_t kSsTimestamp1 = 0xFFFFFFFF - kProcessIntervalSec * 90000; |
| 123 const uint32_t kSsTimestamp2 = 10; |
| 124 const uint32_t kSsTimestamp3 = 1000; |
| 125 packet_.timestamp = kSsTimestamp1; |
| 126 EXPECT_TRUE(map_.Insert(packet_)); |
| 127 packet_.timestamp = kSsTimestamp2; |
| 128 EXPECT_TRUE(map_.Insert(packet_)); |
| 129 packet_.timestamp = kSsTimestamp3; |
| 130 EXPECT_TRUE(map_.Insert(packet_)); |
| 131 |
| 132 map_.RemoveOld(kSsTimestamp3); |
| 133 EXPECT_FALSE(map_.Find(kSsTimestamp1, &it)); |
| 134 EXPECT_FALSE(map_.Find(kSsTimestamp2, &it)); |
| 135 EXPECT_TRUE(map_.Find(kSsTimestamp3, &it)); |
| 136 } |
| 137 |
| 138 TEST_F(Vp9SsMapTest, UpdatePacket_NoSsData) { |
| 139 packet_.codecSpecificHeader.codecHeader.VP9.gof_idx = 0; |
| 140 EXPECT_FALSE(map_.UpdatePacket(&packet_)); |
| 141 } |
| 142 |
| 143 TEST_F(Vp9SsMapTest, UpdatePacket_NoGofIdx) { |
| 144 EXPECT_TRUE(map_.Insert(packet_)); |
| 145 packet_.codecSpecificHeader.codecHeader.VP9.gof_idx = kNoGofIdx; |
| 146 EXPECT_FALSE(map_.UpdatePacket(&packet_)); |
| 147 } |
| 148 |
| 149 TEST_F(Vp9SsMapTest, UpdatePacket_InvalidGofIdx) { |
| 150 EXPECT_TRUE(map_.Insert(packet_)); |
| 151 packet_.codecSpecificHeader.codecHeader.VP9.gof_idx = 4; |
| 152 EXPECT_FALSE(map_.UpdatePacket(&packet_)); |
| 153 } |
| 154 |
| 155 TEST_F(Vp9SsMapTest, UpdatePacket) { |
| 156 EXPECT_TRUE(map_.Insert(packet_)); // kTemporalStructureMode3: 0-2-1-2.. |
| 157 |
| 158 packet_.codecSpecificHeader.codecHeader.VP9.gof_idx = 0; |
| 159 EXPECT_TRUE(map_.UpdatePacket(&packet_)); |
| 160 EXPECT_EQ(0, packet_.codecSpecificHeader.codecHeader.VP9.temporal_idx); |
| 161 EXPECT_FALSE(packet_.codecSpecificHeader.codecHeader.VP9.temporal_up_switch); |
| 162 EXPECT_EQ(1U, packet_.codecSpecificHeader.codecHeader.VP9.num_ref_pics); |
| 163 EXPECT_EQ(4, packet_.codecSpecificHeader.codecHeader.VP9.pid_diff[0]); |
| 164 |
| 165 packet_.codecSpecificHeader.codecHeader.VP9.gof_idx = 1; |
| 166 EXPECT_TRUE(map_.UpdatePacket(&packet_)); |
| 167 EXPECT_EQ(2, packet_.codecSpecificHeader.codecHeader.VP9.temporal_idx); |
| 168 EXPECT_TRUE(packet_.codecSpecificHeader.codecHeader.VP9.temporal_up_switch); |
| 169 EXPECT_EQ(1U, packet_.codecSpecificHeader.codecHeader.VP9.num_ref_pics); |
| 170 EXPECT_EQ(1, packet_.codecSpecificHeader.codecHeader.VP9.pid_diff[0]); |
| 171 |
| 172 packet_.codecSpecificHeader.codecHeader.VP9.gof_idx = 2; |
| 173 EXPECT_TRUE(map_.UpdatePacket(&packet_)); |
| 174 EXPECT_EQ(1, packet_.codecSpecificHeader.codecHeader.VP9.temporal_idx); |
| 175 EXPECT_TRUE(packet_.codecSpecificHeader.codecHeader.VP9.temporal_up_switch); |
| 176 EXPECT_EQ(1U, packet_.codecSpecificHeader.codecHeader.VP9.num_ref_pics); |
| 177 EXPECT_EQ(2, packet_.codecSpecificHeader.codecHeader.VP9.pid_diff[0]); |
| 178 |
| 179 packet_.codecSpecificHeader.codecHeader.VP9.gof_idx = 3; |
| 180 EXPECT_TRUE(map_.UpdatePacket(&packet_)); |
| 181 EXPECT_EQ(2, packet_.codecSpecificHeader.codecHeader.VP9.temporal_idx); |
| 182 EXPECT_FALSE(packet_.codecSpecificHeader.codecHeader.VP9.temporal_up_switch); |
| 183 EXPECT_EQ(2U, packet_.codecSpecificHeader.codecHeader.VP9.num_ref_pics); |
| 184 EXPECT_EQ(1, packet_.codecSpecificHeader.codecHeader.VP9.pid_diff[0]); |
| 185 EXPECT_EQ(2, packet_.codecSpecificHeader.codecHeader.VP9.pid_diff[1]); |
| 186 } |
| 187 |
28 class TestBasicJitterBuffer : public ::testing::Test { | 188 class TestBasicJitterBuffer : public ::testing::Test { |
29 protected: | 189 protected: |
30 virtual void SetUp() { | 190 virtual void SetUp() { |
31 clock_.reset(new SimulatedClock(0)); | 191 clock_.reset(new SimulatedClock(0)); |
32 jitter_buffer_.reset(new VCMJitterBuffer( | 192 jitter_buffer_.reset(new VCMJitterBuffer( |
33 clock_.get(), | 193 clock_.get(), |
34 rtc::scoped_ptr<EventWrapper>(event_factory_.CreateEvent()))); | 194 rtc::scoped_ptr<EventWrapper>(event_factory_.CreateEvent()))); |
35 jitter_buffer_->Start(); | 195 jitter_buffer_->Start(); |
36 seq_num_ = 1234; | 196 seq_num_ = 1234; |
37 timestamp_ = 0; | 197 timestamp_ = 0; |
(...skipping 661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
699 // Should be able to decode 3 delta frames, key frame already decoded. | 859 // Should be able to decode 3 delta frames, key frame already decoded. |
700 for (size_t i = 0; i < 3; ++i) { | 860 for (size_t i = 0; i < 3; ++i) { |
701 frame_out = DecodeCompleteFrame(); | 861 frame_out = DecodeCompleteFrame(); |
702 ASSERT_TRUE(frame_out != NULL); | 862 ASSERT_TRUE(frame_out != NULL); |
703 CheckOutFrame(frame_out, size_, false); | 863 CheckOutFrame(frame_out, size_, false); |
704 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType()); | 864 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType()); |
705 jitter_buffer_->ReleaseFrame(frame_out); | 865 jitter_buffer_->ReleaseFrame(frame_out); |
706 } | 866 } |
707 } | 867 } |
708 | 868 |
| 869 TEST_F(TestBasicJitterBuffer, TestSkipForwardVp9) { |
| 870 // Verify that JB skips forward to next base layer frame. |
| 871 // ------------------------------------------------- |
| 872 // | 65485 | 65486 | 65487 | 65488 | 65489 | ... |
| 873 // | pid:5 | pid:6 | pid:7 | pid:8 | pid:9 | ... |
| 874 // | tid:0 | tid:2 | tid:1 | tid:2 | tid:0 | ... |
| 875 // | ss | x | x | x | | |
| 876 // ------------------------------------------------- |
| 877 // |<----------tl0idx:200--------->|<---tl0idx:201--- |
| 878 |
| 879 bool re = false; |
| 880 packet_->codec = kVideoCodecVP9; |
| 881 packet_->codecSpecificHeader.codec = kRtpVideoVp9; |
| 882 packet_->isFirstPacket = true; |
| 883 packet_->markerBit = true; |
| 884 packet_->codecSpecificHeader.codecHeader.VP9.flexible_mode = false; |
| 885 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 0; |
| 886 packet_->codecSpecificHeader.codecHeader.VP9.beginning_of_frame = true; |
| 887 packet_->codecSpecificHeader.codecHeader.VP9.end_of_frame = true; |
| 888 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = kNoTemporalIdx; |
| 889 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = false; |
| 890 |
| 891 packet_->seqNum = 65485; |
| 892 packet_->timestamp = 1000; |
| 893 packet_->frameType = kVideoFrameKey; |
| 894 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 5; |
| 895 packet_->codecSpecificHeader.codecHeader.VP9.tl0_pic_idx = 200; |
| 896 packet_->codecSpecificHeader.codecHeader.VP9.gof_idx = 0; |
| 897 packet_->codecSpecificHeader.codecHeader.VP9.ss_data_available = true; |
| 898 packet_->codecSpecificHeader.codecHeader.VP9.gof.SetGofInfoVP9( |
| 899 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2.. |
| 900 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re)); |
| 901 |
| 902 // Insert next temporal layer 0. |
| 903 packet_->seqNum = 65489; |
| 904 packet_->timestamp = 13000; |
| 905 packet_->frameType = kVideoFrameDelta; |
| 906 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 9; |
| 907 packet_->codecSpecificHeader.codecHeader.VP9.tl0_pic_idx = 201; |
| 908 packet_->codecSpecificHeader.codecHeader.VP9.gof_idx = 0; |
| 909 packet_->codecSpecificHeader.codecHeader.VP9.ss_data_available = false; |
| 910 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re)); |
| 911 |
| 912 VCMEncodedFrame* frame_out = DecodeCompleteFrame(); |
| 913 EXPECT_EQ(1000U, frame_out->TimeStamp()); |
| 914 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType()); |
| 915 jitter_buffer_->ReleaseFrame(frame_out); |
| 916 |
| 917 frame_out = DecodeCompleteFrame(); |
| 918 EXPECT_EQ(13000U, frame_out->TimeStamp()); |
| 919 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType()); |
| 920 jitter_buffer_->ReleaseFrame(frame_out); |
| 921 } |
| 922 |
| 923 TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) { |
| 924 // Verify that frames are updated with SS data when SS packet is reordered. |
| 925 // -------------------------------- |
| 926 // | 65486 | 65487 | 65485 |... |
| 927 // | pid:6 | pid:7 | pid:5 |... |
| 928 // | tid:2 | tid:1 | tid:0 |... |
| 929 // | | | ss | |
| 930 // -------------------------------- |
| 931 // |<--------tl0idx:200--------->| |
| 932 |
| 933 bool re = false; |
| 934 packet_->codec = kVideoCodecVP9; |
| 935 packet_->codecSpecificHeader.codec = kRtpVideoVp9; |
| 936 packet_->isFirstPacket = true; |
| 937 packet_->markerBit = true; |
| 938 packet_->codecSpecificHeader.codecHeader.VP9.flexible_mode = false; |
| 939 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 0; |
| 940 packet_->codecSpecificHeader.codecHeader.VP9.beginning_of_frame = true; |
| 941 packet_->codecSpecificHeader.codecHeader.VP9.end_of_frame = true; |
| 942 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = kNoTemporalIdx; |
| 943 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = false; |
| 944 packet_->codecSpecificHeader.codecHeader.VP9.tl0_pic_idx = 200; |
| 945 |
| 946 packet_->seqNum = 65486; |
| 947 packet_->timestamp = 6000; |
| 948 packet_->frameType = kVideoFrameDelta; |
| 949 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 6; |
| 950 packet_->codecSpecificHeader.codecHeader.VP9.gof_idx = 1; |
| 951 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re)); |
| 952 |
| 953 packet_->seqNum = 65487; |
| 954 packet_->timestamp = 9000; |
| 955 packet_->frameType = kVideoFrameDelta; |
| 956 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 7; |
| 957 packet_->codecSpecificHeader.codecHeader.VP9.gof_idx = 2; |
| 958 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re)); |
| 959 |
| 960 // Insert first frame with SS data. |
| 961 packet_->seqNum = 65485; |
| 962 packet_->timestamp = 3000; |
| 963 packet_->frameType = kVideoFrameKey; |
| 964 packet_->width = 352; |
| 965 packet_->height = 288; |
| 966 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 5; |
| 967 packet_->codecSpecificHeader.codecHeader.VP9.gof_idx = 0; |
| 968 packet_->codecSpecificHeader.codecHeader.VP9.ss_data_available = true; |
| 969 packet_->codecSpecificHeader.codecHeader.VP9.gof.SetGofInfoVP9( |
| 970 kTemporalStructureMode3); // kTemporalStructureMode3: 0-2-1-2.. |
| 971 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re)); |
| 972 |
| 973 VCMEncodedFrame* frame_out = DecodeCompleteFrame(); |
| 974 EXPECT_EQ(3000U, frame_out->TimeStamp()); |
| 975 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType()); |
| 976 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx); |
| 977 EXPECT_FALSE( |
| 978 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch); |
| 979 jitter_buffer_->ReleaseFrame(frame_out); |
| 980 |
| 981 frame_out = DecodeCompleteFrame(); |
| 982 EXPECT_EQ(6000U, frame_out->TimeStamp()); |
| 983 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType()); |
| 984 EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx); |
| 985 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch); |
| 986 jitter_buffer_->ReleaseFrame(frame_out); |
| 987 |
| 988 frame_out = DecodeCompleteFrame(); |
| 989 EXPECT_EQ(9000U, frame_out->TimeStamp()); |
| 990 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType()); |
| 991 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx); |
| 992 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch); |
| 993 jitter_buffer_->ReleaseFrame(frame_out); |
| 994 } |
| 995 |
| 996 TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) { |
| 997 // Verify that frames are updated with SS data when SS packet is reordered. |
| 998 // ----------------------------------------- |
| 999 // | 65486 | 65487 | 65485 | 65484 |... |
| 1000 // | pid:6 | pid:6 | pid:5 | pid:5 |... |
| 1001 // | tid:1 | tid:1 | tid:0 | tid:0 |... |
| 1002 // | sid:0 | sid:1 | sid:1 | sid:0 |... |
| 1003 // | t:6000 | t:6000 | t:3000 | t:3000 | |
| 1004 // | | | | ss | |
| 1005 // ----------------------------------------- |
| 1006 // |<-----------tl0idx:200------------>| |
| 1007 |
| 1008 bool re = false; |
| 1009 packet_->codec = kVideoCodecVP9; |
| 1010 packet_->codecSpecificHeader.codec = kRtpVideoVp9; |
| 1011 packet_->codecSpecificHeader.codecHeader.VP9.flexible_mode = false; |
| 1012 packet_->codecSpecificHeader.codecHeader.VP9.beginning_of_frame = true; |
| 1013 packet_->codecSpecificHeader.codecHeader.VP9.end_of_frame = true; |
| 1014 packet_->codecSpecificHeader.codecHeader.VP9.temporal_idx = kNoTemporalIdx; |
| 1015 packet_->codecSpecificHeader.codecHeader.VP9.temporal_up_switch = false; |
| 1016 packet_->codecSpecificHeader.codecHeader.VP9.tl0_pic_idx = 200; |
| 1017 |
| 1018 packet_->isFirstPacket = true; |
| 1019 packet_->markerBit = false; |
| 1020 packet_->seqNum = 65486; |
| 1021 packet_->timestamp = 6000; |
| 1022 packet_->frameType = kVideoFrameDelta; |
| 1023 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 0; |
| 1024 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 6; |
| 1025 packet_->codecSpecificHeader.codecHeader.VP9.gof_idx = 1; |
| 1026 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re)); |
| 1027 |
| 1028 packet_->isFirstPacket = false; |
| 1029 packet_->markerBit = true; |
| 1030 packet_->seqNum = 65487; |
| 1031 packet_->frameType = kVideoFrameDelta; |
| 1032 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 1; |
| 1033 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 6; |
| 1034 packet_->codecSpecificHeader.codecHeader.VP9.gof_idx = 1; |
| 1035 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re)); |
| 1036 |
| 1037 packet_->isFirstPacket = false; |
| 1038 packet_->markerBit = true; |
| 1039 packet_->seqNum = 65485; |
| 1040 packet_->timestamp = 3000; |
| 1041 packet_->frameType = kVideoFrameKey; |
| 1042 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 1; |
| 1043 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 5; |
| 1044 packet_->codecSpecificHeader.codecHeader.VP9.gof_idx = 0; |
| 1045 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re)); |
| 1046 |
| 1047 // Insert first frame with SS data. |
| 1048 packet_->isFirstPacket = true; |
| 1049 packet_->markerBit = false; |
| 1050 packet_->seqNum = 65484; |
| 1051 packet_->frameType = kVideoFrameKey; |
| 1052 packet_->width = 352; |
| 1053 packet_->height = 288; |
| 1054 packet_->codecSpecificHeader.codecHeader.VP9.spatial_idx = 0; |
| 1055 packet_->codecSpecificHeader.codecHeader.VP9.picture_id = 5; |
| 1056 packet_->codecSpecificHeader.codecHeader.VP9.gof_idx = 0; |
| 1057 packet_->codecSpecificHeader.codecHeader.VP9.ss_data_available = true; |
| 1058 packet_->codecSpecificHeader.codecHeader.VP9.gof.SetGofInfoVP9( |
| 1059 kTemporalStructureMode2); // kTemporalStructureMode3: 0-1-0-1.. |
| 1060 EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re)); |
| 1061 |
| 1062 VCMEncodedFrame* frame_out = DecodeCompleteFrame(); |
| 1063 EXPECT_EQ(3000U, frame_out->TimeStamp()); |
| 1064 EXPECT_EQ(kVideoFrameKey, frame_out->FrameType()); |
| 1065 EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx); |
| 1066 EXPECT_FALSE( |
| 1067 frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch); |
| 1068 jitter_buffer_->ReleaseFrame(frame_out); |
| 1069 |
| 1070 frame_out = DecodeCompleteFrame(); |
| 1071 EXPECT_EQ(6000U, frame_out->TimeStamp()); |
| 1072 EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType()); |
| 1073 EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx); |
| 1074 EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch); |
| 1075 jitter_buffer_->ReleaseFrame(frame_out); |
| 1076 } |
| 1077 |
709 TEST_F(TestBasicJitterBuffer, H264InsertStartCode) { | 1078 TEST_F(TestBasicJitterBuffer, H264InsertStartCode) { |
710 packet_->frameType = kVideoFrameKey; | 1079 packet_->frameType = kVideoFrameKey; |
711 packet_->isFirstPacket = true; | 1080 packet_->isFirstPacket = true; |
712 packet_->markerBit = false; | 1081 packet_->markerBit = false; |
713 packet_->seqNum = seq_num_; | 1082 packet_->seqNum = seq_num_; |
714 packet_->timestamp = timestamp_; | 1083 packet_->timestamp = timestamp_; |
715 packet_->insertStartCode = true; | 1084 packet_->insertStartCode = true; |
716 | 1085 |
717 bool retransmitted = false; | 1086 bool retransmitted = false; |
718 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, | 1087 EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, |
(...skipping 1478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2197 | 2566 |
2198 // Stream should be decodable from this point. | 2567 // Stream should be decodable from this point. |
2199 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs); | 2568 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs); |
2200 InsertFrame(kVideoFrameDelta); | 2569 InsertFrame(kVideoFrameDelta); |
2201 EXPECT_TRUE(DecodeCompleteFrame()); | 2570 EXPECT_TRUE(DecodeCompleteFrame()); |
2202 nack_list = jitter_buffer_->GetNackList(&extended); | 2571 nack_list = jitter_buffer_->GetNackList(&extended); |
2203 EXPECT_EQ(0u, nack_list.size()); | 2572 EXPECT_EQ(0u, nack_list.size()); |
2204 } | 2573 } |
2205 | 2574 |
2206 } // namespace webrtc | 2575 } // namespace webrtc |
OLD | NEW |