| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/test/simple_test_tick_clock.h" | 5 #include "base/test/simple_test_tick_clock.h" |
| 6 #include "media/cast/framer/framer.h" | 6 #include "media/cast/framer/framer.h" |
| 7 #include "media/cast/rtp_receiver/mock_rtp_payload_feedback.h" | 7 #include "media/cast/rtp_receiver/mock_rtp_payload_feedback.h" |
| 8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
| 9 | 9 |
| 10 namespace media { | 10 namespace media { |
| 11 namespace cast { | 11 namespace cast { |
| 12 | 12 |
| 13 class FramerTest : public ::testing::Test { | 13 class FramerTest : public ::testing::Test { |
| 14 protected: | 14 protected: |
| 15 FramerTest() | 15 FramerTest() |
| 16 : mock_rtp_payload_feedback_(), | 16 : mock_rtp_payload_feedback_(), |
| 17 framer_(&testing_clock_, &mock_rtp_payload_feedback_, 0, true, 0) { | 17 framer_(&testing_clock_, &mock_rtp_payload_feedback_, 0, true, 0) { |
| 18 } | |
| 19 | |
| 20 virtual ~FramerTest() {} | |
| 21 | |
| 22 virtual void SetUp() OVERRIDE { | |
| 23 // Build a default one packet frame - populate webrtc header. | 18 // Build a default one packet frame - populate webrtc header. |
| 24 rtp_header_.is_key_frame = false; | 19 rtp_header_.is_key_frame = false; |
| 25 rtp_header_.frame_id = 0; | 20 rtp_header_.frame_id = 0; |
| 26 rtp_header_.packet_id = 0; | 21 rtp_header_.packet_id = 0; |
| 27 rtp_header_.max_packet_id = 0; | 22 rtp_header_.max_packet_id = 0; |
| 28 rtp_header_.is_reference = false; | 23 rtp_header_.is_reference = false; |
| 29 rtp_header_.reference_frame_id = 0; | 24 rtp_header_.reference_frame_id = 0; |
| 30 payload_.assign(kMaxIpPacketSize, 0); | 25 payload_.assign(kMaxIpPacketSize, 0); |
| 31 | 26 |
| 32 EXPECT_CALL(mock_rtp_payload_feedback_, | 27 EXPECT_CALL(mock_rtp_payload_feedback_, CastFeedback(testing::_)) |
| 33 CastFeedback(testing::_)).WillRepeatedly(testing::Return()); | 28 .WillRepeatedly(testing::Return()); |
| 34 } | 29 } |
| 35 | 30 |
| 31 virtual ~FramerTest() {} |
| 32 |
| 36 std::vector<uint8> payload_; | 33 std::vector<uint8> payload_; |
| 37 RtpCastHeader rtp_header_; | 34 RtpCastHeader rtp_header_; |
| 38 MockRtpPayloadFeedback mock_rtp_payload_feedback_; | 35 MockRtpPayloadFeedback mock_rtp_payload_feedback_; |
| 39 Framer framer_; | 36 Framer framer_; |
| 40 base::SimpleTestTickClock testing_clock_; | 37 base::SimpleTestTickClock testing_clock_; |
| 38 |
| 39 DISALLOW_COPY_AND_ASSIGN(FramerTest); |
| 41 }; | 40 }; |
| 42 | 41 |
| 43 | |
| 44 TEST_F(FramerTest, EmptyState) { | 42 TEST_F(FramerTest, EmptyState) { |
| 45 transport::EncodedVideoFrame frame; | 43 transport::EncodedVideoFrame frame; |
| 46 uint32 rtp_timestamp; | 44 uint32 rtp_timestamp; |
| 47 bool next_frame = false; | 45 bool next_frame = false; |
| 48 EXPECT_FALSE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 46 EXPECT_FALSE( |
| 49 &next_frame)); | 47 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 50 } | 48 } |
| 51 | 49 |
| 52 TEST_F(FramerTest, AlwaysStartWithKey) { | 50 TEST_F(FramerTest, AlwaysStartWithKey) { |
| 53 transport::EncodedVideoFrame frame; | 51 transport::EncodedVideoFrame frame; |
| 54 uint32 rtp_timestamp; | 52 uint32 rtp_timestamp; |
| 55 bool next_frame = false; | 53 bool next_frame = false; |
| 56 bool complete = false; | 54 bool complete = false; |
| 57 bool duplicate = false; | 55 bool duplicate = false; |
| 58 | 56 |
| 59 // Insert non key first frame. | 57 // Insert non key first frame. |
| 60 complete = framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 58 complete = framer_.InsertPacket( |
| 61 &duplicate); | 59 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 62 EXPECT_TRUE(complete); | 60 EXPECT_TRUE(complete); |
| 63 EXPECT_FALSE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 61 EXPECT_FALSE( |
| 64 &next_frame)); | 62 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 65 rtp_header_.frame_id = 1; | 63 rtp_header_.frame_id = 1; |
| 66 rtp_header_.is_key_frame = true; | 64 rtp_header_.is_key_frame = true; |
| 67 complete = framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 65 complete = framer_.InsertPacket( |
| 68 &duplicate); | 66 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 69 EXPECT_TRUE(complete); | 67 EXPECT_TRUE(complete); |
| 70 EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 68 EXPECT_TRUE( |
| 71 &next_frame)); | 69 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 72 EXPECT_TRUE(next_frame); | 70 EXPECT_TRUE(next_frame); |
| 73 EXPECT_EQ(1u, frame.frame_id); | 71 EXPECT_EQ(1u, frame.frame_id); |
| 74 EXPECT_TRUE(frame.key_frame); | 72 EXPECT_TRUE(frame.key_frame); |
| 75 framer_.ReleaseFrame(frame.frame_id); | 73 framer_.ReleaseFrame(frame.frame_id); |
| 76 } | 74 } |
| 77 | 75 |
| 78 TEST_F(FramerTest, CompleteFrame) { | 76 TEST_F(FramerTest, CompleteFrame) { |
| 79 transport::EncodedVideoFrame frame; | 77 transport::EncodedVideoFrame frame; |
| 80 uint32 rtp_timestamp; | 78 uint32 rtp_timestamp; |
| 81 bool next_frame = false; | 79 bool next_frame = false; |
| 82 bool complete = false; | 80 bool complete = false; |
| 83 bool duplicate = false; | 81 bool duplicate = false; |
| 84 | 82 |
| 85 // Start with a complete key frame. | 83 // Start with a complete key frame. |
| 86 rtp_header_.is_key_frame = true; | 84 rtp_header_.is_key_frame = true; |
| 87 complete = framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 85 complete = framer_.InsertPacket( |
| 88 &duplicate); | 86 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 89 EXPECT_TRUE(complete); | 87 EXPECT_TRUE(complete); |
| 90 EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 88 EXPECT_TRUE( |
| 91 &next_frame)); | 89 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 92 EXPECT_TRUE(next_frame); | 90 EXPECT_TRUE(next_frame); |
| 93 EXPECT_EQ(0u, frame.frame_id); | 91 EXPECT_EQ(0u, frame.frame_id); |
| 94 EXPECT_TRUE(frame.key_frame); | 92 EXPECT_TRUE(frame.key_frame); |
| 95 framer_.ReleaseFrame(frame.frame_id); | 93 framer_.ReleaseFrame(frame.frame_id); |
| 96 | 94 |
| 97 // Incomplete delta. | 95 // Incomplete delta. |
| 98 ++rtp_header_.frame_id; | 96 ++rtp_header_.frame_id; |
| 99 rtp_header_.is_key_frame = false; | 97 rtp_header_.is_key_frame = false; |
| 100 rtp_header_.max_packet_id = 2; | 98 rtp_header_.max_packet_id = 2; |
| 101 complete = framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 99 complete = framer_.InsertPacket( |
| 102 &duplicate); | 100 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 103 EXPECT_FALSE(complete); | 101 EXPECT_FALSE(complete); |
| 104 EXPECT_FALSE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 102 EXPECT_FALSE( |
| 105 &next_frame)); | 103 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 106 | 104 |
| 107 // Complete delta - can't skip, as incomplete sequence. | 105 // Complete delta - can't skip, as incomplete sequence. |
| 108 ++rtp_header_.frame_id; | 106 ++rtp_header_.frame_id; |
| 109 rtp_header_.max_packet_id = 0; | 107 rtp_header_.max_packet_id = 0; |
| 110 complete = framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 108 complete = framer_.InsertPacket( |
| 111 &duplicate); | 109 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 112 EXPECT_TRUE(complete); | 110 EXPECT_TRUE(complete); |
| 113 EXPECT_FALSE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 111 EXPECT_FALSE( |
| 114 &next_frame)); | 112 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 115 } | 113 } |
| 116 | 114 |
| 117 TEST_F(FramerTest, DuplicatePackets) { | 115 TEST_F(FramerTest, DuplicatePackets) { |
| 118 transport::EncodedVideoFrame frame; | 116 transport::EncodedVideoFrame frame; |
| 119 uint32 rtp_timestamp; | 117 uint32 rtp_timestamp; |
| 120 bool next_frame = false; | 118 bool next_frame = false; |
| 121 bool complete = false; | 119 bool complete = false; |
| 122 bool duplicate = false; | 120 bool duplicate = false; |
| 123 | 121 |
| 124 // Start with an incomplete key frame. | 122 // Start with an incomplete key frame. |
| 125 rtp_header_.is_key_frame = true; | 123 rtp_header_.is_key_frame = true; |
| 126 rtp_header_.max_packet_id = 1; | 124 rtp_header_.max_packet_id = 1; |
| 127 duplicate = true; | 125 duplicate = true; |
| 128 complete = framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 126 complete = framer_.InsertPacket( |
| 129 &duplicate); | 127 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 130 EXPECT_FALSE(complete); | 128 EXPECT_FALSE(complete); |
| 131 EXPECT_FALSE(duplicate); | 129 EXPECT_FALSE(duplicate); |
| 132 EXPECT_FALSE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 130 EXPECT_FALSE( |
| 133 &next_frame)); | 131 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 134 | 132 |
| 135 // Add same packet again in incomplete key frame. | 133 // Add same packet again in incomplete key frame. |
| 136 duplicate = false; | 134 duplicate = false; |
| 137 complete = framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 135 complete = framer_.InsertPacket( |
| 138 &duplicate); | 136 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 139 EXPECT_FALSE(complete); | 137 EXPECT_FALSE(complete); |
| 140 EXPECT_TRUE(duplicate); | 138 EXPECT_TRUE(duplicate); |
| 141 EXPECT_FALSE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 139 EXPECT_FALSE( |
| 142 &next_frame)); | 140 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 143 | 141 |
| 144 // Complete key frame. | 142 // Complete key frame. |
| 145 rtp_header_.packet_id = 1; | 143 rtp_header_.packet_id = 1; |
| 146 duplicate = true; | 144 duplicate = true; |
| 147 complete = framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 145 complete = framer_.InsertPacket( |
| 148 &duplicate); | 146 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 149 EXPECT_TRUE(complete); | 147 EXPECT_TRUE(complete); |
| 150 EXPECT_FALSE(duplicate); | 148 EXPECT_FALSE(duplicate); |
| 151 EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 149 EXPECT_TRUE( |
| 152 &next_frame)); | 150 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 153 EXPECT_EQ(0u, frame.frame_id); | 151 EXPECT_EQ(0u, frame.frame_id); |
| 154 | 152 |
| 155 // Add same packet again in complete key frame. | 153 // Add same packet again in complete key frame. |
| 156 duplicate = false; | 154 duplicate = false; |
| 157 complete = framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 155 complete = framer_.InsertPacket( |
| 158 &duplicate); | 156 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 159 EXPECT_FALSE(complete); | 157 EXPECT_FALSE(complete); |
| 160 EXPECT_TRUE(duplicate); | 158 EXPECT_TRUE(duplicate); |
| 161 EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 159 EXPECT_TRUE( |
| 162 &next_frame)); | 160 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 163 EXPECT_EQ(0u, frame.frame_id); | 161 EXPECT_EQ(0u, frame.frame_id); |
| 164 framer_.ReleaseFrame(frame.frame_id); | 162 framer_.ReleaseFrame(frame.frame_id); |
| 165 | 163 |
| 166 // Incomplete delta frame. | 164 // Incomplete delta frame. |
| 167 ++rtp_header_.frame_id; | 165 ++rtp_header_.frame_id; |
| 168 rtp_header_.packet_id = 0; | 166 rtp_header_.packet_id = 0; |
| 169 rtp_header_.is_key_frame = false; | 167 rtp_header_.is_key_frame = false; |
| 170 duplicate = true; | 168 duplicate = true; |
| 171 complete = framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 169 complete = framer_.InsertPacket( |
| 172 &duplicate); | 170 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 173 EXPECT_FALSE(complete); | 171 EXPECT_FALSE(complete); |
| 174 EXPECT_FALSE(duplicate); | 172 EXPECT_FALSE(duplicate); |
| 175 EXPECT_FALSE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 173 EXPECT_FALSE( |
| 176 &next_frame)); | 174 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 177 | 175 |
| 178 // Add same packet again in incomplete delta frame. | 176 // Add same packet again in incomplete delta frame. |
| 179 duplicate = false; | 177 duplicate = false; |
| 180 complete = framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 178 complete = framer_.InsertPacket( |
| 181 &duplicate); | 179 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 182 EXPECT_FALSE(complete); | 180 EXPECT_FALSE(complete); |
| 183 EXPECT_TRUE(duplicate); | 181 EXPECT_TRUE(duplicate); |
| 184 EXPECT_FALSE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 182 EXPECT_FALSE( |
| 185 &next_frame)); | 183 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 186 | 184 |
| 187 // Complete delta frame. | 185 // Complete delta frame. |
| 188 rtp_header_.packet_id = 1; | 186 rtp_header_.packet_id = 1; |
| 189 duplicate = true; | 187 duplicate = true; |
| 190 complete = framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 188 complete = framer_.InsertPacket( |
| 191 &duplicate); | 189 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 192 EXPECT_TRUE(complete); | 190 EXPECT_TRUE(complete); |
| 193 EXPECT_FALSE(duplicate); | 191 EXPECT_FALSE(duplicate); |
| 194 EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 192 EXPECT_TRUE( |
| 195 &next_frame)); | 193 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 196 EXPECT_EQ(1u, frame.frame_id); | 194 EXPECT_EQ(1u, frame.frame_id); |
| 197 | 195 |
| 198 // Add same packet again in complete delta frame. | 196 // Add same packet again in complete delta frame. |
| 199 duplicate = false; | 197 duplicate = false; |
| 200 complete = framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 198 complete = framer_.InsertPacket( |
| 201 &duplicate); | 199 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 202 EXPECT_FALSE(complete); | 200 EXPECT_FALSE(complete); |
| 203 EXPECT_TRUE(duplicate); | 201 EXPECT_TRUE(duplicate); |
| 204 EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 202 EXPECT_TRUE( |
| 205 &next_frame)); | 203 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 206 EXPECT_EQ(1u, frame.frame_id); | 204 EXPECT_EQ(1u, frame.frame_id); |
| 207 } | 205 } |
| 208 | 206 |
| 209 TEST_F(FramerTest, ContinuousSequence) { | 207 TEST_F(FramerTest, ContinuousSequence) { |
| 210 transport::EncodedVideoFrame frame; | 208 transport::EncodedVideoFrame frame; |
| 211 uint32 rtp_timestamp; | 209 uint32 rtp_timestamp; |
| 212 bool next_frame = false; | 210 bool next_frame = false; |
| 213 bool complete = false; | 211 bool complete = false; |
| 214 bool duplicate = false; | 212 bool duplicate = false; |
| 215 | 213 |
| 216 // Start with a complete key frame. | 214 // Start with a complete key frame. |
| 217 rtp_header_.is_key_frame = true; | 215 rtp_header_.is_key_frame = true; |
| 218 complete = framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 216 complete = framer_.InsertPacket( |
| 219 &duplicate); | 217 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 220 EXPECT_TRUE(complete); | 218 EXPECT_TRUE(complete); |
| 221 EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 219 EXPECT_TRUE( |
| 222 &next_frame)); | 220 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 223 EXPECT_TRUE(next_frame); | 221 EXPECT_TRUE(next_frame); |
| 224 EXPECT_EQ(0u, frame.frame_id); | 222 EXPECT_EQ(0u, frame.frame_id); |
| 225 EXPECT_TRUE(frame.key_frame); | 223 EXPECT_TRUE(frame.key_frame); |
| 226 framer_.ReleaseFrame(frame.frame_id); | 224 framer_.ReleaseFrame(frame.frame_id); |
| 227 | 225 |
| 228 // Complete - not continuous. | 226 // Complete - not continuous. |
| 229 rtp_header_.frame_id = 2; | 227 rtp_header_.frame_id = 2; |
| 230 rtp_header_.is_key_frame = false; | 228 rtp_header_.is_key_frame = false; |
| 231 complete = framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 229 complete = framer_.InsertPacket( |
| 232 &duplicate); | 230 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 233 EXPECT_TRUE(complete); | 231 EXPECT_TRUE(complete); |
| 234 EXPECT_FALSE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 232 EXPECT_FALSE( |
| 235 &next_frame)); | 233 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 236 } | 234 } |
| 237 | 235 |
| 238 TEST_F(FramerTest, Wrap) { | 236 TEST_F(FramerTest, Wrap) { |
| 239 // Insert key frame, frame_id = 255 (will jump to that) | 237 // Insert key frame, frame_id = 255 (will jump to that) |
| 240 transport::EncodedVideoFrame frame; | 238 transport::EncodedVideoFrame frame; |
| 241 uint32 rtp_timestamp; | 239 uint32 rtp_timestamp; |
| 242 bool next_frame = false; | 240 bool next_frame = false; |
| 243 bool duplicate = false; | 241 bool duplicate = false; |
| 244 | 242 |
| 245 // Start with a complete key frame. | 243 // Start with a complete key frame. |
| 246 rtp_header_.is_key_frame = true; | 244 rtp_header_.is_key_frame = true; |
| 247 rtp_header_.frame_id = 255u; | 245 rtp_header_.frame_id = 255u; |
| 248 framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 246 framer_.InsertPacket( |
| 249 &duplicate); | 247 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 250 EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 248 EXPECT_TRUE( |
| 251 &next_frame)); | 249 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 252 EXPECT_TRUE(next_frame); | 250 EXPECT_TRUE(next_frame); |
| 253 EXPECT_EQ(255u, frame.frame_id); | 251 EXPECT_EQ(255u, frame.frame_id); |
| 254 framer_.ReleaseFrame(frame.frame_id); | 252 framer_.ReleaseFrame(frame.frame_id); |
| 255 | 253 |
| 256 // Insert wrapped delta frame - should be continuous. | 254 // Insert wrapped delta frame - should be continuous. |
| 257 rtp_header_.is_key_frame = false; | 255 rtp_header_.is_key_frame = false; |
| 258 rtp_header_.frame_id = 256; | 256 rtp_header_.frame_id = 256; |
| 259 framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 257 framer_.InsertPacket( |
| 260 &duplicate); | 258 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 261 EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 259 EXPECT_TRUE( |
| 262 &next_frame)); | 260 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 263 EXPECT_TRUE(next_frame); | 261 EXPECT_TRUE(next_frame); |
| 264 EXPECT_EQ(256u, frame.frame_id); | 262 EXPECT_EQ(256u, frame.frame_id); |
| 265 framer_.ReleaseFrame(frame.frame_id); | 263 framer_.ReleaseFrame(frame.frame_id); |
| 266 } | 264 } |
| 267 | 265 |
| 268 TEST_F(FramerTest, Reset) { | 266 TEST_F(FramerTest, Reset) { |
| 269 transport::EncodedVideoFrame frame; | 267 transport::EncodedVideoFrame frame; |
| 270 uint32 rtp_timestamp; | 268 uint32 rtp_timestamp; |
| 271 bool next_frame = false; | 269 bool next_frame = false; |
| 272 bool complete = false; | 270 bool complete = false; |
| 273 bool duplicate = false; | 271 bool duplicate = false; |
| 274 | 272 |
| 275 // Start with a complete key frame. | 273 // Start with a complete key frame. |
| 276 rtp_header_.is_key_frame = true; | 274 rtp_header_.is_key_frame = true; |
| 277 complete = framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 275 complete = framer_.InsertPacket( |
| 278 &duplicate); | 276 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 279 EXPECT_TRUE(complete); | 277 EXPECT_TRUE(complete); |
| 280 framer_.Reset(); | 278 framer_.Reset(); |
| 281 EXPECT_FALSE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 279 EXPECT_FALSE( |
| 282 &next_frame)); | 280 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 283 } | 281 } |
| 284 | 282 |
| 285 TEST_F(FramerTest, RequireKeyAfterReset) { | 283 TEST_F(FramerTest, RequireKeyAfterReset) { |
| 286 transport::EncodedVideoFrame frame; | 284 transport::EncodedVideoFrame frame; |
| 287 uint32 rtp_timestamp; | 285 uint32 rtp_timestamp; |
| 288 bool next_frame = false; | 286 bool next_frame = false; |
| 289 bool duplicate = false; | 287 bool duplicate = false; |
| 290 | 288 |
| 291 framer_.Reset(); | 289 framer_.Reset(); |
| 292 | 290 |
| 293 // Start with a complete key frame. | 291 // Start with a complete key frame. |
| 294 rtp_header_.is_key_frame = false; | 292 rtp_header_.is_key_frame = false; |
| 295 rtp_header_.frame_id = 0u; | 293 rtp_header_.frame_id = 0u; |
| 296 framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 294 framer_.InsertPacket( |
| 297 &duplicate); | 295 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 298 EXPECT_FALSE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 296 EXPECT_FALSE( |
| 299 &next_frame)); | 297 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 300 rtp_header_.frame_id = 1; | 298 rtp_header_.frame_id = 1; |
| 301 rtp_header_.is_key_frame = true; | 299 rtp_header_.is_key_frame = true; |
| 302 framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 300 framer_.InsertPacket( |
| 303 &duplicate); | 301 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 304 EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 302 EXPECT_TRUE( |
| 305 &next_frame)); | 303 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 306 EXPECT_TRUE(next_frame); | 304 EXPECT_TRUE(next_frame); |
| 307 } | 305 } |
| 308 | 306 |
| 309 TEST_F(FramerTest, BasicNonLastReferenceId) { | 307 TEST_F(FramerTest, BasicNonLastReferenceId) { |
| 310 transport::EncodedVideoFrame frame; | 308 transport::EncodedVideoFrame frame; |
| 311 uint32 rtp_timestamp; | 309 uint32 rtp_timestamp; |
| 312 bool next_frame = false; | 310 bool next_frame = false; |
| 313 bool duplicate = false; | 311 bool duplicate = false; |
| 314 | 312 |
| 315 rtp_header_.is_key_frame = true; | 313 rtp_header_.is_key_frame = true; |
| 316 rtp_header_.frame_id = 0; | 314 rtp_header_.frame_id = 0; |
| 317 framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 315 framer_.InsertPacket( |
| 318 &duplicate); | 316 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 319 | 317 |
| 320 EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 318 EXPECT_TRUE( |
| 321 &next_frame)); | 319 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 322 framer_.ReleaseFrame(frame.frame_id); | 320 framer_.ReleaseFrame(frame.frame_id); |
| 323 | 321 |
| 324 rtp_header_.is_key_frame = false; | 322 rtp_header_.is_key_frame = false; |
| 325 rtp_header_.is_reference = true; | 323 rtp_header_.is_reference = true; |
| 326 rtp_header_.reference_frame_id = 0; | 324 rtp_header_.reference_frame_id = 0; |
| 327 rtp_header_.frame_id = 5u; | 325 rtp_header_.frame_id = 5u; |
| 328 framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 326 framer_.InsertPacket( |
| 329 &duplicate); | 327 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 330 | 328 |
| 331 EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 329 EXPECT_TRUE( |
| 332 &next_frame)); | 330 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 333 EXPECT_FALSE(next_frame); | 331 EXPECT_FALSE(next_frame); |
| 334 } | 332 } |
| 335 | 333 |
| 336 TEST_F(FramerTest, InOrderReferenceFrameSelection) { | 334 TEST_F(FramerTest, InOrderReferenceFrameSelection) { |
| 337 // Create pattern: 0, 1, 4, 5. | 335 // Create pattern: 0, 1, 4, 5. |
| 338 transport::EncodedVideoFrame frame; | 336 transport::EncodedVideoFrame frame; |
| 339 uint32 rtp_timestamp; | 337 uint32 rtp_timestamp; |
| 340 bool next_frame = false; | 338 bool next_frame = false; |
| 341 bool duplicate = false; | 339 bool duplicate = false; |
| 342 | 340 |
| 343 rtp_header_.is_key_frame = true; | 341 rtp_header_.is_key_frame = true; |
| 344 rtp_header_.frame_id = 0; | 342 rtp_header_.frame_id = 0; |
| 345 framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 343 framer_.InsertPacket( |
| 346 &duplicate); | 344 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 347 rtp_header_.is_key_frame = false; | 345 rtp_header_.is_key_frame = false; |
| 348 rtp_header_.frame_id = 1; | 346 rtp_header_.frame_id = 1; |
| 349 framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 347 framer_.InsertPacket( |
| 350 &duplicate); | 348 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 351 | 349 |
| 352 // Insert frame #2 partially. | 350 // Insert frame #2 partially. |
| 353 rtp_header_.frame_id = 2; | 351 rtp_header_.frame_id = 2; |
| 354 rtp_header_.max_packet_id = 1; | 352 rtp_header_.max_packet_id = 1; |
| 355 framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 353 framer_.InsertPacket( |
| 356 &duplicate); | 354 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 357 rtp_header_.frame_id = 4; | 355 rtp_header_.frame_id = 4; |
| 358 rtp_header_.max_packet_id = 0; | 356 rtp_header_.max_packet_id = 0; |
| 359 rtp_header_.is_reference = true; | 357 rtp_header_.is_reference = true; |
| 360 rtp_header_.reference_frame_id = 0; | 358 rtp_header_.reference_frame_id = 0; |
| 361 framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 359 framer_.InsertPacket( |
| 362 &duplicate); | 360 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 363 EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 361 EXPECT_TRUE( |
| 364 &next_frame)); | 362 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 365 EXPECT_EQ(0u, frame.frame_id); | 363 EXPECT_EQ(0u, frame.frame_id); |
| 366 framer_.ReleaseFrame(frame.frame_id); | 364 framer_.ReleaseFrame(frame.frame_id); |
| 367 EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 365 EXPECT_TRUE( |
| 368 &next_frame)); | 366 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 369 EXPECT_TRUE(next_frame); | 367 EXPECT_TRUE(next_frame); |
| 370 EXPECT_EQ(1u, frame.frame_id); | 368 EXPECT_EQ(1u, frame.frame_id); |
| 371 framer_.ReleaseFrame(frame.frame_id); | 369 framer_.ReleaseFrame(frame.frame_id); |
| 372 EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 370 EXPECT_TRUE( |
| 373 &next_frame)); | 371 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 374 EXPECT_FALSE(next_frame); | 372 EXPECT_FALSE(next_frame); |
| 375 EXPECT_EQ(4u, frame.frame_id); | 373 EXPECT_EQ(4u, frame.frame_id); |
| 376 framer_.ReleaseFrame(frame.frame_id); | 374 framer_.ReleaseFrame(frame.frame_id); |
| 377 // Insert remaining packet of frame #2 - should no be continuous. | 375 // Insert remaining packet of frame #2 - should no be continuous. |
| 378 rtp_header_.frame_id = 2; | 376 rtp_header_.frame_id = 2; |
| 379 rtp_header_.packet_id = 1; | 377 rtp_header_.packet_id = 1; |
| 380 framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 378 framer_.InsertPacket( |
| 381 &duplicate); | 379 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 382 EXPECT_FALSE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 380 EXPECT_FALSE( |
| 383 &next_frame)); | 381 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 384 rtp_header_.is_reference = false; | 382 rtp_header_.is_reference = false; |
| 385 rtp_header_.frame_id = 5; | 383 rtp_header_.frame_id = 5; |
| 386 rtp_header_.packet_id = 0; | 384 rtp_header_.packet_id = 0; |
| 387 rtp_header_.max_packet_id = 0; | 385 rtp_header_.max_packet_id = 0; |
| 388 framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 386 framer_.InsertPacket( |
| 389 &duplicate); | 387 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 390 EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, | 388 EXPECT_TRUE( |
| 391 &next_frame)); | 389 framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp, &next_frame)); |
| 392 EXPECT_TRUE(next_frame); | 390 EXPECT_TRUE(next_frame); |
| 393 EXPECT_EQ(5u, frame.frame_id); | 391 EXPECT_EQ(5u, frame.frame_id); |
| 394 } | 392 } |
| 395 | 393 |
| 396 TEST_F(FramerTest, AudioWrap) { | 394 TEST_F(FramerTest, AudioWrap) { |
| 397 // All audio frames are marked as key frames. | 395 // All audio frames are marked as key frames. |
| 398 transport::EncodedAudioFrame frame; | 396 transport::EncodedAudioFrame frame; |
| 399 uint32 rtp_timestamp; | 397 uint32 rtp_timestamp; |
| 400 bool next_frame = false; | 398 bool next_frame = false; |
| 401 bool duplicate = false; | 399 bool duplicate = false; |
| 402 | 400 |
| 403 rtp_header_.is_key_frame = true; | 401 rtp_header_.is_key_frame = true; |
| 404 rtp_header_.frame_id = 254; | 402 rtp_header_.frame_id = 254; |
| 405 | 403 |
| 406 framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 404 framer_.InsertPacket( |
| 407 &duplicate); | 405 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 408 EXPECT_TRUE(framer_.GetEncodedAudioFrame(&frame, &rtp_timestamp, | 406 EXPECT_TRUE( |
| 409 &next_frame)); | 407 framer_.GetEncodedAudioFrame(&frame, &rtp_timestamp, &next_frame)); |
| 410 EXPECT_TRUE(next_frame); | 408 EXPECT_TRUE(next_frame); |
| 411 EXPECT_EQ(254u, frame.frame_id); | 409 EXPECT_EQ(254u, frame.frame_id); |
| 412 framer_.ReleaseFrame(frame.frame_id); | 410 framer_.ReleaseFrame(frame.frame_id); |
| 413 | 411 |
| 414 rtp_header_.frame_id = 255; | 412 rtp_header_.frame_id = 255; |
| 415 framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 413 framer_.InsertPacket( |
| 416 &duplicate); | 414 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 417 | 415 |
| 418 // Insert wrapped frame - should be continuous. | 416 // Insert wrapped frame - should be continuous. |
| 419 rtp_header_.frame_id = 256; | 417 rtp_header_.frame_id = 256; |
| 420 framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 418 framer_.InsertPacket( |
| 421 &duplicate); | 419 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 422 | 420 |
| 423 EXPECT_TRUE(framer_.GetEncodedAudioFrame(&frame, &rtp_timestamp, | 421 EXPECT_TRUE( |
| 424 &next_frame)); | 422 framer_.GetEncodedAudioFrame(&frame, &rtp_timestamp, &next_frame)); |
| 425 EXPECT_TRUE(next_frame); | 423 EXPECT_TRUE(next_frame); |
| 426 EXPECT_EQ(255u, frame.frame_id); | 424 EXPECT_EQ(255u, frame.frame_id); |
| 427 framer_.ReleaseFrame(frame.frame_id); | 425 framer_.ReleaseFrame(frame.frame_id); |
| 428 | 426 |
| 429 EXPECT_TRUE(framer_.GetEncodedAudioFrame(&frame, &rtp_timestamp, | 427 EXPECT_TRUE( |
| 430 &next_frame)); | 428 framer_.GetEncodedAudioFrame(&frame, &rtp_timestamp, &next_frame)); |
| 431 EXPECT_TRUE(next_frame); | 429 EXPECT_TRUE(next_frame); |
| 432 EXPECT_EQ(256u, frame.frame_id); | 430 EXPECT_EQ(256u, frame.frame_id); |
| 433 framer_.ReleaseFrame(frame.frame_id); | 431 framer_.ReleaseFrame(frame.frame_id); |
| 434 } | 432 } |
| 435 | 433 |
| 436 TEST_F(FramerTest, AudioWrapWithMissingFrame) { | 434 TEST_F(FramerTest, AudioWrapWithMissingFrame) { |
| 437 // All audio frames are marked as key frames. | 435 // All audio frames are marked as key frames. |
| 438 transport::EncodedAudioFrame frame; | 436 transport::EncodedAudioFrame frame; |
| 439 uint32 rtp_timestamp; | 437 uint32 rtp_timestamp; |
| 440 bool next_frame = false; | 438 bool next_frame = false; |
| 441 bool duplicate = false; | 439 bool duplicate = false; |
| 442 | 440 |
| 443 // Insert and get first packet. | 441 // Insert and get first packet. |
| 444 rtp_header_.is_key_frame = true; | 442 rtp_header_.is_key_frame = true; |
| 445 rtp_header_.frame_id = 253; | 443 rtp_header_.frame_id = 253; |
| 446 framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 444 framer_.InsertPacket( |
| 447 &duplicate); | 445 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 448 EXPECT_TRUE(framer_.GetEncodedAudioFrame(&frame, &rtp_timestamp, | 446 EXPECT_TRUE( |
| 449 &next_frame)); | 447 framer_.GetEncodedAudioFrame(&frame, &rtp_timestamp, &next_frame)); |
| 450 EXPECT_TRUE(next_frame); | 448 EXPECT_TRUE(next_frame); |
| 451 EXPECT_EQ(253u, frame.frame_id); | 449 EXPECT_EQ(253u, frame.frame_id); |
| 452 framer_.ReleaseFrame(frame.frame_id); | 450 framer_.ReleaseFrame(frame.frame_id); |
| 453 | 451 |
| 454 // Insert third and fourth packets. | 452 // Insert third and fourth packets. |
| 455 rtp_header_.frame_id = 255; | 453 rtp_header_.frame_id = 255; |
| 456 framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 454 framer_.InsertPacket( |
| 457 &duplicate); | 455 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 458 rtp_header_.frame_id = 256; | 456 rtp_header_.frame_id = 256; |
| 459 framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_, | 457 framer_.InsertPacket( |
| 460 &duplicate); | 458 payload_.data(), payload_.size(), rtp_header_, &duplicate); |
| 461 | 459 |
| 462 // Get third and fourth packets. | 460 // Get third and fourth packets. |
| 463 EXPECT_TRUE(framer_.GetEncodedAudioFrame(&frame, &rtp_timestamp, | 461 EXPECT_TRUE( |
| 464 &next_frame)); | 462 framer_.GetEncodedAudioFrame(&frame, &rtp_timestamp, &next_frame)); |
| 465 EXPECT_FALSE(next_frame); | 463 EXPECT_FALSE(next_frame); |
| 466 EXPECT_EQ(255u, frame.frame_id); | 464 EXPECT_EQ(255u, frame.frame_id); |
| 467 framer_.ReleaseFrame(frame.frame_id); | 465 framer_.ReleaseFrame(frame.frame_id); |
| 468 EXPECT_TRUE(framer_.GetEncodedAudioFrame(&frame, &rtp_timestamp, | 466 EXPECT_TRUE( |
| 469 &next_frame)); | 467 framer_.GetEncodedAudioFrame(&frame, &rtp_timestamp, &next_frame)); |
| 470 EXPECT_TRUE(next_frame); | 468 EXPECT_TRUE(next_frame); |
| 471 EXPECT_EQ(256u, frame.frame_id); | 469 EXPECT_EQ(256u, frame.frame_id); |
| 472 framer_.ReleaseFrame(frame.frame_id); | 470 framer_.ReleaseFrame(frame.frame_id); |
| 473 } | 471 } |
| 474 | 472 |
| 475 } // namespace cast | 473 } // namespace cast |
| 476 } // namespace media | 474 } // namespace media |
| OLD | NEW |