| Index: webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc
|
| diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc b/webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc
|
| index f9dc96e061f14904422ab184764781376ae88f02..b0ac6501ddf0259e2d0073a92bc8a8fb84051831 100644
|
| --- a/webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc
|
| +++ b/webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc
|
| @@ -36,6 +36,7 @@ RTCPReceiver::RTCPReceiver(
|
| RtcpPacketTypeCounterObserver* packet_type_counter_observer,
|
| RtcpBandwidthObserver* rtcp_bandwidth_observer,
|
| RtcpIntraFrameObserver* rtcp_intra_frame_observer,
|
| + TransportFeedbackObserver* transport_feedback_observer,
|
| ModuleRtpRtcpImpl* owner)
|
| : TMMBRHelp(),
|
| _clock(clock),
|
| @@ -47,6 +48,7 @@ RTCPReceiver::RTCPReceiver(
|
| CriticalSectionWrapper::CreateCriticalSection()),
|
| _cbRtcpBandwidthObserver(rtcp_bandwidth_observer),
|
| _cbRtcpIntraFrameObserver(rtcp_intra_frame_observer),
|
| + _cbTransportFeedbackObserver(transport_feedback_observer),
|
| _criticalSectionRTCPReceiver(
|
| CriticalSectionWrapper::CreateCriticalSection()),
|
| main_ssrc_(0),
|
| @@ -350,6 +352,9 @@ RTCPReceiver::IncomingRTCPPacket(RTCPPacketInformation& rtcpPacketInformation,
|
| // generic application messages
|
| HandleAPPItem(*rtcpParser, rtcpPacketInformation);
|
| break;
|
| + case RTCPPacketTypes::kTransportFeedback:
|
| + HandleTransportFeedback(rtcpParser, &rtcpPacketInformation);
|
| + break;
|
| default:
|
| rtcpParser->Iterate();
|
| break;
|
| @@ -1253,6 +1258,17 @@ void RTCPReceiver::HandleAPPItem(RTCPUtility::RTCPParserV2& rtcpParser,
|
| rtcpParser.Iterate();
|
| }
|
|
|
| +void RTCPReceiver::HandleTransportFeedback(
|
| + RTCPUtility::RTCPParserV2* rtcp_parser,
|
| + RTCPHelp::RTCPPacketInformation* rtcp_packet_information) {
|
| + rtcp::RtcpPacket* packet = rtcp_parser->ReleaseRtcpPacket();
|
| + RTC_DCHECK(packet != nullptr);
|
| + rtcp_packet_information->rtcpPacketTypeFlags |= kRtcpTransportFeedback;
|
| + rtcp_packet_information->transport_feedback_.reset(
|
| + static_cast<rtcp::TransportFeedback*>(packet));
|
| +
|
| + rtcp_parser->Iterate();
|
| +}
|
| int32_t RTCPReceiver::UpdateTMMBR() {
|
| int32_t numBoundingSet = 0;
|
| uint32_t bitrate = 0;
|
| @@ -1322,11 +1338,11 @@ void RTCPReceiver::TriggerCallbacksFromRTCPPacket(
|
| local_ssrc = main_ssrc_;
|
| }
|
| if (!receiver_only_ &&
|
| - rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSrReq) {
|
| + (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSrReq)) {
|
| _rtpRtcp.OnRequestSendReport();
|
| }
|
| if (!receiver_only_ &&
|
| - rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpNack) {
|
| + (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpNack)) {
|
| if (rtcpPacketInformation.nackSequenceNumbers.size() > 0) {
|
| LOG(LS_VERBOSE) << "Incoming NACK length: "
|
| << rtcpPacketInformation.nackSequenceNumbers.size();
|
| @@ -1377,6 +1393,17 @@ void RTCPReceiver::TriggerCallbacksFromRTCPPacket(
|
| now);
|
| }
|
| }
|
| + if (_cbTransportFeedbackObserver &&
|
| + (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpTransportFeedback)) {
|
| + uint32_t media_source_ssrc =
|
| + rtcpPacketInformation.transport_feedback_->GetMediaSourceSsrc();
|
| + if (media_source_ssrc == main_ssrc_ ||
|
| + registered_ssrcs_.find(media_source_ssrc) !=
|
| + registered_ssrcs_.end()) {
|
| + _cbTransportFeedbackObserver->OnTransportFeedback(
|
| + *rtcpPacketInformation.transport_feedback_.get());
|
| + }
|
| + }
|
| }
|
|
|
| if (!receiver_only_) {
|
|
|