• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "media/cast/rtcp/receiver_rtcp_event_subscriber.h"
6 
7 #include <utility>
8 
9 namespace media {
10 namespace cast {
11 
ReceiverRtcpEventSubscriber(const size_t max_size_to_retain,EventMediaType type)12 ReceiverRtcpEventSubscriber::ReceiverRtcpEventSubscriber(
13     const size_t max_size_to_retain, EventMediaType type)
14     : max_size_to_retain_(max_size_to_retain), type_(type) {
15   DCHECK(max_size_to_retain_ > 0u);
16   DCHECK(type_ == AUDIO_EVENT || type_ == VIDEO_EVENT);
17 }
18 
~ReceiverRtcpEventSubscriber()19 ReceiverRtcpEventSubscriber::~ReceiverRtcpEventSubscriber() {
20   DCHECK(thread_checker_.CalledOnValidThread());
21 }
22 
OnReceiveFrameEvent(const FrameEvent & frame_event)23 void ReceiverRtcpEventSubscriber::OnReceiveFrameEvent(
24     const FrameEvent& frame_event) {
25   DCHECK(thread_checker_.CalledOnValidThread());
26 
27   if (ShouldProcessEvent(frame_event.type, frame_event.media_type)) {
28     RtcpEvent rtcp_event;
29     switch (frame_event.type) {
30       case FRAME_PLAYOUT:
31         rtcp_event.delay_delta = frame_event.delay_delta;
32       case FRAME_ACK_SENT:
33       case FRAME_DECODED:
34         rtcp_event.type = frame_event.type;
35         rtcp_event.timestamp = frame_event.timestamp;
36         rtcp_events_.insert(
37             std::make_pair(frame_event.rtp_timestamp, rtcp_event));
38         break;
39       default:
40         break;
41     }
42   }
43 
44   TruncateMapIfNeeded();
45 
46   DCHECK(rtcp_events_.size() <= max_size_to_retain_);
47 }
48 
OnReceivePacketEvent(const PacketEvent & packet_event)49 void ReceiverRtcpEventSubscriber::OnReceivePacketEvent(
50     const PacketEvent& packet_event) {
51   DCHECK(thread_checker_.CalledOnValidThread());
52 
53   if (ShouldProcessEvent(packet_event.type, packet_event.media_type)) {
54     RtcpEvent rtcp_event;
55     if (packet_event.type == PACKET_RECEIVED) {
56       rtcp_event.type = packet_event.type;
57       rtcp_event.timestamp = packet_event.timestamp;
58       rtcp_event.packet_id = packet_event.packet_id;
59       rtcp_events_.insert(
60           std::make_pair(packet_event.rtp_timestamp, rtcp_event));
61     }
62   }
63 
64   TruncateMapIfNeeded();
65 
66   DCHECK(rtcp_events_.size() <= max_size_to_retain_);
67 }
68 
GetRtcpEventsAndReset(RtcpEventMultiMap * rtcp_events)69 void ReceiverRtcpEventSubscriber::GetRtcpEventsAndReset(
70     RtcpEventMultiMap* rtcp_events) {
71   DCHECK(thread_checker_.CalledOnValidThread());
72   DCHECK(rtcp_events);
73   rtcp_events->swap(rtcp_events_);
74   rtcp_events_.clear();
75 }
76 
TruncateMapIfNeeded()77 void ReceiverRtcpEventSubscriber::TruncateMapIfNeeded() {
78   // If map size has exceeded |max_size_to_retain_|, remove entry with
79   // the smallest RTP timestamp.
80   if (rtcp_events_.size() > max_size_to_retain_) {
81     DVLOG(3) << "RTCP event map exceeded size limit; "
82              << "removing oldest entry";
83     // This is fine since we only insert elements one at a time.
84     rtcp_events_.erase(rtcp_events_.begin());
85   }
86 }
87 
ShouldProcessEvent(CastLoggingEvent event_type,EventMediaType event_media_type)88 bool ReceiverRtcpEventSubscriber::ShouldProcessEvent(
89     CastLoggingEvent event_type, EventMediaType event_media_type) {
90   return type_ == event_media_type &&
91       (event_type == FRAME_ACK_SENT || event_type == FRAME_DECODED ||
92        event_type == FRAME_PLAYOUT || event_type == PACKET_RECEIVED);
93 }
94 
95 }  // namespace cast
96 }  // namespace media
97