video_send_stream.h revision 5cb9ce4c746867a02e7d37358f63e1a7c11ef262
18b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko/* 28b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 38b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko * 48b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko * Use of this source code is governed by a BSD-style license 5fed60b0c640828b320f56293c8bebc43fd2b1da8Alex Vakulenko * that can be found in the LICENSE file in the root of the source 6fed60b0c640828b320f56293c8bebc43fd2b1da8Alex Vakulenko * tree. An additional intellectual property rights grant can be found 78b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko * in the file PATENTS. All contributing project authors may 88b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko * be found in the AUTHORS file in the root of the source tree. 98b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko */ 108b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko 118b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko#ifndef WEBRTC_VIDEO_VIDEO_SEND_STREAM_H_ 128b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko#define WEBRTC_VIDEO_VIDEO_SEND_STREAM_H_ 138b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko 148b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko#include <map> 159ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko#include <vector> 169ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko 178b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko#include "webrtc/call.h" 189ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" 198b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h" 208b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko#include "webrtc/video/encoded_frame_callback_adapter.h" 218b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko#include "webrtc/video/send_statistics_proxy.h" 228b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko#include "webrtc/video/transport_adapter.h" 238b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko#include "webrtc/video_receive_stream.h" 248b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko#include "webrtc/video_send_stream.h" 258b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko#include "webrtc/system_wrappers/interface/critical_section_wrapper.h" 268b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko 278b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenkonamespace webrtc { 288b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko 298b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenkoclass CpuOveruseObserver; 308b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenkoclass ProcessThread; 318b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenkoclass ViEBase; 328b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenkoclass ViECapturer; 338b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenkoclass ViEChannel; 348b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenkoclass ViEEncoder; 358b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenkoclass VideoEngine; 368b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko 378b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenkonamespace internal { 388b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko 398b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenkoclass VideoSendStream : public webrtc::VideoSendStream, 408b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko public VideoSendStreamInput { 418b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko public: 428b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko VideoSendStream(newapi::Transport* transport, 438b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko CpuOveruseObserver* overuse_observer, 448b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko webrtc::VideoEngine* video_engine, 458b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko ChannelGroup* channel_group, 469ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko ProcessThread* module_process_thread, 478b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko const VideoSendStream::Config& config, 488b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko const VideoEncoderConfig& encoder_config, 498b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko const std::map<uint32_t, RtpState>& suspended_ssrcs, 508b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko int base_channel); 518b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko 528b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko virtual ~VideoSendStream(); 538b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko 548b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko void Start() override; 558b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko void Stop() override; 568b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko 578b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko bool ReconfigureVideoEncoder(const VideoEncoderConfig& config) override; 588b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko 598b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko Stats GetStats() override; 608b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko 618b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko bool DeliverRtcp(const uint8_t* packet, size_t length); 628b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko 638b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko // From VideoSendStreamInput. 648b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko void IncomingCapturedFrame(const I420VideoFrame& frame) override; 658b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko 669ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko // From webrtc::VideoSendStream. 678b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko VideoSendStreamInput* Input() override; 688b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko 698b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko typedef std::map<uint32_t, RtpState> RtpStateMap; 708b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko RtpStateMap GetRtpStates() const; 718b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko 728b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko void SignalNetworkState(Call::NetworkState state); 738b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko 748b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko int64_t GetRtt() const; 758b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko 768b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko private: 778b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko bool SetSendCodec(VideoCodec video_codec); 788b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko void ConfigureSsrcs(); 799ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko TransportAdapter transport_adapter_; 808b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko EncodedFrameCallbackAdapter encoded_frame_proxy_; 818b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko const VideoSendStream::Config config_; 829ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko VideoEncoderConfig encoder_config_; 838b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko std::map<uint32_t, RtpState> suspended_ssrcs_; 848b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko 858b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko ChannelGroup* const channel_group_; 869ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko ProcessThread* const module_process_thread_; 878b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko 888b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko ViEBase* video_engine_base_; 898b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko ViEChannel* vie_channel_; 908b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko ViEEncoder* vie_encoder_; 918b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko ViECapturer* vie_capturer_; 928b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko 938b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko int channel_; 948b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko 958b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko // Used as a workaround to indicate that we should be using the configured 968b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko // start bitrate initially, instead of the one reported by VideoEngine (which 978b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko // defaults to too high). 988b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko bool use_config_bitrate_; 998b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko 1008b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko SendStatisticsProxy stats_proxy_; 1018b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko}; 1028b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko} // namespace internal 1038b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko} // namespace webrtc 1048b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko 1058b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko#endif // WEBRTC_VIDEO_VIDEO_SEND_STREAM_H_ 1068b8d60940e09a04bc5c8894779f2d2fc1ac32b7dAlex Vakulenko