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 "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/memory/weak_ptr.h" | 10 #include "base/memory/weak_ptr.h" |
11 #include "base/sys_info.h" | |
11 #include "chrome/renderer/media/cast_session.h" | 12 #include "chrome/renderer/media/cast_session.h" |
12 #include "chrome/renderer/media/cast_udp_transport.h" | 13 #include "chrome/renderer/media/cast_udp_transport.h" |
13 #include "content/public/renderer/media_stream_audio_sink.h" | 14 #include "content/public/renderer/media_stream_audio_sink.h" |
14 #include "content/public/renderer/media_stream_video_sink.h" | 15 #include "content/public/renderer/media_stream_video_sink.h" |
15 #include "content/public/renderer/render_thread.h" | 16 #include "content/public/renderer/render_thread.h" |
16 #include "content/public/renderer/video_encode_accelerator.h" | 17 #include "content/public/renderer/video_encode_accelerator.h" |
17 #include "media/audio/audio_parameters.h" | 18 #include "media/audio/audio_parameters.h" |
18 #include "media/base/audio_bus.h" | 19 #include "media/base/audio_bus.h" |
19 #include "media/base/audio_fifo.h" | 20 #include "media/base/audio_fifo.h" |
20 #include "media/base/bind_to_current_loop.h" | 21 #include "media/base/bind_to_current_loop.h" |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
109 content::GetSupportedVideoEncodeAcceleratorProfiles(); | 110 content::GetSupportedVideoEncodeAcceleratorProfiles(); |
110 for (size_t i = 0; i < vea_profiles.size(); ++i) { | 111 for (size_t i = 0; i < vea_profiles.size(); ++i) { |
111 if (vea_profiles[i].profile >= media::H264PROFILE_MIN && | 112 if (vea_profiles[i].profile >= media::H264PROFILE_MIN && |
112 vea_profiles[i].profile <= media::H264PROFILE_MAX) { | 113 vea_profiles[i].profile <= media::H264PROFILE_MAX) { |
113 return true; | 114 return true; |
114 } | 115 } |
115 } | 116 } |
116 return false; | 117 return false; |
117 } | 118 } |
118 | 119 |
120 int NumberOfEncodeThreads() { | |
121 // We want to give CPU cycles for capturing and not to saturate the system | |
122 // just for encoding. So on a lower end system with only 1 or 2 cores we | |
123 // use only one thread for encoding. | |
124 if (base::SysInfo::NumberOfProcessors() <= 2) | |
125 return 1; | |
126 | |
127 // On higher end we want to use 2 threads for encoding to reduce latency. | |
128 // In theory a physical CPU core has maximum 2 hyperthreads. Having 3 or | |
129 // more logical processors means the system has at least 2 physical cores. | |
130 return 2; | |
miu
2014/04/09 00:53:42
Unless I'm missing something, the change descripti
| |
131 } | |
132 | |
119 std::vector<CastRtpParams> SupportedAudioParams() { | 133 std::vector<CastRtpParams> SupportedAudioParams() { |
120 // TODO(hclam): Fill in more codecs here. | 134 // TODO(hclam): Fill in more codecs here. |
121 std::vector<CastRtpParams> supported_params; | 135 std::vector<CastRtpParams> supported_params; |
122 supported_params.push_back(CastRtpParams(DefaultOpusPayload())); | 136 supported_params.push_back(CastRtpParams(DefaultOpusPayload())); |
123 return supported_params; | 137 return supported_params; |
124 } | 138 } |
125 | 139 |
126 std::vector<CastRtpParams> SupportedVideoParams() { | 140 std::vector<CastRtpParams> SupportedVideoParams() { |
127 std::vector<CastRtpParams> supported_params; | 141 std::vector<CastRtpParams> supported_params; |
128 if (IsHardwareH264EncodingSupported()) | 142 if (IsHardwareH264EncodingSupported()) |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
161 config->max_bitrate = params.payload.max_bitrate * kBitrateMultiplier; | 175 config->max_bitrate = params.payload.max_bitrate * kBitrateMultiplier; |
162 if (params.payload.codec_name == kCodecNameVp8) { | 176 if (params.payload.codec_name == kCodecNameVp8) { |
163 config->use_external_encoder = IsHardwareVP8EncodingSupported(); | 177 config->use_external_encoder = IsHardwareVP8EncodingSupported(); |
164 config->codec = media::cast::transport::kVp8; | 178 config->codec = media::cast::transport::kVp8; |
165 } else if (params.payload.codec_name == kCodecNameH264) { | 179 } else if (params.payload.codec_name == kCodecNameH264) { |
166 config->use_external_encoder = IsHardwareH264EncodingSupported(); | 180 config->use_external_encoder = IsHardwareH264EncodingSupported(); |
167 config->codec = media::cast::transport::kH264; | 181 config->codec = media::cast::transport::kH264; |
168 } else { | 182 } else { |
169 return false; | 183 return false; |
170 } | 184 } |
185 if (!config->use_external_encoder) { | |
186 config->number_of_encode_threads = NumberOfEncodeThreads(); | |
187 } | |
171 return true; | 188 return true; |
172 } | 189 } |
173 | 190 |
174 } // namespace | 191 } // namespace |
175 | 192 |
176 // This class receives MediaStreamTrack events and video frames from a | 193 // This class receives MediaStreamTrack events and video frames from a |
177 // MediaStreamTrack. Video frames are submitted to media::cast::FrameInput. | 194 // MediaStreamTrack. Video frames are submitted to media::cast::FrameInput. |
178 // | 195 // |
179 // Threading: Video frames are received on the render thread. | 196 // Threading: Video frames are received on the render thread. |
180 class CastVideoSink : public base::SupportsWeakPtr<CastVideoSink>, | 197 class CastVideoSink : public base::SupportsWeakPtr<CastVideoSink>, |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
499 } | 516 } |
500 | 517 |
501 void CastRtpStream::DidEncounterError(const std::string& message) { | 518 void CastRtpStream::DidEncounterError(const std::string& message) { |
502 // Save the WeakPtr first because the error callback might delete this object. | 519 // Save the WeakPtr first because the error callback might delete this object. |
503 base::WeakPtr<CastRtpStream> ptr = weak_factory_.GetWeakPtr(); | 520 base::WeakPtr<CastRtpStream> ptr = weak_factory_.GetWeakPtr(); |
504 error_callback_.Run(message); | 521 error_callback_.Run(message); |
505 content::RenderThread::Get()->GetMessageLoop()->PostTask( | 522 content::RenderThread::Get()->GetMessageLoop()->PostTask( |
506 FROM_HERE, | 523 FROM_HERE, |
507 base::Bind(&CastRtpStream::Stop, ptr)); | 524 base::Bind(&CastRtpStream::Stop, ptr)); |
508 } | 525 } |
OLD | NEW |