tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

rtcp_packet.h (3919B)


      1 /*
      2 *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
      3 *
      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
      6 *  tree. An additional intellectual property rights grant can be found
      7 *  in the file PATENTS.  All contributing project authors may
      8 *  be found in the AUTHORS file in the root of the source tree.
      9 *
     10 */
     11 #ifndef MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_H_
     12 #define MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_H_
     13 
     14 #include <stddef.h>
     15 #include <stdint.h>
     16 
     17 #include "api/array_view.h"
     18 #include "api/function_view.h"
     19 #include "rtc_base/buffer.h"
     20 
     21 namespace webrtc {
     22 namespace rtcp {
     23 // Class for building RTCP packets.
     24 //
     25 //  Example:
     26 //  ReportBlock report_block;
     27 //  report_block.SetMediaSsrc(234);
     28 //  report_block.SetFractionLost(10);
     29 //
     30 //  ReceiverReport rr;
     31 //  rr.SetSenderSsrc(123);
     32 //  rr.AddReportBlock(report_block);
     33 //
     34 //  Fir fir;
     35 //  fir.SetSenderSsrc(123);
     36 //  fir.AddRequestTo(234, 56);
     37 //
     38 //  size_t length = 0;                     // Builds an intra frame request
     39 //  uint8_t packet[kPacketSize];           // with sequence number 56.
     40 //  fir.Build(packet, &length, kPacketSize);
     41 //
     42 //  Buffer packet = fir.Build();  // Returns a RawPacket holding
     43 //                                // the built rtcp packet.
     44 //
     45 //  CompoundPacket compound;      // Builds a compound RTCP packet with
     46 //  compound.Append(&rr);         // a receiver report, report block
     47 //  compound.Append(&fir);        // and fir message.
     48 //  Buffer packet = compound.Build();
     49 
     50 class RtcpPacket {
     51 public:
     52  // Callback used to signal that an RTCP packet is ready. Note that this may
     53  // not contain all data in this RtcpPacket; if a packet cannot fit in
     54  // max_length bytes, it will be fragmented and multiple calls to this
     55  // callback will be made.
     56  using PacketReadyCallback =
     57      FunctionView<void(ArrayView<const uint8_t> packet)>;
     58 
     59  virtual ~RtcpPacket() = default;
     60 
     61  void SetSenderSsrc(uint32_t ssrc) { sender_ssrc_ = ssrc; }
     62  uint32_t sender_ssrc() const { return sender_ssrc_; }
     63 
     64  // Convenience method mostly used for test. Creates packet without
     65  // fragmentation using BlockLength() to allocate big enough buffer.
     66  Buffer Build() const;
     67 
     68  // Returns true if call to Create succeeded.
     69  bool Build(size_t max_length, PacketReadyCallback callback) const;
     70 
     71  // Size of this packet in bytes (including headers).
     72  virtual size_t BlockLength() const = 0;
     73 
     74  // Creates packet in the given buffer at the given position.
     75  // Calls PacketReadyCallback::OnPacketReady if remaining buffer is too small
     76  // and assume buffer can be reused after OnPacketReady returns.
     77  virtual bool Create(uint8_t* packet,
     78                      size_t* index,
     79                      size_t max_length,
     80                      PacketReadyCallback callback) const = 0;
     81 
     82 protected:
     83  // Size of the rtcp common header.
     84  static constexpr size_t kHeaderLength = 4;
     85  RtcpPacket() {}
     86 
     87  static void CreateHeader(size_t count_or_format,
     88                           uint8_t packet_type,
     89                           size_t block_length,  // Payload size in 32bit words.
     90                           uint8_t* buffer,
     91                           size_t* pos);
     92 
     93  static void CreateHeader(size_t count_or_format,
     94                           uint8_t packet_type,
     95                           size_t block_length,  // Payload size in 32bit words.
     96                           bool padding,  // True if there are padding bytes.
     97                           uint8_t* buffer,
     98                           size_t* pos);
     99 
    100  bool OnBufferFull(uint8_t* packet,
    101                    size_t* index,
    102                    PacketReadyCallback callback) const;
    103  // Size of the rtcp packet as written in header.
    104  size_t HeaderLength() const;
    105 
    106 private:
    107  uint32_t sender_ssrc_ = 0;
    108 };
    109 }  // namespace rtcp
    110 }  // namespace webrtc
    111 #endif  // MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_H_