OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 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 |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 void SendRtcpXrReceiverReferenceTime(bool enable); | 142 void SendRtcpXrReceiverReferenceTime(bool enable); |
143 | 143 |
144 bool RtcpXrReceiverReferenceTime() const; | 144 bool RtcpXrReceiverReferenceTime() const; |
145 | 145 |
146 void SetCsrcs(const std::vector<uint32_t>& csrcs); | 146 void SetCsrcs(const std::vector<uint32_t>& csrcs); |
147 | 147 |
148 void SetTargetBitrate(unsigned int target_bitrate); | 148 void SetTargetBitrate(unsigned int target_bitrate); |
149 bool SendFeedbackPacket(const rtcp::TransportFeedback& packet); | 149 bool SendFeedbackPacket(const rtcp::TransportFeedback& packet); |
150 | 150 |
151 private: | 151 private: |
152 struct RtcpContext; | 152 class RtcpContext; |
153 | 153 |
154 // The BuildResult indicates the outcome of a call to a builder method, | 154 // Determine which RTCP messages should be sent and setup flags. |
155 // constructing a part of an RTCP packet: | 155 void PrepareReport(const std::set<RTCPPacketType>& packetTypes, |
156 // | 156 const FeedbackState& feedback_state) |
157 // kError | 157 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); |
158 // Building RTCP packet failed, propagate error out to caller. | |
159 // kAbort | |
160 // The (partial) block being build should not be included. Reset current | |
161 // buffer position to the state before the method call and proceed to the | |
162 // next packet type. | |
163 // kTruncated | |
164 // There is not enough room in the buffer to fit the data being constructed. | |
165 // (IP packet is full). Proceed to the next packet type, and call this | |
166 // method again when a new buffer has been allocated. | |
167 // TODO(sprang): Actually allocate multiple packets if needed. | |
168 // kSuccess | |
169 // Data has been successfully placed in the buffer. | |
170 | |
171 enum class BuildResult { kError, kAborted, kTruncated, kSuccess }; | |
172 | |
173 int32_t SendToNetwork(const uint8_t* dataBuffer, size_t length); | |
174 | 158 |
175 int32_t AddReportBlock(const RTCPReportBlock& report_block) | 159 int32_t AddReportBlock(const RTCPReportBlock& report_block) |
176 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); | 160 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); |
177 | 161 |
178 bool PrepareReport(const FeedbackState& feedback_state, | 162 bool PrepareReportBlock(const FeedbackState& feedback_state, |
179 uint32_t ssrc, | 163 uint32_t ssrc, |
180 StreamStatistician* statistician, | 164 StreamStatistician* statistician, |
181 RTCPReportBlock* report_block); | 165 RTCPReportBlock* report_block); |
182 | 166 |
183 int PrepareRTCP(const FeedbackState& feedback_state, | 167 rtc::scoped_ptr<rtcp::RtcpPacket> BuildSR(const RtcpContext& context) |
184 const std::set<RTCPPacketType>& packetTypes, | |
185 int32_t nackSize, | |
186 const uint16_t* nackList, | |
187 bool repeat, | |
188 uint64_t pictureID, | |
189 uint8_t* rtcp_buffer, | |
190 int buffer_size); | |
191 | |
192 BuildResult BuildSR(RtcpContext* context) | |
193 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); | 168 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); |
194 BuildResult BuildRR(RtcpContext* context) | 169 rtc::scoped_ptr<rtcp::RtcpPacket> BuildRR(const RtcpContext& context) |
195 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); | 170 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); |
196 BuildResult BuildSDES(RtcpContext* context) | 171 rtc::scoped_ptr<rtcp::RtcpPacket> BuildSDES(const RtcpContext& context) |
197 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); | 172 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); |
198 BuildResult BuildPLI(RtcpContext* context) | 173 rtc::scoped_ptr<rtcp::RtcpPacket> BuildPLI(const RtcpContext& context) |
199 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); | 174 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); |
200 BuildResult BuildREMB(RtcpContext* context) | 175 rtc::scoped_ptr<rtcp::RtcpPacket> BuildREMB(const RtcpContext& context) |
201 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); | 176 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); |
202 BuildResult BuildTMMBR(RtcpContext* context) | 177 rtc::scoped_ptr<rtcp::RtcpPacket> BuildTMMBR(const RtcpContext& context) |
203 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); | 178 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); |
204 BuildResult BuildTMMBN(RtcpContext* context) | 179 rtc::scoped_ptr<rtcp::RtcpPacket> BuildTMMBN(const RtcpContext& context) |
205 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); | 180 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); |
206 BuildResult BuildAPP(RtcpContext* context) | 181 rtc::scoped_ptr<rtcp::RtcpPacket> BuildAPP(const RtcpContext& context) |
207 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); | 182 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); |
208 BuildResult BuildVoIPMetric(RtcpContext* context) | 183 rtc::scoped_ptr<rtcp::RtcpPacket> BuildVoIPMetric(const RtcpContext& context) |
209 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); | 184 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); |
210 BuildResult BuildBYE(RtcpContext* context) | 185 rtc::scoped_ptr<rtcp::RtcpPacket> BuildBYE(const RtcpContext& context) |
211 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); | 186 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); |
212 BuildResult BuildFIR(RtcpContext* context) | 187 rtc::scoped_ptr<rtcp::RtcpPacket> BuildFIR(const RtcpContext& context) |
213 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); | 188 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); |
214 BuildResult BuildSLI(RtcpContext* context) | 189 rtc::scoped_ptr<rtcp::RtcpPacket> BuildSLI(const RtcpContext& context) |
215 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); | 190 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); |
216 BuildResult BuildRPSI(RtcpContext* context) | 191 rtc::scoped_ptr<rtcp::RtcpPacket> BuildRPSI(const RtcpContext& context) |
217 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); | 192 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); |
218 BuildResult BuildNACK(RtcpContext* context) | 193 rtc::scoped_ptr<rtcp::RtcpPacket> BuildNACK(const RtcpContext& context) |
219 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); | 194 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); |
220 BuildResult BuildReceiverReferenceTime(RtcpContext* context) | 195 rtc::scoped_ptr<rtcp::RtcpPacket> BuildReceiverReferenceTime( |
| 196 const RtcpContext& context) |
221 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); | 197 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); |
222 BuildResult BuildDlrr(RtcpContext* context) | 198 rtc::scoped_ptr<rtcp::RtcpPacket> BuildDlrr(const RtcpContext& context) |
223 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); | 199 EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_); |
224 | 200 |
225 private: | 201 private: |
226 const bool audio_; | 202 const bool audio_; |
227 Clock* const clock_; | 203 Clock* const clock_; |
228 RtcpMode method_ GUARDED_BY(critical_section_rtcp_sender_); | 204 RtcpMode method_ GUARDED_BY(critical_section_rtcp_sender_); |
229 | 205 |
230 Transport* const transport_; | 206 Transport* const transport_; |
231 | 207 |
232 rtc::scoped_ptr<CriticalSectionWrapper> critical_section_rtcp_sender_; | 208 rtc::scoped_ptr<CriticalSectionWrapper> critical_section_rtcp_sender_; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
309 ReportFlag(RTCPPacketType type, bool is_volatile) | 285 ReportFlag(RTCPPacketType type, bool is_volatile) |
310 : type(type), is_volatile(is_volatile) {} | 286 : type(type), is_volatile(is_volatile) {} |
311 bool operator<(const ReportFlag& flag) const { return type < flag.type; } | 287 bool operator<(const ReportFlag& flag) const { return type < flag.type; } |
312 bool operator==(const ReportFlag& flag) const { return type == flag.type; } | 288 bool operator==(const ReportFlag& flag) const { return type == flag.type; } |
313 const RTCPPacketType type; | 289 const RTCPPacketType type; |
314 const bool is_volatile; | 290 const bool is_volatile; |
315 }; | 291 }; |
316 | 292 |
317 std::set<ReportFlag> report_flags_ GUARDED_BY(critical_section_rtcp_sender_); | 293 std::set<ReportFlag> report_flags_ GUARDED_BY(critical_section_rtcp_sender_); |
318 | 294 |
319 typedef BuildResult (RTCPSender::*Builder)(RtcpContext*); | 295 typedef rtc::scoped_ptr<rtcp::RtcpPacket> (RTCPSender::*BuilderFunc)( |
320 std::map<RTCPPacketType, Builder> builders_; | 296 const RtcpContext&); |
321 | 297 std::map<RTCPPacketType, BuilderFunc> builders_; |
322 class PacketBuiltCallback; | |
323 }; | 298 }; |
324 } // namespace webrtc | 299 } // namespace webrtc |
325 | 300 |
326 #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_SENDER_H_ | 301 #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_SENDER_H_ |
OLD | NEW |