| /* | |
| * Copyright 2005 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. | |
| */ | |
| // Class to collect statistics from a media channel | |
| #ifndef WEBRTC_PC_MEDIAMONITOR_H_ | |
| #define WEBRTC_PC_MEDIAMONITOR_H_ | |
| #include "webrtc/media/base/mediachannel.h" | |
| #include "webrtc/rtc_base/criticalsection.h" | |
| #include "webrtc/rtc_base/sigslot.h" | |
| #include "webrtc/rtc_base/thread.h" | |
| #include "webrtc/rtc_base/thread_annotations.h" | |
| namespace cricket { | |
| // The base MediaMonitor class, independent of voice and video. | |
| class MediaMonitor : public rtc::MessageHandler, | |
| public sigslot::has_slots<> { | |
| public: | |
| MediaMonitor(rtc::Thread* worker_thread, | |
| rtc::Thread* monitor_thread); | |
| ~MediaMonitor(); | |
| void Start(uint32_t milliseconds); | |
| void Stop(); | |
| protected: | |
| void OnMessage(rtc::Message *message); | |
| void PollMediaChannel(); | |
| virtual void GetStats() = 0; | |
| virtual void Update() = 0; | |
| rtc::CriticalSection crit_; | |
| rtc::Thread* worker_thread_; | |
| rtc::Thread* monitor_thread_; | |
| bool monitoring_; | |
| uint32_t rate_; | |
| }; | |
| // Templatized MediaMonitor that can deal with different kinds of media. | |
| template<class MC, class MI> | |
| class MediaMonitorT : public MediaMonitor { | |
| public: | |
| MediaMonitorT(MC* media_channel, rtc::Thread* worker_thread, | |
| rtc::Thread* monitor_thread) | |
| : MediaMonitor(worker_thread, monitor_thread), | |
| media_channel_(media_channel) {} | |
| sigslot::signal2<MC*, const MI&> SignalUpdate; | |
| protected: | |
| // These routines assume the crit_ lock is held by the calling thread. | |
| virtual void GetStats() { | |
| media_info_.Clear(); | |
| media_channel_->GetStats(&media_info_); | |
| } | |
| virtual void Update() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_) { | |
| MI stats(media_info_); | |
| crit_.Leave(); | |
| SignalUpdate(media_channel_, stats); | |
| crit_.Enter(); | |
| } | |
| private: | |
| MC* media_channel_; | |
| MI media_info_; | |
| }; | |
| typedef MediaMonitorT<VoiceMediaChannel, VoiceMediaInfo> VoiceMediaMonitor; | |
| typedef MediaMonitorT<VideoMediaChannel, VideoMediaInfo> VideoMediaMonitor; | |
| typedef MediaMonitorT<DataMediaChannel, DataMediaInfo> DataMediaMonitor; | |
| } // namespace cricket | |
| #endif // WEBRTC_PC_MEDIAMONITOR_H_ |