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