1 /* 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 3 * 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 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef WEBRTC_VIDEO_VIDEO_SEND_STREAM_H_ 12 #define WEBRTC_VIDEO_VIDEO_SEND_STREAM_H_ 13 14 #include <map> 15 #include <vector> 16 17 #include "webrtc/call.h" 18 #include "webrtc/call/transport_adapter.h" 19 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" 20 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" 21 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" 22 #include "webrtc/video/encoded_frame_callback_adapter.h" 23 #include "webrtc/video/send_statistics_proxy.h" 24 #include "webrtc/video/video_capture_input.h" 25 #include "webrtc/video_receive_stream.h" 26 #include "webrtc/video_send_stream.h" 27 28 namespace webrtc { 29 30 class BitrateAllocator; 31 class CallStats; 32 class CongestionController; 33 class EncoderStateFeedback; 34 class ProcessThread; 35 class ViEChannel; 36 class ViEEncoder; 37 38 namespace internal { 39 40 class VideoSendStream : public webrtc::VideoSendStream, 41 public webrtc::CpuOveruseObserver { 42 public: 43 VideoSendStream(int num_cpu_cores, 44 ProcessThread* module_process_thread, 45 CallStats* call_stats, 46 CongestionController* congestion_controller, 47 BitrateAllocator* bitrate_allocator, 48 const VideoSendStream::Config& config, 49 const VideoEncoderConfig& encoder_config, 50 const std::map<uint32_t, RtpState>& suspended_ssrcs); 51 52 ~VideoSendStream() override; 53 54 // webrtc::SendStream implementation. 55 void Start() override; 56 void Stop() override; 57 void SignalNetworkState(NetworkState state) override; 58 bool DeliverRtcp(const uint8_t* packet, size_t length) override; 59 60 // webrtc::VideoSendStream implementation. 61 VideoCaptureInput* Input() override; 62 bool ReconfigureVideoEncoder(const VideoEncoderConfig& config) override; 63 Stats GetStats() override; 64 65 // webrtc::CpuOveruseObserver implementation. 66 void OveruseDetected() override; 67 void NormalUsage() override; 68 69 typedef std::map<uint32_t, RtpState> RtpStateMap; 70 RtpStateMap GetRtpStates() const; 71 72 int64_t GetRtt() const; 73 int GetPaddingNeededBps() const; 74 75 private: 76 bool SetSendCodec(VideoCodec video_codec); 77 void ConfigureSsrcs(); 78 79 SendStatisticsProxy stats_proxy_; 80 TransportAdapter transport_adapter_; 81 EncodedFrameCallbackAdapter encoded_frame_proxy_; 82 const VideoSendStream::Config config_; 83 VideoEncoderConfig encoder_config_; 84 std::map<uint32_t, RtpState> suspended_ssrcs_; 85 86 ProcessThread* const module_process_thread_; 87 CallStats* const call_stats_; 88 CongestionController* const congestion_controller_; 89 90 rtc::scoped_ptr<VideoCaptureInput> input_; 91 rtc::scoped_ptr<ViEChannel> vie_channel_; 92 rtc::scoped_ptr<ViEEncoder> vie_encoder_; 93 rtc::scoped_ptr<EncoderStateFeedback> encoder_feedback_; 94 95 // Used as a workaround to indicate that we should be using the configured 96 // start bitrate initially, instead of the one reported by VideoEngine (which 97 // defaults to too high). 98 bool use_config_bitrate_; 99 }; 100 } // namespace internal 101 } // namespace webrtc 102 103 #endif // WEBRTC_VIDEO_VIDEO_SEND_STREAM_H_ 104