| 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 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 virtual ~WebRtcVideoEngine(); | 114 virtual ~WebRtcVideoEngine(); |
| 115 | 115 |
| 116 WebRtcVideoChannel* CreateChannel(webrtc::Call* call, | 116 WebRtcVideoChannel* CreateChannel(webrtc::Call* call, |
| 117 const MediaConfig& config, | 117 const MediaConfig& config, |
| 118 const VideoOptions& options); | 118 const VideoOptions& options); |
| 119 | 119 |
| 120 std::vector<VideoCodec> codecs() const; | 120 std::vector<VideoCodec> codecs() const; |
| 121 RtpCapabilities GetCapabilities() const; | 121 RtpCapabilities GetCapabilities() const; |
| 122 | 122 |
| 123 private: | 123 private: |
| 124 const std::unique_ptr<DecoderFactoryAdapter> decoder_factory_; | 124 std::unique_ptr<DecoderFactoryAdapter> decoder_factory_; |
| 125 const std::unique_ptr<EncoderFactoryAdapter> encoder_factory_; | 125 std::unique_ptr<EncoderFactoryAdapter> encoder_factory_; |
| 126 }; | 126 }; |
| 127 | 127 |
| 128 class WebRtcVideoChannel : public VideoMediaChannel, public webrtc::Transport { | 128 class WebRtcVideoChannel : public VideoMediaChannel, public webrtc::Transport { |
| 129 public: | 129 public: |
| 130 WebRtcVideoChannel(webrtc::Call* call, | 130 WebRtcVideoChannel(webrtc::Call* call, |
| 131 const MediaConfig& config, | 131 const MediaConfig& config, |
| 132 const VideoOptions& options, | 132 const VideoOptions& options, |
| 133 const EncoderFactoryAdapter* encoder_factory, | 133 EncoderFactoryAdapter* encoder_factory, |
| 134 const DecoderFactoryAdapter* decoder_factory); | 134 DecoderFactoryAdapter* decoder_factory); |
| 135 ~WebRtcVideoChannel() override; | 135 ~WebRtcVideoChannel() override; |
| 136 | 136 |
| 137 // VideoMediaChannel implementation | 137 // VideoMediaChannel implementation |
| 138 rtc::DiffServCodePoint PreferredDscp() const override; | 138 rtc::DiffServCodePoint PreferredDscp() const override; |
| 139 | 139 |
| 140 bool SetSendParameters(const VideoSendParameters& params) override; | 140 bool SetSendParameters(const VideoSendParameters& params) override; |
| 141 bool SetRecvParameters(const VideoRecvParameters& params) override; | 141 bool SetRecvParameters(const VideoRecvParameters& params) override; |
| 142 webrtc::RtpParameters GetRtpSendParameters(uint32_t ssrc) const override; | 142 webrtc::RtpParameters GetRtpSendParameters(uint32_t ssrc) const override; |
| 143 bool SetRtpSendParameters(uint32_t ssrc, | 143 bool SetRtpSendParameters(uint32_t ssrc, |
| 144 const webrtc::RtpParameters& parameters) override; | 144 const webrtc::RtpParameters& parameters) override; |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 // of |other|. | 198 // of |other|. |
| 199 bool operator==(const VideoCodecSettings& other) const; | 199 bool operator==(const VideoCodecSettings& other) const; |
| 200 bool operator!=(const VideoCodecSettings& other) const; | 200 bool operator!=(const VideoCodecSettings& other) const; |
| 201 | 201 |
| 202 // Checks if all members of |a|, except |flexfec_payload_type|, are equal | 202 // Checks if all members of |a|, except |flexfec_payload_type|, are equal |
| 203 // to the corresponding members of |b|. | 203 // to the corresponding members of |b|. |
| 204 static bool EqualsDisregardingFlexfec(const VideoCodecSettings& a, | 204 static bool EqualsDisregardingFlexfec(const VideoCodecSettings& a, |
| 205 const VideoCodecSettings& b); | 205 const VideoCodecSettings& b); |
| 206 | 206 |
| 207 VideoCodec codec; | 207 VideoCodec codec; |
| 208 rtc::Optional<VideoCodec> stereo_codec; |
| 208 webrtc::UlpfecConfig ulpfec; | 209 webrtc::UlpfecConfig ulpfec; |
| 209 int flexfec_payload_type; | 210 int flexfec_payload_type; |
| 210 int rtx_payload_type; | 211 int rtx_payload_type; |
| 211 }; | 212 }; |
| 212 | 213 |
| 213 struct ChangedSendParameters { | 214 struct ChangedSendParameters { |
| 214 // These optionals are unset if not changed. | 215 // These optionals are unset if not changed. |
| 215 rtc::Optional<VideoCodecSettings> codec; | 216 rtc::Optional<VideoCodecSettings> codec; |
| 216 rtc::Optional<std::vector<webrtc::RtpExtension>> rtp_header_extensions; | 217 rtc::Optional<std::vector<webrtc::RtpExtension>> rtp_header_extensions; |
| 217 rtc::Optional<int> max_bandwidth_bps; | 218 rtc::Optional<int> max_bandwidth_bps; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 252 | 253 |
| 253 // Wrapper for the sender part. | 254 // Wrapper for the sender part. |
| 254 class WebRtcVideoSendStream | 255 class WebRtcVideoSendStream |
| 255 : public rtc::VideoSourceInterface<webrtc::VideoFrame> { | 256 : public rtc::VideoSourceInterface<webrtc::VideoFrame> { |
| 256 public: | 257 public: |
| 257 WebRtcVideoSendStream( | 258 WebRtcVideoSendStream( |
| 258 webrtc::Call* call, | 259 webrtc::Call* call, |
| 259 const StreamParams& sp, | 260 const StreamParams& sp, |
| 260 webrtc::VideoSendStream::Config config, | 261 webrtc::VideoSendStream::Config config, |
| 261 const VideoOptions& options, | 262 const VideoOptions& options, |
| 262 const EncoderFactoryAdapter* encoder_factory, | 263 EncoderFactoryAdapter* encoder_factory, |
| 263 bool enable_cpu_overuse_detection, | 264 bool enable_cpu_overuse_detection, |
| 264 int max_bitrate_bps, | 265 int max_bitrate_bps, |
| 265 const rtc::Optional<VideoCodecSettings>& codec_settings, | 266 const rtc::Optional<VideoCodecSettings>& codec_settings, |
| 266 const rtc::Optional<std::vector<webrtc::RtpExtension>>& rtp_extensions, | 267 const rtc::Optional<std::vector<webrtc::RtpExtension>>& rtp_extensions, |
| 267 const VideoSendParameters& send_params); | 268 const VideoSendParameters& send_params); |
| 268 virtual ~WebRtcVideoSendStream(); | 269 virtual ~WebRtcVideoSendStream(); |
| 269 | 270 |
| 270 void SetSendParameters(const ChangedSendParameters& send_params); | 271 void SetSendParameters(const ChangedSendParameters& send_params); |
| 271 bool SetRtpParameters(const webrtc::RtpParameters& parameters); | 272 bool SetRtpParameters(const webrtc::RtpParameters& parameters); |
| 272 webrtc::RtpParameters GetRtpParameters() const; | 273 webrtc::RtpParameters GetRtpParameters() const; |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 330 | 331 |
| 331 rtc::ThreadChecker thread_checker_; | 332 rtc::ThreadChecker thread_checker_; |
| 332 rtc::AsyncInvoker invoker_; | 333 rtc::AsyncInvoker invoker_; |
| 333 rtc::Thread* worker_thread_; | 334 rtc::Thread* worker_thread_; |
| 334 const std::vector<uint32_t> ssrcs_ RTC_ACCESS_ON(&thread_checker_); | 335 const std::vector<uint32_t> ssrcs_ RTC_ACCESS_ON(&thread_checker_); |
| 335 const std::vector<SsrcGroup> ssrc_groups_ RTC_ACCESS_ON(&thread_checker_); | 336 const std::vector<SsrcGroup> ssrc_groups_ RTC_ACCESS_ON(&thread_checker_); |
| 336 webrtc::Call* const call_; | 337 webrtc::Call* const call_; |
| 337 const bool enable_cpu_overuse_detection_; | 338 const bool enable_cpu_overuse_detection_; |
| 338 rtc::VideoSourceInterface<webrtc::VideoFrame>* source_ | 339 rtc::VideoSourceInterface<webrtc::VideoFrame>* source_ |
| 339 RTC_ACCESS_ON(&thread_checker_); | 340 RTC_ACCESS_ON(&thread_checker_); |
| 340 const EncoderFactoryAdapter* const encoder_factory_ | 341 EncoderFactoryAdapter* encoder_factory_ RTC_ACCESS_ON(&thread_checker_); |
| 341 RTC_ACCESS_ON(&thread_checker_); | |
| 342 | 342 |
| 343 webrtc::VideoSendStream* stream_ RTC_ACCESS_ON(&thread_checker_); | 343 webrtc::VideoSendStream* stream_ RTC_ACCESS_ON(&thread_checker_); |
| 344 rtc::VideoSinkInterface<webrtc::VideoFrame>* encoder_sink_ | 344 rtc::VideoSinkInterface<webrtc::VideoFrame>* encoder_sink_ |
| 345 RTC_ACCESS_ON(&thread_checker_); | 345 RTC_ACCESS_ON(&thread_checker_); |
| 346 // Contains settings that are the same for all streams in the MediaChannel, | 346 // Contains settings that are the same for all streams in the MediaChannel, |
| 347 // such as codecs, header extensions, and the global bitrate limit for the | 347 // such as codecs, header extensions, and the global bitrate limit for the |
| 348 // entire channel. | 348 // entire channel. |
| 349 VideoSendStreamParameters parameters_ RTC_ACCESS_ON(&thread_checker_); | 349 VideoSendStreamParameters parameters_ RTC_ACCESS_ON(&thread_checker_); |
| 350 // Contains settings that are unique for each stream, such as max_bitrate. | 350 // Contains settings that are unique for each stream, such as max_bitrate. |
| 351 // Does *not* contain codecs, however. | 351 // Does *not* contain codecs, however. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 362 | 362 |
| 363 // Wrapper for the receiver part, contains configs etc. that are needed to | 363 // Wrapper for the receiver part, contains configs etc. that are needed to |
| 364 // reconstruct the underlying VideoReceiveStream. | 364 // reconstruct the underlying VideoReceiveStream. |
| 365 class WebRtcVideoReceiveStream | 365 class WebRtcVideoReceiveStream |
| 366 : public rtc::VideoSinkInterface<webrtc::VideoFrame> { | 366 : public rtc::VideoSinkInterface<webrtc::VideoFrame> { |
| 367 public: | 367 public: |
| 368 WebRtcVideoReceiveStream( | 368 WebRtcVideoReceiveStream( |
| 369 webrtc::Call* call, | 369 webrtc::Call* call, |
| 370 const StreamParams& sp, | 370 const StreamParams& sp, |
| 371 webrtc::VideoReceiveStream::Config config, | 371 webrtc::VideoReceiveStream::Config config, |
| 372 const DecoderFactoryAdapter* decoder_factory, | 372 DecoderFactoryAdapter* decoder_factory, |
| 373 bool default_stream, | 373 bool default_stream, |
| 374 const std::vector<VideoCodecSettings>& recv_codecs, | 374 const std::vector<VideoCodecSettings>& recv_codecs, |
| 375 const webrtc::FlexfecReceiveStream::Config& flexfec_config); | 375 const webrtc::FlexfecReceiveStream::Config& flexfec_config); |
| 376 ~WebRtcVideoReceiveStream(); | 376 ~WebRtcVideoReceiveStream(); |
| 377 | 377 |
| 378 const std::vector<uint32_t>& GetSsrcs() const; | 378 const std::vector<uint32_t>& GetSsrcs() const; |
| 379 rtc::Optional<uint32_t> GetFirstPrimarySsrc() const; | 379 rtc::Optional<uint32_t> GetFirstPrimarySsrc() const; |
| 380 | 380 |
| 381 void SetLocalSsrc(uint32_t local_ssrc); | 381 void SetLocalSsrc(uint32_t local_ssrc); |
| 382 // TODO(deadbeef): Move these feedback parameters into the recv parameters. | 382 // TODO(deadbeef): Move these feedback parameters into the recv parameters. |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 423 | 423 |
| 424 // Both |stream_| and |flexfec_stream_| are managed by |this|. They are | 424 // Both |stream_| and |flexfec_stream_| are managed by |this|. They are |
| 425 // destroyed by calling call_->DestroyVideoReceiveStream and | 425 // destroyed by calling call_->DestroyVideoReceiveStream and |
| 426 // call_->DestroyFlexfecReceiveStream, respectively. | 426 // call_->DestroyFlexfecReceiveStream, respectively. |
| 427 webrtc::VideoReceiveStream* stream_; | 427 webrtc::VideoReceiveStream* stream_; |
| 428 const bool default_stream_; | 428 const bool default_stream_; |
| 429 webrtc::VideoReceiveStream::Config config_; | 429 webrtc::VideoReceiveStream::Config config_; |
| 430 webrtc::FlexfecReceiveStream::Config flexfec_config_; | 430 webrtc::FlexfecReceiveStream::Config flexfec_config_; |
| 431 webrtc::FlexfecReceiveStream* flexfec_stream_; | 431 webrtc::FlexfecReceiveStream* flexfec_stream_; |
| 432 | 432 |
| 433 const DecoderFactoryAdapter* decoder_factory_; | 433 DecoderFactoryAdapter* decoder_factory_; |
| 434 DecoderMap allocated_decoders_; | 434 DecoderMap allocated_decoders_; |
| 435 | 435 |
| 436 rtc::CriticalSection sink_lock_; | 436 rtc::CriticalSection sink_lock_; |
| 437 rtc::VideoSinkInterface<webrtc::VideoFrame>* sink_ | 437 rtc::VideoSinkInterface<webrtc::VideoFrame>* sink_ |
| 438 RTC_GUARDED_BY(sink_lock_); | 438 RTC_GUARDED_BY(sink_lock_); |
| 439 // Expands remote RTP timestamps to int64_t to be able to estimate how long | 439 // Expands remote RTP timestamps to int64_t to be able to estimate how long |
| 440 // the stream has been running. | 440 // the stream has been running. |
| 441 rtc::TimestampWrapAroundHandler timestamp_wraparound_handler_ | 441 rtc::TimestampWrapAroundHandler timestamp_wraparound_handler_ |
| 442 RTC_GUARDED_BY(sink_lock_); | 442 RTC_GUARDED_BY(sink_lock_); |
| 443 int64_t first_frame_timestamp_ RTC_GUARDED_BY(sink_lock_); | 443 int64_t first_frame_timestamp_ RTC_GUARDED_BY(sink_lock_); |
| 444 // Start NTP time is estimated as current remote NTP time (estimated from | 444 // Start NTP time is estimated as current remote NTP time (estimated from |
| 445 // RTCP) minus the elapsed time, as soon as remote NTP time is available. | 445 // RTCP) minus the elapsed time, as soon as remote NTP time is available. |
| 446 int64_t estimated_remote_start_ntp_time_ms_ RTC_GUARDED_BY(sink_lock_); | 446 int64_t estimated_remote_start_ntp_time_ms_ RTC_GUARDED_BY(sink_lock_); |
| 447 }; | 447 }; |
| 448 | 448 |
| 449 void Construct(webrtc::Call* call, WebRtcVideoEngine* engine); | 449 void Construct(webrtc::Call* call, WebRtcVideoEngine* engine); |
| 450 | 450 |
| 451 bool SendRtp(const uint8_t* data, | 451 bool SendRtp(const uint8_t* data, |
| 452 size_t len, | 452 size_t len, |
| 453 const webrtc::PacketOptions& options) override; | 453 const webrtc::PacketOptions& options) override; |
| 454 bool SendRtcp(const uint8_t* data, size_t len) override; | 454 bool SendRtcp(const uint8_t* data, size_t len) override; |
| 455 | 455 |
| 456 static std::vector<VideoCodecSettings> MapCodecs( | 456 static std::vector<VideoCodecSettings> MapCodecs( |
| 457 const std::vector<VideoCodec>& codecs); | 457 const std::vector<VideoCodec>& codecs); |
| 458 // Select what video codec will be used for sending, i.e. what codec is used | 458 // Select what video codec will be used for sending, i.e. what codec is used |
| 459 // for local encoding, based on supported remote codecs. The first remote | 459 // for local encoding, based on supported remote codecs. The first remote |
| 460 // codec that is supported locally will be selected. | 460 // codec that is supported locally will be selected. |
| 461 rtc::Optional<VideoCodecSettings> SelectSendVideoCodec( | 461 rtc::Optional<VideoCodecSettings> SelectSendVideoCodec( |
| 462 const std::vector<VideoCodecSettings>& remote_mapped_codecs) const; | 462 const std::vector<VideoCodecSettings>& remote_mapped_codecs) const; |
| 463 rtc::Optional<WebRtcVideoChannel::VideoCodecSettings> |
| 464 SelectStereoAssociatedVideoCodec( |
| 465 const std::vector<VideoCodecSettings>& remote_mapped_codecs) const; |
| 463 | 466 |
| 464 static bool NonFlexfecReceiveCodecsHaveChanged( | 467 static bool NonFlexfecReceiveCodecsHaveChanged( |
| 465 std::vector<VideoCodecSettings> before, | 468 std::vector<VideoCodecSettings> before, |
| 466 std::vector<VideoCodecSettings> after); | 469 std::vector<VideoCodecSettings> after); |
| 467 | 470 |
| 468 void FillSenderStats(VideoMediaInfo* info, bool log_stats); | 471 void FillSenderStats(VideoMediaInfo* info, bool log_stats); |
| 469 void FillReceiverStats(VideoMediaInfo* info, bool log_stats); | 472 void FillReceiverStats(VideoMediaInfo* info, bool log_stats); |
| 470 void FillBandwidthEstimationStats(const webrtc::Call::Stats& stats, | 473 void FillBandwidthEstimationStats(const webrtc::Call::Stats& stats, |
| 471 VideoMediaInfo* info); | 474 VideoMediaInfo* info); |
| 472 void FillSendAndReceiveCodecStats(VideoMediaInfo* video_media_info); | 475 void FillSendAndReceiveCodecStats(VideoMediaInfo* video_media_info); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 487 std::map<uint32_t, WebRtcVideoSendStream*> send_streams_ | 490 std::map<uint32_t, WebRtcVideoSendStream*> send_streams_ |
| 488 RTC_GUARDED_BY(stream_crit_); | 491 RTC_GUARDED_BY(stream_crit_); |
| 489 std::map<uint32_t, WebRtcVideoReceiveStream*> receive_streams_ | 492 std::map<uint32_t, WebRtcVideoReceiveStream*> receive_streams_ |
| 490 RTC_GUARDED_BY(stream_crit_); | 493 RTC_GUARDED_BY(stream_crit_); |
| 491 std::set<uint32_t> send_ssrcs_ RTC_GUARDED_BY(stream_crit_); | 494 std::set<uint32_t> send_ssrcs_ RTC_GUARDED_BY(stream_crit_); |
| 492 std::set<uint32_t> receive_ssrcs_ RTC_GUARDED_BY(stream_crit_); | 495 std::set<uint32_t> receive_ssrcs_ RTC_GUARDED_BY(stream_crit_); |
| 493 | 496 |
| 494 rtc::Optional<VideoCodecSettings> send_codec_; | 497 rtc::Optional<VideoCodecSettings> send_codec_; |
| 495 rtc::Optional<std::vector<webrtc::RtpExtension>> send_rtp_extensions_; | 498 rtc::Optional<std::vector<webrtc::RtpExtension>> send_rtp_extensions_; |
| 496 | 499 |
| 497 const EncoderFactoryAdapter* const encoder_factory_; | 500 EncoderFactoryAdapter* encoder_factory_; |
| 498 const DecoderFactoryAdapter* const decoder_factory_; | 501 DecoderFactoryAdapter* decoder_factory_; |
| 499 std::vector<VideoCodecSettings> recv_codecs_; | 502 std::vector<VideoCodecSettings> recv_codecs_; |
| 500 std::vector<webrtc::RtpExtension> recv_rtp_extensions_; | 503 std::vector<webrtc::RtpExtension> recv_rtp_extensions_; |
| 501 // See reason for keeping track of the FlexFEC payload type separately in | 504 // See reason for keeping track of the FlexFEC payload type separately in |
| 502 // comment in WebRtcVideoChannel::ChangedRecvParameters. | 505 // comment in WebRtcVideoChannel::ChangedRecvParameters. |
| 503 int recv_flexfec_payload_type_; | 506 int recv_flexfec_payload_type_; |
| 504 webrtc::Call::Config::BitrateConfig bitrate_config_; | 507 webrtc::Call::Config::BitrateConfig bitrate_config_; |
| 505 // TODO(deadbeef): Don't duplicate information between | 508 // TODO(deadbeef): Don't duplicate information between |
| 506 // send_params/recv_params, rtp_extensions, options, etc. | 509 // send_params/recv_params, rtp_extensions, options, etc. |
| 507 VideoSendParameters send_params_; | 510 VideoSendParameters send_params_; |
| 508 VideoOptions default_send_options_; | 511 VideoOptions default_send_options_; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 528 const std::string codec_name_; | 531 const std::string codec_name_; |
| 529 const int max_qp_; | 532 const int max_qp_; |
| 530 const int max_framerate_; | 533 const int max_framerate_; |
| 531 const bool is_screencast_; | 534 const bool is_screencast_; |
| 532 const bool conference_mode_; | 535 const bool conference_mode_; |
| 533 }; | 536 }; |
| 534 | 537 |
| 535 } // namespace cricket | 538 } // namespace cricket |
| 536 | 539 |
| 537 #endif // MEDIA_ENGINE_WEBRTCVIDEOENGINE_H_ | 540 #endif // MEDIA_ENGINE_WEBRTCVIDEOENGINE_H_ |
| OLD | NEW |