OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/cast/cast_sender_impl.h" | 5 #include "media/cast/cast_sender_impl.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/callback.h" | 8 #include "base/callback.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
11 #include "media/base/video_frame.h" | 11 #include "media/base/video_frame.h" |
| 12 #include "media/cast/net/rtcp/rtcp_receiver.h" |
12 | 13 |
13 namespace media { | 14 namespace media { |
14 namespace cast { | 15 namespace cast { |
15 | 16 |
16 // The LocalVideoFrameInput class posts all incoming video frames to the main | 17 // The LocalVideoFrameInput class posts all incoming video frames to the main |
17 // cast thread for processing. | 18 // cast thread for processing. |
18 class LocalVideoFrameInput : public VideoFrameInput { | 19 class LocalVideoFrameInput : public VideoFrameInput { |
19 public: | 20 public: |
20 LocalVideoFrameInput(scoped_refptr<CastEnvironment> cast_environment, | 21 LocalVideoFrameInput(scoped_refptr<CastEnvironment> cast_environment, |
21 base::WeakPtr<VideoSender> video_sender) | 22 base::WeakPtr<VideoSender> video_sender) |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 video_frame_input_ = | 136 video_frame_input_ = |
136 new LocalVideoFrameInput(cast_environment_, video_sender_->AsWeakPtr()); | 137 new LocalVideoFrameInput(cast_environment_, video_sender_->AsWeakPtr()); |
137 } | 138 } |
138 cast_initialization_cb.Run(status); | 139 cast_initialization_cb.Run(status); |
139 } | 140 } |
140 | 141 |
141 CastSenderImpl::~CastSenderImpl() { | 142 CastSenderImpl::~CastSenderImpl() { |
142 VLOG(1) << "CastSenderImpl@" << this << "::~CastSenderImpl()"; | 143 VLOG(1) << "CastSenderImpl@" << this << "::~CastSenderImpl()"; |
143 } | 144 } |
144 | 145 |
145 // ReceivedPacket handle the incoming packets to the cast sender | |
146 // it's only expected to receive RTCP feedback packets from the remote cast | |
147 // receiver. The class verifies that that it is a RTCP packet and based on the | |
148 // SSRC of the incoming packet route the packet to the correct sender; audio or | |
149 // video. | |
150 // | |
151 // Definition of SSRC as defined in RFC 3550. | |
152 // Synchronization source (SSRC): The source of a stream of RTP | |
153 // packets, identified by a 32-bit numeric SSRC identifier carried in | |
154 // the RTP header so as not to be dependent upon the network address. | |
155 // All packets from a synchronization source form part of the same | |
156 // timing and sequence number space, so a receiver groups packets by | |
157 // synchronization source for playback. Examples of synchronization | |
158 // sources include the sender of a stream of packets derived from a | |
159 // signal source such as a microphone or a camera, or an RTP mixer | |
160 // (see below). A synchronization source may change its data format, | |
161 // e.g., audio encoding, over time. The SSRC identifier is a | |
162 // randomly chosen value meant to be globally unique within a | |
163 // particular RTP session (see Section 8). A participant need not | |
164 // use the same SSRC identifier for all the RTP sessions in a | |
165 // multimedia session; the binding of the SSRC identifiers is | |
166 // provided through RTCP (see Section 6.5.1). If a participant | |
167 // generates multiple streams in one RTP session, for example from | |
168 // separate video cameras, each MUST be identified as a different | |
169 // SSRC. | |
170 void CastSenderImpl::ReceivedPacket(scoped_ptr<Packet> packet) { | |
171 DCHECK(cast_environment_); | |
172 size_t length = packet->size(); | |
173 const uint8_t* data = &packet->front(); | |
174 if (!Rtcp::IsRtcpPacket(data, length)) { | |
175 VLOG(1) << "CastSenderImpl@" << this << "::ReceivedPacket() -- " | |
176 << "Received an invalid (non-RTCP?) packet in the cast sender."; | |
177 return; | |
178 } | |
179 uint32 ssrc_of_sender = Rtcp::GetSsrcOfSender(data, length); | |
180 if (ssrc_of_sender == ssrc_of_audio_sender_) { | |
181 if (!audio_sender_) { | |
182 NOTREACHED(); | |
183 return; | |
184 } | |
185 cast_environment_->PostTask(CastEnvironment::MAIN, | |
186 FROM_HERE, | |
187 base::Bind(&AudioSender::IncomingRtcpPacket, | |
188 audio_sender_->AsWeakPtr(), | |
189 base::Passed(&packet))); | |
190 } else if (ssrc_of_sender == ssrc_of_video_sender_) { | |
191 if (!video_sender_) { | |
192 NOTREACHED(); | |
193 return; | |
194 } | |
195 cast_environment_->PostTask(CastEnvironment::MAIN, | |
196 FROM_HERE, | |
197 base::Bind(&VideoSender::IncomingRtcpPacket, | |
198 video_sender_->AsWeakPtr(), | |
199 base::Passed(&packet))); | |
200 } else { | |
201 VLOG(1) << "CastSenderImpl@" << this << "::ReceivedPacket() -- " | |
202 << "Received a RTCP packet with a non matching sender SSRC " | |
203 << ssrc_of_sender; | |
204 } | |
205 } | |
206 | |
207 scoped_refptr<AudioFrameInput> CastSenderImpl::audio_frame_input() { | 146 scoped_refptr<AudioFrameInput> CastSenderImpl::audio_frame_input() { |
208 return audio_frame_input_; | 147 return audio_frame_input_; |
209 } | 148 } |
210 | 149 |
211 scoped_refptr<VideoFrameInput> CastSenderImpl::video_frame_input() { | 150 scoped_refptr<VideoFrameInput> CastSenderImpl::video_frame_input() { |
212 return video_frame_input_; | 151 return video_frame_input_; |
213 } | 152 } |
214 | 153 |
215 PacketReceiverCallback CastSenderImpl::packet_receiver() { | |
216 return base::Bind(&CastSenderImpl::ReceivedPacket, | |
217 weak_factory_.GetWeakPtr()); | |
218 } | |
219 | |
220 } // namespace cast | 154 } // namespace cast |
221 } // namespace media | 155 } // namespace media |
OLD | NEW |