summaryrefslogtreecommitdiff
path: root/chromium/media/cast/rtcp/rtcp_receiver.h
blob: 81383c4ec10d64b366c09085e560a9fa3fe63464 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef MEDIA_CAST_RTCP_RTCP_RECEIVER_H_
#define MEDIA_CAST_RTCP_RTCP_RECEIVER_H_

#include "media/cast/net/cast_net_defines.h"
#include "media/cast/rtcp/rtcp.h"
#include "media/cast/rtcp/rtcp_defines.h"
#include "media/cast/rtcp/rtcp_utility.h"

namespace media {
namespace cast {

class RtcpReceiverFeedback {
 public:
  virtual void OnReceivedSenderReport(
      const RtcpSenderInfo& remote_sender_info) = 0;

  virtual void OnReceiverReferenceTimeReport(
      const RtcpReceiverReferenceTimeReport& remote_time_report) = 0;

  virtual void OnReceivedSendReportRequest() = 0;

  virtual void OnReceivedReceiverLog(
      const RtcpReceiverLogMessage& receiver_log) = 0;

  virtual void OnReceivedSenderLog(
      const RtcpSenderLogMessage& sender_log) = 0;

  virtual ~RtcpReceiverFeedback() {}
};

class RtcpRttFeedback {
 public:
  virtual void OnReceivedDelaySinceLastReport(
      uint32 receivers_ssrc,
      uint32 last_report,
      uint32 delay_since_last_report) = 0;

  virtual ~RtcpRttFeedback() {}
};

class RtcpReceiver {
 public:
  explicit RtcpReceiver(scoped_refptr<CastEnvironment> cast_environment,
                        RtcpSenderFeedback* sender_feedback,
                        RtcpReceiverFeedback* receiver_feedback,
                        RtcpRttFeedback* rtt_feedback,
                        uint32 local_ssrc);
  virtual ~RtcpReceiver();

  void SetRemoteSSRC(uint32 ssrc);

  void IncomingRtcpPacket(RtcpParser* rtcp_parser);

 private:
  void HandleSenderReport(RtcpParser* rtcp_parser);

  void HandleReceiverReport(RtcpParser* rtcp_parser);

  void HandleReportBlock(const RtcpField* rtcp_field,
                         uint32 remote_ssrc);

  void HandleSDES(RtcpParser* rtcp_parser);
  void HandleSDESChunk(RtcpParser* rtcp_parser);

  void HandleBYE(RtcpParser* rtcp_parser);

  void HandleXr(RtcpParser* rtcp_parser);
  void HandleRrtr(RtcpParser* rtcp_parser, uint32 remote_ssrc);
  void HandleDlrr(RtcpParser* rtcp_parser);

  //  Generic RTP Feedback.
  void HandleNACK(RtcpParser* rtcp_parser);
  void HandleNACKItem(const RtcpField* rtcp_field,
                      std::list<uint16>* nack_sequence_numbers);

  void HandleSendReportRequest(RtcpParser* rtcp_parser);

  // Payload-specific.
  void HandlePLI(RtcpParser* rtcp_parser);

  void HandleSLI(RtcpParser* rtcp_parser);
  void HandleSLIItem(RtcpField* rtcpPacket);

  void HandleRpsi(RtcpParser* rtcp_parser);

  void HandleFIR(RtcpParser* rtcp_parser);
  void HandleFIRItem(const RtcpField* rtcp_field);

  void HandlePayloadSpecificApp(RtcpParser* rtcp_parser);
  void HandlePayloadSpecificRembItem(RtcpParser* rtcp_parser);
  void HandlePayloadSpecificCastItem(RtcpParser* rtcp_parser);
  void HandlePayloadSpecificCastNackItem(
      const RtcpField* rtcp_field,
      MissingFramesAndPacketsMap* missing_frames_and_packets);

  void HandleApplicationSpecificCastReceiverLog(RtcpParser* rtcp_parser);
  void HandleApplicationSpecificCastSenderLog(RtcpParser* rtcp_parser);
  void HandleApplicationSpecificCastReceiverEventLog(
      RtcpParser* rtcp_parser,
      RtcpReceiverEventLogMessages* event_log_messages);

  const uint32 ssrc_;
  uint32 remote_ssrc_;

  // Not owned by this class.
  RtcpSenderFeedback* const sender_feedback_;
  RtcpReceiverFeedback* const receiver_feedback_;
  RtcpRttFeedback* const rtt_feedback_;
  scoped_refptr<CastEnvironment> cast_environment_;

  FrameIdWrapHelper ack_frame_id_wrap_helper_;

  DISALLOW_COPY_AND_ASSIGN(RtcpReceiver);
};

}  // namespace cast
}  // namespace media

#endif  // MEDIA_CAST_RTCP_RTCP_RECEIVER_H_