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

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: nits 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
« no previous file with comments | « no previous file | webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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>
15 #include <memory> 14 #include <memory>
16 #include <vector> 15 #include <vector>
17 16
18 #include "webrtc/base/constructormagic.h" 17 #include "webrtc/base/constructormagic.h"
19 #include "webrtc/base/deprecation.h"
20 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rtpfb.h" 18 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rtpfb.h"
21 19
22 namespace webrtc { 20 namespace webrtc {
23 namespace rtcp { 21 namespace rtcp {
24 class CommonHeader; 22 class CommonHeader;
25 23
26 class TransportFeedback : public Rtpfb { 24 class TransportFeedback : public Rtpfb {
27 public: 25 public:
28 class PacketStatusChunk;
29 // TODO(sprang): IANA reg? 26 // TODO(sprang): IANA reg?
30 static constexpr uint8_t kFeedbackMessageType = 15; 27 static constexpr uint8_t kFeedbackMessageType = 15;
31 // Convert to multiples of 0.25ms. 28 // Convert to multiples of 0.25ms.
32 static constexpr int kDeltaScaleFactor = 250; 29 static constexpr int kDeltaScaleFactor = 250;
30 // Maximum number of packets (including missing) TransportFeedback can report.
31 static constexpr size_t kMaxReportedPackets = 0xffff;
33 32
34 TransportFeedback(); 33 TransportFeedback();
35 ~TransportFeedback() override; 34 ~TransportFeedback() override;
36 35
37 void SetBase(uint16_t base_sequence, // Seq# of first packet in this msg. 36 void SetBase(uint16_t base_sequence, // Seq# of first packet in this msg.
38 int64_t ref_timestamp_us); // Reference timestamp for this msg. 37 int64_t ref_timestamp_us); // Reference timestamp for this msg.
39 void SetFeedbackSequenceNumber(uint8_t feedback_sequence); 38 void SetFeedbackSequenceNumber(uint8_t feedback_sequence);
40 // NOTE: This method requires increasing sequence numbers (excepting wraps). 39 // NOTE: This method requires increasing sequence numbers (excepting wraps).
41 bool AddReceivedPacket(uint16_t sequence_number, int64_t timestamp_us); 40 bool AddReceivedPacket(uint16_t sequence_number, int64_t timestamp_us);
42 41
43 enum class StatusSymbol { 42 enum class StatusSymbol {
44 kNotReceived, 43 kNotReceived,
45 kReceivedSmallDelta, 44 kReceivedSmallDelta,
46 kReceivedLargeDelta, 45 kReceivedLargeDelta,
47 }; 46 };
48 47
49 uint16_t GetBaseSequence() const; 48 uint16_t GetBaseSequence() const;
50 std::vector<TransportFeedback::StatusSymbol> GetStatusVector() const; 49 std::vector<TransportFeedback::StatusSymbol> GetStatusVector() const;
51 std::vector<int16_t> GetReceiveDeltas() const; 50 std::vector<int16_t> GetReceiveDeltas() const;
52 51
53 // Get the reference time in microseconds, including any precision loss. 52 // Get the reference time in microseconds, including any precision loss.
54 int64_t GetBaseTimeUs() const; 53 int64_t GetBaseTimeUs() const;
55 // Convenience method for getting all deltas as microseconds. The first delta 54 // Convenience method for getting all deltas as microseconds. The first delta
56 // is relative the base time. 55 // is relative the base time.
57 std::vector<int64_t> GetReceiveDeltasUs() const; 56 std::vector<int64_t> GetReceiveDeltasUs() const;
58 57
59 bool Parse(const CommonHeader& packet); 58 bool Parse(const CommonHeader& packet);
60 static std::unique_ptr<TransportFeedback> ParseFrom(const uint8_t* buffer, 59 static std::unique_ptr<TransportFeedback> ParseFrom(const uint8_t* buffer,
61 size_t length); 60 size_t length);
62 61 // Pre and postcondition for all public methods. Should always return true.
63 RTC_DEPRECATED 62 // This function is for tests.
64 void WithPacketSenderSsrc(uint32_t ssrc) { SetSenderSsrc(ssrc); } 63 bool IsConsistent() const;
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 64
80 protected: 65 protected:
81 bool Create(uint8_t* packet, 66 bool Create(uint8_t* packet,
82 size_t* position, 67 size_t* position,
83 size_t max_length, 68 size_t max_length,
84 PacketReadyCallback* callback) const override; 69 PacketReadyCallback* callback) const override;
85 70
86 size_t BlockLength() const override; 71 size_t BlockLength() const override;
87 72
88 private: 73 private:
89 static PacketStatusChunk* ParseChunk(const uint8_t* buffer, size_t max_size); 74 // Size in bytes of a delta time in rtcp packet.
75 // Valid values are 0 (packet wasn't received), 1 or 2.
76 using DeltaSize = uint8_t;
77 // Keeps DeltaSizes that can be encoded into single chunk if it is last chunk.
78 class LastChunk;
79 struct ReceivedPacket {
80 ReceivedPacket(uint16_t sequence_number, int16_t delta_ticks)
81 : sequence_number(sequence_number), delta_ticks(delta_ticks) {}
82 uint16_t sequence_number;
83 int16_t delta_ticks;
84 };
90 85
91 int64_t Unwrap(uint16_t sequence_number); 86 // Reset packet to consistent empty state.
92 bool AddSymbol(StatusSymbol symbol, int64_t seq); 87 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 88
101 int32_t base_seq_; 89 bool AddDeltaSize(DeltaSize delta_size);
102 int64_t base_time_; 90
91 uint16_t base_seq_no_;
92 uint16_t num_seq_no_;
93 int32_t base_time_ticks_;
103 uint8_t feedback_seq_; 94 uint8_t feedback_seq_;
104 std::vector<PacketStatusChunk*> status_chunks_;
105 std::vector<int16_t> receive_deltas_;
106 95
107 int64_t last_seq_; 96 int64_t last_timestamp_us_;
108 int64_t last_timestamp_; 97 std::vector<ReceivedPacket> packets_;
109 std::deque<StatusSymbol> symbol_vec_; 98 // All but last encoded packet chunks.
110 uint16_t first_symbol_cardinality_; 99 std::vector<uint16_t> encoded_chunks_;
111 bool vec_needs_two_bit_symbols_; 100 const std::unique_ptr<LastChunk> last_chunk_;
112 uint32_t size_bytes_; 101 size_t size_bytes_;
113 102
114 RTC_DISALLOW_COPY_AND_ASSIGN(TransportFeedback); 103 RTC_DISALLOW_COPY_AND_ASSIGN(TransportFeedback);
115 }; 104 };
116 105
117 } // namespace rtcp 106 } // namespace rtcp
118 } // namespace webrtc 107 } // namespace webrtc
119 #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_TRANSPORT_FEEDBACK_H_ 108 #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_TRANSPORT_FEEDBACK_H_
OLDNEW
« no previous file with comments | « no previous file | webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698