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