129d5839233b19743286a89676bd748a6bd8623d6pbos@webrtc.org/*
229d5839233b19743286a89676bd748a6bd8623d6pbos@webrtc.org *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
329d5839233b19743286a89676bd748a6bd8623d6pbos@webrtc.org *
429d5839233b19743286a89676bd748a6bd8623d6pbos@webrtc.org *  Use of this source code is governed by a BSD-style license
529d5839233b19743286a89676bd748a6bd8623d6pbos@webrtc.org *  that can be found in the LICENSE file in the root of the source
629d5839233b19743286a89676bd748a6bd8623d6pbos@webrtc.org *  tree. An additional intellectual property rights grant can be found
729d5839233b19743286a89676bd748a6bd8623d6pbos@webrtc.org *  in the file PATENTS.  All contributing project authors may
829d5839233b19743286a89676bd748a6bd8623d6pbos@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
929d5839233b19743286a89676bd748a6bd8623d6pbos@webrtc.org */
1029d5839233b19743286a89676bd748a6bd8623d6pbos@webrtc.org
11f3973e81d5aa7e4f1d6b5abdfe3a6dc53a32840cmflodman@webrtc.org#ifndef WEBRTC_VIDEO_VIDEO_SEND_STREAM_H_
12f3973e81d5aa7e4f1d6b5abdfe3a6dc53a32840cmflodman@webrtc.org#define WEBRTC_VIDEO_VIDEO_SEND_STREAM_H_
1329d5839233b19743286a89676bd748a6bd8623d6pbos@webrtc.org
142bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org#include <map>
15dde16f19e3ed36ca462f6404c40d5a9811f0ec37pbos@webrtc.org#include <vector>
162bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org
1726c0c41a06d77af54df547169d952a21319dea8cpbos@webrtc.org#include "webrtc/call.h"
185c389d3e09646c0e2ed76d5ccb37a3419a09eb6aPeter Boström#include "webrtc/call/transport_adapter.h"
1929d5839233b19743286a89676bd748a6bd8623d6pbos@webrtc.org#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
20ff761fba8274d93bd73e76c8b8a1f2d0776dd840Henrik Kjellander#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
2198f53510b222f71fdd8b799b2f33737ceeb28c61Henrik Kjellander#include "webrtc/system_wrappers/include/critical_section_wrapper.h"
224070935f4fb5b9fb2df246d7073fe0ba7e350791sprang@webrtc.org#include "webrtc/video/encoded_frame_callback_adapter.h"
23ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org#include "webrtc/video/send_statistics_proxy.h"
244b91bd08979fcfb191cdae27ad24936beefce735Peter Boström#include "webrtc/video/video_capture_input.h"
2516e03b7bd8b88ba569987e20a7f29061f91a3d0dpbos@webrtc.org#include "webrtc/video_receive_stream.h"
2616e03b7bd8b88ba569987e20a7f29061f91a3d0dpbos@webrtc.org#include "webrtc/video_send_stream.h"
2729d5839233b19743286a89676bd748a6bd8623d6pbos@webrtc.org
2829d5839233b19743286a89676bd748a6bd8623d6pbos@webrtc.orgnamespace webrtc {
2929d5839233b19743286a89676bd748a6bd8623d6pbos@webrtc.org
300e7e259ebd69993bb5670a991f43aa1b06c9bf9emflodmanclass BitrateAllocator;
31e37870297fc45f1253dff4b1c59c85a50d2a8a97mflodmanclass CallStats;
320c478b3d75be3c026e68f03a11cb558c3655c926mflodmanclass CongestionController;
33e37870297fc45f1253dff4b1c59c85a50d2a8a97mflodmanclass EncoderStateFeedback;
34f16fcbec734e1e3303828525c9fd7e13e0803aabPeter Boströmclass ProcessThread;
3559d91dc951143995069798edee05e757502f335cPeter Boströmclass ViEChannel;
3659d91dc951143995069798edee05e757502f335cPeter Boströmclass ViEEncoder;
3729d5839233b19743286a89676bd748a6bd8623d6pbos@webrtc.org
3829d5839233b19743286a89676bd748a6bd8623d6pbos@webrtc.orgnamespace internal {
396879c8adad604d51db200de56f9afe08282973a6mflodman@webrtc.org
40e5269747595864eedd604f153df5d7bcbe1b475asolenbergclass VideoSendStream : public webrtc::VideoSendStream,
41e5269747595864eedd604f153df5d7bcbe1b475asolenberg                        public webrtc::CpuOveruseObserver {
4229d5839233b19743286a89676bd748a6bd8623d6pbos@webrtc.org public:
43e5269747595864eedd604f153df5d7bcbe1b475asolenberg  VideoSendStream(int num_cpu_cores,
44f16fcbec734e1e3303828525c9fd7e13e0803aabPeter Boström                  ProcessThread* module_process_thread,
45e37870297fc45f1253dff4b1c59c85a50d2a8a97mflodman                  CallStats* call_stats,
460c478b3d75be3c026e68f03a11cb558c3655c926mflodman                  CongestionController* congestion_controller,
470e7e259ebd69993bb5670a991f43aa1b06c9bf9emflodman                  BitrateAllocator* bitrate_allocator,
48f3973e81d5aa7e4f1d6b5abdfe3a6dc53a32840cmflodman@webrtc.org                  const VideoSendStream::Config& config,
49bbe0a8517d7f9da7aa779bff77cdbb70df358437pbos@webrtc.org                  const VideoEncoderConfig& encoder_config,
5045553aefacb797818da83ccef1c3679a8aa0fc7fPeter Boström                  const std::map<uint32_t, RtpState>& suspended_ssrcs);
5129d5839233b19743286a89676bd748a6bd8623d6pbos@webrtc.org
52cd6702282a49448adda470934f4bd9e6181cab22Jelena Marusic  ~VideoSendStream() override;
534b91bd08979fcfb191cdae27ad24936beefce735Peter Boström
54cd6702282a49448adda470934f4bd9e6181cab22Jelena Marusic  // webrtc::SendStream implementation.
5514665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  void Start() override;
5614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  void Stop() override;
57cd6702282a49448adda470934f4bd9e6181cab22Jelena Marusic  void SignalNetworkState(NetworkState state) override;
58cd6702282a49448adda470934f4bd9e6181cab22Jelena Marusic  bool DeliverRtcp(const uint8_t* packet, size_t length) override;
5929d5839233b19743286a89676bd748a6bd8623d6pbos@webrtc.org
60cd6702282a49448adda470934f4bd9e6181cab22Jelena Marusic  // webrtc::VideoSendStream implementation.
61cd6702282a49448adda470934f4bd9e6181cab22Jelena Marusic  VideoCaptureInput* Input() override;
6214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  bool ReconfigureVideoEncoder(const VideoEncoderConfig& config) override;
6314665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  Stats GetStats() override;
64ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
65e5269747595864eedd604f153df5d7bcbe1b475asolenberg  // webrtc::CpuOveruseObserver implementation.
66e5269747595864eedd604f153df5d7bcbe1b475asolenberg  void OveruseDetected() override;
67e5269747595864eedd604f153df5d7bcbe1b475asolenberg  void NormalUsage() override;
68e5269747595864eedd604f153df5d7bcbe1b475asolenberg
692bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  typedef std::map<uint32_t, RtpState> RtpStateMap;
702bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  RtpStateMap GetRtpStates() const;
712bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org
7216825b1a828bb4ff40f7682040e43a239b7b8ca3pkasting@chromium.org  int64_t GetRtt() const;
730e7e259ebd69993bb5670a991f43aa1b06c9bf9emflodman  int GetPaddingNeededBps() const;
742b19f0631233488e891d9db0d170b637dc8fc464pbos@webrtc.org
7529d5839233b19743286a89676bd748a6bd8623d6pbos@webrtc.org private:
765cb9ce4c746867a02e7d37358f63e1a7c11ef262Peter Boström  bool SetSendCodec(VideoCodec video_codec);
77be9d2a45499d87f3b04e644fc173b0d997a9eeeapbos@webrtc.org  void ConfigureSsrcs();
78373284da06631c33a01fee6d755355cabeadf6c6Peter Boström
79373284da06631c33a01fee6d755355cabeadf6c6Peter Boström  SendStatisticsProxy stats_proxy_;
80e75a1bf45fb66f384701c375e77af3fe833b68cdpbos@webrtc.org  TransportAdapter transport_adapter_;
814070935f4fb5b9fb2df246d7073fe0ba7e350791sprang@webrtc.org  EncodedFrameCallbackAdapter encoded_frame_proxy_;
826ae48c660934784b4df56ab1ac99402ce3745e9fpbos@webrtc.org  const VideoSendStream::Config config_;
83008731868a09e2fe01da53733a612dc24761f791pbos@webrtc.org  VideoEncoderConfig encoder_config_;
842bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  std::map<uint32_t, RtpState> suspended_ssrcs_;
8529d5839233b19743286a89676bd748a6bd8623d6pbos@webrtc.org
86f16fcbec734e1e3303828525c9fd7e13e0803aabPeter Boström  ProcessThread* const module_process_thread_;
87e37870297fc45f1253dff4b1c59c85a50d2a8a97mflodman  CallStats* const call_stats_;
880c478b3d75be3c026e68f03a11cb558c3655c926mflodman  CongestionController* const congestion_controller_;
8959d91dc951143995069798edee05e757502f335cPeter Boström
904b91bd08979fcfb191cdae27ad24936beefce735Peter Boström  rtc::scoped_ptr<VideoCaptureInput> input_;
91949c2f04b4156095090e02f3f13613aadacce88dmflodman  rtc::scoped_ptr<ViEChannel> vie_channel_;
92949c2f04b4156095090e02f3f13613aadacce88dmflodman  rtc::scoped_ptr<ViEEncoder> vie_encoder_;
93e37870297fc45f1253dff4b1c59c85a50d2a8a97mflodman  rtc::scoped_ptr<EncoderStateFeedback> encoder_feedback_;
9429d5839233b19743286a89676bd748a6bd8623d6pbos@webrtc.org
9532452b20b8f5ea4470ec619a31eefc736e51c8a3pbos@webrtc.org  // Used as a workaround to indicate that we should be using the configured
9632452b20b8f5ea4470ec619a31eefc736e51c8a3pbos@webrtc.org  // start bitrate initially, instead of the one reported by VideoEngine (which
9732452b20b8f5ea4470ec619a31eefc736e51c8a3pbos@webrtc.org  // defaults to too high).
98008731868a09e2fe01da53733a612dc24761f791pbos@webrtc.org  bool use_config_bitrate_;
9929d5839233b19743286a89676bd748a6bd8623d6pbos@webrtc.org};
10029d5839233b19743286a89676bd748a6bd8623d6pbos@webrtc.org}  // namespace internal
10129d5839233b19743286a89676bd748a6bd8623d6pbos@webrtc.org}  // namespace webrtc
10229d5839233b19743286a89676bd748a6bd8623d6pbos@webrtc.org
103f3973e81d5aa7e4f1d6b5abdfe3a6dc53a32840cmflodman@webrtc.org#endif  // WEBRTC_VIDEO_VIDEO_SEND_STREAM_H_
104