blob: e309dd5047c4b119b3e3d427cf5b2dce122623a2 [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>
perkj376b1922016-05-02 11:35:24 -070015#include <string>
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000016#include <vector>
mflodman@webrtc.orgd6ec3862012-10-25 11:30:29 +000017
Tommi97888bd2016-01-21 23:24:59 +010018#include "webrtc/base/criticalsection.h"
Peter Boström26b08602015-06-04 15:18:17 +020019#include "webrtc/base/scoped_ref_ptr.h"
pbos@webrtc.org38344ed2014-09-24 06:05:00 +000020#include "webrtc/base/thread_annotations.h"
pbos@webrtc.orgf5d4cb12013-05-17 13:44:48 +000021#include "webrtc/common_types.h"
kjellander02b3d272016-04-20 05:05:54 -070022#include "webrtc/video_encoder.h"
nissed30a1112016-04-18 05:15:22 -070023#include "webrtc/media/base/videosinkinterface.h"
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010024#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
Henrik Kjellander2557b862015-11-18 22:00:21 +010025#include "webrtc/modules/video_coding/include/video_coding_defines.h"
Peter Boströmcd5c25c2016-04-21 16:48:08 +020026#include "webrtc/modules/video_coding/video_coding_impl.h"
Henrik Kjellander0f59a882015-11-18 22:31:24 +010027#include "webrtc/modules/video_processing/include/video_processing.h"
pbos@webrtc.orgf5d4cb12013-05-17 13:44:48 +000028#include "webrtc/typedefs.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000029
30namespace webrtc {
mflodman@webrtc.org84d17832011-12-01 17:02:23 +000031
andresp@webrtc.org7707d062013-05-13 10:50:50 +000032class Config;
sprang@webrtc.org40709352013-11-26 11:41:59 +000033class EncodedImageCallback;
Peter Boströme4499152016-02-05 11:13:28 +010034class OveruseFrameDetector;
pwestin@webrtc.org571a1c02012-11-13 21:12:39 +000035class PacedSender;
niklase@google.com470e71d2011-07-07 08:21:25 +000036class ProcessThread;
stefan@webrtc.org439be292012-02-16 14:45:37 +000037class QMVideoSettingsCallback;
pbos@webrtc.org273a4142014-12-01 15:23:21 +000038class SendStatisticsProxy;
pwestin@webrtc.org49888ce2012-04-27 05:25:53 +000039class ViEBitrateObserver;
mflodman@webrtc.org84d17832011-12-01 17:02:23 +000040class ViEEffectFilter;
Peter Boströma4c76882016-03-03 16:29:02 +010041class VideoEncoder;
niklase@google.com470e71d2011-07-07 08:21:25 +000042
perkjbc75d972016-05-02 06:31:25 -070043// VieEncoder represent a video encoder that accepts raw video frames as input
44// and produces an encoded bit stream.
45// Usage:
46// 1. Instantiate
47// 2. Call Init
48// 3. Call RegisterExternalEncoder if available.
49// 4. Call SetEncoder with the codec settings and the object that shall receive
50// the encoded bit stream.
51// 5. Call Start.
52// 6. For each available raw video frame call EncodeVideoFrame.
Peter Boström0013dcc2016-02-19 20:42:19 +010053class ViEEncoder : public VideoEncoderRateObserver,
kjellander02b3d272016-04-20 05:05:54 -070054 public EncodedImageCallback,
Peter Boströma4c76882016-03-03 16:29:02 +010055 public VCMSendStatisticsCallback {
mflodman@webrtc.org84d17832011-12-01 17:02:23 +000056 public:
pwestin@webrtc.org49888ce2012-04-27 05:25:53 +000057 friend class ViEBitrateObserver;
58
mflodman0dbf0092015-10-19 08:12:12 -070059 ViEEncoder(uint32_t number_of_cores,
Peter Boström7083e112015-09-22 16:28:51 +020060 ProcessThread* module_process_thread,
61 SendStatisticsProxy* stats_proxy,
Per28a44562016-05-04 17:12:51 +020062 OveruseFrameDetector* overuse_detector);
mflodman@webrtc.org84d17832011-12-01 17:02:23 +000063 ~ViEEncoder();
niklase@google.com470e71d2011-07-07 08:21:25 +000064
Peter Boströmcd5c25c2016-04-21 16:48:08 +020065 vcm::VideoSender* video_sender();
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000066
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +000067 void SetNetworkTransmissionState(bool is_transmitting);
68
mflodman@webrtc.org9ec883e2012-03-05 17:12:41 +000069 // Returns the id of the owning channel.
70 int Owner() const;
71
perkjbc75d972016-05-02 06:31:25 -070072 void Start();
mflodman@webrtc.org84d17832011-12-01 17:02:23 +000073 // Drops incoming packets before they get to the encoder.
74 void Pause();
niklase@google.com470e71d2011-07-07 08:21:25 +000075
mflodman@webrtc.org84d17832011-12-01 17:02:23 +000076 // Codec settings.
pbos@webrtc.orgb238d122013-04-09 13:41:51 +000077 int32_t RegisterExternalEncoder(VideoEncoder* encoder,
78 uint8_t pl_type,
79 bool internal_source);
80 int32_t DeRegisterExternalEncoder(uint8_t pl_type);
perkjbc75d972016-05-02 06:31:25 -070081 void SetEncoder(const VideoCodec& video_codec,
82 int min_transmit_bitrate_bps,
83 size_t max_data_payload_length,
84 EncodedImageCallback* sink);
niklase@google.com470e71d2011-07-07 08:21:25 +000085
Peter Boströma4c76882016-03-03 16:29:02 +010086 void EncodeVideoFrame(const VideoFrame& video_frame);
Peter Boström233bfd22016-01-18 20:23:40 +010087 void SendKeyFrame();
pwestin@webrtc.org49888ce2012-04-27 05:25:53 +000088
pbos@webrtc.org143451d2015-03-18 14:40:03 +000089 uint32_t LastObservedBitrateBps() const;
Peter Boströmd153a372015-11-10 15:27:12 +000090 // Loss protection. Must be called before SetEncoder() to have max packet size
91 // updated according to protection.
Peter Boströmcd5c25c2016-04-21 16:48:08 +020092 // TODO(pbos): Set protection method on construction.
Peter Boströmd153a372015-11-10 15:27:12 +000093 void SetProtectionMethod(bool nack, bool fec);
marpan@google.com80c5d7a2011-07-15 21:32:40 +000094
pbos@webrtc.org891d4832015-02-26 13:15:22 +000095 // Implements VideoEncoderRateObserver.
96 void OnSetRates(uint32_t bitrate_bps, int framerate) override;
97
kjellander02b3d272016-04-20 05:05:54 -070098 // Implements EncodedImageCallback.
99 int32_t Encoded(const EncodedImage& encoded_image,
100 const CodecSpecificInfo* codec_specific_info,
101 const RTPFragmentationHeader* fragmentation) override;
102
mflodman@webrtc.org84d17832011-12-01 17:02:23 +0000103 // Implements VideoSendStatisticsCallback.
perkj376b1922016-05-02 11:35:24 -0700104 void SendStatistics(uint32_t bit_rate,
105 uint32_t frame_rate,
106 const std::string& encoder_name) override;
henrike@webrtc.orgcc774a62014-09-11 22:45:54 +0000107
Peter Boström0013dcc2016-02-19 20:42:19 +0100108 // virtual to test EncoderStateFeedback with mocks.
perkj600246e2016-05-04 11:26:51 -0700109 virtual void OnReceivedIntraFrameRequest(size_t stream_index);
110 virtual void OnReceivedSLI(uint8_t picture_id);
111 virtual void OnReceivedRPSI(uint64_t picture_id);
mflodman@webrtc.orgd6ec3862012-10-25 11:30:29 +0000112
stefana4a8d4a2015-07-15 04:39:22 -0700113 int GetPaddingNeededBps() const;
Stefan Holmere5904162015-03-26 11:11:06 +0100114
mflodman86aabb22016-03-11 15:44:32 +0100115 void OnBitrateUpdated(uint32_t bitrate_bps,
stefan@webrtc.orgedeea912014-12-08 19:46:23 +0000116 uint8_t fraction_lost,
pkasting@chromium.org16825b12015-01-12 21:51:21 +0000117 int64_t round_trip_time_ms);
pwestin@webrtc.org49888ce2012-04-27 05:25:53 +0000118
mflodman@webrtc.org84d17832011-12-01 17:02:23 +0000119 private:
stefan@webrtc.org7af12be2014-07-09 14:46:31 +0000120 bool EncoderPaused() const EXCLUSIVE_LOCKS_REQUIRED(data_cs_);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000121 void TraceFrameDropStart() EXCLUSIVE_LOCKS_REQUIRED(data_cs_);
122 void TraceFrameDropEnd() EXCLUSIVE_LOCKS_REQUIRED(data_cs_);
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000123
pbos@webrtc.orgb238d122013-04-09 13:41:51 +0000124 const uint32_t number_of_cores_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000125
kwiberg27f982b2016-03-01 11:52:33 -0800126 const std::unique_ptr<VideoProcessing> vp_;
127 const std::unique_ptr<QMVideoSettingsCallback> qm_callback_;
Peter Boströmcd5c25c2016-04-21 16:48:08 +0200128 vcm::VideoSender video_sender_;
mflodman@webrtc.org96abda02015-02-25 13:50:10 +0000129
pbosd8de1152016-02-01 09:00:51 -0800130 rtc::CriticalSection data_cs_;
pwestin@webrtc.org49888ce2012-04-27 05:25:53 +0000131
Peter Boström7083e112015-09-22 16:28:51 +0200132 SendStatisticsProxy* const stats_proxy_;
Peter Boströme4499152016-02-05 11:13:28 +0100133 OveruseFrameDetector* const overuse_detector_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000134
Noah Richards099323e2015-04-15 09:14:12 -0700135 // The time we last received an input frame or encoded frame. This is used to
136 // track when video is stopped long enough that we also want to stop sending
137 // padding.
138 int64_t time_of_last_frame_activity_ms_ GUARDED_BY(data_cs_);
Peter Boströmd153a372015-11-10 15:27:12 +0000139 VideoCodec encoder_config_ GUARDED_BY(data_cs_);
Peter Boströma03785e2016-03-03 11:36:18 +0100140 int min_transmit_bitrate_bps_ GUARDED_BY(data_cs_);
pbos@webrtc.org143451d2015-03-18 14:40:03 +0000141 uint32_t last_observed_bitrate_bps_ GUARDED_BY(data_cs_);
stefan@webrtc.org7af12be2014-07-09 14:46:31 +0000142 bool network_is_transmitting_ GUARDED_BY(data_cs_);
143 bool encoder_paused_ GUARDED_BY(data_cs_);
144 bool encoder_paused_and_dropped_frame_ GUARDED_BY(data_cs_);
niklase@google.com470e71d2011-07-07 08:21:25 +0000145
perkjbc75d972016-05-02 06:31:25 -0700146 rtc::CriticalSection sink_cs_;
147 EncodedImageCallback* sink_ GUARDED_BY(sink_cs_);
148
Peter Boström7083e112015-09-22 16:28:51 +0200149 ProcessThread* module_process_thread_;
mflodman@webrtc.org84d17832011-12-01 17:02:23 +0000150
stefan@webrtc.org7af12be2014-07-09 14:46:31 +0000151 bool has_received_sli_ GUARDED_BY(data_cs_);
152 uint8_t picture_id_sli_ GUARDED_BY(data_cs_);
153 bool has_received_rpsi_ GUARDED_BY(data_cs_);
154 uint64_t picture_id_rpsi_ GUARDED_BY(data_cs_);
mflodman@webrtc.org84d17832011-12-01 17:02:23 +0000155
stefan@webrtc.org7af12be2014-07-09 14:46:31 +0000156 bool video_suspended_ GUARDED_BY(data_cs_);
niklase@google.com470e71d2011-07-07 08:21:25 +0000157};
mflodman@webrtc.org84d17832011-12-01 17:02:23 +0000158
159} // namespace webrtc
160
Peter Boström7623ce42015-12-09 12:13:30 +0100161#endif // WEBRTC_VIDEO_VIE_ENCODER_H_