OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
231 void DeleteReceiveStream(WebRtcVideoReceiveStream* stream) | 231 void DeleteReceiveStream(WebRtcVideoReceiveStream* stream) |
232 EXCLUSIVE_LOCKS_REQUIRED(stream_crit_); | 232 EXCLUSIVE_LOCKS_REQUIRED(stream_crit_); |
233 | 233 |
234 static std::string CodecSettingsVectorToString( | 234 static std::string CodecSettingsVectorToString( |
235 const std::vector<VideoCodecSettings>& codecs); | 235 const std::vector<VideoCodecSettings>& codecs); |
236 | 236 |
237 // Wrapper for the sender part, this is where the source is connected and | 237 // Wrapper for the sender part, this is where the source is connected and |
238 // frames are then converted from cricket frames to webrtc frames. | 238 // frames are then converted from cricket frames to webrtc frames. |
239 class WebRtcVideoSendStream | 239 class WebRtcVideoSendStream |
240 : public rtc::VideoSinkInterface<cricket::VideoFrame>, | 240 : public rtc::VideoSinkInterface<cricket::VideoFrame>, |
241 public rtc::VideoSourceInterface<webrtc::VideoFrame>, | 241 public rtc::VideoSourceInterface<webrtc::VideoFrame> { |
242 public webrtc::LoadObserver { | |
243 public: | 242 public: |
244 WebRtcVideoSendStream( | 243 WebRtcVideoSendStream( |
245 webrtc::Call* call, | 244 webrtc::Call* call, |
246 const StreamParams& sp, | 245 const StreamParams& sp, |
247 webrtc::VideoSendStream::Config config, | 246 webrtc::VideoSendStream::Config config, |
248 const VideoOptions& options, | 247 const VideoOptions& options, |
249 WebRtcVideoEncoderFactory* external_encoder_factory, | 248 WebRtcVideoEncoderFactory* external_encoder_factory, |
250 bool enable_cpu_overuse_detection, | 249 bool enable_cpu_overuse_detection, |
251 int max_bitrate_bps, | 250 int max_bitrate_bps, |
252 const rtc::Optional<VideoCodecSettings>& codec_settings, | 251 const rtc::Optional<VideoCodecSettings>& codec_settings, |
(...skipping 12 matching lines...) Expand all Loading... |
265 // TODO(perkj, nisse): Refactor WebRtcVideoSendStream to directly connect | 264 // TODO(perkj, nisse): Refactor WebRtcVideoSendStream to directly connect |
266 // the camera input |source_| | 265 // the camera input |source_| |
267 void AddOrUpdateSink(VideoSinkInterface<webrtc::VideoFrame>* sink, | 266 void AddOrUpdateSink(VideoSinkInterface<webrtc::VideoFrame>* sink, |
268 const rtc::VideoSinkWants& wants) override; | 267 const rtc::VideoSinkWants& wants) override; |
269 void RemoveSink(VideoSinkInterface<webrtc::VideoFrame>* sink) override; | 268 void RemoveSink(VideoSinkInterface<webrtc::VideoFrame>* sink) override; |
270 | 269 |
271 void OnFrame(const cricket::VideoFrame& frame) override; | 270 void OnFrame(const cricket::VideoFrame& frame) override; |
272 bool SetVideoSend(bool mute, | 271 bool SetVideoSend(bool mute, |
273 const VideoOptions* options, | 272 const VideoOptions* options, |
274 rtc::VideoSourceInterface<cricket::VideoFrame>* source); | 273 rtc::VideoSourceInterface<cricket::VideoFrame>* source); |
275 void DisconnectSource(); | |
276 | 274 |
277 void SetSend(bool send); | 275 void SetSend(bool send); |
278 | 276 |
279 // Implements webrtc::LoadObserver. | |
280 void OnLoadUpdate(Load load) override; | |
281 | |
282 const std::vector<uint32_t>& GetSsrcs() const; | 277 const std::vector<uint32_t>& GetSsrcs() const; |
283 VideoSenderInfo GetVideoSenderInfo(bool log_stats); | 278 VideoSenderInfo GetVideoSenderInfo(bool log_stats); |
284 void FillBandwidthEstimationInfo(BandwidthEstimationInfo* bwe_info); | 279 void FillBandwidthEstimationInfo(BandwidthEstimationInfo* bwe_info); |
285 | 280 |
286 private: | 281 private: |
287 // Parameters needed to reconstruct the underlying stream. | 282 // Parameters needed to reconstruct the underlying stream. |
288 // webrtc::VideoSendStream doesn't support setting a lot of options on the | 283 // webrtc::VideoSendStream doesn't support setting a lot of options on the |
289 // fly, so when those need to be changed we tear down and reconstruct with | 284 // fly, so when those need to be changed we tear down and reconstruct with |
290 // similar parameters depending on which options changed etc. | 285 // similar parameters depending on which options changed etc. |
291 struct VideoSendStreamParameters { | 286 struct VideoSendStreamParameters { |
(...skipping 16 matching lines...) Expand all Loading... |
308 struct AllocatedEncoder { | 303 struct AllocatedEncoder { |
309 AllocatedEncoder(webrtc::VideoEncoder* encoder, | 304 AllocatedEncoder(webrtc::VideoEncoder* encoder, |
310 webrtc::VideoCodecType type, | 305 webrtc::VideoCodecType type, |
311 bool external); | 306 bool external); |
312 webrtc::VideoEncoder* encoder; | 307 webrtc::VideoEncoder* encoder; |
313 webrtc::VideoEncoder* external_encoder; | 308 webrtc::VideoEncoder* external_encoder; |
314 webrtc::VideoCodecType type; | 309 webrtc::VideoCodecType type; |
315 bool external; | 310 bool external; |
316 }; | 311 }; |
317 | 312 |
318 // TODO(perkj): VideoFrameInfo is currently used for CPU adaptation since | 313 // TODO(perkj): VideoFrameInfo is currently used for sending a black frame |
319 // we currently do not express CPU overuse using SinkWants in lower | 314 // when the video source is removed. Consider moving that logic to |
320 // layers. This will be fixed in an upcoming cl. | 315 // VieEncoder or remove it. |
321 struct VideoFrameInfo { | 316 struct VideoFrameInfo { |
322 VideoFrameInfo() | 317 VideoFrameInfo() |
323 : width(0), | 318 : width(0), |
324 height(0), | 319 height(0), |
325 rotation(webrtc::kVideoRotation_0), | 320 rotation(webrtc::kVideoRotation_0), |
326 is_texture(false) {} | 321 is_texture(false) {} |
327 int width; | 322 int width; |
328 int height; | 323 int height; |
329 webrtc::VideoRotation rotation; | 324 webrtc::VideoRotation rotation; |
330 bool is_texture; | 325 bool is_texture; |
331 }; | 326 }; |
332 | 327 |
333 rtc::scoped_refptr<webrtc::VideoEncoderConfig::EncoderSpecificSettings> | 328 rtc::scoped_refptr<webrtc::VideoEncoderConfig::EncoderSpecificSettings> |
334 ConfigureVideoEncoderSettings(const VideoCodec& codec); | 329 ConfigureVideoEncoderSettings(const VideoCodec& codec); |
335 AllocatedEncoder CreateVideoEncoder(const VideoCodec& codec); | 330 AllocatedEncoder CreateVideoEncoder(const VideoCodec& codec); |
336 void DestroyVideoEncoder(AllocatedEncoder* encoder); | 331 void DestroyVideoEncoder(AllocatedEncoder* encoder); |
337 void SetCodec(const VideoCodecSettings& codec); | 332 void SetCodec(const VideoCodecSettings& codec); |
338 void RecreateWebRtcStream(); | 333 void RecreateWebRtcStream(); |
339 webrtc::VideoEncoderConfig CreateVideoEncoderConfig( | 334 webrtc::VideoEncoderConfig CreateVideoEncoderConfig( |
340 const VideoCodec& codec) const; | 335 const VideoCodec& codec) const; |
341 void ReconfigureEncoder(); | 336 void ReconfigureEncoder(); |
342 bool ValidateRtpParameters(const webrtc::RtpParameters& parameters); | 337 bool ValidateRtpParameters(const webrtc::RtpParameters& parameters); |
343 | 338 |
344 // Calls Start or Stop according to whether or not |sending_| is true, | 339 // Calls Start or Stop according to whether or not |sending_| is true, |
345 // and whether or not the encoding in |rtp_parameters_| is active. | 340 // and whether or not the encoding in |rtp_parameters_| is active. |
346 void UpdateSendState(); | 341 void UpdateSendState(); |
347 | 342 |
348 void UpdateHistograms() const EXCLUSIVE_LOCKS_REQUIRED(lock_); | |
349 | |
350 rtc::ThreadChecker thread_checker_; | 343 rtc::ThreadChecker thread_checker_; |
351 rtc::AsyncInvoker invoker_; | 344 rtc::AsyncInvoker invoker_; |
352 rtc::Thread* worker_thread_; | 345 rtc::Thread* worker_thread_; |
353 const std::vector<uint32_t> ssrcs_ ACCESS_ON(&thread_checker_); | 346 const std::vector<uint32_t> ssrcs_ ACCESS_ON(&thread_checker_); |
354 const std::vector<SsrcGroup> ssrc_groups_ ACCESS_ON(&thread_checker_); | 347 const std::vector<SsrcGroup> ssrc_groups_ ACCESS_ON(&thread_checker_); |
355 webrtc::Call* const call_; | 348 webrtc::Call* const call_; |
356 rtc::VideoSinkWants sink_wants_ ACCESS_ON(&thread_checker_); | 349 const bool enable_cpu_overuse_detection_; |
357 // Counter used for deciding if the video resolution is currently | |
358 // restricted by CPU usage. It is reset if |source_| is changed. | |
359 int cpu_restricted_counter_; | |
360 // Total number of times resolution as been requested to be changed due to | |
361 // CPU adaptation. | |
362 int number_of_cpu_adapt_changes_ ACCESS_ON(&thread_checker_); | |
363 // Total number of frames sent to |stream_|. | |
364 int frame_count_ GUARDED_BY(lock_); | |
365 // Total number of cpu restricted frames sent to |stream_|. | |
366 int cpu_restricted_frame_count_ GUARDED_BY(lock_); | |
367 rtc::VideoSourceInterface<cricket::VideoFrame>* source_ | 350 rtc::VideoSourceInterface<cricket::VideoFrame>* source_ |
368 ACCESS_ON(&thread_checker_); | 351 ACCESS_ON(&thread_checker_); |
369 WebRtcVideoEncoderFactory* const external_encoder_factory_ | 352 WebRtcVideoEncoderFactory* const external_encoder_factory_ |
370 ACCESS_ON(&thread_checker_); | 353 ACCESS_ON(&thread_checker_); |
371 | 354 |
372 rtc::CriticalSection lock_; | 355 rtc::CriticalSection lock_; |
373 webrtc::VideoSendStream* stream_ ACCESS_ON(&thread_checker_); | 356 webrtc::VideoSendStream* stream_ ACCESS_ON(&thread_checker_); |
374 rtc::VideoSinkInterface<webrtc::VideoFrame>* encoder_sink_ | 357 rtc::VideoSinkInterface<webrtc::VideoFrame>* encoder_sink_ |
375 GUARDED_BY(lock_); | 358 GUARDED_BY(lock_); |
376 // Contains settings that are the same for all streams in the MediaChannel, | 359 // Contains settings that are the same for all streams in the MediaChannel, |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
534 VideoSendParameters send_params_; | 517 VideoSendParameters send_params_; |
535 VideoOptions default_send_options_; | 518 VideoOptions default_send_options_; |
536 VideoRecvParameters recv_params_; | 519 VideoRecvParameters recv_params_; |
537 bool red_disabled_by_remote_side_; | 520 bool red_disabled_by_remote_side_; |
538 int64_t last_stats_log_ms_; | 521 int64_t last_stats_log_ms_; |
539 }; | 522 }; |
540 | 523 |
541 } // namespace cricket | 524 } // namespace cricket |
542 | 525 |
543 #endif // WEBRTC_MEDIA_ENGINE_WEBRTCVIDEOENGINE2_H_ | 526 #endif // WEBRTC_MEDIA_ENGINE_WEBRTCVIDEOENGINE2_H_ |
OLD | NEW |