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