| 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 |