| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2014 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 | 11 |
| 12 #ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_H_ | 12 #ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_H_ |
| 13 #define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_H_ | 13 #define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_H_ |
| 14 | 14 |
| 15 #include <vector> | 15 #include <vector> |
| 16 | 16 |
| 17 #include "webrtc/base/scoped_ptr.h" | 17 #include "webrtc/base/buffer.h" |
| 18 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" | 18 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" |
| 19 #include "webrtc/typedefs.h" | 19 #include "webrtc/typedefs.h" |
| 20 | 20 |
| 21 namespace webrtc { | 21 namespace webrtc { |
| 22 namespace rtcp { | 22 namespace rtcp { |
| 23 | 23 |
| 24 static const int kCommonFbFmtLength = 12; | 24 static const int kCommonFbFmtLength = 12; |
| 25 | 25 |
| 26 class RawPacket; | |
| 27 | |
| 28 // Class for building RTCP packets. | 26 // Class for building RTCP packets. |
| 29 // | 27 // |
| 30 // Example: | 28 // Example: |
| 31 // ReportBlock report_block; | 29 // ReportBlock report_block; |
| 32 // report_block.To(234) | 30 // report_block.To(234); |
| 33 // report_block.FractionLost(10); | 31 // report_block.WithFractionLost(10); |
| 34 // | 32 // |
| 35 // ReceiverReport rr; | 33 // ReceiverReport rr; |
| 36 // rr.From(123); | 34 // rr.From(123); |
| 37 // rr.WithReportBlock(&report_block) | 35 // rr.WithReportBlock(report_block); |
| 38 // | 36 // |
| 39 // Fir fir; | 37 // Fir fir; |
| 40 // fir.From(123); | 38 // fir.From(123); |
| 41 // fir.WithRequestTo(234, 56); | 39 // fir.WithRequestTo(234, 56); |
| 42 // | 40 // |
| 43 // size_t length = 0; // Builds an intra frame request | 41 // size_t length = 0; // Builds an intra frame request |
| 44 // uint8_t packet[kPacketSize]; // with sequence number 56. | 42 // uint8_t packet[kPacketSize]; // with sequence number 56. |
| 45 // fir.Build(packet, &length, kPacketSize); | 43 // fir.Build(packet, &length, kPacketSize); |
| 46 // | 44 // |
| 47 // RawPacket packet = fir.Build(); // Returns a RawPacket holding | 45 // rtc::Buffer packet = fir.Build(); // Returns a RawPacket holding |
| 48 // // the built rtcp packet. | 46 // // the built rtcp packet. |
| 49 // | 47 // |
| 50 // rr.Append(&fir) // Builds a compound RTCP packet with | 48 // rr.Append(&fir); // Builds a compound RTCP packet with |
| 51 // RawPacket packet = rr.Build(); // a receiver report, report block | 49 // rtc::Buffer packet = rr.Build(); // a receiver report, report block |
| 52 // // and fir message. | 50 // // and fir message. |
| 53 | 51 |
| 54 class RtcpPacket { | 52 class RtcpPacket { |
| 55 public: | 53 public: |
| 56 virtual ~RtcpPacket() {} | 54 virtual ~RtcpPacket() {} |
| 57 | 55 |
| 58 void Append(RtcpPacket* packet); | 56 void Append(RtcpPacket* packet); |
| 59 | 57 |
| 60 // Callback used to signal that an RTCP packet is ready. Note that this may | 58 // Callback used to signal that an RTCP packet is ready. Note that this may |
| 61 // not contain all data in this RtcpPacket; if a packet cannot fit in | 59 // not contain all data in this RtcpPacket; if a packet cannot fit in |
| 62 // max_length bytes, it will be fragmented and multiple calls to this | 60 // max_length bytes, it will be fragmented and multiple calls to this |
| 63 // callback will be made. | 61 // callback will be made. |
| 64 class PacketReadyCallback { | 62 class PacketReadyCallback { |
| 65 public: | 63 public: |
| 66 PacketReadyCallback() {} | 64 PacketReadyCallback() {} |
| 67 virtual ~PacketReadyCallback() {} | 65 virtual ~PacketReadyCallback() {} |
| 68 | 66 |
| 69 virtual void OnPacketReady(uint8_t* data, size_t length) = 0; | 67 virtual void OnPacketReady(uint8_t* data, size_t length) = 0; |
| 70 }; | 68 }; |
| 71 | 69 |
| 72 // Convenience method mostly used for test. Max length of IP_PACKET_SIZE is | 70 // Convenience method mostly used for test. Max length of IP_PACKET_SIZE is |
| 73 // used, will cause assertion error if fragmentation occurs. | 71 // used, will cause assertion error if fragmentation occurs. |
| 74 rtc::scoped_ptr<RawPacket> Build() const; | 72 rtc::Buffer Build() const; |
| 75 | 73 |
| 76 // Returns true if all calls to Create succeeded. A buffer of size | 74 // Returns true if all calls to Create succeeded. A buffer of size |
| 77 // IP_PACKET_SIZE will be allocated and reused between calls to callback. | 75 // IP_PACKET_SIZE will be allocated and reused between calls to callback. |
| 78 bool Build(PacketReadyCallback* callback) const; | 76 bool Build(PacketReadyCallback* callback) const; |
| 79 | 77 |
| 80 // Returns true if all calls to Create succeeded. Provided buffer reference | 78 // Returns true if all calls to Create succeeded. Provided buffer reference |
| 81 // will be used for all calls to callback. | 79 // will be used for all calls to callback. |
| 82 bool BuildExternalBuffer(uint8_t* buffer, | 80 bool BuildExternalBuffer(uint8_t* buffer, |
| 83 size_t max_length, | 81 size_t max_length, |
| 84 PacketReadyCallback* callback) const; | 82 PacketReadyCallback* callback) const; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 108 | 106 |
| 109 static const size_t kHeaderLength = 4; | 107 static const size_t kHeaderLength = 4; |
| 110 std::vector<RtcpPacket*> appended_packets_; | 108 std::vector<RtcpPacket*> appended_packets_; |
| 111 | 109 |
| 112 private: | 110 private: |
| 113 bool CreateAndAddAppended(uint8_t* packet, | 111 bool CreateAndAddAppended(uint8_t* packet, |
| 114 size_t* index, | 112 size_t* index, |
| 115 size_t max_length, | 113 size_t max_length, |
| 116 PacketReadyCallback* callback) const; | 114 PacketReadyCallback* callback) const; |
| 117 }; | 115 }; |
| 118 | |
| 119 // Class holding a RTCP packet. | |
| 120 // | |
| 121 // Takes a built rtcp packet. | |
| 122 // RawPacket raw_packet(buffer, length); | |
| 123 // | |
| 124 // To access the raw packet: | |
| 125 // raw_packet.Buffer(); - pointer to the raw packet | |
| 126 // raw_packet.BufferLength(); - the length of the raw packet | |
| 127 | |
| 128 class RawPacket { | |
| 129 public: | |
| 130 explicit RawPacket(size_t buffer_length); | |
| 131 RawPacket(const uint8_t* packet, size_t packet_length); | |
| 132 | |
| 133 const uint8_t* Buffer() const; | |
| 134 uint8_t* MutableBuffer(); | |
| 135 size_t BufferLength() const; | |
| 136 size_t Length() const; | |
| 137 void SetLength(size_t length); | |
| 138 | |
| 139 private: | |
| 140 const size_t buffer_length_; | |
| 141 size_t length_; | |
| 142 rtc::scoped_ptr<uint8_t[]> buffer_; | |
| 143 }; | |
| 144 | |
| 145 } // namespace rtcp | 116 } // namespace rtcp |
| 146 } // namespace webrtc | 117 } // namespace webrtc |
| 147 #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_H_ | 118 #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_H_ |
| OLD | NEW |