| Index: media/cast/net/rtcp/receiver_rtcp_event_subscriber.h
|
| diff --git a/media/cast/net/rtcp/receiver_rtcp_event_subscriber.h b/media/cast/net/rtcp/receiver_rtcp_event_subscriber.h
|
| index c08733ca94d2a49bc455e89b19021aca829bd33b..b5321f98a0b387a20d4eefe3bca0ba4a6ee95ac6 100644
|
| --- a/media/cast/net/rtcp/receiver_rtcp_event_subscriber.h
|
| +++ b/media/cast/net/rtcp/receiver_rtcp_event_subscriber.h
|
| @@ -5,7 +5,8 @@
|
| #ifndef MEDIA_CAST_RTCP_RECEIVER_RTCP_EVENT_SUBSCRIBER_H_
|
| #define MEDIA_CAST_RTCP_RECEIVER_RTCP_EVENT_SUBSCRIBER_H_
|
|
|
| -#include <map>
|
| +#include <deque>
|
| +#include <vector>
|
|
|
| #include "base/threading/thread_checker.h"
|
| #include "media/cast/logging/logging_defines.h"
|
| @@ -15,6 +16,10 @@
|
| namespace media {
|
| namespace cast {
|
|
|
| +static const size_t kNumResends = 3;
|
| +static const size_t kResendDelay = 10;
|
| +static const size_t kMaxEventsPerRTCP = 20;
|
| +
|
| // A RawEventSubscriber implementation with the following properties:
|
| // - Only processes raw event types that are relevant for sending from cast
|
| // receiver to cast sender via RTCP.
|
| @@ -26,7 +31,8 @@ namespace cast {
|
| // timestamp) up to the size limit.
|
| class ReceiverRtcpEventSubscriber : public RawEventSubscriber {
|
| public:
|
| - typedef std::multimap<RtpTimestamp, RtcpEvent> RtcpEventMultiMap;
|
| + typedef std::pair<RtpTimestamp, RtcpEvent> RtcpEventPair;
|
| + typedef std::vector<std::pair<RtpTimestamp, RtcpEvent> > RtcpEvents;
|
|
|
| // |max_size_to_retain|: The object will keep up to |max_size_to_retain|
|
| // events
|
| @@ -43,9 +49,9 @@ class ReceiverRtcpEventSubscriber : public RawEventSubscriber {
|
| void OnReceiveFrameEvent(const FrameEvent& frame_event) override;
|
| void OnReceivePacketEvent(const PacketEvent& packet_event) override;
|
|
|
| - // Assigns events collected to |rtcp_events| and clears them from this
|
| - // object.
|
| - void GetRtcpEventsAndReset(RtcpEventMultiMap* rtcp_events);
|
| + // Assigns events collected to |rtcp_events|. If there is space, some
|
| + // older events will be added for redundancy as well.
|
| + void GetRtcpEventsWithRedundancy(RtcpEvents* rtcp_events);
|
|
|
| private:
|
| // If |rtcp_events_.size()| exceeds |max_size_to_retain_|, remove an oldest
|
| @@ -65,7 +71,24 @@ class ReceiverRtcpEventSubscriber : public RawEventSubscriber {
|
| // to differentiate between video and audio frames, but since the
|
| // implementation doesn't mix audio and video frame events, RTP timestamp
|
| // only as key is fine.
|
| - RtcpEventMultiMap rtcp_events_;
|
| + std::deque<RtcpEventPair> rtcp_events_;
|
| +
|
| + // Counts how many events have been removed from rtcp_events_.
|
| + uint64 popped_events_;
|
| +
|
| + // Events greater than send_ptrs_[0] have not been sent yet.
|
| + // Events greater than send_ptrs_[1] have been transmit once.
|
| + // Note that these counters use absolute numbers, so you need
|
| + // to subtract popped_events_ before looking up the events in
|
| + // rtcp_events_.
|
| + uint64 send_ptrs_[kNumResends];
|
| +
|
| + // For each frame, we push how many events have been added to
|
| + // rtcp_events_ so far. We use this to make sure that
|
| + // send_ptrs_[N+1] is always at least kResendDelay frames behind
|
| + // send_ptrs_[N]. Old information is removed so that information
|
| + // for (kNumResends + 1) * kResendDelay frames remain.
|
| + std::deque<uint64> event_levels_for_past_frames_;
|
|
|
| // Ensures methods are only called on the main thread.
|
| base::ThreadChecker thread_checker_;
|
|
|