Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(36)

Side by Side Diff: chrome/renderer/media/cast_transport_sender_ipc.cc

Issue 1709863002: Add Cast PLI support on sender side. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased and addressed comments. Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 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 "chrome/renderer/media/cast_transport_sender_ipc.h" 5 #include "chrome/renderer/media/cast_transport_sender_ipc.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/callback.h" 9 #include "base/callback.h"
10 #include "base/id_map.h" 10 #include "base/id_map.h"
(...skipping 29 matching lines...) Expand all
40 CastTransportSenderIPC::~CastTransportSenderIPC() { 40 CastTransportSenderIPC::~CastTransportSenderIPC() {
41 Send(new CastHostMsg_Delete(channel_id_)); 41 Send(new CastHostMsg_Delete(channel_id_));
42 if (CastIPCDispatcher::Get()) { 42 if (CastIPCDispatcher::Get()) {
43 CastIPCDispatcher::Get()->RemoveSender(channel_id_); 43 CastIPCDispatcher::Get()->RemoveSender(channel_id_);
44 } 44 }
45 } 45 }
46 46
47 void CastTransportSenderIPC::InitializeAudio( 47 void CastTransportSenderIPC::InitializeAudio(
48 const media::cast::CastTransportRtpConfig& config, 48 const media::cast::CastTransportRtpConfig& config,
49 const media::cast::RtcpCastMessageCallback& cast_message_cb, 49 const media::cast::RtcpCastMessageCallback& cast_message_cb,
50 const media::cast::RtcpRttCallback& rtt_cb) { 50 const media::cast::RtcpRttCallback& rtt_cb,
51 const media::cast::RtcpPliCallback& pli_cb) {
51 clients_[config.ssrc].cast_message_cb = cast_message_cb; 52 clients_[config.ssrc].cast_message_cb = cast_message_cb;
52 clients_[config.ssrc].rtt_cb = rtt_cb; 53 clients_[config.ssrc].rtt_cb = rtt_cb;
54 clients_[config.ssrc].pli_cb = pli_cb;
53 Send(new CastHostMsg_InitializeAudio(channel_id_, config)); 55 Send(new CastHostMsg_InitializeAudio(channel_id_, config));
54 } 56 }
55 57
56 void CastTransportSenderIPC::InitializeVideo( 58 void CastTransportSenderIPC::InitializeVideo(
57 const media::cast::CastTransportRtpConfig& config, 59 const media::cast::CastTransportRtpConfig& config,
58 const media::cast::RtcpCastMessageCallback& cast_message_cb, 60 const media::cast::RtcpCastMessageCallback& cast_message_cb,
59 const media::cast::RtcpRttCallback& rtt_cb) { 61 const media::cast::RtcpRttCallback& rtt_cb,
62 const media::cast::RtcpPliCallback& pli_cb) {
60 clients_[config.ssrc].cast_message_cb = cast_message_cb; 63 clients_[config.ssrc].cast_message_cb = cast_message_cb;
61 clients_[config.ssrc].rtt_cb = rtt_cb; 64 clients_[config.ssrc].rtt_cb = rtt_cb;
65 clients_[config.ssrc].pli_cb = pli_cb;
62 Send(new CastHostMsg_InitializeVideo(channel_id_, config)); 66 Send(new CastHostMsg_InitializeVideo(channel_id_, config));
63 } 67 }
64 68
65 void CastTransportSenderIPC::InsertFrame( 69 void CastTransportSenderIPC::InsertFrame(
66 uint32_t ssrc, 70 uint32_t ssrc,
67 const media::cast::EncodedFrame& frame) { 71 const media::cast::EncodedFrame& frame) {
68 Send(new CastHostMsg_InsertFrame(channel_id_, ssrc, frame)); 72 Send(new CastHostMsg_InsertFrame(channel_id_, ssrc, frame));
69 } 73 }
70 74
71 void CastTransportSenderIPC::SendSenderReport( 75 void CastTransportSenderIPC::SendSenderReport(
(...skipping 23 matching lines...) Expand all
95 99
96 void CastTransportSenderIPC::AddValidSsrc(uint32_t ssrc) { 100 void CastTransportSenderIPC::AddValidSsrc(uint32_t ssrc) {
97 Send(new CastHostMsg_AddValidSsrc(channel_id_, ssrc)); 101 Send(new CastHostMsg_AddValidSsrc(channel_id_, ssrc));
98 } 102 }
99 103
100 void CastTransportSenderIPC::SendRtcpFromRtpReceiver( 104 void CastTransportSenderIPC::SendRtcpFromRtpReceiver(
101 uint32_t ssrc, 105 uint32_t ssrc,
102 uint32_t sender_ssrc, 106 uint32_t sender_ssrc,
103 const media::cast::RtcpTimeData& time_data, 107 const media::cast::RtcpTimeData& time_data,
104 const media::cast::RtcpCastMessage* cast_message, 108 const media::cast::RtcpCastMessage* cast_message,
109 const media::cast::RtcpPliMessage* pli_message,
105 base::TimeDelta target_delay, 110 base::TimeDelta target_delay,
106 const media::cast::ReceiverRtcpEventSubscriber::RtcpEvents* rtcp_events, 111 const media::cast::ReceiverRtcpEventSubscriber::RtcpEvents* rtcp_events,
107 const media::cast::RtpReceiverStatistics* rtp_receiver_statistics) { 112 const media::cast::RtpReceiverStatistics* rtp_receiver_statistics) {
108 // To avoid copies, we put pointers to objects we don't really 113 // To avoid copies, we put pointers to objects we don't really
109 // own into scoped pointers and then very carefully extract them again 114 // own into scoped pointers and then very carefully extract them again
110 // before the scoped pointers go out of scope. 115 // before the scoped pointers go out of scope.
111 media::cast::SendRtcpFromRtpReceiver_Params params; 116 media::cast::SendRtcpFromRtpReceiver_Params params;
112 params.ssrc = ssrc; 117 params.ssrc = ssrc;
113 params.sender_ssrc = sender_ssrc; 118 params.sender_ssrc = sender_ssrc;
114 params.time_data = time_data; 119 params.time_data = time_data;
115 if (cast_message) { 120 if (cast_message) {
116 params.cast_message.reset( 121 params.cast_message.reset(
117 const_cast<media::cast::RtcpCastMessage*>(cast_message)); 122 const_cast<media::cast::RtcpCastMessage*>(cast_message));
118 } 123 }
124 if (pli_message) {
125 params.pli_message.reset(
dcheng 2016/03/01 23:44:12 Maybe the parameters shouldn't be const?
xjz 2016/03/02 04:24:17 The const_cast is used here only for the purpose t
dcheng 2016/03/02 07:41:24 But what's the point of making it const? Either th
xjz 2016/03/16 00:25:50 Not applicable.
126 const_cast<media::cast::RtcpPliMessage*>(pli_message));
127 }
119 params.target_delay = target_delay; 128 params.target_delay = target_delay;
120 if (rtcp_events) { 129 if (rtcp_events) {
121 params.rtcp_events.reset( 130 params.rtcp_events.reset(
122 const_cast<media::cast::ReceiverRtcpEventSubscriber::RtcpEvents*>( 131 const_cast<media::cast::ReceiverRtcpEventSubscriber::RtcpEvents*>(
123 rtcp_events)); 132 rtcp_events));
124 } 133 }
125 if (rtp_receiver_statistics) { 134 if (rtp_receiver_statistics) {
126 params.rtp_receiver_statistics.reset( 135 params.rtp_receiver_statistics.reset(
127 const_cast<media::cast::RtpReceiverStatistics*>( 136 const_cast<media::cast::RtpReceiverStatistics*>(
128 rtp_receiver_statistics)); 137 rtp_receiver_statistics));
129 } 138 }
130 // Note, params contains scoped_ptr<>, but this still works because 139 // Note, params contains scoped_ptr<>, but this still works because
131 // CastHostMsg_SendRtcpFromRtpReceiver doesn't take ownership, it 140 // CastHostMsg_SendRtcpFromRtpReceiver doesn't take ownership, it
132 // serializes it and remember the serialized form instead. 141 // serializes it and remember the serialized form instead.
dcheng 2016/03/01 23:44:12 ... so who frees this memory?
xjz 2016/03/02 04:24:17 It will be released below (line 146).
dcheng 2016/03/02 07:41:24 Reading the code, I understand how it works now: o
xjz 2016/03/16 00:25:50 Not applicable after refactor.
133 Send(new CastHostMsg_SendRtcpFromRtpReceiver(channel_id_, params)); 142 Send(new CastHostMsg_SendRtcpFromRtpReceiver(channel_id_, params));
134 143
135 ignore_result(params.rtp_receiver_statistics.release()); 144 ignore_result(params.rtp_receiver_statistics.release());
136 ignore_result(params.cast_message.release()); 145 ignore_result(params.cast_message.release());
146 ignore_result(params.pli_message.release());
137 ignore_result(params.rtcp_events.release()); 147 ignore_result(params.rtcp_events.release());
138 } 148 }
139 149
140 150
141 void CastTransportSenderIPC::OnNotifyStatusChange( 151 void CastTransportSenderIPC::OnNotifyStatusChange(
142 media::cast::CastTransportStatus status) { 152 media::cast::CastTransportStatus status) {
143 status_callback_.Run(status); 153 status_callback_.Run(status);
144 } 154 }
145 155
146 void CastTransportSenderIPC::OnRawEvents( 156 void CastTransportSenderIPC::OnRawEvents(
(...skipping 30 matching lines...) Expand all
177 ClientMap::iterator it = clients_.find(ssrc); 187 ClientMap::iterator it = clients_.find(ssrc);
178 if (it == clients_.end()) { 188 if (it == clients_.end()) {
179 LOG(ERROR) << "Received cast message from for unknown SSRC: " << ssrc; 189 LOG(ERROR) << "Received cast message from for unknown SSRC: " << ssrc;
180 return; 190 return;
181 } 191 }
182 if (it->second.cast_message_cb.is_null()) 192 if (it->second.cast_message_cb.is_null())
183 return; 193 return;
184 it->second.cast_message_cb.Run(cast_message); 194 it->second.cast_message_cb.Run(cast_message);
185 } 195 }
186 196
197 void CastTransportSenderIPC::OnReceivedPli(uint32_t ssrc) {
198 ClientMap::iterator it = clients_.find(ssrc);
199 if (it == clients_.end()) {
200 LOG(ERROR) << "Received picture loss indicator from for unknown SSRC: "
201 << ssrc;
202 return;
203 }
204 if (!it->second.pli_cb.is_null())
205 it->second.pli_cb.Run();
206 }
207
187 void CastTransportSenderIPC::OnReceivedPacket( 208 void CastTransportSenderIPC::OnReceivedPacket(
188 const media::cast::Packet& packet) { 209 const media::cast::Packet& packet) {
189 if (!packet_callback_.is_null()) { 210 if (!packet_callback_.is_null()) {
190 // TODO(hubbe): Perhaps an non-ownership-transferring cb here? 211 // TODO(hubbe): Perhaps an non-ownership-transferring cb here?
191 scoped_ptr<media::cast::Packet> packet_copy( 212 scoped_ptr<media::cast::Packet> packet_copy(
192 new media::cast::Packet(packet)); 213 new media::cast::Packet(packet));
193 packet_callback_.Run(std::move(packet_copy)); 214 packet_callback_.Run(std::move(packet_copy));
194 } else { 215 } else {
195 DVLOG(1) << "CastIPCDispatcher::OnReceivedPacket no packet callback yet."; 216 DVLOG(1) << "CastIPCDispatcher::OnReceivedPacket no packet callback yet.";
196 } 217 }
197 } 218 }
198 219
199 void CastTransportSenderIPC::Send(IPC::Message* message) { 220 void CastTransportSenderIPC::Send(IPC::Message* message) {
200 if (CastIPCDispatcher::Get()) { 221 if (CastIPCDispatcher::Get()) {
201 CastIPCDispatcher::Get()->Send(message); 222 CastIPCDispatcher::Get()->Send(message);
202 } else { 223 } else {
203 delete message; 224 delete message;
204 } 225 }
205 } 226 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698