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 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 bool ValidateSendSsrcAvailability(const StreamParams& sp) const | 224 bool ValidateSendSsrcAvailability(const StreamParams& sp) const |
225 EXCLUSIVE_LOCKS_REQUIRED(stream_crit_); | 225 EXCLUSIVE_LOCKS_REQUIRED(stream_crit_); |
226 bool ValidateReceiveSsrcAvailability(const StreamParams& sp) const | 226 bool ValidateReceiveSsrcAvailability(const StreamParams& sp) const |
227 EXCLUSIVE_LOCKS_REQUIRED(stream_crit_); | 227 EXCLUSIVE_LOCKS_REQUIRED(stream_crit_); |
228 void DeleteReceiveStream(WebRtcVideoReceiveStream* stream) | 228 void DeleteReceiveStream(WebRtcVideoReceiveStream* stream) |
229 EXCLUSIVE_LOCKS_REQUIRED(stream_crit_); | 229 EXCLUSIVE_LOCKS_REQUIRED(stream_crit_); |
230 | 230 |
231 static std::string CodecSettingsVectorToString( | 231 static std::string CodecSettingsVectorToString( |
232 const std::vector<VideoCodecSettings>& codecs); | 232 const std::vector<VideoCodecSettings>& codecs); |
233 | 233 |
234 // Wrapper for the sender part, this is where the source is connected and | 234 // Wrapper for the sender part. |
235 // frames are then converted from cricket frames to webrtc frames. | |
236 class WebRtcVideoSendStream | 235 class WebRtcVideoSendStream |
237 : public rtc::VideoSinkInterface<webrtc::VideoFrame>, | 236 : public rtc::VideoSourceInterface<webrtc::VideoFrame> { |
238 public rtc::VideoSourceInterface<webrtc::VideoFrame> { | |
239 public: | 237 public: |
240 WebRtcVideoSendStream( | 238 WebRtcVideoSendStream( |
241 webrtc::Call* call, | 239 webrtc::Call* call, |
242 const StreamParams& sp, | 240 const StreamParams& sp, |
243 webrtc::VideoSendStream::Config config, | 241 webrtc::VideoSendStream::Config config, |
244 const VideoOptions& options, | 242 const VideoOptions& options, |
245 WebRtcVideoEncoderFactory* external_encoder_factory, | 243 WebRtcVideoEncoderFactory* external_encoder_factory, |
246 bool enable_cpu_overuse_detection, | 244 bool enable_cpu_overuse_detection, |
247 int max_bitrate_bps, | 245 int max_bitrate_bps, |
248 const rtc::Optional<VideoCodecSettings>& codec_settings, | 246 const rtc::Optional<VideoCodecSettings>& codec_settings, |
249 const rtc::Optional<std::vector<webrtc::RtpExtension>>& rtp_extensions, | 247 const rtc::Optional<std::vector<webrtc::RtpExtension>>& rtp_extensions, |
250 const VideoSendParameters& send_params); | 248 const VideoSendParameters& send_params); |
251 virtual ~WebRtcVideoSendStream(); | 249 virtual ~WebRtcVideoSendStream(); |
252 | 250 |
253 void SetSendParameters(const ChangedSendParameters& send_params); | 251 void SetSendParameters(const ChangedSendParameters& send_params); |
254 bool SetRtpParameters(const webrtc::RtpParameters& parameters); | 252 bool SetRtpParameters(const webrtc::RtpParameters& parameters); |
255 webrtc::RtpParameters GetRtpParameters() const; | 253 webrtc::RtpParameters GetRtpParameters() const; |
256 | 254 |
257 // Implements rtc::VideoSourceInterface<webrtc::VideoFrame>. | 255 // Implements rtc::VideoSourceInterface<webrtc::VideoFrame>. |
258 // WebRtcVideoSendStream acts as a source to the webrtc::VideoSendStream | 256 // WebRtcVideoSendStream acts as a source to the webrtc::VideoSendStream |
259 // in |stream_|. | 257 // in |stream_|. This is done to proxy VideoSinkWants from the encoder to |
260 // TODO(perkj, nisse): Refactor WebRtcVideoSendStream to directly connect | 258 // the worker thread. |
261 // the camera input |source_| | 259 void AddOrUpdateSink(rtc::VideoSinkInterface<webrtc::VideoFrame>* sink, |
262 void AddOrUpdateSink(VideoSinkInterface<webrtc::VideoFrame>* sink, | |
263 const rtc::VideoSinkWants& wants) override; | 260 const rtc::VideoSinkWants& wants) override; |
264 void RemoveSink(VideoSinkInterface<webrtc::VideoFrame>* sink) override; | 261 void RemoveSink(rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) override; |
265 | 262 |
266 void OnFrame(const webrtc::VideoFrame& frame) override; | |
267 bool SetVideoSend(bool mute, | 263 bool SetVideoSend(bool mute, |
268 const VideoOptions* options, | 264 const VideoOptions* options, |
269 rtc::VideoSourceInterface<webrtc::VideoFrame>* source); | 265 rtc::VideoSourceInterface<webrtc::VideoFrame>* source); |
270 | 266 |
271 void SetSend(bool send); | 267 void SetSend(bool send); |
272 | 268 |
273 const std::vector<uint32_t>& GetSsrcs() const; | 269 const std::vector<uint32_t>& GetSsrcs() const; |
274 VideoSenderInfo GetVideoSenderInfo(bool log_stats); | 270 VideoSenderInfo GetVideoSenderInfo(bool log_stats); |
275 void FillBandwidthEstimationInfo(BandwidthEstimationInfo* bwe_info); | 271 void FillBandwidthEstimationInfo(BandwidthEstimationInfo* bwe_info); |
276 | 272 |
(...skipping 22 matching lines...) Expand all Loading... |
299 struct AllocatedEncoder { | 295 struct AllocatedEncoder { |
300 AllocatedEncoder(webrtc::VideoEncoder* encoder, | 296 AllocatedEncoder(webrtc::VideoEncoder* encoder, |
301 const cricket::VideoCodec& codec, | 297 const cricket::VideoCodec& codec, |
302 bool external); | 298 bool external); |
303 webrtc::VideoEncoder* encoder; | 299 webrtc::VideoEncoder* encoder; |
304 webrtc::VideoEncoder* external_encoder; | 300 webrtc::VideoEncoder* external_encoder; |
305 cricket::VideoCodec codec; | 301 cricket::VideoCodec codec; |
306 bool external; | 302 bool external; |
307 }; | 303 }; |
308 | 304 |
309 // TODO(perkj): VideoFrameInfo is currently used for sending a black frame | |
310 // when the video source is removed. Consider moving that logic to | |
311 // VieEncoder or remove it. | |
312 struct VideoFrameInfo { | |
313 VideoFrameInfo() | |
314 : width(0), | |
315 height(0), | |
316 rotation(webrtc::kVideoRotation_0), | |
317 is_texture(false) {} | |
318 int width; | |
319 int height; | |
320 webrtc::VideoRotation rotation; | |
321 bool is_texture; | |
322 }; | |
323 | |
324 rtc::scoped_refptr<webrtc::VideoEncoderConfig::EncoderSpecificSettings> | 305 rtc::scoped_refptr<webrtc::VideoEncoderConfig::EncoderSpecificSettings> |
325 ConfigureVideoEncoderSettings(const VideoCodec& codec); | 306 ConfigureVideoEncoderSettings(const VideoCodec& codec); |
326 AllocatedEncoder CreateVideoEncoder(const VideoCodec& codec); | 307 AllocatedEncoder CreateVideoEncoder(const VideoCodec& codec); |
327 void DestroyVideoEncoder(AllocatedEncoder* encoder); | 308 void DestroyVideoEncoder(AllocatedEncoder* encoder); |
328 void SetCodec(const VideoCodecSettings& codec); | 309 void SetCodec(const VideoCodecSettings& codec); |
329 void RecreateWebRtcStream(); | 310 void RecreateWebRtcStream(); |
330 webrtc::VideoEncoderConfig CreateVideoEncoderConfig( | 311 webrtc::VideoEncoderConfig CreateVideoEncoderConfig( |
331 const VideoCodec& codec) const; | 312 const VideoCodec& codec) const; |
332 void ReconfigureEncoder(); | 313 void ReconfigureEncoder(); |
333 bool ValidateRtpParameters(const webrtc::RtpParameters& parameters); | 314 bool ValidateRtpParameters(const webrtc::RtpParameters& parameters); |
334 | 315 |
335 // Calls Start or Stop according to whether or not |sending_| is true, | 316 // Calls Start or Stop according to whether or not |sending_| is true, |
336 // and whether or not the encoding in |rtp_parameters_| is active. | 317 // and whether or not the encoding in |rtp_parameters_| is active. |
337 void UpdateSendState(); | 318 void UpdateSendState(); |
338 | 319 |
339 rtc::ThreadChecker thread_checker_; | 320 rtc::ThreadChecker thread_checker_; |
340 rtc::AsyncInvoker invoker_; | 321 rtc::AsyncInvoker invoker_; |
341 rtc::Thread* worker_thread_; | 322 rtc::Thread* worker_thread_; |
342 const std::vector<uint32_t> ssrcs_ ACCESS_ON(&thread_checker_); | 323 const std::vector<uint32_t> ssrcs_ ACCESS_ON(&thread_checker_); |
343 const std::vector<SsrcGroup> ssrc_groups_ ACCESS_ON(&thread_checker_); | 324 const std::vector<SsrcGroup> ssrc_groups_ ACCESS_ON(&thread_checker_); |
344 webrtc::Call* const call_; | 325 webrtc::Call* const call_; |
345 const bool enable_cpu_overuse_detection_; | 326 const bool enable_cpu_overuse_detection_; |
346 rtc::VideoSourceInterface<webrtc::VideoFrame>* source_ | 327 rtc::VideoSourceInterface<webrtc::VideoFrame>* source_ |
347 ACCESS_ON(&thread_checker_); | 328 ACCESS_ON(&thread_checker_); |
348 WebRtcVideoEncoderFactory* const external_encoder_factory_ | 329 WebRtcVideoEncoderFactory* const external_encoder_factory_ |
349 ACCESS_ON(&thread_checker_); | 330 ACCESS_ON(&thread_checker_); |
350 | 331 |
351 rtc::CriticalSection lock_; | |
352 webrtc::VideoSendStream* stream_ ACCESS_ON(&thread_checker_); | 332 webrtc::VideoSendStream* stream_ ACCESS_ON(&thread_checker_); |
353 rtc::VideoSinkInterface<webrtc::VideoFrame>* encoder_sink_ | 333 rtc::VideoSinkInterface<webrtc::VideoFrame>* encoder_sink_ |
354 GUARDED_BY(lock_); | 334 ACCESS_ON(&thread_checker_); |
355 // Contains settings that are the same for all streams in the MediaChannel, | 335 // Contains settings that are the same for all streams in the MediaChannel, |
356 // such as codecs, header extensions, and the global bitrate limit for the | 336 // such as codecs, header extensions, and the global bitrate limit for the |
357 // entire channel. | 337 // entire channel. |
358 VideoSendStreamParameters parameters_ ACCESS_ON(&thread_checker_); | 338 VideoSendStreamParameters parameters_ ACCESS_ON(&thread_checker_); |
359 // Contains settings that are unique for each stream, such as max_bitrate. | 339 // Contains settings that are unique for each stream, such as max_bitrate. |
360 // Does *not* contain codecs, however. | 340 // Does *not* contain codecs, however. |
361 // TODO(skvlad): Move ssrcs_ and ssrc_groups_ into rtp_parameters_. | 341 // TODO(skvlad): Move ssrcs_ and ssrc_groups_ into rtp_parameters_. |
362 // TODO(skvlad): Combine parameters_ and rtp_parameters_ once we have only | 342 // TODO(skvlad): Combine parameters_ and rtp_parameters_ once we have only |
363 // one stream per MediaChannel. | 343 // one stream per MediaChannel. |
364 webrtc::RtpParameters rtp_parameters_ ACCESS_ON(&thread_checker_); | 344 webrtc::RtpParameters rtp_parameters_ ACCESS_ON(&thread_checker_); |
365 AllocatedEncoder allocated_encoder_ ACCESS_ON(&thread_checker_); | 345 AllocatedEncoder allocated_encoder_ ACCESS_ON(&thread_checker_); |
366 VideoFrameInfo last_frame_info_ GUARDED_BY(lock_); | |
367 | 346 |
368 bool sending_ ACCESS_ON(&thread_checker_); | 347 bool sending_ ACCESS_ON(&thread_checker_); |
369 | |
370 // The timestamp of the last frame received | |
371 // Used to generate timestamp for the black frame when source is removed | |
372 int64_t last_frame_timestamp_us_ GUARDED_BY(lock_); | |
373 }; | 348 }; |
374 | 349 |
375 // Wrapper for the receiver part, contains configs etc. that are needed to | 350 // Wrapper for the receiver part, contains configs etc. that are needed to |
376 // reconstruct the underlying VideoReceiveStream. | 351 // reconstruct the underlying VideoReceiveStream. |
377 class WebRtcVideoReceiveStream | 352 class WebRtcVideoReceiveStream |
378 : public rtc::VideoSinkInterface<webrtc::VideoFrame> { | 353 : public rtc::VideoSinkInterface<webrtc::VideoFrame> { |
379 public: | 354 public: |
380 WebRtcVideoReceiveStream( | 355 WebRtcVideoReceiveStream( |
381 webrtc::Call* call, | 356 webrtc::Call* call, |
382 const StreamParams& sp, | 357 const StreamParams& sp, |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
511 // send_params/recv_params, rtp_extensions, options, etc. | 486 // send_params/recv_params, rtp_extensions, options, etc. |
512 VideoSendParameters send_params_; | 487 VideoSendParameters send_params_; |
513 VideoOptions default_send_options_; | 488 VideoOptions default_send_options_; |
514 VideoRecvParameters recv_params_; | 489 VideoRecvParameters recv_params_; |
515 int64_t last_stats_log_ms_; | 490 int64_t last_stats_log_ms_; |
516 }; | 491 }; |
517 | 492 |
518 } // namespace cricket | 493 } // namespace cricket |
519 | 494 |
520 #endif // WEBRTC_MEDIA_ENGINE_WEBRTCVIDEOENGINE2_H_ | 495 #endif // WEBRTC_MEDIA_ENGINE_WEBRTCVIDEOENGINE2_H_ |
OLD | NEW |