15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/media/cast_transport_host_filter.h" 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/browser_process.h" 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/net/chrome_net_log.h" 96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/public/browser/power_save_blocker.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "media/cast/net/cast_transport_sender.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace { 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// How often to send raw events. 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const int kSendRawEventsIntervalSecs = 1; 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace cast { 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)CastTransportHostFilter::CastTransportHostFilter() 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : BrowserMessageFilter(CastMsgStart), 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) weak_factory_(this) {} 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)CastTransportHostFilter::~CastTransportHostFilter() {} 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool CastTransportHostFilter::OnMessageReceived(const IPC::Message& message) { 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool handled = true; 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(CastTransportHostFilter, message) 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(CastHostMsg_New, OnNew) 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(CastHostMsg_Delete, OnDelete) 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_MESSAGE_HANDLER(CastHostMsg_InitializeAudio, OnInitializeAudio) 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_MESSAGE_HANDLER(CastHostMsg_InitializeVideo, OnInitializeVideo) 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IPC_MESSAGE_HANDLER(CastHostMsg_InsertFrame, OnInsertFrame) 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) IPC_MESSAGE_HANDLER(CastHostMsg_SendSenderReport, 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) OnSendSenderReport) 3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) IPC_MESSAGE_HANDLER(CastHostMsg_ResendFrameForKickstart, 3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) OnResendFrameForKickstart) 3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) IPC_MESSAGE_HANDLER(CastHostMsg_CancelSendingFrames, 4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) OnCancelSendingFrames) 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false); 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_END_MESSAGE_MAP(); 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return handled; 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CastTransportHostFilter::NotifyStatusChange( 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int32 channel_id, 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch media::cast::CastTransportStatus status) { 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Send(new CastMsg_NotifyStatusChange(channel_id, status)); 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void CastTransportHostFilter::SendRawEvents( 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int32 channel_id, 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::vector<media::cast::PacketEvent>& packet_events, 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::vector<media::cast::FrameEvent>& frame_events) { 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!packet_events.empty()) 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Send(new CastMsg_RawEvents(channel_id, 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) packet_events, 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) frame_events)); 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void CastTransportHostFilter::SendRtt(int32 channel_id, 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) uint32 ssrc, 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TimeDelta rtt) { 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Send(new CastMsg_Rtt(channel_id, ssrc, rtt)); 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void CastTransportHostFilter::SendCastMessage( 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int32 channel_id, 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) uint32 ssrc, 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const media::cast::RtcpCastMessage& cast_message) { 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Send(new CastMsg_RtcpCastMessage(channel_id, ssrc, cast_message)); 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CastTransportHostFilter::OnNew( 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int32 channel_id, 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const net::IPEndPoint& remote_end_point, 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::DictionaryValue& options) { 796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!power_save_blocker_) { 806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DVLOG(1) << ("Preventing the application from being suspended while one or " 816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "more transports are active for Cast Streaming."); 826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) power_save_blocker_ = content::PowerSaveBlocker::Create( 836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) content::PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension, 846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "Cast is streaming content to a remote receiver.").Pass(); 856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (id_map_.Lookup(channel_id)) { 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) id_map_.Remove(channel_id); 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<media::cast::CastTransportSender> sender = 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch media::cast::CastTransportSender::Create( 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) g_browser_process->net_log(), 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &clock_, 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) remote_end_point, 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci make_scoped_ptr(options.DeepCopy()), 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&CastTransportHostFilter::NotifyStatusChange, 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) weak_factory_.GetWeakPtr(), 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) channel_id), 1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&CastTransportHostFilter::SendRawEvents, 1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) weak_factory_.GetWeakPtr(), 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) channel_id), 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeDelta::FromSeconds(kSendRawEventsIntervalSecs), 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::MessageLoopProxy::current()); 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) id_map_.AddWithID(sender.release(), channel_id); 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CastTransportHostFilter::OnDelete(int32 channel_id) { 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch media::cast::CastTransportSender* sender = 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) id_map_.Lookup(channel_id); 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (sender) { 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) id_map_.Remove(channel_id); 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DVLOG(1) << "CastTransportHostFilter::Delete called " 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << "on non-existing channel"; 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (id_map_.IsEmpty()) { 1196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DVLOG_IF(1, power_save_blocker_) << 1206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ("Releasing the block on application suspension since no transports " 1216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "are active anymore for Cast Streaming."); 1226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) power_save_blocker_.reset(); 1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void CastTransportHostFilter::OnInitializeAudio( 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int32 channel_id, 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const media::cast::CastTransportRtpConfig& config) { 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch media::cast::CastTransportSender* sender = 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) id_map_.Lookup(channel_id); 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (sender) { 1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sender->InitializeAudio( 1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) config, 1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&CastTransportHostFilter::SendCastMessage, 1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) weak_factory_.GetWeakPtr(), 1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) channel_id, config.ssrc), 1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&CastTransportHostFilter::SendRtt, 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) weak_factory_.GetWeakPtr(), 1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) channel_id, config.ssrc)); 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DVLOG(1) 142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) << "CastTransportHostFilter::OnInitializeAudio on non-existing channel"; 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void CastTransportHostFilter::OnInitializeVideo( 147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int32 channel_id, 148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const media::cast::CastTransportRtpConfig& config) { 149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch media::cast::CastTransportSender* sender = 150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) id_map_.Lookup(channel_id); 151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (sender) { 1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sender->InitializeVideo( 1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) config, 1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&CastTransportHostFilter::SendCastMessage, 1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) weak_factory_.GetWeakPtr(), 1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) channel_id, config.ssrc), 1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&CastTransportHostFilter::SendRtt, 1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) weak_factory_.GetWeakPtr(), 1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) channel_id, config.ssrc)); 160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DVLOG(1) 162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) << "CastTransportHostFilter::OnInitializeVideo on non-existing channel"; 163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid CastTransportHostFilter::OnInsertFrame( 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int32 channel_id, 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci uint32 ssrc, 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const media::cast::EncodedFrame& frame) { 170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch media::cast::CastTransportSender* sender = 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) id_map_.Lookup(channel_id); 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (sender) { 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sender->InsertFrame(ssrc, frame); 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DVLOG(1) 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci << "CastTransportHostFilter::OnInsertFrame on non-existing channel"; 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void CastTransportHostFilter::OnCancelSendingFrames( 18103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int32 channel_id, uint32 ssrc, 18203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const std::vector<uint32>& frame_ids) { 183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch media::cast::CastTransportSender* sender = 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) id_map_.Lookup(channel_id); 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (sender) { 18603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) sender->CancelSendingFrames(ssrc, frame_ids); 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DVLOG(1) 18903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) << "CastTransportHostFilter::OnCancelSendingFrames " 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << "on non-existing channel"; 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 19403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void CastTransportHostFilter::OnResendFrameForKickstart( 19503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int32 channel_id, uint32 ssrc, uint32 frame_id) { 19603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) media::cast::CastTransportSender* sender = 19703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) id_map_.Lookup(channel_id); 19803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (sender) { 19903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) sender->ResendFrameForKickstart(ssrc, frame_id); 20003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } else { 20103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DVLOG(1) 20203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) << "CastTransportHostFilter::OnResendFrameForKickstart " 20303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) << "on non-existing channel"; 20403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 20503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 20603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 20703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void CastTransportHostFilter::OnSendSenderReport( 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int32 channel_id, 20903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) uint32 ssrc, 21003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::TimeTicks current_time, 21103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) uint32 current_time_as_rtp_timestamp) { 212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch media::cast::CastTransportSender* sender = 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) id_map_.Lookup(channel_id); 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (sender) { 21503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) sender->SendSenderReport(ssrc, 21603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) current_time, 21703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) current_time_as_rtp_timestamp); 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DVLOG(1) 22003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) << "CastTransportHostFilter::OnSendSenderReport " 22103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) << "on non-existing channel"; 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace cast 226