Index: webrtc/video/video_send_stream.h |
diff --git a/webrtc/video/video_send_stream.h b/webrtc/video/video_send_stream.h |
index 932264265dddf75e3e762b6325141c0e4ae07957..c67dc70199b989e41a129deba1bbccdb758d564b 100644 |
--- a/webrtc/video/video_send_stream.h |
+++ b/webrtc/video/video_send_stream.h |
@@ -17,8 +17,6 @@ |
#include "webrtc/call/bitrate_allocator.h" |
#include "webrtc/base/criticalsection.h" |
-#include "webrtc/base/event.h" |
-#include "webrtc/base/task_queue.h" |
#include "webrtc/call.h" |
#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" |
#include "webrtc/modules/video_coding/protection_bitrate_calculator.h" |
@@ -26,6 +24,7 @@ |
#include "webrtc/video/payload_router.h" |
#include "webrtc/video/send_delay_stats.h" |
#include "webrtc/video/send_statistics_proxy.h" |
+#include "webrtc/video/video_capture_input.h" |
#include "webrtc/video/vie_encoder.h" |
#include "webrtc/video_receive_stream.h" |
#include "webrtc/video_send_stream.h" |
@@ -38,29 +37,32 @@ |
class IvfFileWriter; |
class ProcessThread; |
class RtpRtcp; |
+class ViEEncoder; |
class VieRemb; |
class RtcEventLog; |
+namespace vcm { |
+class VideoSender; |
+} // namespace vcm |
+ |
namespace internal { |
-class VideoSendStreamImpl; |
- |
-// VideoSendStream implements webrtc::VideoSendStream. |
-// Internally, it delegates all public methods to VideoSendStreamImpl and / or |
-// VieEncoder. VideoSendStreamInternal is created and deleted on |worker_queue|. |
-class VideoSendStream : public webrtc::VideoSendStream { |
+class VideoSendStream : public webrtc::VideoSendStream, |
+ public webrtc::CpuOveruseObserver, |
+ public webrtc::BitrateAllocatorObserver, |
+ public webrtc::VCMProtectionCallback, |
+ public EncodedImageCallback { |
public: |
VideoSendStream(int num_cpu_cores, |
ProcessThread* module_process_thread, |
- rtc::TaskQueue* worker_queue, |
CallStats* call_stats, |
CongestionController* congestion_controller, |
BitrateAllocator* bitrate_allocator, |
SendDelayStats* send_delay_stats, |
VieRemb* remb, |
RtcEventLog* event_log, |
- VideoSendStream::Config config, |
- VideoEncoderConfig encoder_config, |
+ const VideoSendStream::Config& config, |
+ const VideoEncoderConfig& encoder_config, |
const std::map<uint32_t, RtpState>& suspended_ssrcs); |
~VideoSendStream() override; |
@@ -72,26 +74,101 @@ |
void Start() override; |
void Stop() override; |
VideoCaptureInput* Input() override; |
- void ReconfigureVideoEncoder(VideoEncoderConfig) override; |
+ void ReconfigureVideoEncoder(const VideoEncoderConfig& config) override; |
Stats GetStats() override; |
+ // webrtc::CpuOveruseObserver implementation. |
+ void OveruseDetected() override; |
+ void NormalUsage() override; |
+ |
typedef std::map<uint32_t, RtpState> RtpStateMap; |
- RtpStateMap StopPermanentlyAndGetRtpStates(); |
+ RtpStateMap GetRtpStates() const; |
+ |
+ int GetPaddingNeededBps() const; |
+ |
+ // Implements BitrateAllocatorObserver. |
+ uint32_t OnBitrateUpdated(uint32_t bitrate_bps, |
+ uint8_t fraction_loss, |
+ int64_t rtt) override; |
+ |
+ protected: |
+ // Implements webrtc::VCMProtectionCallback. |
+ int ProtectionRequest(const FecProtectionParams* delta_params, |
+ const FecProtectionParams* key_params, |
+ uint32_t* sent_video_rate_bps, |
+ uint32_t* sent_nack_rate_bps, |
+ uint32_t* sent_fec_rate_bps) override; |
private: |
- class ConstructionTask; |
- class DestructAndGetRtpStateTask; |
+ struct EncoderSettings { |
+ VideoCodec video_codec; |
+ VideoEncoderConfig config; |
+ }; |
- rtc::ThreadChecker thread_checker_; |
- rtc::TaskQueue* const worker_queue_; |
- rtc::Event thread_sync_event_; |
+ // Implements EncodedImageCallback. The implementation routes encoded frames |
+ // to the |payload_router_| and |config.pre_encode_callback| if set. |
+ // Called on an arbitrary encoder callback thread. |
+ EncodedImageCallback::Result OnEncodedImage( |
+ const EncodedImage& encoded_image, |
+ const CodecSpecificInfo* codec_specific_info, |
+ const RTPFragmentationHeader* fragmentation) override; |
+ |
+ static bool EncoderThreadFunction(void* obj); |
+ void EncoderProcess(); |
+ |
+ void ConfigureProtection(); |
+ void ConfigureSsrcs(); |
SendStatisticsProxy stats_proxy_; |
const VideoSendStream::Config config_; |
- std::unique_ptr<VideoSendStreamImpl> send_stream_; |
- std::unique_ptr<ViEEncoder> vie_encoder_; |
+ std::map<uint32_t, RtpState> suspended_ssrcs_; |
+ |
+ ProcessThread* const module_process_thread_; |
+ CallStats* const call_stats_; |
+ CongestionController* const congestion_controller_; |
+ BitrateAllocator* const bitrate_allocator_; |
+ VieRemb* const remb_; |
+ |
+ static const bool kEnableFrameRecording = false; |
+ static const int kMaxLayers = 3; |
+ std::unique_ptr<IvfFileWriter> file_writers_[kMaxLayers]; |
+ |
+ rtc::PlatformThread encoder_thread_; |
+ rtc::Event encoder_wakeup_event_; |
+ volatile int stop_encoder_thread_; |
+ rtc::CriticalSection encoder_settings_crit_; |
+ std::unique_ptr<EncoderSettings> pending_encoder_settings_ |
+ GUARDED_BY(encoder_settings_crit_); |
+ uint32_t encoder_max_bitrate_bps_ GUARDED_BY(encoder_settings_crit_); |
+ uint32_t encoder_target_rate_bps_ GUARDED_BY(encoder_settings_crit_); |
+ |
+ enum class State { |
+ kStopped, // VideoSendStream::Start has not yet been called. |
+ kStarted, // VideoSendStream::Start has been called. |
+ // VideoSendStream::Start has been called but the encoder have timed out. |
+ kEncoderTimedOut, |
+ }; |
+ rtc::Optional<State> pending_state_change_ GUARDED_BY(encoder_settings_crit_); |
+ |
+ // Only used on the encoder thread. |
+ rtc::ThreadChecker encoder_thread_checker_; |
+ State state_ ACCESS_ON(&encoder_thread_checker_); |
+ std::unique_ptr<EncoderSettings> current_encoder_settings_ |
+ ACCESS_ON(&encoder_thread_checker_); |
+ |
+ OveruseFrameDetector overuse_detector_; |
+ ViEEncoder vie_encoder_; |
+ EncoderStateFeedback encoder_feedback_; |
+ ProtectionBitrateCalculator protection_bitrate_calculator_; |
+ |
+ vcm::VideoSender* const video_sender_; |
+ |
+ const std::unique_ptr<RtcpBandwidthObserver> bandwidth_observer_; |
+ // RtpRtcp modules, declared here as they use other members on construction. |
+ const std::vector<RtpRtcp*> rtp_rtcp_modules_; |
+ PayloadRouter payload_router_; |
+ VideoCaptureInput input_; |
}; |
- |
} // namespace internal |
} // namespace webrtc |