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

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h

Issue 2616343003: Refactor TransportFeedback ensuring it's consistency: (Closed)
Patch Set: . Created 3 years, 11 months 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) 2015 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2015 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 #ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_TRANSPORT_FEEDBACK_H_ 11 #ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_TRANSPORT_FEEDBACK_H_
12 #define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_TRANSPORT_FEEDBACK_H_ 12 #define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_TRANSPORT_FEEDBACK_H_
13 13
14 #include <deque> 14 #include <deque>
15 #include <memory> 15 #include <memory>
16 #include <vector> 16 #include <vector>
17 17
18 #include "webrtc/base/constructormagic.h" 18 #include "webrtc/base/constructormagic.h"
19 #include "webrtc/base/deprecation.h" 19 #include "webrtc/base/deprecation.h"
20 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rtpfb.h" 20 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rtpfb.h"
21 21
22 namespace webrtc { 22 namespace webrtc {
23 namespace rtcp { 23 namespace rtcp {
24 class CommonHeader; 24 class CommonHeader;
25 25
26 class TransportFeedback : public Rtpfb { 26 class TransportFeedback : public Rtpfb {
27 public: 27 public:
28 class PacketStatusChunk;
29 // TODO(sprang): IANA reg? 28 // TODO(sprang): IANA reg?
30 static constexpr uint8_t kFeedbackMessageType = 15; 29 static constexpr uint8_t kFeedbackMessageType = 15;
31 // Convert to multiples of 0.25ms. 30 // Convert to multiples of 0.25ms.
32 static constexpr int kDeltaScaleFactor = 250; 31 static constexpr int kDeltaScaleFactor = 250;
32 // Maximum number of packets (including missing) TransportFeedback can report.
33 static constexpr size_t kMaxReportedPackets = 0xffff;
33 34
34 TransportFeedback(); 35 TransportFeedback();
35 ~TransportFeedback() override; 36 ~TransportFeedback() override;
36 37
37 void SetBase(uint16_t base_sequence, // Seq# of first packet in this msg. 38 void SetBase(uint16_t base_sequence, // Seq# of first packet in this msg.
38 int64_t ref_timestamp_us); // Reference timestamp for this msg. 39 int64_t ref_timestamp_us); // Reference timestamp for this msg.
39 void SetFeedbackSequenceNumber(uint8_t feedback_sequence); 40 void SetFeedbackSequenceNumber(uint8_t feedback_sequence);
40 // NOTE: This method requires increasing sequence numbers (excepting wraps). 41 // NOTE: This method requires increasing sequence numbers (excepting wraps).
41 bool AddReceivedPacket(uint16_t sequence_number, int64_t timestamp_us); 42 bool AddReceivedPacket(uint16_t sequence_number, int64_t timestamp_us);
42 43
(...skipping 10 matching lines...) Expand all
53 // Get the reference time in microseconds, including any precision loss. 54 // Get the reference time in microseconds, including any precision loss.
54 int64_t GetBaseTimeUs() const; 55 int64_t GetBaseTimeUs() const;
55 // Convenience method for getting all deltas as microseconds. The first delta 56 // Convenience method for getting all deltas as microseconds. The first delta
56 // is relative the base time. 57 // is relative the base time.
57 std::vector<int64_t> GetReceiveDeltasUs() const; 58 std::vector<int64_t> GetReceiveDeltasUs() const;
58 59
59 bool Parse(const CommonHeader& packet); 60 bool Parse(const CommonHeader& packet);
60 static std::unique_ptr<TransportFeedback> ParseFrom(const uint8_t* buffer, 61 static std::unique_ptr<TransportFeedback> ParseFrom(const uint8_t* buffer,
61 size_t length); 62 size_t length);
62 63
63 RTC_DEPRECATED
64 void WithPacketSenderSsrc(uint32_t ssrc) { SetSenderSsrc(ssrc); }
65 RTC_DEPRECATED
66 void WithMediaSourceSsrc(uint32_t ssrc) { SetMediaSsrc(ssrc); }
67 RTC_DEPRECATED
68 void WithBase(uint16_t base_sequence, int64_t ref_timestamp_us) {
69 SetBase(base_sequence, ref_timestamp_us);
70 }
71 RTC_DEPRECATED
72 void WithFeedbackSequenceNumber(uint8_t feedback_sequence) {
73 SetFeedbackSequenceNumber(feedback_sequence);
74 }
75 RTC_DEPRECATED
76 bool WithReceivedPacket(uint16_t sequence_number, int64_t timestamp_us) {
77 return AddReceivedPacket(sequence_number, timestamp_us);
78 }
79
80 protected: 64 protected:
81 bool Create(uint8_t* packet, 65 bool Create(uint8_t* packet,
82 size_t* position, 66 size_t* position,
83 size_t max_length, 67 size_t max_length,
84 PacketReadyCallback* callback) const override; 68 PacketReadyCallback* callback) const override;
85 69
86 size_t BlockLength() const override; 70 size_t BlockLength() const override;
87 71
88 private: 72 private:
89 static PacketStatusChunk* ParseChunk(const uint8_t* buffer, size_t max_size); 73 using DeltaSize = uint8_t;
74 class LastChunk;
75 struct ReceivedPacket {
76 ReceivedPacket(uint16_t sequence_number, int16_t delta_ticks)
77 : sequence_number(sequence_number), delta_ticks(delta_ticks) {}
78 uint16_t sequence_number;
79 int16_t delta_ticks;
80 };
81 // Pre and postcondition for all public methods.
82 bool IsConsistent() const;
90 83
91 int64_t Unwrap(uint16_t sequence_number); 84 // Reset packet to consistent empty state.
92 bool AddSymbol(StatusSymbol symbol, int64_t seq); 85 void Clear();
93 bool Encode(StatusSymbol symbol);
94 bool HandleRleCandidate(StatusSymbol symbol,
95 int current_capacity,
96 int delta_size);
97 void EmitRemaining();
98 void EmitVectorChunk();
99 void EmitRunLengthChunk();
100 86
101 int32_t base_seq_; 87 bool AddDeltaSize(DeltaSize delta_size);
102 int64_t base_time_; 88
89 uint16_t base_seq_no_;
90 uint16_t num_seq_no_;
91 int32_t base_time_ticks_;
103 uint8_t feedback_seq_; 92 uint8_t feedback_seq_;
104 std::vector<PacketStatusChunk*> status_chunks_;
105 std::vector<int16_t> receive_deltas_;
106 93
107 int64_t last_seq_; 94 int64_t last_timestamp_us_;
108 int64_t last_timestamp_; 95 std::vector<ReceivedPacket> packets_;
109 std::deque<StatusSymbol> symbol_vec_; 96 std::vector<uint16_t> chunks_;
110 uint16_t first_symbol_cardinality_; 97 const std::unique_ptr<LastChunk> last_chunk_;
111 bool vec_needs_two_bit_symbols_; 98 size_t size_bytes_;
112 uint32_t size_bytes_;
113 99
114 RTC_DISALLOW_COPY_AND_ASSIGN(TransportFeedback); 100 RTC_DISALLOW_COPY_AND_ASSIGN(TransportFeedback);
115 }; 101 };
116 102
117 } // namespace rtcp 103 } // namespace rtcp
118 } // namespace webrtc 104 } // namespace webrtc
119 #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_TRANSPORT_FEEDBACK_H_ 105 #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_TRANSPORT_FEEDBACK_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698