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 "chrome/renderer/media/cast_rtp_stream.h" | 5 #include "chrome/renderer/media/cast_rtp_stream.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 if (supported_params.empty()) | 156 if (supported_params.empty()) |
157 supported_params.push_back(CastRtpParams(DefaultVp8Payload())); | 157 supported_params.push_back(CastRtpParams(DefaultVp8Payload())); |
158 | 158 |
159 return supported_params; | 159 return supported_params; |
160 } | 160 } |
161 | 161 |
162 bool ToAudioSenderConfig(const CastRtpParams& params, | 162 bool ToAudioSenderConfig(const CastRtpParams& params, |
163 AudioSenderConfig* config) { | 163 AudioSenderConfig* config) { |
164 config->ssrc = params.payload.ssrc; | 164 config->ssrc = params.payload.ssrc; |
165 config->receiver_ssrc = params.payload.feedback_ssrc; | 165 config->receiver_ssrc = params.payload.feedback_ssrc; |
166 if (config->ssrc == config->receiver_ssrc) | 166 if (config->ssrc == config->receiver_ssrc) { |
| 167 DVLOG(1) << "ssrc " << config->ssrc << " cannot be equal to receiver_ssrc"; |
167 return false; | 168 return false; |
| 169 } |
168 config->min_playout_delay = base::TimeDelta::FromMilliseconds( | 170 config->min_playout_delay = base::TimeDelta::FromMilliseconds( |
169 params.payload.min_latency_ms ? | 171 params.payload.min_latency_ms ? |
170 params.payload.min_latency_ms : | 172 params.payload.min_latency_ms : |
171 params.payload.max_latency_ms); | 173 params.payload.max_latency_ms); |
172 config->max_playout_delay = | 174 config->max_playout_delay = |
173 base::TimeDelta::FromMilliseconds(params.payload.max_latency_ms); | 175 base::TimeDelta::FromMilliseconds(params.payload.max_latency_ms); |
174 if (config->min_playout_delay <= base::TimeDelta()) | 176 config->animated_playout_delay = base::TimeDelta::FromMilliseconds( |
| 177 params.payload.animated_latency_ms ? params.payload.animated_latency_ms |
| 178 : params.payload.max_latency_ms); |
| 179 if (config->min_playout_delay <= base::TimeDelta()) { |
| 180 DVLOG(1) << "min_playout_delay " << config->min_playout_delay |
| 181 << " is too small"; |
175 return false; | 182 return false; |
176 if (config->min_playout_delay > config->max_playout_delay) | 183 } |
| 184 if (config->min_playout_delay > config->max_playout_delay) { |
| 185 DVLOG(1) << "min_playout_delay " << config->min_playout_delay |
| 186 << " is too big"; |
177 return false; | 187 return false; |
| 188 } |
| 189 if (config->animated_playout_delay < config->min_playout_delay || |
| 190 config->animated_playout_delay > config->max_playout_delay) { |
| 191 DVLOG(1) << "animated_playout_delay " << config->animated_playout_delay |
| 192 << " is out of range"; |
| 193 return false; |
| 194 } |
178 config->rtp_payload_type = params.payload.payload_type; | 195 config->rtp_payload_type = params.payload.payload_type; |
179 config->use_external_encoder = false; | 196 config->use_external_encoder = false; |
180 config->frequency = params.payload.clock_rate; | 197 config->frequency = params.payload.clock_rate; |
181 // Sampling rate must be one of the Opus-supported values. | 198 // Sampling rate must be one of the Opus-supported values. |
182 switch (config->frequency) { | 199 switch (config->frequency) { |
183 case 48000: | 200 case 48000: |
184 case 24000: | 201 case 24000: |
185 case 16000: | 202 case 16000: |
186 case 12000: | 203 case 12000: |
187 case 8000: | 204 case 8000: |
188 break; | 205 break; |
189 default: | 206 default: |
| 207 DVLOG(1) << "frequency " << config->frequency << " is invalid"; |
190 return false; | 208 return false; |
191 } | 209 } |
192 config->channels = params.payload.channels; | 210 config->channels = params.payload.channels; |
193 if (config->channels < 1) | 211 if (config->channels < 1) { |
| 212 DVLOG(1) << "channels " << config->channels << " is invalid"; |
194 return false; | 213 return false; |
| 214 } |
195 config->bitrate = params.payload.max_bitrate * kBitrateMultiplier; | 215 config->bitrate = params.payload.max_bitrate * kBitrateMultiplier; |
196 if (params.payload.codec_name == kCodecNameOpus) | 216 if (params.payload.codec_name == kCodecNameOpus) { |
197 config->codec = media::cast::CODEC_AUDIO_OPUS; | 217 config->codec = media::cast::CODEC_AUDIO_OPUS; |
198 else | 218 } else { |
| 219 DVLOG(1) << "codec_name " << params.payload.codec_name << " is invalid"; |
199 return false; | 220 return false; |
| 221 } |
200 config->aes_key = params.payload.aes_key; | 222 config->aes_key = params.payload.aes_key; |
201 config->aes_iv_mask = params.payload.aes_iv_mask; | 223 config->aes_iv_mask = params.payload.aes_iv_mask; |
202 return true; | 224 return true; |
203 } | 225 } |
204 | 226 |
205 bool ToVideoSenderConfig(const CastRtpParams& params, | 227 bool ToVideoSenderConfig(const CastRtpParams& params, |
206 VideoSenderConfig* config) { | 228 VideoSenderConfig* config) { |
207 config->ssrc = params.payload.ssrc; | 229 config->ssrc = params.payload.ssrc; |
208 config->receiver_ssrc = params.payload.feedback_ssrc; | 230 config->receiver_ssrc = params.payload.feedback_ssrc; |
209 if (config->ssrc == config->receiver_ssrc) | 231 if (config->ssrc == config->receiver_ssrc) { |
| 232 DVLOG(1) << "ssrc " << config->ssrc << " cannot be equal to receiver_ssrc"; |
210 return false; | 233 return false; |
| 234 } |
211 config->min_playout_delay = base::TimeDelta::FromMilliseconds( | 235 config->min_playout_delay = base::TimeDelta::FromMilliseconds( |
212 params.payload.min_latency_ms ? | 236 params.payload.min_latency_ms ? |
213 params.payload.min_latency_ms : | 237 params.payload.min_latency_ms : |
214 params.payload.max_latency_ms); | 238 params.payload.max_latency_ms); |
215 config->max_playout_delay = | 239 config->max_playout_delay = |
216 base::TimeDelta::FromMilliseconds(params.payload.max_latency_ms); | 240 base::TimeDelta::FromMilliseconds(params.payload.max_latency_ms); |
217 if (config->min_playout_delay <= base::TimeDelta()) | 241 config->animated_playout_delay = base::TimeDelta::FromMilliseconds( |
| 242 params.payload.animated_latency_ms ? params.payload.animated_latency_ms |
| 243 : params.payload.max_latency_ms); |
| 244 if (config->min_playout_delay <= base::TimeDelta()) { |
| 245 DVLOG(1) << "min_playout_delay " << config->min_playout_delay |
| 246 << " is too small"; |
218 return false; | 247 return false; |
219 if (config->min_playout_delay > config->max_playout_delay) | 248 } |
| 249 if (config->min_playout_delay > config->max_playout_delay) { |
| 250 DVLOG(1) << "min_playout_delay " << config->min_playout_delay |
| 251 << " is too big"; |
220 return false; | 252 return false; |
| 253 } |
| 254 if (config->animated_playout_delay < config->min_playout_delay || |
| 255 config->animated_playout_delay > config->max_playout_delay) { |
| 256 DVLOG(1) << "animated_playout_delay " << config->animated_playout_delay |
| 257 << " is out of range"; |
| 258 return false; |
| 259 } |
221 config->rtp_payload_type = params.payload.payload_type; | 260 config->rtp_payload_type = params.payload.payload_type; |
222 config->min_bitrate = config->start_bitrate = | 261 config->min_bitrate = config->start_bitrate = |
223 params.payload.min_bitrate * kBitrateMultiplier; | 262 params.payload.min_bitrate * kBitrateMultiplier; |
224 config->max_bitrate = params.payload.max_bitrate * kBitrateMultiplier; | 263 config->max_bitrate = params.payload.max_bitrate * kBitrateMultiplier; |
225 if (config->min_bitrate > config->max_bitrate) | 264 if (config->min_bitrate > config->max_bitrate) { |
| 265 DVLOG(1) << "min_bitrate " << config->min_bitrate << " is larger than " |
| 266 << "max_bitrate " << config->max_bitrate; |
226 return false; | 267 return false; |
| 268 } |
227 config->start_bitrate = config->min_bitrate; | 269 config->start_bitrate = config->min_bitrate; |
228 config->max_frame_rate = static_cast<int>( | 270 config->max_frame_rate = static_cast<int>( |
229 std::max(1.0, params.payload.max_frame_rate) + 0.5); | 271 std::max(1.0, params.payload.max_frame_rate) + 0.5); |
230 if (config->max_frame_rate > media::limits::kMaxFramesPerSecond) | 272 if (config->max_frame_rate > media::limits::kMaxFramesPerSecond) { |
| 273 DVLOG(1) << "max_frame_rate " << config->max_frame_rate << " is invalid"; |
231 return false; | 274 return false; |
| 275 } |
232 if (params.payload.codec_name == kCodecNameVp8) { | 276 if (params.payload.codec_name == kCodecNameVp8) { |
233 config->use_external_encoder = IsHardwareVP8EncodingSupported(); | 277 config->use_external_encoder = IsHardwareVP8EncodingSupported(); |
234 config->codec = media::cast::CODEC_VIDEO_VP8; | 278 config->codec = media::cast::CODEC_VIDEO_VP8; |
235 } else if (params.payload.codec_name == kCodecNameH264) { | 279 } else if (params.payload.codec_name == kCodecNameH264) { |
236 config->use_external_encoder = IsHardwareH264EncodingSupported(); | 280 config->use_external_encoder = IsHardwareH264EncodingSupported(); |
237 config->codec = media::cast::CODEC_VIDEO_H264; | 281 config->codec = media::cast::CODEC_VIDEO_H264; |
238 } else { | 282 } else { |
| 283 DVLOG(1) << "codec_name " << params.payload.codec_name << " is invalid"; |
239 return false; | 284 return false; |
240 } | 285 } |
241 if (!config->use_external_encoder) | 286 if (!config->use_external_encoder) |
242 config->number_of_encode_threads = NumberOfEncodeThreads(); | 287 config->number_of_encode_threads = NumberOfEncodeThreads(); |
243 config->aes_key = params.payload.aes_key; | 288 config->aes_key = params.payload.aes_key; |
244 config->aes_iv_mask = params.payload.aes_iv_mask; | 289 config->aes_iv_mask = params.payload.aes_iv_mask; |
245 return true; | 290 return true; |
246 } | 291 } |
247 | 292 |
248 } // namespace | 293 } // namespace |
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
579 DCHECK(content::RenderThread::Get()); | 624 DCHECK(content::RenderThread::Get()); |
580 DVLOG(1) << "CastRtpStream::DidEncounterError(" << message << ") = " | 625 DVLOG(1) << "CastRtpStream::DidEncounterError(" << message << ") = " |
581 << (IsAudio() ? "audio" : "video"); | 626 << (IsAudio() ? "audio" : "video"); |
582 // Save the WeakPtr first because the error callback might delete this object. | 627 // Save the WeakPtr first because the error callback might delete this object. |
583 base::WeakPtr<CastRtpStream> ptr = weak_factory_.GetWeakPtr(); | 628 base::WeakPtr<CastRtpStream> ptr = weak_factory_.GetWeakPtr(); |
584 error_callback_.Run(message); | 629 error_callback_.Run(message); |
585 base::ThreadTaskRunnerHandle::Get()->PostTask( | 630 base::ThreadTaskRunnerHandle::Get()->PostTask( |
586 FROM_HERE, | 631 FROM_HERE, |
587 base::Bind(&CastRtpStream::Stop, ptr)); | 632 base::Bind(&CastRtpStream::Stop, ptr)); |
588 } | 633 } |
OLD | NEW |