OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright 2016 The WebRTC Project Authors. All rights reserved. | |
3 * | |
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 | |
6 * tree. An additional intellectual property rights grant can be found | |
7 * in the file PATENTS. All contributing project authors may | |
8 * be found in the AUTHORS file in the root of the source tree. | |
9 */ | |
10 | |
11 #ifndef WEBRTC_API_TRACKMEDIAINFOMAP_H_ | |
12 #define WEBRTC_API_TRACKMEDIAINFOMAP_H_ | |
13 | |
14 #include <map> | |
15 #include <memory> | |
16 #include <vector> | |
17 | |
18 #include "webrtc/api/mediastreaminterface.h" | |
19 #include "webrtc/api/rtpreceiverinterface.h" | |
20 #include "webrtc/api/rtpsenderinterface.h" | |
21 #include "webrtc/base/refcount.h" | |
22 #include "webrtc/media/base/mediachannel.h" | |
23 | |
24 namespace webrtc { | |
25 | |
26 // Audio/video tracks and sender/receiver statistical information are associated | |
27 // with each other based on attachments to RTP senders/receivers. This class | |
28 // maps that relationship, in both directions, so that stats about a track can | |
29 // be retrieved on a per-attachment basis. | |
30 // | |
31 // An RTP sender/receiver sends or receives media for a set of SSRCs. The media | |
32 // comes from an audio/video track that is attached to it. | |
33 // |[Voice/Video][Sender/Receiver]Info| has statistical information for a set of | |
34 // SSRCs. Looking at the RTP senders and receivers uncovers the track <-> info | |
35 // relationships, which this class does. | |
36 class TrackMediaInfoMap { | |
37 public: | |
38 TrackMediaInfoMap( | |
39 std::unique_ptr<cricket::VoiceMediaInfo> voice_media_info, | |
40 std::unique_ptr<cricket::VideoMediaInfo> video_media_info, | |
41 const std::vector<rtc::scoped_refptr<RtpSenderInterface>>& rtp_senders, | |
42 const std::vector<rtc::scoped_refptr<RtpReceiverInterface>>& | |
43 rtp_receivers); | |
44 | |
45 const cricket::VoiceMediaInfo* voice_media_info() const { | |
46 return voice_media_info_.get(); | |
47 } | |
48 const cricket::VideoMediaInfo* video_media_info() const { | |
49 return video_media_info_.get(); | |
50 } | |
51 | |
52 const std::vector<cricket::VoiceSenderInfo*>* GetVoiceSenderInfos( | |
53 const AudioTrackInterface& local_audio_track) const; | |
54 const cricket::VoiceReceiverInfo* GetVoiceReceiverInfo( | |
55 const AudioTrackInterface& remote_audio_track) const; | |
56 const std::vector<cricket::VideoSenderInfo*>* GetVideoSenderInfos( | |
57 const VideoTrackInterface& local_video_track) const; | |
58 const cricket::VideoReceiverInfo* GetVideoReceiverInfo( | |
59 const VideoTrackInterface& remote_video_track) const; | |
60 | |
61 rtc::scoped_refptr<AudioTrackInterface> GetAudioTrack( | |
62 const cricket::VoiceSenderInfo& voice_sender_info) const; | |
63 rtc::scoped_refptr<AudioTrackInterface> GetAudioTrack( | |
64 const cricket::VoiceReceiverInfo& voice_receiver_info) const; | |
65 rtc::scoped_refptr<VideoTrackInterface> GetVideoTrack( | |
66 const cricket::VideoSenderInfo& video_sender_info) const; | |
67 rtc::scoped_refptr<VideoTrackInterface> GetVideoTrack( | |
68 const cricket::VideoReceiverInfo& video_receiver_info) const; | |
69 | |
70 private: | |
71 std::unique_ptr<cricket::VoiceMediaInfo> voice_media_info_; | |
72 std::unique_ptr<cricket::VideoMediaInfo> video_media_info_; | |
73 // These maps map tracks (identified by a pointer) to their corresponding info | |
74 // object of the correct kind. One track can map to multiple info objects. | |
75 std::map<const AudioTrackInterface*, std::vector<cricket::VoiceSenderInfo*>> | |
76 voice_infos_by_local_track_; | |
77 std::map<const AudioTrackInterface*, cricket::VoiceReceiverInfo*> | |
78 voice_info_by_remote_track_; | |
79 std::map<const VideoTrackInterface*, std::vector<cricket::VideoSenderInfo*>> | |
80 video_infos_by_local_track_; | |
81 std::map<const VideoTrackInterface*, cricket::VideoReceiverInfo*> | |
82 video_info_by_remote_track_; | |
83 // These maps map info objects to their corresponding tracks. They are always | |
84 // the inverse of the maps above. One info object always maps to only one | |
85 // track. | |
86 std::map<const cricket::VoiceSenderInfo*, | |
87 rtc::scoped_refptr<AudioTrackInterface>> audio_track_by_sender_info_; | |
88 std::map<const cricket::VoiceReceiverInfo*, | |
89 rtc::scoped_refptr<AudioTrackInterface>> audio_track_by_receiver_info_; | |
90 std::map<const cricket::VideoSenderInfo*, | |
91 rtc::scoped_refptr<VideoTrackInterface>> video_track_by_sender_info_; | |
92 std::map<const cricket::VideoReceiverInfo*, | |
93 rtc::scoped_refptr<VideoTrackInterface>> video_track_by_receiver_info_; | |
94 }; | |
95 | |
96 } // namespace webrtc | |
97 | |
98 #endif // WEBRTC_API_TRACKMEDIAINFOMAP_H_ | |
OLD | NEW |