15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef MEDIA_CAST_RTCP_RECEIVER_RTCP_EVENT_SUBSCRIBER_H_ 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MEDIA_CAST_RTCP_RECEIVER_RTCP_EVENT_SUBSCRIBER_H_ 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <map> 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/threading/thread_checker.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/cast/logging/logging_defines.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/cast/logging/raw_event_subscriber.h" 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "media/cast/net/rtcp/rtcp_defines.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace media { 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace cast { 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// A RawEventSubscriber implementation with the following properties: 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// - Only processes raw event types that are relevant for sending from cast 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// receiver to cast sender via RTCP. 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// - Captures information to be sent over to RTCP from raw event logs into the 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// more compact RtcpEvent struct. 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// - Orders events by RTP timestamp with a multimap. 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// - Internally, the map is capped at a maximum size configurable by the caller. 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// The subscriber only keeps the most recent events (determined by RTP 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// timestamp) up to the size limit. 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ReceiverRtcpEventSubscriber : public RawEventSubscriber { 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) typedef std::multimap<RtpTimestamp, RtcpEvent> RtcpEventMultiMap; 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // |max_size_to_retain|: The object will keep up to |max_size_to_retain| 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // events 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // in the map. Once threshold has been reached, an event with the smallest 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // RTP timestamp will be removed. 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // |type|: Determines whether the subscriber will process only audio or video 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // events. 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ReceiverRtcpEventSubscriber(const size_t max_size_to_retain, 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EventMediaType type); 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~ReceiverRtcpEventSubscriber(); 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // RawEventSubscriber implementation. 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnReceiveFrameEvent(const FrameEvent& frame_event) OVERRIDE; 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnReceivePacketEvent(const PacketEvent& packet_event) OVERRIDE; 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Assigns events collected to |rtcp_events| and clears them from this 47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // object. 48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void GetRtcpEventsAndReset(RtcpEventMultiMap* rtcp_events); 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If |rtcp_events_.size()| exceeds |max_size_to_retain_|, remove an oldest 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // entry (determined by RTP timestamp) so its size no greater than 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // |max_size_to_retain_|. 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void TruncateMapIfNeeded(); 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Returns |true| if events of |event_type| and |media_type| 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // should be processed. 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool ShouldProcessEvent(CastLoggingEvent event_type, 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EventMediaType media_type); 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const size_t max_size_to_retain_; 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EventMediaType type_; 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The key should really be something more than just a RTP timestamp in order 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // to differentiate between video and audio frames, but since the 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // implementation doesn't mix audio and video frame events, RTP timestamp 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // only as key is fine. 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RtcpEventMultiMap rtcp_events_; 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Ensures methods are only called on the main thread. 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ThreadChecker thread_checker_; 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ReceiverRtcpEventSubscriber); 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace cast 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace media 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // MEDIA_CAST_RTCP_RECEIVER_RTCP_EVENT_SUBSCRIBER_H_ 80