| /* | 
 |  *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. | 
 |  * | 
 |  *  Use of this source code is governed by a BSD-style license | 
 |  *  that can be found in the LICENSE file in the root of the source | 
 |  *  tree. An additional intellectual property rights grant can be found | 
 |  *  in the file PATENTS.  All contributing project authors may | 
 |  *  be found in the AUTHORS file in the root of the source tree. | 
 |  */ | 
 |  | 
 | #ifndef WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_PACKET_H_ | 
 | #define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_PACKET_H_ | 
 |  | 
 | #include <list> | 
 |  | 
 | #include "webrtc/base/constructormagic.h" | 
 | #include "webrtc/common_types.h" | 
 | #include "webrtc/system_wrappers/interface/scoped_ptr.h" | 
 | #include "webrtc/typedefs.h" | 
 |  | 
 | namespace webrtc { | 
 |  | 
 | class RtpHeaderParser; | 
 | struct WebRtcRTPHeader; | 
 |  | 
 | namespace test { | 
 |  | 
 | // Class for handling RTP packets in test applications. | 
 | class Packet { | 
 |  public: | 
 |   // Creates a packet, with the packet payload (including header bytes) in | 
 |   // |packet_memory|. The length of |packet_memory| is |allocated_bytes|. | 
 |   // The new object assumes ownership of |packet_memory| and will delete it | 
 |   // when the Packet object is deleted. The |time_ms| is an extra time | 
 |   // associated with this packet, typically used to denote arrival time. | 
 |   // The first bytes in |packet_memory| will be parsed using |parser|. | 
 |   Packet(uint8_t* packet_memory, | 
 |          size_t allocated_bytes, | 
 |          double time_ms, | 
 |          const RtpHeaderParser& parser); | 
 |  | 
 |   // Same as above, but with the extra argument |virtual_packet_length_bytes|. | 
 |   // This is typically used when reading RTP dump files that only contain the | 
 |   // RTP headers, and no payload (a.k.a RTP dummy files or RTP light). The | 
 |   // |virtual_packet_length_bytes| tells what size the packet had on wire, | 
 |   // including the now discarded payload, whereas |allocated_bytes| is the | 
 |   // length of the remaining payload (typically only the RTP header). | 
 |   Packet(uint8_t* packet_memory, | 
 |          size_t allocated_bytes, | 
 |          size_t virtual_packet_length_bytes, | 
 |          double time_ms, | 
 |          const RtpHeaderParser& parser); | 
 |  | 
 |   // The following two constructors are the same as above, but without a | 
 |   // parser. Note that when the object is constructed using any of these | 
 |   // methods, the header will be parsed using a default RtpHeaderParser object. | 
 |   // In particular, RTP header extensions won't be parsed. | 
 |   Packet(uint8_t* packet_memory, size_t allocated_bytes, double time_ms); | 
 |  | 
 |   Packet(uint8_t* packet_memory, | 
 |          size_t allocated_bytes, | 
 |          size_t virtual_packet_length_bytes, | 
 |          double time_ms); | 
 |  | 
 |   virtual ~Packet() {} | 
 |  | 
 |   // Parses the first bytes of the RTP payload, interpreting them as RED headers | 
 |   // according to RFC 2198. The headers will be inserted into |headers|. The | 
 |   // caller of the method assumes ownership of the objects in the list, and | 
 |   // must delete them properly. | 
 |   bool ExtractRedHeaders(std::list<RTPHeader*>* headers) const; | 
 |  | 
 |   // Deletes all RTPHeader objects in |headers|, but does not delete |headers| | 
 |   // itself. | 
 |   static void DeleteRedHeaders(std::list<RTPHeader*>* headers); | 
 |  | 
 |   const uint8_t* payload() const { return payload_; } | 
 |  | 
 |   size_t packet_length_bytes() const { return packet_length_bytes_; } | 
 |  | 
 |   size_t payload_length_bytes() const { return payload_length_bytes_; } | 
 |  | 
 |   size_t virtual_packet_length_bytes() const { | 
 |     return virtual_packet_length_bytes_; | 
 |   } | 
 |  | 
 |   size_t virtual_payload_length_bytes() const { | 
 |     return virtual_payload_length_bytes_; | 
 |   } | 
 |  | 
 |   const RTPHeader& header() const { return header_; } | 
 |  | 
 |   // Copies the packet header information, converting from the native RTPHeader | 
 |   // type to WebRtcRTPHeader. | 
 |   void ConvertHeader(WebRtcRTPHeader* copy_to) const; | 
 |  | 
 |   void set_time_ms(double time) { time_ms_ = time; } | 
 |   double time_ms() const { return time_ms_; } | 
 |   bool valid_header() const { return valid_header_; } | 
 |  | 
 |  private: | 
 |   bool ParseHeader(const RtpHeaderParser& parser); | 
 |   void CopyToHeader(RTPHeader* destination) const; | 
 |  | 
 |   RTPHeader header_; | 
 |   scoped_ptr<uint8_t[]> payload_memory_; | 
 |   const uint8_t* payload_;            // First byte after header. | 
 |   const size_t packet_length_bytes_;  // Total length of packet. | 
 |   size_t payload_length_bytes_;  // Length of the payload, after RTP header. | 
 |                                  // Zero for dummy RTP packets. | 
 |   // Virtual lengths are used when parsing RTP header files (dummy RTP files). | 
 |   const size_t virtual_packet_length_bytes_; | 
 |   size_t virtual_payload_length_bytes_; | 
 |   double time_ms_;     // Used to denote a packet's arrival time. | 
 |   bool valid_header_;  // Set by the RtpHeaderParser. | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(Packet); | 
 | }; | 
 |  | 
 | }  // namespace test | 
 | }  // namespace webrtc | 
 | #endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_PACKET_H_ |