OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 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 #ifndef WEBRTC_MODULES_VIDEO_CODING_PACKET_BUFFER_H_ | 11 #ifndef WEBRTC_MODULES_VIDEO_CODING_PACKET_BUFFER_H_ |
12 #define WEBRTC_MODULES_VIDEO_CODING_PACKET_BUFFER_H_ | 12 #define WEBRTC_MODULES_VIDEO_CODING_PACKET_BUFFER_H_ |
13 | 13 |
14 #include <array> | |
15 #include <map> | |
16 #include <memory> | |
17 #include <queue> | |
18 #include <set> | |
19 #include <utility> | |
20 #include <vector> | 14 #include <vector> |
21 | 15 |
22 #include "webrtc/base/criticalsection.h" | 16 #include "webrtc/base/criticalsection.h" |
23 #include "webrtc/base/scoped_ptr.h" | 17 #include "webrtc/base/scoped_ptr.h" |
24 #include "webrtc/base/thread_annotations.h" | 18 #include "webrtc/base/thread_annotations.h" |
25 #include "webrtc/modules/include/module_common_types.h" | 19 #include "webrtc/modules/include/module_common_types.h" |
26 #include "webrtc/modules/video_coding/packet.h" | 20 #include "webrtc/modules/video_coding/packet.h" |
| 21 #include "webrtc/modules/video_coding/rtp_frame_reference_finder.h" |
27 #include "webrtc/modules/video_coding/sequence_number_util.h" | 22 #include "webrtc/modules/video_coding/sequence_number_util.h" |
28 | 23 |
29 namespace webrtc { | 24 namespace webrtc { |
30 namespace video_coding { | 25 namespace video_coding { |
31 | 26 |
32 class FrameObject; | 27 class FrameObject; |
33 class RtpFrameObject; | 28 class RtpFrameObject; |
34 | 29 |
35 class OnCompleteFrameCallback { | 30 class OnCompleteFrameCallback { |
36 public: | 31 public: |
37 virtual ~OnCompleteFrameCallback() {} | 32 virtual ~OnCompleteFrameCallback() {} |
38 virtual void OnCompleteFrame(std::unique_ptr<FrameObject> frame) = 0; | 33 virtual void OnCompleteFrame(std::unique_ptr<FrameObject> frame) = 0; |
39 }; | 34 }; |
40 | 35 |
41 class PacketBuffer { | 36 class PacketBuffer { |
42 public: | 37 public: |
43 // Both |start_buffer_size| and |max_buffer_size| must be a power of 2. | 38 // Both |start_buffer_size| and |max_buffer_size| must be a power of 2. |
44 PacketBuffer(size_t start_buffer_size, | 39 PacketBuffer(size_t start_buffer_size, |
45 size_t max_buffer_size, | 40 size_t max_buffer_size, |
46 OnCompleteFrameCallback* frame_callback); | 41 OnCompleteFrameCallback* frame_callback); |
47 | 42 |
48 bool InsertPacket(const VCMPacket& packet); | 43 bool InsertPacket(const VCMPacket& packet); |
49 void ClearTo(uint16_t seq_num); | 44 void ClearTo(uint16_t seq_num); |
50 void Flush(); | 45 void Clear(); |
51 | 46 |
52 private: | 47 private: |
53 static const uint16_t kPicIdLength = 1 << 7; | |
54 static const uint8_t kMaxTemporalLayers = 5; | |
55 static const int kMaxStashedFrames = 10; | |
56 static const int kMaxLayerInfo = 10; | |
57 static const int kMaxNotYetReceivedFrames = 20; | |
58 static const int kMaxGofSaved = 15; | |
59 | |
60 friend RtpFrameObject; | 48 friend RtpFrameObject; |
61 // Since we want the packet buffer to be as packet type agnostic | 49 // Since we want the packet buffer to be as packet type agnostic |
62 // as possible we extract only the information needed in order | 50 // as possible we extract only the information needed in order |
63 // to determine whether a sequence of packets is continuous or not. | 51 // to determine whether a sequence of packets is continuous or not. |
64 struct ContinuityInfo { | 52 struct ContinuityInfo { |
65 // The sequence number of the packet. | 53 // The sequence number of the packet. |
66 uint16_t seq_num = 0; | 54 uint16_t seq_num = 0; |
67 | 55 |
68 // If this is the first packet of the frame. | 56 // If this is the first packet of the frame. |
69 bool frame_begin = false; | 57 bool frame_begin = false; |
70 | 58 |
71 // If this is the last packet of the frame. | 59 // If this is the last packet of the frame. |
72 bool frame_end = false; | 60 bool frame_end = false; |
73 | 61 |
74 // If this slot is currently used. | 62 // If this slot is currently used. |
75 bool used = false; | 63 bool used = false; |
76 | 64 |
77 // If all its previous packets have been inserted into the packet buffer. | 65 // If all its previous packets have been inserted into the packet buffer. |
78 bool continuous = false; | 66 bool continuous = false; |
79 | 67 |
80 // If this packet has been used to create a frame already. | 68 // If this packet has been used to create a frame already. |
81 bool frame_created = false; | 69 bool frame_created = false; |
82 }; | 70 }; |
83 | 71 |
84 // Expand the buffer. | 72 // Tries to expand the buffer. |
85 bool ExpandBufferSize() EXCLUSIVE_LOCKS_REQUIRED(crit_); | 73 bool ExpandBufferSize() EXCLUSIVE_LOCKS_REQUIRED(crit_); |
86 | 74 |
87 // Test if all previous packets has arrived for the given sequence number. | 75 // Test if all previous packets has arrived for the given sequence number. |
88 bool IsContinuous(uint16_t seq_num) const EXCLUSIVE_LOCKS_REQUIRED(crit_); | 76 bool IsContinuous(uint16_t seq_num) const EXCLUSIVE_LOCKS_REQUIRED(crit_); |
89 | 77 |
90 // Test if all packets of a frame has arrived, and if so, creates a frame. | 78 // Test if all packets of a frame has arrived, and if so, creates a frame. |
91 // May create multiple frames per invocation. | 79 // May create multiple frames per invocation. |
92 void FindFrames(uint16_t seq_num) EXCLUSIVE_LOCKS_REQUIRED(crit_); | 80 void FindFrames(uint16_t seq_num) EXCLUSIVE_LOCKS_REQUIRED(crit_); |
93 | 81 |
94 // Copy the bitstream for |frame| to |destination|. | 82 // Copy the bitstream for |frame| to |destination|. |
95 bool GetBitstream(const RtpFrameObject& frame, uint8_t* destination); | 83 bool GetBitstream(const RtpFrameObject& frame, uint8_t* destination); |
96 | 84 |
| 85 // Get the packet with sequence number |seq_num|. |
| 86 VCMPacket* GetPacket(uint16_t seq_num); |
| 87 |
97 // Mark all slots used by |frame| as not used. | 88 // Mark all slots used by |frame| as not used. |
98 void ReturnFrame(RtpFrameObject* frame); | 89 void ReturnFrame(RtpFrameObject* frame); |
99 | 90 |
100 // Find the references for this frame. | |
101 void ManageFrame(std::unique_ptr<RtpFrameObject> frame) | |
102 EXCLUSIVE_LOCKS_REQUIRED(crit_); | |
103 | |
104 // Retry finding references for all frames that previously didn't have | |
105 // all information needed. | |
106 void RetryStashedFrames() EXCLUSIVE_LOCKS_REQUIRED(crit_); | |
107 | |
108 // Find references for generic frames. | |
109 void ManageFrameGeneric(std::unique_ptr<RtpFrameObject> frame) | |
110 EXCLUSIVE_LOCKS_REQUIRED(crit_); | |
111 | |
112 // Find references for Vp8 frames | |
113 void ManageFrameVp8(std::unique_ptr<RtpFrameObject> frame) | |
114 EXCLUSIVE_LOCKS_REQUIRED(crit_); | |
115 | |
116 // Updates all necessary state used to determine frame references | |
117 // for Vp8 and then calls the |frame_callback| callback with the | |
118 // completed frame. | |
119 void CompletedFrameVp8(std::unique_ptr<RtpFrameObject> frame) | |
120 EXCLUSIVE_LOCKS_REQUIRED(crit_); | |
121 | |
122 // Find references for Vp9 frames | |
123 void ManageFrameVp9(std::unique_ptr<RtpFrameObject> frame) | |
124 EXCLUSIVE_LOCKS_REQUIRED(crit_); | |
125 | |
126 // Unwrap the picture id and the frame references and then call the | |
127 // |frame_callback| callback with the completed frame. | |
128 void CompletedFrameVp9(std::unique_ptr<RtpFrameObject> frame) | |
129 EXCLUSIVE_LOCKS_REQUIRED(crit_); | |
130 | |
131 // Check if we are missing a frame necessary to determine the references | |
132 // for this frame. | |
133 bool MissingRequiredFrameVp9(uint16_t picture_id, const GofInfoVP9& gof) | |
134 EXCLUSIVE_LOCKS_REQUIRED(crit_); | |
135 | |
136 // Updates which frames that have been received. If there is a gap, | |
137 // missing frames will be added to |missing_frames_for_layer_| or | |
138 // if this is an already missing frame then it will be removed. | |
139 void FrameReceivedVp9(uint16_t picture_id, const GofInfoVP9& gof) | |
140 EXCLUSIVE_LOCKS_REQUIRED(crit_); | |
141 | |
142 // Check if there is a frame with the up-switch flag set in the interval | |
143 // (|pid_ref|, |picture_id|) with temporal layer smaller than |temporal_idx|. | |
144 bool UpSwitchInIntervalVp9(uint16_t picture_id, | |
145 uint8_t temporal_idx, | |
146 uint16_t pid_ref) EXCLUSIVE_LOCKS_REQUIRED(crit_); | |
147 | |
148 // All picture ids are unwrapped to 16 bits. | |
149 uint16_t UnwrapPictureId(uint16_t picture_id) | |
150 EXCLUSIVE_LOCKS_REQUIRED(crit_); | |
151 | |
152 rtc::CriticalSection crit_; | 91 rtc::CriticalSection crit_; |
153 | 92 |
154 // Buffer size_ and max_size_ must always be a power of two. | 93 // Buffer size_ and max_size_ must always be a power of two. |
155 size_t size_ GUARDED_BY(crit_); | 94 size_t size_ GUARDED_BY(crit_); |
156 const size_t max_size_; | 95 const size_t max_size_; |
157 | 96 |
158 // The fist sequence number currently in the buffer. | 97 // The fist sequence number currently in the buffer. |
159 uint16_t first_seq_num_ GUARDED_BY(crit_); | 98 uint16_t first_seq_num_ GUARDED_BY(crit_); |
160 | 99 |
161 // The last sequence number currently in the buffer. | 100 // The last sequence number currently in the buffer. |
162 uint16_t last_seq_num_ GUARDED_BY(crit_); | 101 uint16_t last_seq_num_ GUARDED_BY(crit_); |
163 | 102 |
164 // If the packet buffer has received its first packet. | 103 // If the packet buffer has received its first packet. |
165 bool first_packet_received_ GUARDED_BY(crit_); | 104 bool first_packet_received_ GUARDED_BY(crit_); |
166 | 105 |
167 // Buffer that holds the inserted packets. | 106 // Buffer that holds the inserted packets. |
168 std::vector<VCMPacket> data_buffer_ GUARDED_BY(crit_); | 107 std::vector<VCMPacket> data_buffer_ GUARDED_BY(crit_); |
169 | 108 |
170 // Buffer that holds the information about which slot that is currently in use | 109 // Buffer that holds the information about which slot that is currently in use |
171 // and information needed to determine the continuity between packets. | 110 // and information needed to determine the continuity between packets. |
172 std::vector<ContinuityInfo> sequence_buffer_ GUARDED_BY(crit_); | 111 std::vector<ContinuityInfo> sequence_buffer_ GUARDED_BY(crit_); |
173 | 112 |
174 // The callback that is called when a frame has been created and all its | 113 // Frames that have received all their packets are handed off to the |
175 // references has been found. | 114 // |reference_finder_| which finds the dependencies between the frames. |
176 OnCompleteFrameCallback* const frame_callback_; | 115 RtpFrameReferenceFinder reference_finder_; |
177 | |
178 // Holds the last sequence number of the last frame that has been created | |
179 // given the last sequence number of a given keyframe. | |
180 std::map<uint16_t, uint16_t, DescendingSeqNumComp<uint16_t>> | |
181 last_seq_num_gop_ GUARDED_BY(crit_); | |
182 | |
183 // Save the last picture id in order to detect when there is a gap in frames | |
184 // that have not yet been fully received. | |
185 int last_picture_id_ GUARDED_BY(crit_); | |
186 | |
187 // The last unwrapped picture id. Used to unwrap the picture id from a length | |
188 // of |kPicIdLength| to 16 bits. | |
189 int last_unwrap_ GUARDED_BY(crit_); | |
190 | |
191 // Frames earlier than the last received frame that have not yet been | |
192 // fully received. | |
193 std::set<uint16_t, DescendingSeqNumComp<uint16_t, kPicIdLength>> | |
194 not_yet_received_frames_ GUARDED_BY(crit_); | |
195 | |
196 // Frames that have been fully received but didn't have all the information | |
197 // needed to determine their references. | |
198 std::queue<std::unique_ptr<RtpFrameObject>> stashed_frames_ GUARDED_BY(crit_); | |
199 | |
200 // Holds the information about the last completed frame for a given temporal | |
201 // layer given a Tl0 picture index. | |
202 std::map<uint8_t, | |
203 std::array<int16_t, kMaxTemporalLayers>, | |
204 DescendingSeqNumComp<uint8_t>> | |
205 layer_info_ GUARDED_BY(crit_); | |
206 | |
207 // Where the current scalability structure is in the | |
208 // |scalability_structures_| array. | |
209 uint8_t current_ss_idx_; | |
210 | |
211 // Holds received scalability structures. | |
212 std::array<GofInfoVP9, kMaxGofSaved> scalability_structures_ | |
213 GUARDED_BY(crit_); | |
214 | |
215 // Holds the picture id and the Gof information for a given TL0 picture index. | |
216 std::map<uint8_t, | |
217 std::pair<uint16_t, GofInfoVP9*>, | |
218 DescendingSeqNumComp<uint8_t>> | |
219 gof_info_ GUARDED_BY(crit_); | |
220 | |
221 // Keep track of which picture id and which temporal layer that had the | |
222 // up switch flag set. | |
223 std::map<uint16_t, uint8_t> up_switch_ GUARDED_BY(crit_); | |
224 | |
225 // For every temporal layer, keep a set of which frames that are missing. | |
226 std::array<std::set<uint16_t, DescendingSeqNumComp<uint16_t, kPicIdLength>>, | |
227 kMaxTemporalLayers> | |
228 missing_frames_for_layer_ GUARDED_BY(crit_); | |
229 }; | 116 }; |
230 | 117 |
231 } // namespace video_coding | 118 } // namespace video_coding |
232 } // namespace webrtc | 119 } // namespace webrtc |
233 | 120 |
234 #endif // WEBRTC_MODULES_VIDEO_CODING_PACKET_BUFFER_H_ | 121 #endif // WEBRTC_MODULES_VIDEO_CODING_PACKET_BUFFER_H_ |
OLD | NEW |