OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 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 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h" | 10 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h" |
(...skipping 14 matching lines...) Expand all Loading... | |
25 constexpr int8_t kPayloadType = 100; | 25 constexpr int8_t kPayloadType = 100; |
26 constexpr uint32_t kSsrc = 0x12345678; | 26 constexpr uint32_t kSsrc = 0x12345678; |
27 constexpr uint16_t kSeqNum = 0x1234; | 27 constexpr uint16_t kSeqNum = 0x1234; |
28 constexpr uint8_t kSeqNumFirstByte = kSeqNum >> 8; | 28 constexpr uint8_t kSeqNumFirstByte = kSeqNum >> 8; |
29 constexpr uint8_t kSeqNumSecondByte = kSeqNum & 0xff; | 29 constexpr uint8_t kSeqNumSecondByte = kSeqNum & 0xff; |
30 constexpr uint32_t kTimestamp = 0x65431278; | 30 constexpr uint32_t kTimestamp = 0x65431278; |
31 constexpr uint8_t kTransmissionOffsetExtensionId = 1; | 31 constexpr uint8_t kTransmissionOffsetExtensionId = 1; |
32 constexpr uint8_t kAudioLevelExtensionId = 9; | 32 constexpr uint8_t kAudioLevelExtensionId = 9; |
33 constexpr uint8_t kRtpStreamIdExtensionId = 0xa; | 33 constexpr uint8_t kRtpStreamIdExtensionId = 0xa; |
34 constexpr uint8_t kRtpMidExtensionId = 0xb; | 34 constexpr uint8_t kRtpMidExtensionId = 0xb; |
35 constexpr uint8_t kVideoTimingExtensionId = 0xc; | |
35 constexpr int32_t kTimeOffset = 0x56ce; | 36 constexpr int32_t kTimeOffset = 0x56ce; |
36 constexpr bool kVoiceActive = true; | 37 constexpr bool kVoiceActive = true; |
37 constexpr uint8_t kAudioLevel = 0x5a; | 38 constexpr uint8_t kAudioLevel = 0x5a; |
38 constexpr char kStreamId[] = "streamid"; | 39 constexpr char kStreamId[] = "streamid"; |
39 constexpr char kMid[] = "mid"; | 40 constexpr char kMid[] = "mid"; |
40 constexpr size_t kMaxPaddingSize = 224u; | 41 constexpr size_t kMaxPaddingSize = 224u; |
41 // clang-format off | 42 // clang-format off |
42 constexpr uint8_t kMinimumPacket[] = { | 43 constexpr uint8_t kMinimumPacket[] = { |
43 0x80, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte, | 44 0x80, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte, |
44 0x65, 0x43, 0x12, 0x78, | 45 0x65, 0x43, 0x12, 0x78, |
(...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
491 | 492 |
492 ASSERT_TRUE(packet.Parse(kPacket, sizeof(kPacket))); | 493 ASSERT_TRUE(packet.Parse(kPacket, sizeof(kPacket))); |
493 | 494 |
494 EXPECT_FALSE(packet.HasRawExtension(kInvalidId)); | 495 EXPECT_FALSE(packet.HasRawExtension(kInvalidId)); |
495 EXPECT_THAT(packet.GetRawExtension(kInvalidId), IsEmpty()); | 496 EXPECT_THAT(packet.GetRawExtension(kInvalidId), IsEmpty()); |
496 const uint8_t kExtension[] = {'e', 'x', 't'}; | 497 const uint8_t kExtension[] = {'e', 'x', 't'}; |
497 EXPECT_FALSE(packet.SetRawExtension(kInvalidId, kExtension)); | 498 EXPECT_FALSE(packet.SetRawExtension(kInvalidId, kExtension)); |
498 EXPECT_THAT(packet.AllocateRawExtension(kInvalidId, 3), IsEmpty()); | 499 EXPECT_THAT(packet.AllocateRawExtension(kInvalidId, 3), IsEmpty()); |
499 } | 500 } |
500 | 501 |
502 TEST(RtpPacketTest, TimingFrameExtension) { | |
danilchap
2017/08/11 12:22:36
Prefer to split this test into 2-3 smaller tests:
sprang_webrtc
2017/08/11 13:19:05
Done.
| |
503 // Create a packet with video frame timing extension populated. | |
504 RtpPacketToSend::ExtensionManager send_extensions; | |
505 send_extensions.Register(kRtpExtensionVideoTiming, kVideoTimingExtensionId); | |
506 RtpPacketToSend send_packet(&send_extensions); | |
507 send_packet.SetPayloadType(kPayloadType); | |
508 send_packet.SetSequenceNumber(kSeqNum); | |
509 send_packet.SetTimestamp(kTimestamp); | |
510 send_packet.SetSsrc(kSsrc); | |
511 | |
512 VideoSendTiming timing; | |
513 timing.encode_start_delta_ms = 1; | |
514 timing.encode_finish_delta_ms = 2; | |
515 timing.packetization_finish_delta_ms = 3; | |
516 timing.pacer_exit_delta_ms = 4; | |
517 timing.packetization_finish_delta_ms = 5; | |
518 timing.flags = | |
519 TimingFrameFlags::kTriggeredByTimer + TimingFrameFlags::kTriggeredBySize; | |
520 | |
521 send_packet.SetExtension<VideoTimingExtension>(timing); | |
522 | |
523 // Serialize the packet and then parse it again. | |
524 RtpPacketReceived::ExtensionManager extensions; | |
525 extensions.Register<VideoTimingExtension>(kVideoTimingExtensionId); | |
526 RtpPacketReceived receive_packet(&extensions); | |
527 rtc::CopyOnWriteBuffer buffer = send_packet.Buffer(); | |
528 EXPECT_TRUE(receive_packet.Parse(buffer)); | |
529 | |
530 VideoSendTiming receivied_timing; | |
531 EXPECT_TRUE( | |
532 receive_packet.GetExtension<VideoTimingExtension>(&receivied_timing)); | |
533 | |
534 // Only check first and last timestamp (covered by other tests) plus flags. | |
535 EXPECT_EQ(receivied_timing.encode_start_delta_ms, | |
536 timing.encode_start_delta_ms); | |
537 EXPECT_EQ(receivied_timing.packetization_finish_delta_ms, | |
538 timing.packetization_finish_delta_ms); | |
539 EXPECT_EQ(receivied_timing.flags, timing.flags); | |
540 | |
541 // Modify the sent packet so that the old VideoTimingExtension format is used. | |
542 rtc::ArrayView<const uint8_t> raw_extension = | |
543 receive_packet.GetRawExtension(kVideoTimingExtensionId); | |
544 ptrdiff_t start_offset = raw_extension.cbegin() - buffer.cdata(); | |
545 const uint8_t kExtensionLength = VideoTimingExtension::kValueSizeBytes; | |
546 | |
547 // Turn last byte of header extension into padding. | |
548 buffer[start_offset + kExtensionLength - 1] = 0; | |
549 // Validate one-byte header and reduce length by one. | |
550 const uint8_t onebyte_header = buffer[start_offset - 1]; | |
551 EXPECT_EQ(onebyte_header, | |
552 (kVideoTimingExtensionId << 4) | (kExtensionLength - 1)); | |
553 buffer[receive_packet.headers_size() - kExtensionLength] = | |
554 (kVideoTimingExtensionId << 4) | (kExtensionLength - 2); | |
555 | |
556 // Parse the modified packet. | |
557 EXPECT_TRUE(receive_packet.Parse(buffer)); | |
558 EXPECT_TRUE( | |
559 receive_packet.GetExtension<VideoTimingExtension>(&receivied_timing)); | |
560 | |
561 // Check first and last timestamp are still OK. Flags should now be 0. | |
562 EXPECT_EQ(receivied_timing.encode_start_delta_ms, | |
563 timing.encode_start_delta_ms); | |
564 EXPECT_EQ(receivied_timing.packetization_finish_delta_ms, | |
565 timing.packetization_finish_delta_ms); | |
566 EXPECT_EQ(receivied_timing.flags, 0); | |
567 } | |
568 | |
501 } // namespace webrtc | 569 } // namespace webrtc |
OLD | NEW |