1a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng/*
2a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng *  Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng *
4a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng *  Use of this source code is governed by a BSD-style license
5a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng *  that can be found in the LICENSE file in the root of the source
6a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng *  tree. An additional intellectual property rights grant can be found
7a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng *  in the file PATENTS.  All contributing project authors may
8a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng *  be found in the AUTHORS file in the root of the source tree.
9a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng */
10a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng
11a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng#ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_TRANSPORT_FEEDBACK_H_
12a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_TRANSPORT_FEEDBACK_H_
13a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng
14a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng#include <deque>
15a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng#include <vector>
16a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng
17a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng#include "webrtc/base/constructormagic.h"
18ff761fba8274d93bd73e76c8b8a1f2d0776dd840Henrik Kjellander#include "webrtc/modules/include/module_common_types.h"
19a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng#include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
20a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng
21a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språngnamespace webrtc {
22a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språngnamespace rtcp {
23a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng
24a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språngclass PacketStatusChunk;
25a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng
26a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språngclass TransportFeedback : public RtcpPacket {
27a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng public:
28a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  TransportFeedback();
29a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  virtual ~TransportFeedback();
30a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng
31a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  void WithPacketSenderSsrc(uint32_t ssrc);
32a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  void WithMediaSourceSsrc(uint32_t ssrc);
33a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  void WithBase(uint16_t base_sequence,     // Seq# of first packet in this msg.
34a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng                int64_t ref_timestamp_us);  // Reference timestamp for this msg.
35a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  void WithFeedbackSequenceNumber(uint8_t feedback_sequence);
36a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  // NOTE: This method requires increasing sequence numbers (excepting wraps).
37a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  bool WithReceivedPacket(uint16_t sequence_number, int64_t timestamp_us);
38a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng
39a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  enum class StatusSymbol {
40a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng    kNotReceived,
41a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng    kReceivedSmallDelta,
42a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng    kReceivedLargeDelta,
43a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  };
44a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng
45a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  uint16_t GetBaseSequence() const;
46a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  std::vector<TransportFeedback::StatusSymbol> GetStatusVector() const;
47a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  std::vector<int16_t> GetReceiveDeltas() const;
48a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng
49a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  // Get the reference time in microseconds, including any precision loss.
50a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  int64_t GetBaseTimeUs() const;
51a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  // Convenience method for getting all deltas as microseconds. The first delta
52a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  // is relative the base time.
53a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  std::vector<int64_t> GetReceiveDeltasUs() const;
54a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng
55233bd87d45bbeeec50d7687e7d98c1cfc7f65562sprang  uint32_t GetPacketSenderSsrc() const;
56233bd87d45bbeeec50d7687e7d98c1cfc7f65562sprang  uint32_t GetMediaSourceSsrc() const;
57a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  static const int kDeltaScaleFactor = 250;  // Convert to multiples of 0.25ms.
58a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  static const uint8_t kFeedbackMessageType = 15;  // TODO(sprang): IANA reg?
59a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  static const uint8_t kPayloadType = 205;         // RTPFB, see RFC4585.
60a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng
61a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  static rtc::scoped_ptr<TransportFeedback> ParseFrom(const uint8_t* buffer,
62a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng                                                      size_t length);
63a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng
64a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng protected:
65a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  bool Create(uint8_t* packet,
66a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng              size_t* position,
67a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng              size_t max_length,
68a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng              PacketReadyCallback* callback) const override;
69a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng
70a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  size_t BlockLength() const override;
71a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng
72a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng private:
73a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  static PacketStatusChunk* ParseChunk(const uint8_t* buffer, size_t max_size);
74a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng
75a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  int64_t Unwrap(uint16_t sequence_number);
76a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  bool AddSymbol(StatusSymbol symbol, int64_t seq);
77a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  bool Encode(StatusSymbol symbol);
78a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  bool HandleRleCandidate(StatusSymbol symbol,
79a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng                          int current_capacity,
80a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng                          int delta_size);
81a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  void EmitRemaining();
82a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  void EmitVectorChunk();
83a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  void EmitRunLengthChunk();
84a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng
85a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  uint32_t packet_sender_ssrc_;
86a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  uint32_t media_source_ssrc_;
87a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  int32_t base_seq_;
88a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  int64_t base_time_;
89a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  uint8_t feedback_seq_;
90a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  std::vector<PacketStatusChunk*> status_chunks_;
91a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  std::vector<int16_t> receive_deltas_;
92a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng
93a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  int64_t last_seq_;
94a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  int64_t last_timestamp_;
95a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  std::deque<StatusSymbol> symbol_vec_;
96a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  uint16_t first_symbol_cardinality_;
97a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  bool vec_needs_two_bit_symbols_;
98a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng  uint32_t size_bytes_;
99a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng
1003c089d751ede283e21e186885eaf705c3257ccd2henrikg  RTC_DISALLOW_COPY_AND_ASSIGN(TransportFeedback);
101a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng};
102a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng
103a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng}  // namespace rtcp
104a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng}  // namespace webrtc
105a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_TRANSPORT_FEEDBACK_H_
106