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.
5 #ifndef MEDIA_CAST_TRANSPORT_CAST_TRANSPORT_CONFIG_H_
6 #define MEDIA_CAST_TRANSPORT_CAST_TRANSPORT_CONFIG_H_
11 #include "base/basictypes.h"
12 #include "base/callback.h"
13 #include "base/memory/linked_ptr.h"
14 #include "base/memory/ref_counted.h"
15 #include "base/stl_util.h"
16 #include "media/cast/transport/cast_transport_defines.h"
17 #include "net/base/ip_endpoint.h"
24 kRtcpCompound, // Compound RTCP mode is described by RFC 4585.
25 kRtcpReducedSize, // Reduced-size RTCP mode is described by RFC 5506.
33 kVideoCodecLast = kH264
40 kAudioCodecLast = kPcm16
49 std::string aes_key; // Binary string of size kAesKeySize.
50 std::string aes_iv_mask; // Binary string of size kAesBlockSize.
53 struct CastTransportRtpConfig {
54 CastTransportRtpConfig();
55 ~CastTransportRtpConfig();
57 int max_outstanding_frames;
60 struct CastTransportAudioConfig {
61 CastTransportAudioConfig();
62 ~CastTransportAudioConfig();
64 CastTransportRtpConfig rtp;
70 struct CastTransportVideoConfig {
71 CastTransportVideoConfig();
72 ~CastTransportVideoConfig();
74 CastTransportRtpConfig rtp;
78 // A combination of metadata and data for one encoded frame. This can contain
79 // audio data or video data or other.
82 // "null" value, used to indicate whether |dependency| has been set.
85 // Not decodable without the reference frame indicated by
86 // |referenced_frame_id|.
89 // Independently decodable.
92 // Independently decodable, and no future frames will depend on any frames
102 // Convenience accessors to data as an array of uint8 elements.
103 const uint8* bytes() const {
104 return reinterpret_cast<uint8*>(string_as_array(
105 const_cast<std::string*>(&data)));
107 uint8* mutable_bytes() {
108 return reinterpret_cast<uint8*>(string_as_array(&data));
111 // Copies all data members except |data| to |dest|.
112 // Does not modify |dest->data|.
113 void CopyMetadataTo(EncodedFrame* dest) const;
115 // This frame's dependency relationship with respect to other frames.
116 Dependency dependency;
118 // The label associated with this frame. Implies an ordering relative to
119 // other frames in the same stream.
122 // The label associated with the frame upon which this frame depends. If
123 // this frame does not require any other frame in order to become decodable
124 // (e.g., key frames), |referenced_frame_id| must equal |frame_id|.
125 uint32 referenced_frame_id;
127 // The stream timestamp, on the timeline of the signal data. For example, RTP
128 // timestamps for audio are usually defined as the total number of audio
129 // samples encoded in all prior frames. A playback system uses this value to
130 // detect gaps in the stream, and otherwise stretch the signal to match
132 uint32 rtp_timestamp;
134 // The common reference clock timestamp for this frame. This value originates
135 // from a sender and is used to provide lip synchronization between streams in
136 // a receiver. Thus, in the sender context, this is set to the time at which
137 // the frame was captured/recorded. In the receiver context, this is set to
138 // the target playout time. Over a sequence of frames, this time value is
139 // expected to drift with respect to the elapsed time implied by the RTP
140 // timestamps; and it may not necessarily increment with precise regularity.
141 base::TimeTicks reference_time;
143 // The encoded signal data.
147 typedef std::vector<uint8> Packet;
148 typedef scoped_refptr<base::RefCountedData<Packet> > PacketRef;
149 typedef std::vector<PacketRef> PacketList;
151 typedef base::Callback<void(scoped_ptr<Packet> packet)> PacketReceiverCallback;
155 // Send a packet to the network. Returns false if the network is blocked
156 // and we should wait for |cb| to be called. It is not allowed to called
157 // SendPacket again until |cb| has been called. Any other errors that
158 // occur will be reported through side channels, in such cases, this function
159 // will return true indicating that the channel is not blocked.
160 virtual bool SendPacket(PacketRef packet, const base::Closure& cb) = 0;
161 virtual ~PacketSender() {}
164 struct RtcpSenderInfo {
167 // First three members are used for lipsync.
168 // First two members are used for rtt.
171 uint32 rtp_timestamp;
172 uint32 send_packet_count;
173 size_t send_octet_count;
176 struct RtcpReportBlock {
179 uint32 remote_ssrc; // SSRC of sender of this report.
180 uint32 media_ssrc; // SSRC of the RTP packet sender.
182 uint32 cumulative_lost; // 24 bits valid.
183 uint32 extended_high_sequence_number;
186 uint32 delay_since_last_sr;
189 struct RtcpDlrrReportBlock {
190 RtcpDlrrReportBlock();
191 ~RtcpDlrrReportBlock();
193 uint32 delay_since_last_rr;
196 // This is only needed because IPC messages don't support more than
198 struct SendRtcpFromRtpSenderData {
199 SendRtcpFromRtpSenderData();
200 ~SendRtcpFromRtpSenderData();
201 uint32 packet_type_flags;
206 uint32 rtp_timestamp;
209 inline bool operator==(RtcpSenderInfo lhs, RtcpSenderInfo rhs) {
210 return lhs.ntp_seconds == rhs.ntp_seconds &&
211 lhs.ntp_fraction == rhs.ntp_fraction &&
212 lhs.rtp_timestamp == rhs.rtp_timestamp &&
213 lhs.send_packet_count == rhs.send_packet_count &&
214 lhs.send_octet_count == rhs.send_octet_count;
217 } // namespace transport
221 #endif // MEDIA_CAST_TRANSPORT_CAST_TRANSPORT_CONFIG_H_