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