| 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 211 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 222 | 222 | 
| 223 void ViEChannel::UpdateHistograms() { | 223 void ViEChannel::UpdateHistograms() { | 
| 224   int64_t now = Clock::GetRealTimeClock()->TimeInMilliseconds(); | 224   int64_t now = Clock::GetRealTimeClock()->TimeInMilliseconds(); | 
| 225 | 225 | 
| 226   if (sender_) { | 226   if (sender_) { | 
| 227     RtcpPacketTypeCounter rtcp_counter; | 227     RtcpPacketTypeCounter rtcp_counter; | 
| 228     GetSendRtcpPacketTypeCounter(&rtcp_counter); | 228     GetSendRtcpPacketTypeCounter(&rtcp_counter); | 
| 229     int64_t elapsed_sec = rtcp_counter.TimeSinceFirstPacketInMs(now) / 1000; | 229     int64_t elapsed_sec = rtcp_counter.TimeSinceFirstPacketInMs(now) / 1000; | 
| 230     if (elapsed_sec > metrics::kMinRunTimeInSeconds) { | 230     if (elapsed_sec > metrics::kMinRunTimeInSeconds) { | 
| 231       RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.NackPacketsReceivedPerMinute", | 231       RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.NackPacketsReceivedPerMinute", | 
| 232           rtcp_counter.nack_packets * 60 / elapsed_sec); | 232                                  rtcp_counter.nack_packets * 60 / elapsed_sec); | 
| 233       RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.FirPacketsReceivedPerMinute", | 233       RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.FirPacketsReceivedPerMinute", | 
| 234           rtcp_counter.fir_packets * 60 / elapsed_sec); | 234                                  rtcp_counter.fir_packets * 60 / elapsed_sec); | 
| 235       RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.PliPacketsReceivedPerMinute", | 235       RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.PliPacketsReceivedPerMinute", | 
| 236           rtcp_counter.pli_packets * 60 / elapsed_sec); | 236                                  rtcp_counter.pli_packets * 60 / elapsed_sec); | 
| 237       if (rtcp_counter.nack_requests > 0) { | 237       if (rtcp_counter.nack_requests > 0) { | 
| 238         RTC_HISTOGRAM_PERCENTAGE( | 238         RTC_HISTOGRAM_PERCENTAGE( | 
| 239             "WebRTC.Video.UniqueNackRequestsReceivedInPercent", | 239             "WebRTC.Video.UniqueNackRequestsReceivedInPercent", | 
| 240                 rtcp_counter.UniqueNackRequestsInPercent()); | 240             rtcp_counter.UniqueNackRequestsInPercent()); | 
| 241       } | 241       } | 
| 242       int fraction_lost = report_block_stats_sender_->FractionLostInPercent(); | 242       int fraction_lost = report_block_stats_sender_->FractionLostInPercent(); | 
| 243       if (fraction_lost != -1) { | 243       if (fraction_lost != -1) { | 
| 244         RTC_HISTOGRAM_PERCENTAGE("WebRTC.Video.SentPacketsLostInPercent", | 244         RTC_HISTOGRAM_PERCENTAGE("WebRTC.Video.SentPacketsLostInPercent", | 
| 245             fraction_lost); | 245                                  fraction_lost); | 
|  | 246       } | 
|  | 247     } | 
|  | 248 | 
|  | 249     StreamDataCounters rtp; | 
|  | 250     StreamDataCounters rtx; | 
|  | 251     GetSendStreamDataCounters(&rtp, &rtx); | 
|  | 252     StreamDataCounters rtp_rtx = rtp; | 
|  | 253     rtp_rtx.Add(rtx); | 
|  | 254     elapsed_sec = rtp_rtx.TimeSinceFirstPacketInMs( | 
|  | 255                       Clock::GetRealTimeClock()->TimeInMilliseconds()) / | 
|  | 256                   1000; | 
|  | 257     if (elapsed_sec > metrics::kMinRunTimeInSeconds) { | 
|  | 258       RTC_HISTOGRAM_COUNTS_100000( | 
|  | 259           "WebRTC.Video.BitrateSentInKbps", | 
|  | 260           static_cast<int>(rtp_rtx.transmitted.TotalBytes() * 8 / elapsed_sec / | 
|  | 261                            1000)); | 
|  | 262       RTC_HISTOGRAM_COUNTS_10000( | 
|  | 263           "WebRTC.Video.MediaBitrateSentInKbps", | 
|  | 264           static_cast<int>(rtp.MediaPayloadBytes() * 8 / elapsed_sec / 1000)); | 
|  | 265       RTC_HISTOGRAM_COUNTS_10000( | 
|  | 266           "WebRTC.Video.PaddingBitrateSentInKbps", | 
|  | 267           static_cast<int>(rtp_rtx.transmitted.padding_bytes * 8 / elapsed_sec / | 
|  | 268                            1000)); | 
|  | 269       RTC_HISTOGRAM_COUNTS_10000( | 
|  | 270           "WebRTC.Video.RetransmittedBitrateSentInKbps", | 
|  | 271           static_cast<int>(rtp_rtx.retransmitted.TotalBytes() * 8 / | 
|  | 272                            elapsed_sec / 1000)); | 
|  | 273       if (rtp_rtcp_->RtxSendStatus() != kRtxOff) { | 
|  | 274         RTC_HISTOGRAM_COUNTS_10000( | 
|  | 275             "WebRTC.Video.RtxBitrateSentInKbps", | 
|  | 276             static_cast<int>(rtx.transmitted.TotalBytes() * 8 / elapsed_sec / | 
|  | 277                              1000)); | 
|  | 278       } | 
|  | 279       bool fec_enabled = false; | 
|  | 280       uint8_t pltype_red; | 
|  | 281       uint8_t pltype_fec; | 
|  | 282       rtp_rtcp_->GenericFECStatus(fec_enabled, pltype_red, pltype_fec); | 
|  | 283       if (fec_enabled) { | 
|  | 284         RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.FecBitrateSentInKbps", | 
|  | 285                                    static_cast<int>(rtp_rtx.fec.TotalBytes() * | 
|  | 286                                                     8 / elapsed_sec / 1000)); | 
| 246       } | 287       } | 
| 247     } | 288     } | 
| 248   } else if (vie_receiver_.GetRemoteSsrc() > 0) { | 289   } else if (vie_receiver_.GetRemoteSsrc() > 0) { | 
| 249     // Get receive stats if we are receiving packets, i.e. there is a remote | 290     // Get receive stats if we are receiving packets, i.e. there is a remote | 
| 250     // ssrc. | 291     // ssrc. | 
| 251     RtcpPacketTypeCounter rtcp_counter; | 292     RtcpPacketTypeCounter rtcp_counter; | 
| 252     GetReceiveRtcpPacketTypeCounter(&rtcp_counter); | 293     GetReceiveRtcpPacketTypeCounter(&rtcp_counter); | 
| 253     int64_t elapsed_sec = rtcp_counter.TimeSinceFirstPacketInMs(now) / 1000; | 294     int64_t elapsed_sec = rtcp_counter.TimeSinceFirstPacketInMs(now) / 1000; | 
| 254     if (elapsed_sec > metrics::kMinRunTimeInSeconds) { | 295     if (elapsed_sec > metrics::kMinRunTimeInSeconds) { | 
| 255       RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.NackPacketsSentPerMinute", | 296       RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.NackPacketsSentPerMinute", | 
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 295       } | 336       } | 
| 296       if (vie_receiver_.IsFecEnabled()) { | 337       if (vie_receiver_.IsFecEnabled()) { | 
| 297         RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.FecBitrateReceivedInKbps", | 338         RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.FecBitrateReceivedInKbps", | 
| 298                                    static_cast<int>(rtp_rtx.fec.TotalBytes() * | 339                                    static_cast<int>(rtp_rtx.fec.TotalBytes() * | 
| 299                                                     8 / elapsed_sec / 1000)); | 340                                                     8 / elapsed_sec / 1000)); | 
| 300       } | 341       } | 
| 301     } | 342     } | 
| 302   } | 343   } | 
| 303 } | 344 } | 
| 304 | 345 | 
| 305 void ViEChannel::UpdateHistogramsAtStopSend() { |  | 
| 306   StreamDataCounters rtp; |  | 
| 307   StreamDataCounters rtx; |  | 
| 308   GetSendStreamDataCounters(&rtp, &rtx); |  | 
| 309   StreamDataCounters rtp_rtx = rtp; |  | 
| 310   rtp_rtx.Add(rtx); |  | 
| 311 |  | 
| 312   int64_t elapsed_sec = rtp_rtx.TimeSinceFirstPacketInMs( |  | 
| 313       Clock::GetRealTimeClock()->TimeInMilliseconds()) / 1000; |  | 
| 314   if (elapsed_sec < metrics::kMinRunTimeInSeconds) { |  | 
| 315     return; |  | 
| 316   } |  | 
| 317   RTC_HISTOGRAM_COUNTS_100000( |  | 
| 318       "WebRTC.Video.BitrateSentInKbps", |  | 
| 319       static_cast<int>(rtp_rtx.transmitted.TotalBytes() * 8 / elapsed_sec / |  | 
| 320                        1000)); |  | 
| 321   RTC_HISTOGRAM_COUNTS_10000( |  | 
| 322       "WebRTC.Video.MediaBitrateSentInKbps", |  | 
| 323       static_cast<int>(rtp.MediaPayloadBytes() * 8 / elapsed_sec / 1000)); |  | 
| 324   RTC_HISTOGRAM_COUNTS_10000( |  | 
| 325       "WebRTC.Video.PaddingBitrateSentInKbps", |  | 
| 326       static_cast<int>(rtp_rtx.transmitted.padding_bytes * 8 / elapsed_sec / |  | 
| 327                        1000)); |  | 
| 328   RTC_HISTOGRAM_COUNTS_10000( |  | 
| 329       "WebRTC.Video.RetransmittedBitrateSentInKbps", |  | 
| 330       static_cast<int>(rtp_rtx.retransmitted.TotalBytes() * 8 / elapsed_sec / |  | 
| 331                        1000)); |  | 
| 332   if (rtp_rtcp_->RtxSendStatus() != kRtxOff) { |  | 
| 333     RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.RtxBitrateSentInKbps", |  | 
| 334                                static_cast<int>(rtx.transmitted.TotalBytes() * |  | 
| 335                                                 8 / elapsed_sec / 1000)); |  | 
| 336   } |  | 
| 337   bool fec_enabled = false; |  | 
| 338   uint8_t pltype_red; |  | 
| 339   uint8_t pltype_fec; |  | 
| 340   rtp_rtcp_->GenericFECStatus(fec_enabled, pltype_red, pltype_fec); |  | 
| 341   if (fec_enabled) { |  | 
| 342     RTC_HISTOGRAM_COUNTS_10000( |  | 
| 343         "WebRTC.Video.FecBitrateSentInKbps", |  | 
| 344         static_cast<int>(rtp_rtx.fec.TotalBytes() * 8 / elapsed_sec / 1000)); |  | 
| 345   } |  | 
| 346 } |  | 
| 347 |  | 
| 348 int32_t ViEChannel::SetSendCodec(const VideoCodec& video_codec, | 346 int32_t ViEChannel::SetSendCodec(const VideoCodec& video_codec, | 
| 349                                  bool new_stream) { | 347                                  bool new_stream) { | 
| 350   DCHECK(sender_); | 348   DCHECK(sender_); | 
| 351   if (video_codec.codecType == kVideoCodecRED || | 349   if (video_codec.codecType == kVideoCodecRED || | 
| 352       video_codec.codecType == kVideoCodecULPFEC) { | 350       video_codec.codecType == kVideoCodecULPFEC) { | 
| 353     LOG_F(LS_ERROR) << "Not a valid send codec " << video_codec.codecType; | 351     LOG_F(LS_ERROR) << "Not a valid send codec " << video_codec.codecType; | 
| 354     return -1; | 352     return -1; | 
| 355   } | 353   } | 
| 356   if (kMaxSimulcastStreams < video_codec.numberOfSimulcastStreams) { | 354   if (kMaxSimulcastStreams < video_codec.numberOfSimulcastStreams) { | 
| 357     LOG_F(LS_ERROR) << "Incorrect config " | 355     LOG_F(LS_ERROR) << "Incorrect config " | 
| (...skipping 971 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1329        it++) { | 1327        it++) { | 
| 1330     RtpRtcp* rtp_rtcp = *it; | 1328     RtpRtcp* rtp_rtcp = *it; | 
| 1331     rtp_rtcp->SetSendingMediaStatus(true); | 1329     rtp_rtcp->SetSendingMediaStatus(true); | 
| 1332     rtp_rtcp->SetSendingStatus(true); | 1330     rtp_rtcp->SetSendingStatus(true); | 
| 1333   } | 1331   } | 
| 1334   send_payload_router_->set_active(true); | 1332   send_payload_router_->set_active(true); | 
| 1335   return 0; | 1333   return 0; | 
| 1336 } | 1334 } | 
| 1337 | 1335 | 
| 1338 int32_t ViEChannel::StopSend() { | 1336 int32_t ViEChannel::StopSend() { | 
| 1339   UpdateHistogramsAtStopSend(); |  | 
| 1340   send_payload_router_->set_active(false); | 1337   send_payload_router_->set_active(false); | 
| 1341   CriticalSectionScoped cs(rtp_rtcp_cs_.get()); | 1338   CriticalSectionScoped cs(rtp_rtcp_cs_.get()); | 
| 1342   rtp_rtcp_->SetSendingMediaStatus(false); | 1339   rtp_rtcp_->SetSendingMediaStatus(false); | 
| 1343   for (std::list<RtpRtcp*>::iterator it = simulcast_rtp_rtcp_.begin(); | 1340   for (std::list<RtpRtcp*>::iterator it = simulcast_rtp_rtcp_.begin(); | 
| 1344        it != simulcast_rtp_rtcp_.end(); | 1341        it != simulcast_rtp_rtcp_.end(); | 
| 1345        it++) { | 1342        it++) { | 
| 1346     RtpRtcp* rtp_rtcp = *it; | 1343     RtpRtcp* rtp_rtcp = *it; | 
| 1347     rtp_rtcp->SetSendingMediaStatus(false); | 1344     rtp_rtcp->SetSendingMediaStatus(false); | 
| 1348   } | 1345   } | 
| 1349   if (!rtp_rtcp_->Sending()) { | 1346   if (!rtp_rtcp_->Sending()) { | 
| 1350     return -1; | 1347     return -1; | 
| 1351   } | 1348   } | 
| 1352 | 1349 | 
| 1353   // Reset. |  | 
| 1354   rtp_rtcp_->ResetSendDataCountersRTP(); |  | 
| 1355   if (rtp_rtcp_->SetSendingStatus(false) != 0) { | 1350   if (rtp_rtcp_->SetSendingStatus(false) != 0) { | 
| 1356     return -1; | 1351     return -1; | 
| 1357   } | 1352   } | 
| 1358   for (std::list<RtpRtcp*>::iterator it = simulcast_rtp_rtcp_.begin(); | 1353   for (std::list<RtpRtcp*>::iterator it = simulcast_rtp_rtcp_.begin(); | 
| 1359        it != simulcast_rtp_rtcp_.end(); | 1354        it != simulcast_rtp_rtcp_.end(); | 
| 1360        it++) { | 1355        it++) { | 
| 1361     RtpRtcp* rtp_rtcp = *it; | 1356     RtpRtcp* rtp_rtcp = *it; | 
| 1362     rtp_rtcp->ResetSendDataCountersRTP(); |  | 
| 1363     rtp_rtcp->SetSendingStatus(false); | 1357     rtp_rtcp->SetSendingStatus(false); | 
| 1364   } | 1358   } | 
| 1365   return 0; | 1359   return 0; | 
| 1366 } | 1360 } | 
| 1367 | 1361 | 
| 1368 bool ViEChannel::Sending() { | 1362 bool ViEChannel::Sending() { | 
| 1369   return rtp_rtcp_->Sending(); | 1363   return rtp_rtcp_->Sending(); | 
| 1370 } | 1364 } | 
| 1371 | 1365 | 
| 1372 void ViEChannel::StartReceive() { | 1366 void ViEChannel::StartReceive() { | 
| (...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1691 | 1685 | 
| 1692 } | 1686 } | 
| 1693 | 1687 | 
| 1694 void ViEChannel::OnIncomingCSRCChanged(const int32_t id, | 1688 void ViEChannel::OnIncomingCSRCChanged(const int32_t id, | 
| 1695                                        const uint32_t CSRC, | 1689                                        const uint32_t CSRC, | 
| 1696                                        const bool added) { | 1690                                        const bool added) { | 
| 1697   assert(channel_id_ == ChannelId(id)); | 1691   assert(channel_id_ == ChannelId(id)); | 
| 1698   CriticalSectionScoped cs(callback_cs_.get()); | 1692   CriticalSectionScoped cs(callback_cs_.get()); | 
| 1699 } | 1693 } | 
| 1700 | 1694 | 
| 1701 void ViEChannel::ResetStatistics(uint32_t ssrc) { |  | 
| 1702   StreamStatistician* statistician = |  | 
| 1703       vie_receiver_.GetReceiveStatistics()->GetStatistician(ssrc); |  | 
| 1704   if (statistician) |  | 
| 1705     statistician->ResetStatistics(); |  | 
| 1706 } |  | 
| 1707 |  | 
| 1708 void ViEChannel::RegisterSendFrameCountObserver( | 1695 void ViEChannel::RegisterSendFrameCountObserver( | 
| 1709     FrameCountObserver* observer) { | 1696     FrameCountObserver* observer) { | 
| 1710   send_frame_count_observer_.Set(observer); | 1697   send_frame_count_observer_.Set(observer); | 
| 1711 } | 1698 } | 
| 1712 | 1699 | 
| 1713 void ViEChannel::RegisterReceiveStatisticsProxy( | 1700 void ViEChannel::RegisterReceiveStatisticsProxy( | 
| 1714     ReceiveStatisticsProxy* receive_statistics_proxy) { | 1701     ReceiveStatisticsProxy* receive_statistics_proxy) { | 
| 1715   CriticalSectionScoped cs(callback_cs_.get()); | 1702   CriticalSectionScoped cs(callback_cs_.get()); | 
| 1716   vcm_receive_stats_callback_ = receive_statistics_proxy; | 1703   vcm_receive_stats_callback_ = receive_statistics_proxy; | 
| 1717 } | 1704 } | 
| 1718 | 1705 | 
| 1719 void ViEChannel::SetIncomingVideoStream( | 1706 void ViEChannel::SetIncomingVideoStream( | 
| 1720     IncomingVideoStream* incoming_video_stream) { | 1707     IncomingVideoStream* incoming_video_stream) { | 
| 1721   CriticalSectionScoped cs(callback_cs_.get()); | 1708   CriticalSectionScoped cs(callback_cs_.get()); | 
| 1722   incoming_video_stream_ = incoming_video_stream; | 1709   incoming_video_stream_ = incoming_video_stream; | 
| 1723 } | 1710 } | 
| 1724 }  // namespace webrtc | 1711 }  // namespace webrtc | 
| OLD | NEW | 
|---|