| Index: media/cast/net/cast_transport_sender_impl.cc
|
| diff --git a/media/cast/net/cast_transport_sender_impl.cc b/media/cast/net/cast_transport_sender_impl.cc
|
| index 390180f131e907a66dd80ce592b324ac5ea5af91..4ef3017e10f146c405c3f102a316eb8e0ca459a5 100644
|
| --- a/media/cast/net/cast_transport_sender_impl.cc
|
| +++ b/media/cast/net/cast_transport_sender_impl.cc
|
| @@ -52,21 +52,25 @@ int32 GetTransportSendBufferSize(const base::DictionaryValue& options) {
|
| scoped_ptr<CastTransportSender> CastTransportSender::Create(
|
| net::NetLog* net_log,
|
| base::TickClock* clock,
|
| + const net::IPEndPoint& local_end_point,
|
| const net::IPEndPoint& remote_end_point,
|
| scoped_ptr<base::DictionaryValue> options,
|
| const CastTransportStatusCallback& status_callback,
|
| const BulkRawEventsCallback& raw_events_callback,
|
| base::TimeDelta raw_events_callback_interval,
|
| + const PacketReceiverCallback& packet_callback,
|
| const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner) {
|
| return scoped_ptr<CastTransportSender>(
|
| new CastTransportSenderImpl(net_log,
|
| clock,
|
| + local_end_point,
|
| remote_end_point,
|
| options.Pass(),
|
| status_callback,
|
| raw_events_callback,
|
| raw_events_callback_interval,
|
| transport_task_runner.get(),
|
| + packet_callback,
|
| NULL));
|
| }
|
|
|
| @@ -77,12 +81,14 @@ PacketReceiverCallback CastTransportSender::PacketReceiverForTesting() {
|
| CastTransportSenderImpl::CastTransportSenderImpl(
|
| net::NetLog* net_log,
|
| base::TickClock* clock,
|
| + const net::IPEndPoint& local_end_point,
|
| const net::IPEndPoint& remote_end_point,
|
| scoped_ptr<base::DictionaryValue> options,
|
| const CastTransportStatusCallback& status_callback,
|
| const BulkRawEventsCallback& raw_events_callback,
|
| base::TimeDelta raw_events_callback_interval,
|
| const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner,
|
| + const PacketReceiverCallback& packet_callback,
|
| PacketSender* external_transport)
|
| : clock_(clock),
|
| status_callback_(status_callback),
|
| @@ -92,7 +98,7 @@ CastTransportSenderImpl::CastTransportSenderImpl(
|
| NULL :
|
| new UdpTransport(net_log,
|
| transport_task_runner,
|
| - net::IPEndPoint(),
|
| + local_end_point,
|
| remote_end_point,
|
| GetTransportSendBufferSize(*options),
|
| status_callback)),
|
| @@ -109,6 +115,7 @@ CastTransportSenderImpl::CastTransportSenderImpl(
|
| raw_events_callback_(raw_events_callback),
|
| raw_events_callback_interval_(raw_events_callback_interval),
|
| last_byte_acked_for_audio_(0),
|
| + packet_callback_(packet_callback),
|
| weak_factory_(this) {
|
| DCHECK(clock_);
|
| if (!raw_events_callback_.is_null()) {
|
| @@ -129,7 +136,7 @@ CastTransportSenderImpl::CastTransportSenderImpl(
|
| }
|
| transport_->StartReceiving(
|
| base::Bind(&CastTransportSenderImpl::OnReceivedPacket,
|
| - weak_factory_.GetWeakPtr()));
|
| + base::Unretained(this)));
|
| int wifi_options = 0;
|
| if (options->HasKey(kOptionWifiDisableScan)) {
|
| wifi_options |= net::WIFI_OPTIONS_DISABLE_SCAN;
|
| @@ -144,6 +151,9 @@ CastTransportSenderImpl::CastTransportSenderImpl(
|
| }
|
|
|
| CastTransportSenderImpl::~CastTransportSenderImpl() {
|
| + if (transport_) {
|
| + transport_->StopReceiving();
|
| + }
|
| if (event_subscriber_.get())
|
| logging_.RemoveRawEventSubscriber(event_subscriber_.get());
|
| }
|
| @@ -183,6 +193,7 @@ void CastTransportSenderImpl::InitializeAudio(
|
| config.ssrc,
|
| config.feedback_ssrc));
|
| pacer_.RegisterAudioSsrc(config.ssrc);
|
| + AddValidSsrc(config.feedback_ssrc);
|
| status_callback_.Run(TRANSPORT_AUDIO_INITIALIZED);
|
| }
|
|
|
| @@ -216,6 +227,7 @@ void CastTransportSenderImpl::InitializeVideo(
|
| config.ssrc,
|
| config.feedback_ssrc));
|
| pacer_.RegisterVideoSsrc(config.ssrc);
|
| + AddValidSsrc(config.feedback_ssrc);
|
| status_callback_.Run(TRANSPORT_VIDEO_INITIALIZED);
|
| }
|
|
|
| @@ -314,8 +326,9 @@ void CastTransportSenderImpl::ResendPackets(
|
| }
|
|
|
| PacketReceiverCallback CastTransportSenderImpl::PacketReceiverForTesting() {
|
| - return base::Bind(&CastTransportSenderImpl::OnReceivedPacket,
|
| - weak_factory_.GetWeakPtr());
|
| + return base::Bind(
|
| + base::IgnoreResult(&CastTransportSenderImpl::OnReceivedPacket),
|
| + weak_factory_.GetWeakPtr());
|
| }
|
|
|
| void CastTransportSenderImpl::SendRawEvents() {
|
| @@ -334,18 +347,35 @@ void CastTransportSenderImpl::SendRawEvents() {
|
| raw_events_callback_interval_);
|
| }
|
|
|
| -void CastTransportSenderImpl::OnReceivedPacket(scoped_ptr<Packet> packet) {
|
| +bool CastTransportSenderImpl::OnReceivedPacket(scoped_ptr<Packet> packet) {
|
| + const uint8_t* const data = &packet->front();
|
| + const size_t length = packet->size();
|
| + uint32 ssrc;
|
| + if (Rtcp::IsRtcpPacket(data, length)) {
|
| + ssrc = Rtcp::GetSsrcOfSender(data, length);
|
| + } else if (!RtpParser::ParseSsrc(data, length, &ssrc)) {
|
| + VLOG(1) << "Invalid RTP packet.";
|
| + return false;
|
| + }
|
| + if (valid_ssrcs_.find(ssrc) == valid_ssrcs_.end()) {
|
| + VLOG(1) << "Stale packet received.";
|
| + return false;
|
| + }
|
| +
|
| if (audio_rtcp_session_ &&
|
| - audio_rtcp_session_->IncomingRtcpPacket(&packet->front(),
|
| - packet->size())) {
|
| - return;
|
| + audio_rtcp_session_->IncomingRtcpPacket(data, length)) {
|
| + return true;
|
| }
|
| if (video_rtcp_session_ &&
|
| - video_rtcp_session_->IncomingRtcpPacket(&packet->front(),
|
| - packet->size())) {
|
| - return;
|
| + video_rtcp_session_->IncomingRtcpPacket(data, length)) {
|
| + return true;
|
| }
|
| - VLOG(1) << "Stale packet received.";
|
| + if (packet_callback_.is_null()) {
|
| + VLOG(1) << "Stale packet received.";
|
| + return false;
|
| + }
|
| + packet_callback_.Run(packet.Pass());
|
| + return true;
|
| }
|
|
|
| void CastTransportSenderImpl::OnReceivedLogMessage(
|
| @@ -422,5 +452,31 @@ void CastTransportSenderImpl::OnReceivedCastMessage(
|
| dedup_info);
|
| }
|
|
|
| +void CastTransportSenderImpl::AddValidSsrc(uint32 ssrc) {
|
| + valid_ssrcs_.insert(ssrc);
|
| +}
|
| +
|
| +void CastTransportSenderImpl::SendRtcpFromRtpReceiver(
|
| + uint32 ssrc,
|
| + uint32 sender_ssrc,
|
| + const RtcpTimeData& time_data,
|
| + const RtcpCastMessage* cast_message,
|
| + base::TimeDelta target_delay,
|
| + const ReceiverRtcpEventSubscriber::RtcpEvents* rtcp_events,
|
| + const RtpReceiverStatistics* rtp_receiver_statistics) {
|
| + const Rtcp rtcp(RtcpCastMessageCallback(),
|
| + RtcpRttCallback(),
|
| + RtcpLogMessageCallback(),
|
| + clock_,
|
| + &pacer_,
|
| + ssrc,
|
| + sender_ssrc);
|
| + rtcp.SendRtcpFromRtpReceiver(time_data,
|
| + cast_message,
|
| + target_delay,
|
| + rtcp_events,
|
| + rtp_receiver_statistics);
|
| +}
|
| +
|
| } // namespace cast
|
| } // namespace media
|
|
|