xref: /aosp_15_r20/external/webrtc/api/rtp_packet_infos.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #ifndef API_RTP_PACKET_INFOS_H_
12*d9f75844SAndroid Build Coastguard Worker #define API_RTP_PACKET_INFOS_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <cstdint>
15*d9f75844SAndroid Build Coastguard Worker #include <utility>
16*d9f75844SAndroid Build Coastguard Worker #include <vector>
17*d9f75844SAndroid Build Coastguard Worker 
18*d9f75844SAndroid Build Coastguard Worker #include "api/make_ref_counted.h"
19*d9f75844SAndroid Build Coastguard Worker #include "api/ref_counted_base.h"
20*d9f75844SAndroid Build Coastguard Worker #include "api/rtp_packet_info.h"
21*d9f75844SAndroid Build Coastguard Worker #include "api/scoped_refptr.h"
22*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/system/rtc_export.h"
23*d9f75844SAndroid Build Coastguard Worker 
24*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
25*d9f75844SAndroid Build Coastguard Worker 
26*d9f75844SAndroid Build Coastguard Worker // Semi-immutable structure to hold information about packets used to assemble
27*d9f75844SAndroid Build Coastguard Worker // an audio or video frame. Uses internal reference counting to make it very
28*d9f75844SAndroid Build Coastguard Worker // cheap to copy.
29*d9f75844SAndroid Build Coastguard Worker //
30*d9f75844SAndroid Build Coastguard Worker // We should ideally just use `std::vector<RtpPacketInfo>` and have it
31*d9f75844SAndroid Build Coastguard Worker // `std::move()`-ed as the per-packet information is transferred from one object
32*d9f75844SAndroid Build Coastguard Worker // to another. But moving the info, instead of copying it, is not easily done
33*d9f75844SAndroid Build Coastguard Worker // for the current video code.
34*d9f75844SAndroid Build Coastguard Worker class RTC_EXPORT RtpPacketInfos {
35*d9f75844SAndroid Build Coastguard Worker  public:
36*d9f75844SAndroid Build Coastguard Worker   using vector_type = std::vector<RtpPacketInfo>;
37*d9f75844SAndroid Build Coastguard Worker 
38*d9f75844SAndroid Build Coastguard Worker   using value_type = vector_type::value_type;
39*d9f75844SAndroid Build Coastguard Worker   using size_type = vector_type::size_type;
40*d9f75844SAndroid Build Coastguard Worker   using difference_type = vector_type::difference_type;
41*d9f75844SAndroid Build Coastguard Worker   using const_reference = vector_type::const_reference;
42*d9f75844SAndroid Build Coastguard Worker   using const_pointer = vector_type::const_pointer;
43*d9f75844SAndroid Build Coastguard Worker   using const_iterator = vector_type::const_iterator;
44*d9f75844SAndroid Build Coastguard Worker   using const_reverse_iterator = vector_type::const_reverse_iterator;
45*d9f75844SAndroid Build Coastguard Worker 
46*d9f75844SAndroid Build Coastguard Worker   using reference = const_reference;
47*d9f75844SAndroid Build Coastguard Worker   using pointer = const_pointer;
48*d9f75844SAndroid Build Coastguard Worker   using iterator = const_iterator;
49*d9f75844SAndroid Build Coastguard Worker   using reverse_iterator = const_reverse_iterator;
50*d9f75844SAndroid Build Coastguard Worker 
RtpPacketInfos()51*d9f75844SAndroid Build Coastguard Worker   RtpPacketInfos() {}
RtpPacketInfos(const vector_type & entries)52*d9f75844SAndroid Build Coastguard Worker   explicit RtpPacketInfos(const vector_type& entries)
53*d9f75844SAndroid Build Coastguard Worker       : data_(Data::Create(entries)) {}
54*d9f75844SAndroid Build Coastguard Worker 
RtpPacketInfos(vector_type && entries)55*d9f75844SAndroid Build Coastguard Worker   explicit RtpPacketInfos(vector_type&& entries)
56*d9f75844SAndroid Build Coastguard Worker       : data_(Data::Create(std::move(entries))) {}
57*d9f75844SAndroid Build Coastguard Worker 
58*d9f75844SAndroid Build Coastguard Worker   RtpPacketInfos(const RtpPacketInfos& other) = default;
59*d9f75844SAndroid Build Coastguard Worker   RtpPacketInfos(RtpPacketInfos&& other) = default;
60*d9f75844SAndroid Build Coastguard Worker   RtpPacketInfos& operator=(const RtpPacketInfos& other) = default;
61*d9f75844SAndroid Build Coastguard Worker   RtpPacketInfos& operator=(RtpPacketInfos&& other) = default;
62*d9f75844SAndroid Build Coastguard Worker 
63*d9f75844SAndroid Build Coastguard Worker   const_reference operator[](size_type pos) const { return entries()[pos]; }
64*d9f75844SAndroid Build Coastguard Worker 
at(size_type pos)65*d9f75844SAndroid Build Coastguard Worker   const_reference at(size_type pos) const { return entries().at(pos); }
front()66*d9f75844SAndroid Build Coastguard Worker   const_reference front() const { return entries().front(); }
back()67*d9f75844SAndroid Build Coastguard Worker   const_reference back() const { return entries().back(); }
68*d9f75844SAndroid Build Coastguard Worker 
begin()69*d9f75844SAndroid Build Coastguard Worker   const_iterator begin() const { return entries().begin(); }
end()70*d9f75844SAndroid Build Coastguard Worker   const_iterator end() const { return entries().end(); }
rbegin()71*d9f75844SAndroid Build Coastguard Worker   const_reverse_iterator rbegin() const { return entries().rbegin(); }
rend()72*d9f75844SAndroid Build Coastguard Worker   const_reverse_iterator rend() const { return entries().rend(); }
73*d9f75844SAndroid Build Coastguard Worker 
cbegin()74*d9f75844SAndroid Build Coastguard Worker   const_iterator cbegin() const { return entries().cbegin(); }
cend()75*d9f75844SAndroid Build Coastguard Worker   const_iterator cend() const { return entries().cend(); }
crbegin()76*d9f75844SAndroid Build Coastguard Worker   const_reverse_iterator crbegin() const { return entries().crbegin(); }
crend()77*d9f75844SAndroid Build Coastguard Worker   const_reverse_iterator crend() const { return entries().crend(); }
78*d9f75844SAndroid Build Coastguard Worker 
empty()79*d9f75844SAndroid Build Coastguard Worker   bool empty() const { return entries().empty(); }
size()80*d9f75844SAndroid Build Coastguard Worker   size_type size() const { return entries().size(); }
81*d9f75844SAndroid Build Coastguard Worker 
82*d9f75844SAndroid Build Coastguard Worker  private:
83*d9f75844SAndroid Build Coastguard Worker   class Data final : public rtc::RefCountedNonVirtual<Data> {
84*d9f75844SAndroid Build Coastguard Worker    public:
Create(const vector_type & entries)85*d9f75844SAndroid Build Coastguard Worker     static rtc::scoped_refptr<Data> Create(const vector_type& entries) {
86*d9f75844SAndroid Build Coastguard Worker       // Performance optimization for the empty case.
87*d9f75844SAndroid Build Coastguard Worker       if (entries.empty()) {
88*d9f75844SAndroid Build Coastguard Worker         return nullptr;
89*d9f75844SAndroid Build Coastguard Worker       }
90*d9f75844SAndroid Build Coastguard Worker 
91*d9f75844SAndroid Build Coastguard Worker       return rtc::make_ref_counted<Data>(entries);
92*d9f75844SAndroid Build Coastguard Worker     }
93*d9f75844SAndroid Build Coastguard Worker 
Create(vector_type && entries)94*d9f75844SAndroid Build Coastguard Worker     static rtc::scoped_refptr<Data> Create(vector_type&& entries) {
95*d9f75844SAndroid Build Coastguard Worker       // Performance optimization for the empty case.
96*d9f75844SAndroid Build Coastguard Worker       if (entries.empty()) {
97*d9f75844SAndroid Build Coastguard Worker         return nullptr;
98*d9f75844SAndroid Build Coastguard Worker       }
99*d9f75844SAndroid Build Coastguard Worker 
100*d9f75844SAndroid Build Coastguard Worker       return rtc::make_ref_counted<Data>(std::move(entries));
101*d9f75844SAndroid Build Coastguard Worker     }
102*d9f75844SAndroid Build Coastguard Worker 
entries()103*d9f75844SAndroid Build Coastguard Worker     const vector_type& entries() const { return entries_; }
104*d9f75844SAndroid Build Coastguard Worker 
Data(const vector_type & entries)105*d9f75844SAndroid Build Coastguard Worker     explicit Data(const vector_type& entries) : entries_(entries) {}
Data(vector_type && entries)106*d9f75844SAndroid Build Coastguard Worker     explicit Data(vector_type&& entries) : entries_(std::move(entries)) {}
107*d9f75844SAndroid Build Coastguard Worker     ~Data() = default;
108*d9f75844SAndroid Build Coastguard Worker 
109*d9f75844SAndroid Build Coastguard Worker    private:
110*d9f75844SAndroid Build Coastguard Worker     const vector_type entries_;
111*d9f75844SAndroid Build Coastguard Worker   };
112*d9f75844SAndroid Build Coastguard Worker 
empty_entries()113*d9f75844SAndroid Build Coastguard Worker   static const vector_type& empty_entries() {
114*d9f75844SAndroid Build Coastguard Worker     static const vector_type& value = *new vector_type();
115*d9f75844SAndroid Build Coastguard Worker     return value;
116*d9f75844SAndroid Build Coastguard Worker   }
117*d9f75844SAndroid Build Coastguard Worker 
entries()118*d9f75844SAndroid Build Coastguard Worker   const vector_type& entries() const {
119*d9f75844SAndroid Build Coastguard Worker     if (data_ != nullptr) {
120*d9f75844SAndroid Build Coastguard Worker       return data_->entries();
121*d9f75844SAndroid Build Coastguard Worker     } else {
122*d9f75844SAndroid Build Coastguard Worker       return empty_entries();
123*d9f75844SAndroid Build Coastguard Worker     }
124*d9f75844SAndroid Build Coastguard Worker   }
125*d9f75844SAndroid Build Coastguard Worker 
126*d9f75844SAndroid Build Coastguard Worker   rtc::scoped_refptr<Data> data_;
127*d9f75844SAndroid Build Coastguard Worker };
128*d9f75844SAndroid Build Coastguard Worker 
129*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
130*d9f75844SAndroid Build Coastguard Worker 
131*d9f75844SAndroid Build Coastguard Worker #endif  // API_RTP_PACKET_INFOS_H_
132