blob: 64013015ace1f29f5ca226fc346283fda4bfeda3 [file] [log] [blame] [edit]
/*
* Copyright 2016 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.
*/
#ifndef PC_TRACK_MEDIA_INFO_MAP_H_
#define PC_TRACK_MEDIA_INFO_MAP_H_
#include <cstdint>
#include <optional>
#include <string>
#include "api/array_view.h"
#include "api/media_types.h"
#include "api/rtp_parameters.h"
#include "media/base/media_channel.h"
#include "rtc_base/containers/flat_map.h"
namespace webrtc {
class RtpSenderInternal;
class RtpReceiverInternal;
// Audio/video tracks and sender/receiver statistical information are associated
// with each other based on attachments to RTP senders/receivers. This class
// maps that relationship so that "infos" can be obtained from SSRCs and tracks
// can be obtained from "infos".
class TrackMediaInfoMap {
public:
struct RtpSenderSignalInfo {
uint32_t ssrc = 0;
int attachment_id = 0;
MediaType media_type = MediaType::AUDIO;
};
struct RtpReceiverSignalInfo {
std::string track_id;
int attachment_id = 0;
MediaType media_type = MediaType::AUDIO;
};
TrackMediaInfoMap(std::optional<VoiceMediaInfo> voice_media_info,
std::optional<VideoMediaInfo> video_media_info,
ArrayView<const RtpSenderSignalInfo> senders,
ArrayView<const RtpReceiverSignalInfo> receivers,
ArrayView<const RtpParameters> receiver_parameters);
const std::optional<VoiceMediaInfo>& voice_media_info() const {
return voice_media_info_;
}
const std::optional<VideoMediaInfo>& video_media_info() const {
return video_media_info_;
}
const VoiceSenderInfo* GetVoiceSenderInfoBySsrc(uint32_t ssrc) const;
const VoiceReceiverInfo* GetVoiceReceiverInfoBySsrc(uint32_t ssrc) const;
const VideoSenderInfo* GetVideoSenderInfoBySsrc(uint32_t ssrc) const;
const VideoReceiverInfo* GetVideoReceiverInfoBySsrc(uint32_t ssrc) const;
std::optional<int> GetAttachmentIdBySsrc(uint32_t ssrc,
MediaType media_type,
bool is_sender) const;
std::optional<std::string> GetReceiverTrackIdBySsrc(
uint32_t ssrc,
MediaType media_type) const;
private:
const std::optional<VoiceMediaInfo> voice_media_info_;
const std::optional<VideoMediaInfo> video_media_info_;
// Maps SSRC to Attachment ID/Track ID, split by media type to handle SSRC
// reuse (e.g. same SSRC for Audio and Video on different processing chains)
// and by direction to handle loopback (same SSRC for Sender and Receiver).
const flat_map<uint32_t, int> audio_sender_attachment_id_by_ssrc_;
const flat_map<uint32_t, int> video_sender_attachment_id_by_ssrc_;
const flat_map<uint32_t, int> audio_receiver_attachment_id_by_ssrc_;
const flat_map<uint32_t, int> video_receiver_attachment_id_by_ssrc_;
const flat_map<uint32_t, std::string> audio_receiver_track_id_by_ssrc_;
const flat_map<uint32_t, std::string> video_receiver_track_id_by_ssrc_;
// These maps map SSRCs to the corresponding voice or video info objects.
const flat_map<uint32_t, const VoiceSenderInfo*> voice_info_by_sender_ssrc_;
const flat_map<uint32_t, const VideoSenderInfo*> video_info_by_sender_ssrc_;
};
} // namespace webrtc
#endif // PC_TRACK_MEDIA_INFO_MAP_H_