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, CreateAndParseTimingFrameExtension) { | |
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.packetization_finish_delta_ms = 5; | |
515 timing.flags = | |
516 TimingFrameFlags::kTriggeredByTimer + TimingFrameFlags::kTriggeredBySize; | |
517 | |
518 send_packet.SetExtension<VideoTimingExtension>(timing); | |
519 | |
520 // Serialize the packet and then parse it again. | |
521 RtpPacketReceived::ExtensionManager extensions; | |
522 extensions.Register<VideoTimingExtension>(kVideoTimingExtensionId); | |
523 RtpPacketReceived receive_packet(&extensions); | |
524 EXPECT_TRUE(receive_packet.Parse(send_packet.Buffer())); | |
525 | |
526 VideoSendTiming receivied_timing; | |
527 EXPECT_TRUE( | |
528 receive_packet.GetExtension<VideoTimingExtension>(&receivied_timing)); | |
529 | |
530 // Only check first and last timestamp (covered by other tests) plus flags. | |
531 EXPECT_EQ(receivied_timing.encode_start_delta_ms, | |
532 timing.encode_start_delta_ms); | |
533 EXPECT_EQ(receivied_timing.packetization_finish_delta_ms, | |
534 timing.packetization_finish_delta_ms); | |
535 EXPECT_EQ(receivied_timing.flags, timing.flags); | |
536 } | |
537 | |
538 TEST(RtpPacketTest, ParseLegacyTimingFrameExtension) { | |
539 // Create a packet with video frame timing extension populated. | |
540 RtpPacketToSend::ExtensionManager send_extensions; | |
541 send_extensions.Register(kRtpExtensionVideoTiming, kVideoTimingExtensionId); | |
542 RtpPacketToSend send_packet(&send_extensions); | |
543 send_packet.SetPayloadType(kPayloadType); | |
544 send_packet.SetSequenceNumber(kSeqNum); | |
545 send_packet.SetTimestamp(kTimestamp); | |
546 send_packet.SetSsrc(kSsrc); | |
547 | |
548 VideoSendTiming timing; | |
549 timing.encode_start_delta_ms = 1; | |
550 timing.packetization_finish_delta_ms = 5; | |
551 timing.flags = | |
552 TimingFrameFlags::kTriggeredByTimer + TimingFrameFlags::kTriggeredBySize; | |
553 | |
554 send_packet.SetExtension<VideoTimingExtension>(timing); | |
555 | |
556 // Modify the sent packet so that the old VideoTimingExtension format is used. | |
danilchap
2017/08/11 13:51:16
May be it is simpler and more robust to assemble s
sprang_webrtc
2017/08/11 15:06:34
Done.
| |
557 rtc::ArrayView<const uint8_t> raw_extension = | |
558 send_packet.GetRawExtension(kVideoTimingExtensionId); | |
559 rtc::CopyOnWriteBuffer buffer = send_packet.Buffer(); | |
560 ptrdiff_t start_offset = raw_extension.cbegin() - buffer.cdata(); | |
561 | |
562 // Turn last byte of header extension into padding. | |
563 const uint8_t kExtensionLength = VideoTimingExtension::kValueSizeBytes; | |
564 buffer[start_offset + kExtensionLength - 1] = 0; | |
565 // Validate one-byte header and reduce length by one. | |
566 const uint8_t onebyte_header = buffer[start_offset - 1]; | |
567 EXPECT_EQ(onebyte_header, | |
568 (kVideoTimingExtensionId << 4) | (kExtensionLength - 1)); | |
569 buffer[send_packet.headers_size() - kExtensionLength] = | |
570 (kVideoTimingExtensionId << 4) | (kExtensionLength - 2); | |
571 | |
572 // Parse the modified packet. | |
573 RtpPacketReceived::ExtensionManager extensions; | |
574 extensions.Register<VideoTimingExtension>(kVideoTimingExtensionId); | |
575 RtpPacketReceived receive_packet(&extensions); | |
576 EXPECT_TRUE(receive_packet.Parse(buffer)); | |
577 VideoSendTiming receivied_timing; | |
578 EXPECT_TRUE( | |
579 receive_packet.GetExtension<VideoTimingExtension>(&receivied_timing)); | |
580 | |
581 // Check first and last timestamp are still OK. Flags should now be 0. | |
582 EXPECT_EQ(receivied_timing.encode_start_delta_ms, | |
583 timing.encode_start_delta_ms); | |
584 EXPECT_EQ(receivied_timing.packetization_finish_delta_ms, | |
585 timing.packetization_finish_delta_ms); | |
586 EXPECT_EQ(receivied_timing.flags, 0); | |
587 } | |
588 | |
501 } // namespace webrtc | 589 } // namespace webrtc |
OLD | NEW |