/* * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "call/rtp_rtcp_demuxer_helper.h" #include "modules/rtp_rtcp/source/byte_io.h" #include "modules/rtp_rtcp/source/rtcp_packet/bye.h" #include "modules/rtp_rtcp/source/rtcp_packet/common_header.h" #include "modules/rtp_rtcp/source/rtcp_packet/extended_reports.h" #include "modules/rtp_rtcp/source/rtcp_packet/psfb.h" #include "modules/rtp_rtcp/source/rtcp_packet/receiver_report.h" #include "modules/rtp_rtcp/source/rtcp_packet/rtpfb.h" #include "modules/rtp_rtcp/source/rtcp_packet/sender_report.h" namespace webrtc { absl::optional ParseRtcpPacketSenderSsrc( rtc::ArrayView packet) { rtcp::CommonHeader header; for (const uint8_t* next_packet = packet.begin(); next_packet < packet.end(); next_packet = header.NextPacket()) { if (!header.Parse(next_packet, packet.end() - next_packet)) { return absl::nullopt; } switch (header.type()) { case rtcp::Bye::kPacketType: case rtcp::ExtendedReports::kPacketType: case rtcp::Psfb::kPacketType: case rtcp::ReceiverReport::kPacketType: case rtcp::Rtpfb::kPacketType: case rtcp::SenderReport::kPacketType: { // Sender SSRC at the beginning of the RTCP payload. if (header.payload_size_bytes() >= sizeof(uint32_t)) { const uint32_t ssrc_sender = ByteReader::ReadBigEndian(header.payload()); return ssrc_sender; } else { return absl::nullopt; } } } } return absl::nullopt; } } // namespace webrtc