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

Side by Side Diff: webrtc/modules/video_coding/main/source/jitter_buffer_unittest.cc

Issue 1386903002: Add support for handling reordered SS data on the receive-side for VP9. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: rebase 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) 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
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
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
OLDNEW
« no previous file with comments | « webrtc/modules/video_coding/main/source/jitter_buffer.cc ('k') | webrtc/modules/video_coding/main/source/session_info.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698