• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #include "base/test/simple_test_tick_clock.h"
6 #include "media/cast/framer/framer.h"
7 #include "media/cast/rtp_receiver/mock_rtp_payload_feedback.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9 
10 namespace media {
11 namespace cast {
12 
13 class FramerTest : public ::testing::Test {
14  protected:
FramerTest()15   FramerTest()
16       : mock_rtp_payload_feedback_(),
17         framer_(&testing_clock_, &mock_rtp_payload_feedback_, 0, true, 0) {
18   }
19 
~FramerTest()20   virtual ~FramerTest() {}
21 
SetUp()22   virtual void SetUp() OVERRIDE {
23     // Build a default one packet frame - populate webrtc header.
24     rtp_header_.is_key_frame = false;
25     rtp_header_.frame_id = 0;
26     rtp_header_.packet_id = 0;
27     rtp_header_.max_packet_id = 0;
28     rtp_header_.is_reference = false;
29     rtp_header_.reference_frame_id = 0;
30     payload_.assign(kIpPacketSize, 0);
31 
32     EXPECT_CALL(mock_rtp_payload_feedback_,
33                 CastFeedback(testing::_)).WillRepeatedly(testing::Return());
34   }
35 
36   std::vector<uint8> payload_;
37   RtpCastHeader rtp_header_;
38   MockRtpPayloadFeedback mock_rtp_payload_feedback_;
39   Framer framer_;
40   base::SimpleTestTickClock testing_clock_;
41 };
42 
43 
TEST_F(FramerTest,EmptyState)44 TEST_F(FramerTest, EmptyState) {
45   EncodedVideoFrame frame;
46   uint32 rtp_timestamp;
47   bool next_frame = false;
48   EXPECT_FALSE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp,
49                                             &next_frame));
50 }
51 
TEST_F(FramerTest,AlwaysStartWithKey)52 TEST_F(FramerTest, AlwaysStartWithKey) {
53   EncodedVideoFrame frame;
54   uint32 rtp_timestamp;
55   bool next_frame = false;
56 
57   // Insert non key first frame.
58   framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
59   EXPECT_FALSE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp,
60                                             &next_frame));
61   rtp_header_.frame_id = 1;
62   rtp_header_.is_key_frame = true;
63   framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
64   EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp,
65                                            &next_frame));
66   EXPECT_TRUE(next_frame);
67   EXPECT_EQ(1u, frame.frame_id);
68   EXPECT_TRUE(frame.key_frame);
69   framer_.ReleaseFrame(frame.frame_id);
70 }
71 
TEST_F(FramerTest,CompleteFrame)72 TEST_F(FramerTest, CompleteFrame) {
73   EncodedVideoFrame frame;
74   uint32 rtp_timestamp;
75   bool next_frame = false;
76 
77   // start with a complete key frame.
78   rtp_header_.is_key_frame = true;
79   framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
80   EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp,
81                                            &next_frame));
82   EXPECT_TRUE(next_frame);
83   EXPECT_EQ(0u, frame.frame_id);
84   EXPECT_TRUE(frame.key_frame);
85   framer_.ReleaseFrame(frame.frame_id);
86 
87   // Incomplete delta.
88   ++rtp_header_.frame_id;
89   rtp_header_.is_key_frame = false;
90   rtp_header_.max_packet_id = 2;
91   framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
92   EXPECT_FALSE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp,
93                                             &next_frame));
94 
95   // Complete delta - can't skip, as incomplete sequence.
96   ++rtp_header_.frame_id;
97   rtp_header_.max_packet_id = 0;
98   framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
99   EXPECT_FALSE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp,
100                                             &next_frame));
101 }
102 
TEST_F(FramerTest,ContinuousSequence)103 TEST_F(FramerTest, ContinuousSequence) {
104   EncodedVideoFrame frame;
105   uint32 rtp_timestamp;
106   bool next_frame = false;
107 
108   // start with a complete key frame.
109   rtp_header_.is_key_frame = true;
110   framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
111   EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp,
112                                            &next_frame));
113   EXPECT_TRUE(next_frame);
114   EXPECT_EQ(0u, frame.frame_id);
115   EXPECT_TRUE(frame.key_frame);
116   framer_.ReleaseFrame(frame.frame_id);
117 
118   // Complete - not continuous.
119   rtp_header_.frame_id = 2;
120   rtp_header_.is_key_frame = false;
121   framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
122   EXPECT_FALSE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp,
123                                             &next_frame));
124 }
125 
TEST_F(FramerTest,Wrap)126 TEST_F(FramerTest, Wrap) {
127   // Insert key frame, frame_id = 255 (will jump to that)
128   EncodedVideoFrame frame;
129   uint32 rtp_timestamp;
130   bool next_frame = false;
131 
132   // Start with a complete key frame.
133   rtp_header_.is_key_frame = true;
134   rtp_header_.frame_id = 255u;
135   framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
136   EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp,
137                                            &next_frame));
138   EXPECT_TRUE(next_frame);
139   EXPECT_EQ(255u, frame.frame_id);
140   framer_.ReleaseFrame(frame.frame_id);
141 
142   // Insert wrapped delta frame - should be continuous.
143   rtp_header_.is_key_frame = false;
144   rtp_header_.frame_id = 256;
145   framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
146   EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp,
147                                            &next_frame));
148   EXPECT_TRUE(next_frame);
149   EXPECT_EQ(256u, frame.frame_id);
150   framer_.ReleaseFrame(frame.frame_id);
151 }
152 
TEST_F(FramerTest,Reset)153 TEST_F(FramerTest, Reset) {
154   EncodedVideoFrame frame;
155   uint32 rtp_timestamp;
156   bool next_frame = false;
157 
158   // Start with a complete key frame.
159   rtp_header_.is_key_frame = true;
160   framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
161   framer_.Reset();
162   EXPECT_FALSE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp,
163                                             &next_frame));
164 }
165 
TEST_F(FramerTest,RequireKeyAfterReset)166 TEST_F(FramerTest, RequireKeyAfterReset) {
167   EncodedVideoFrame frame;
168   uint32 rtp_timestamp;
169   bool next_frame = false;
170   framer_.Reset();
171 
172   // Start with a complete key frame.
173   rtp_header_.is_key_frame = false;
174   rtp_header_.frame_id = 0u;
175   framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
176   EXPECT_FALSE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp,
177                                             &next_frame));
178   rtp_header_.frame_id = 1;
179   rtp_header_.is_key_frame = true;
180   framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
181   EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp,
182                                            &next_frame));
183   EXPECT_TRUE(next_frame);
184 }
185 
TEST_F(FramerTest,BasicNonLastReferenceId)186 TEST_F(FramerTest, BasicNonLastReferenceId) {
187   EncodedVideoFrame frame;
188   uint32 rtp_timestamp;
189   bool next_frame = false;
190   rtp_header_.is_key_frame = true;
191   rtp_header_.frame_id = 0;
192   framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
193 
194   EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp,
195                                            &next_frame));
196   framer_.ReleaseFrame(frame.frame_id);
197 
198   rtp_header_.is_key_frame = false;
199   rtp_header_.is_reference = true;
200   rtp_header_.reference_frame_id = 0;
201   rtp_header_.frame_id = 5u;
202   framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
203 
204   EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp,
205                                            &next_frame));
206   EXPECT_FALSE(next_frame);
207 }
208 
TEST_F(FramerTest,InOrderReferenceFrameSelection)209 TEST_F(FramerTest, InOrderReferenceFrameSelection) {
210   // Create pattern: 0, 1, 4, 5.
211   EncodedVideoFrame frame;
212   uint32 rtp_timestamp;
213   bool next_frame = false;
214 
215   rtp_header_.is_key_frame = true;
216   rtp_header_.frame_id = 0;
217   framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
218   rtp_header_.is_key_frame = false;
219   rtp_header_.frame_id = 1;
220   framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
221 
222   // Insert frame #2 partially.
223   rtp_header_.frame_id = 2;
224   rtp_header_.max_packet_id = 1;
225   framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
226   rtp_header_.frame_id = 4;
227   rtp_header_.max_packet_id = 0;
228   rtp_header_.is_reference = true;
229   rtp_header_.reference_frame_id = 0;
230   framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
231   EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp,
232                                            &next_frame));
233   EXPECT_EQ(0u, frame.frame_id);
234   framer_.ReleaseFrame(frame.frame_id);
235   EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp,
236                                            &next_frame));
237   EXPECT_TRUE(next_frame);
238   EXPECT_EQ(1u, frame.frame_id);
239   framer_.ReleaseFrame(frame.frame_id);
240   EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp,
241                                            &next_frame));
242   EXPECT_FALSE(next_frame);
243   EXPECT_EQ(4u, frame.frame_id);
244   framer_.ReleaseFrame(frame.frame_id);
245   // Insert remaining packet of frame #2 - should no be continuous.
246   rtp_header_.frame_id = 2;
247   rtp_header_.packet_id = 1;
248   framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
249   EXPECT_FALSE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp,
250                                             &next_frame));
251   rtp_header_.is_reference = false;
252   rtp_header_.frame_id = 5;
253   rtp_header_.packet_id = 0;
254   rtp_header_.max_packet_id = 0;
255   framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
256   EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &rtp_timestamp,
257                                            &next_frame));
258   EXPECT_TRUE(next_frame);
259   EXPECT_EQ(5u, frame.frame_id);
260 }
261 
TEST_F(FramerTest,AudioWrap)262 TEST_F(FramerTest, AudioWrap) {
263   // All audio frames are marked as key frames.
264   EncodedAudioFrame frame;
265   uint32 rtp_timestamp;
266   bool next_frame = false;
267   rtp_header_.is_key_frame = true;
268   rtp_header_.frame_id = 254;
269 
270   framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
271   EXPECT_TRUE(framer_.GetEncodedAudioFrame(&frame, &rtp_timestamp,
272                                            &next_frame));
273   EXPECT_TRUE(next_frame);
274   EXPECT_EQ(254u, frame.frame_id);
275   framer_.ReleaseFrame(frame.frame_id);
276 
277   rtp_header_.frame_id = 255;
278   framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
279 
280   // Insert wrapped frame - should be continuous.
281   rtp_header_.frame_id = 256;
282   framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
283 
284   EXPECT_TRUE(framer_.GetEncodedAudioFrame(&frame, &rtp_timestamp,
285                                            &next_frame));
286   EXPECT_TRUE(next_frame);
287   EXPECT_EQ(255u, frame.frame_id);
288   framer_.ReleaseFrame(frame.frame_id);
289 
290   EXPECT_TRUE(framer_.GetEncodedAudioFrame(&frame, &rtp_timestamp,
291                                            &next_frame));
292   EXPECT_TRUE(next_frame);
293   EXPECT_EQ(256u, frame.frame_id);
294   framer_.ReleaseFrame(frame.frame_id);
295 }
296 
TEST_F(FramerTest,AudioWrapWithMissingFrame)297 TEST_F(FramerTest, AudioWrapWithMissingFrame) {
298   // All audio frames are marked as key frames.
299   EncodedAudioFrame frame;
300   uint32 rtp_timestamp;
301   bool next_frame = false;
302 
303   // Insert and get first packet.
304   rtp_header_.is_key_frame = true;
305   rtp_header_.frame_id = 253;
306   framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
307   EXPECT_TRUE(framer_.GetEncodedAudioFrame(&frame, &rtp_timestamp,
308                                            &next_frame));
309   EXPECT_TRUE(next_frame);
310   EXPECT_EQ(253u, frame.frame_id);
311   framer_.ReleaseFrame(frame.frame_id);
312 
313   // Insert third and fourth packets.
314   rtp_header_.frame_id = 255;
315   framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
316   rtp_header_.frame_id = 256;
317   framer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
318 
319   // Get third and fourth packets.
320   EXPECT_TRUE(framer_.GetEncodedAudioFrame(&frame, &rtp_timestamp,
321                                            &next_frame));
322   EXPECT_FALSE(next_frame);
323   EXPECT_EQ(255u, frame.frame_id);
324   framer_.ReleaseFrame(frame.frame_id);
325   EXPECT_TRUE(framer_.GetEncodedAudioFrame(&frame, &rtp_timestamp,
326                                            &next_frame));
327   EXPECT_TRUE(next_frame);
328   EXPECT_EQ(256u, frame.frame_id);
329   framer_.ReleaseFrame(frame.frame_id);
330 }
331 
332 }  // namespace cast
333 }  // namespace media
334