blob: 994c223ed06f8aaa59d8d8b6696324aa5176c62b [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
stefan@webrtc.org07b45a52012-02-02 08:37:48 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
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
Peter Boström7623ce42015-12-09 12:13:30 +010011#ifndef WEBRTC_VIDEO_VIE_ENCODER_H_
12#define WEBRTC_VIDEO_VIE_ENCODER_H_
niklase@google.com470e71d2011-07-07 08:21:25 +000013
kwiberg27f982b2016-03-01 11:52:33 -080014#include <memory>
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000015#include <vector>
mflodman@webrtc.orgd6ec3862012-10-25 11:30:29 +000016
Tommi97888bd2016-01-21 23:24:59 +010017#include "webrtc/base/criticalsection.h"
Peter Boström26b08602015-06-04 15:18:17 +020018#include "webrtc/base/scoped_ref_ptr.h"
pbos@webrtc.org38344ed2014-09-24 06:05:00 +000019#include "webrtc/base/thread_annotations.h"
pbos@webrtc.orgf5d4cb12013-05-17 13:44:48 +000020#include "webrtc/common_types.h"
nissed30a1112016-04-18 05:15:22 -070021#include "webrtc/media/base/videosinkinterface.h"
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010022#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
Henrik Kjellander2557b862015-11-18 22:00:21 +010023#include "webrtc/modules/video_coding/include/video_coding_defines.h"
sprang3911c262016-04-15 01:24:14 -070024#include "webrtc/modules/video_coding/utility/ivf_file_writer.h"
Henrik Kjellander0f59a882015-11-18 22:31:24 +010025#include "webrtc/modules/video_processing/include/video_processing.h"
pbos@webrtc.orgf5d4cb12013-05-17 13:44:48 +000026#include "webrtc/typedefs.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000027
28namespace webrtc {
mflodman@webrtc.org84d17832011-12-01 17:02:23 +000029
andresp@webrtc.org7707d062013-05-13 10:50:50 +000030class Config;
sprang@webrtc.org40709352013-11-26 11:41:59 +000031class EncodedImageCallback;
Peter Boströme4499152016-02-05 11:13:28 +010032class OveruseFrameDetector;
pwestin@webrtc.org571a1c02012-11-13 21:12:39 +000033class PacedSender;
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000034class PayloadRouter;
niklase@google.com470e71d2011-07-07 08:21:25 +000035class ProcessThread;
stefan@webrtc.org439be292012-02-16 14:45:37 +000036class QMVideoSettingsCallback;
pbos@webrtc.org273a4142014-12-01 15:23:21 +000037class SendStatisticsProxy;
pwestin@webrtc.org49888ce2012-04-27 05:25:53 +000038class ViEBitrateObserver;
mflodman@webrtc.org84d17832011-12-01 17:02:23 +000039class ViEEffectFilter;
mflodman@webrtc.org6879c8a2013-07-23 11:35:00 +000040class VideoCodingModule;
Peter Boströma4c76882016-03-03 16:29:02 +010041class VideoEncoder;
niklase@google.com470e71d2011-07-07 08:21:25 +000042
Peter Boström0013dcc2016-02-19 20:42:19 +010043class ViEEncoder : public VideoEncoderRateObserver,
Peter Boström4b91bd02015-06-26 06:58:16 +020044 public VCMPacketizationCallback,
Peter Boströma4c76882016-03-03 16:29:02 +010045 public VCMSendStatisticsCallback {
mflodman@webrtc.org84d17832011-12-01 17:02:23 +000046 public:
pwestin@webrtc.org49888ce2012-04-27 05:25:53 +000047 friend class ViEBitrateObserver;
48
mflodman0dbf0092015-10-19 08:12:12 -070049 ViEEncoder(uint32_t number_of_cores,
Peter Boström0013dcc2016-02-19 20:42:19 +010050 const std::vector<uint32_t>& ssrcs,
Peter Boström7083e112015-09-22 16:28:51 +020051 ProcessThread* module_process_thread,
52 SendStatisticsProxy* stats_proxy,
nissed30a1112016-04-18 05:15:22 -070053 // TODO(nisse): Used only for tests, delete?
54 rtc::VideoSinkInterface<VideoFrame>* pre_encode_callback,
Peter Boströme4499152016-02-05 11:13:28 +010055 OveruseFrameDetector* overuse_detector,
Stefan Holmere5904162015-03-26 11:11:06 +010056 PacedSender* pacer,
mflodman86aabb22016-03-11 15:44:32 +010057 PayloadRouter* payload_router);
mflodman@webrtc.org84d17832011-12-01 17:02:23 +000058 ~ViEEncoder();
niklase@google.com470e71d2011-07-07 08:21:25 +000059
wu@webrtc.org5d8c1022012-04-10 16:54:05 +000060 bool Init();
61
Peter Boström1d04ac62016-02-05 11:25:46 +010062 VideoCodingModule* vcm() const;
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000063
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +000064 void SetNetworkTransmissionState(bool is_transmitting);
65
mflodman@webrtc.org9ec883e2012-03-05 17:12:41 +000066 // Returns the id of the owning channel.
67 int Owner() const;
68
mflodman@webrtc.org84d17832011-12-01 17:02:23 +000069 // Drops incoming packets before they get to the encoder.
70 void Pause();
71 void Restart();
niklase@google.com470e71d2011-07-07 08:21:25 +000072
mflodman@webrtc.org84d17832011-12-01 17:02:23 +000073 // Codec settings.
pbos@webrtc.orgb238d122013-04-09 13:41:51 +000074 int32_t RegisterExternalEncoder(VideoEncoder* encoder,
75 uint8_t pl_type,
76 bool internal_source);
77 int32_t DeRegisterExternalEncoder(uint8_t pl_type);
Peter Boströma03785e2016-03-03 11:36:18 +010078 void SetEncoder(const VideoCodec& video_codec, int min_transmit_bitrate_bps);
niklase@google.com470e71d2011-07-07 08:21:25 +000079
Peter Boströma4c76882016-03-03 16:29:02 +010080 void EncodeVideoFrame(const VideoFrame& video_frame);
Peter Boström233bfd22016-01-18 20:23:40 +010081 void SendKeyFrame();
pwestin@webrtc.org49888ce2012-04-27 05:25:53 +000082
pbos@webrtc.org143451d2015-03-18 14:40:03 +000083 uint32_t LastObservedBitrateBps() const;
pbos@webrtc.orgb238d122013-04-09 13:41:51 +000084 int CodecTargetBitrate(uint32_t* bitrate) const;
Peter Boströmd153a372015-11-10 15:27:12 +000085 // Loss protection. Must be called before SetEncoder() to have max packet size
86 // updated according to protection.
87 // TODO(pbos): Set protection method on construction or extract vcm_ outside
88 // this class and set it on construction there.
89 void SetProtectionMethod(bool nack, bool fec);
marpan@google.com80c5d7a2011-07-15 21:32:40 +000090
pbos@webrtc.org891d4832015-02-26 13:15:22 +000091 // Implements VideoEncoderRateObserver.
92 void OnSetRates(uint32_t bitrate_bps, int framerate) override;
93
mflodman@webrtc.org84d17832011-12-01 17:02:23 +000094 // Implements VCMPacketizationCallback.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000095 int32_t SendData(uint8_t payload_type,
96 const EncodedImage& encoded_image,
Peter Boströmfb152702016-01-28 19:11:58 +010097 const RTPFragmentationHeader* fragmentation_header,
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000098 const RTPVideoHeader* rtp_video_hdr) override;
Peter Boströmb7d9a972015-12-18 16:01:11 +010099 void OnEncoderImplementationName(const char* implementation_name) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000100
mflodman@webrtc.org84d17832011-12-01 17:02:23 +0000101 // Implements VideoSendStatisticsCallback.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000102 int32_t SendStatistics(const uint32_t bit_rate,
103 const uint32_t frame_rate) override;
henrike@webrtc.orgcc774a62014-09-11 22:45:54 +0000104
Peter Boström0013dcc2016-02-19 20:42:19 +0100105 // virtual to test EncoderStateFeedback with mocks.
106 virtual void OnReceivedIntraFrameRequest(uint32_t ssrc);
107 virtual void OnReceivedSLI(uint32_t ssrc, uint8_t picture_id);
108 virtual void OnReceivedRPSI(uint32_t ssrc, uint64_t picture_id);
mflodman@webrtc.orgd6ec3862012-10-25 11:30:29 +0000109
sprang@webrtc.org40709352013-11-26 11:41:59 +0000110 // New-style callbacks, used by VideoSendStream.
sprang@webrtc.org40709352013-11-26 11:41:59 +0000111 void RegisterPostEncodeImageCallback(
112 EncodedImageCallback* post_encode_callback);
pbos@webrtc.orgfe1ef932013-10-21 10:34:43 +0000113
stefana4a8d4a2015-07-15 04:39:22 -0700114 int GetPaddingNeededBps() const;
Stefan Holmere5904162015-03-26 11:11:06 +0100115
mflodman86aabb22016-03-11 15:44:32 +0100116 void OnBitrateUpdated(uint32_t bitrate_bps,
stefan@webrtc.orgedeea912014-12-08 19:46:23 +0000117 uint8_t fraction_lost,
pkasting@chromium.org16825b12015-01-12 21:51:21 +0000118 int64_t round_trip_time_ms);
pwestin@webrtc.org49888ce2012-04-27 05:25:53 +0000119
mflodman@webrtc.org84d17832011-12-01 17:02:23 +0000120 private:
sprang3911c262016-04-15 01:24:14 -0700121 static const bool kEnableFrameRecording = false;
122 static const int kMaxLayers = 3;
123
stefan@webrtc.org7af12be2014-07-09 14:46:31 +0000124 bool EncoderPaused() const EXCLUSIVE_LOCKS_REQUIRED(data_cs_);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000125 void TraceFrameDropStart() EXCLUSIVE_LOCKS_REQUIRED(data_cs_);
126 void TraceFrameDropEnd() EXCLUSIVE_LOCKS_REQUIRED(data_cs_);
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000127
pbos@webrtc.orgb238d122013-04-09 13:41:51 +0000128 const uint32_t number_of_cores_;
Peter Boström0013dcc2016-02-19 20:42:19 +0100129 const std::vector<uint32_t> ssrcs_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000130
kwiberg27f982b2016-03-01 11:52:33 -0800131 const std::unique_ptr<VideoProcessing> vp_;
132 const std::unique_ptr<QMVideoSettingsCallback> qm_callback_;
133 const std::unique_ptr<VideoCodingModule> vcm_;
mflodman@webrtc.org96abda02015-02-25 13:50:10 +0000134
pbosd8de1152016-02-01 09:00:51 -0800135 rtc::CriticalSection data_cs_;
pwestin@webrtc.org49888ce2012-04-27 05:25:53 +0000136
Peter Boström7083e112015-09-22 16:28:51 +0200137 SendStatisticsProxy* const stats_proxy_;
nissed30a1112016-04-18 05:15:22 -0700138 rtc::VideoSinkInterface<VideoFrame>* const pre_encode_callback_;
Peter Boströme4499152016-02-05 11:13:28 +0100139 OveruseFrameDetector* const overuse_detector_;
Stefan Holmere5904162015-03-26 11:11:06 +0100140 PacedSender* const pacer_;
Peter Boström1d04ac62016-02-05 11:25:46 +0100141 PayloadRouter* const send_payload_router_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000142
Noah Richards099323e2015-04-15 09:14:12 -0700143 // The time we last received an input frame or encoded frame. This is used to
144 // track when video is stopped long enough that we also want to stop sending
145 // padding.
146 int64_t time_of_last_frame_activity_ms_ GUARDED_BY(data_cs_);
Peter Boströmd153a372015-11-10 15:27:12 +0000147 VideoCodec encoder_config_ GUARDED_BY(data_cs_);
Peter Boströma03785e2016-03-03 11:36:18 +0100148 int min_transmit_bitrate_bps_ GUARDED_BY(data_cs_);
pbos@webrtc.org143451d2015-03-18 14:40:03 +0000149 uint32_t last_observed_bitrate_bps_ GUARDED_BY(data_cs_);
stefan@webrtc.org7af12be2014-07-09 14:46:31 +0000150 bool network_is_transmitting_ GUARDED_BY(data_cs_);
151 bool encoder_paused_ GUARDED_BY(data_cs_);
152 bool encoder_paused_and_dropped_frame_ GUARDED_BY(data_cs_);
Peter Boström0013dcc2016-02-19 20:42:19 +0100153 std::vector<int64_t> time_last_intra_request_ms_ GUARDED_BY(data_cs_);
niklase@google.com470e71d2011-07-07 08:21:25 +0000154
Peter Boström7083e112015-09-22 16:28:51 +0200155 ProcessThread* module_process_thread_;
mflodman@webrtc.org84d17832011-12-01 17:02:23 +0000156
stefan@webrtc.org7af12be2014-07-09 14:46:31 +0000157 bool has_received_sli_ GUARDED_BY(data_cs_);
158 uint8_t picture_id_sli_ GUARDED_BY(data_cs_);
159 bool has_received_rpsi_ GUARDED_BY(data_cs_);
160 uint64_t picture_id_rpsi_ GUARDED_BY(data_cs_);
mflodman@webrtc.org84d17832011-12-01 17:02:23 +0000161
stefan@webrtc.org7af12be2014-07-09 14:46:31 +0000162 bool video_suspended_ GUARDED_BY(data_cs_);
sprang3911c262016-04-15 01:24:14 -0700163
164 std::unique_ptr<IvfFileWriter> file_writers_[kMaxLayers] GUARDED_BY(data_cs_);
niklase@google.com470e71d2011-07-07 08:21:25 +0000165};
mflodman@webrtc.org84d17832011-12-01 17:02:23 +0000166
167} // namespace webrtc
168
Peter Boström7623ce42015-12-09 12:13:30 +0100169#endif // WEBRTC_VIDEO_VIE_ENCODER_H_