/* * 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/base/criticalsection.h" #include "webrtc/base/sigslot.h" #include "webrtc/base/thread.h" #include "webrtc/base/thread_annotations.h" #include "webrtc/media/base/mediachannel.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 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 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() 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 VoiceMediaMonitor; typedef MediaMonitorT VideoMediaMonitor; typedef MediaMonitorT DataMediaMonitor; } // namespace cricket #endif // WEBRTC_PC_MEDIAMONITOR_H_