| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | |
| 3 * | |
| 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 | |
| 11 #ifndef WEBRTC_VIDEO_ENGINE_VIE_ENCODER_H_ | |
| 12 #define WEBRTC_VIDEO_ENGINE_VIE_ENCODER_H_ | |
| 13 | |
| 14 #include <map> | |
| 15 #include <vector> | |
| 16 | |
| 17 #include "webrtc/base/scoped_ptr.h" | |
| 18 #include "webrtc/base/scoped_ref_ptr.h" | |
| 19 #include "webrtc/base/thread_annotations.h" | |
| 20 #include "webrtc/call/bitrate_allocator.h" | |
| 21 #include "webrtc/common_types.h" | |
| 22 #include "webrtc/frame_callback.h" | |
| 23 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" | |
| 24 #include "webrtc/modules/video_coding/include/video_coding_defines.h" | |
| 25 #include "webrtc/modules/video_processing/include/video_processing.h" | |
| 26 #include "webrtc/typedefs.h" | |
| 27 #include "webrtc/video/video_capture_input.h" | |
| 28 | |
| 29 namespace webrtc { | |
| 30 | |
| 31 class BitrateAllocator; | |
| 32 class BitrateObserver; | |
| 33 class Config; | |
| 34 class CriticalSectionWrapper; | |
| 35 class EncodedImageCallback; | |
| 36 class PacedSender; | |
| 37 class PayloadRouter; | |
| 38 class ProcessThread; | |
| 39 class QMVideoSettingsCallback; | |
| 40 class SendStatisticsProxy; | |
| 41 class ViEBitrateObserver; | |
| 42 class ViEEffectFilter; | |
| 43 class VideoCodingModule; | |
| 44 | |
| 45 class ViEEncoder : public RtcpIntraFrameObserver, | |
| 46 public VideoEncoderRateObserver, | |
| 47 public VCMPacketizationCallback, | |
| 48 public VCMSendStatisticsCallback, | |
| 49 public VideoCaptureCallback { | |
| 50 public: | |
| 51 friend class ViEBitrateObserver; | |
| 52 | |
| 53 ViEEncoder(uint32_t number_of_cores, | |
| 54 ProcessThread* module_process_thread, | |
| 55 SendStatisticsProxy* stats_proxy, | |
| 56 I420FrameCallback* pre_encode_callback, | |
| 57 PacedSender* pacer, | |
| 58 BitrateAllocator* bitrate_allocator); | |
| 59 ~ViEEncoder(); | |
| 60 | |
| 61 bool Init(); | |
| 62 | |
| 63 // This function is assumed to be called before any frames are delivered and | |
| 64 // only once. | |
| 65 // Ideally this would be done in Init, but the dependencies between ViEEncoder | |
| 66 // and ViEChannel makes it really hard to do in a good way. | |
| 67 void StartThreadsAndSetSharedMembers( | |
| 68 rtc::scoped_refptr<PayloadRouter> send_payload_router, | |
| 69 VCMProtectionCallback* vcm_protection_callback); | |
| 70 | |
| 71 // This function must be called before the corresponding ViEChannel is | |
| 72 // deleted. | |
| 73 void StopThreadsAndRemoveSharedMembers(); | |
| 74 | |
| 75 void SetNetworkTransmissionState(bool is_transmitting); | |
| 76 | |
| 77 // Returns the id of the owning channel. | |
| 78 int Owner() const; | |
| 79 | |
| 80 // Drops incoming packets before they get to the encoder. | |
| 81 void Pause(); | |
| 82 void Restart(); | |
| 83 | |
| 84 // Codec settings. | |
| 85 int32_t RegisterExternalEncoder(VideoEncoder* encoder, | |
| 86 uint8_t pl_type, | |
| 87 bool internal_source); | |
| 88 int32_t DeRegisterExternalEncoder(uint8_t pl_type); | |
| 89 int32_t SetEncoder(const VideoCodec& video_codec); | |
| 90 | |
| 91 // Implementing VideoCaptureCallback. | |
| 92 void DeliverFrame(VideoFrame video_frame) override; | |
| 93 | |
| 94 int32_t SendKeyFrame(); | |
| 95 | |
| 96 uint32_t LastObservedBitrateBps() const; | |
| 97 int CodecTargetBitrate(uint32_t* bitrate) const; | |
| 98 // Loss protection. Must be called before SetEncoder() to have max packet size | |
| 99 // updated according to protection. | |
| 100 // TODO(pbos): Set protection method on construction or extract vcm_ outside | |
| 101 // this class and set it on construction there. | |
| 102 void SetProtectionMethod(bool nack, bool fec); | |
| 103 | |
| 104 // Buffering mode. | |
| 105 void SetSenderBufferingMode(int target_delay_ms); | |
| 106 | |
| 107 // Implements VideoEncoderRateObserver. | |
| 108 void OnSetRates(uint32_t bitrate_bps, int framerate) override; | |
| 109 | |
| 110 // Implements VCMPacketizationCallback. | |
| 111 int32_t SendData(uint8_t payload_type, | |
| 112 const EncodedImage& encoded_image, | |
| 113 const RTPFragmentationHeader& fragmentation_header, | |
| 114 const RTPVideoHeader* rtp_video_hdr) override; | |
| 115 | |
| 116 // Implements VideoSendStatisticsCallback. | |
| 117 int32_t SendStatistics(const uint32_t bit_rate, | |
| 118 const uint32_t frame_rate) override; | |
| 119 | |
| 120 // Implements RtcpIntraFrameObserver. | |
| 121 void OnReceivedIntraFrameRequest(uint32_t ssrc) override; | |
| 122 void OnReceivedSLI(uint32_t ssrc, uint8_t picture_id) override; | |
| 123 void OnReceivedRPSI(uint32_t ssrc, uint64_t picture_id) override; | |
| 124 void OnLocalSsrcChanged(uint32_t old_ssrc, uint32_t new_ssrc) override; | |
| 125 | |
| 126 // Sets SSRCs for all streams. | |
| 127 void SetSsrcs(const std::vector<uint32_t>& ssrcs); | |
| 128 | |
| 129 void SetMinTransmitBitrate(int min_transmit_bitrate_kbps); | |
| 130 | |
| 131 // Lets the sender suspend video when the rate drops below | |
| 132 // |threshold_bps|, and turns back on when the rate goes back up above | |
| 133 // |threshold_bps| + |window_bps|. | |
| 134 void SuspendBelowMinBitrate(); | |
| 135 | |
| 136 // New-style callbacks, used by VideoSendStream. | |
| 137 void RegisterPostEncodeImageCallback( | |
| 138 EncodedImageCallback* post_encode_callback); | |
| 139 | |
| 140 int GetPaddingNeededBps() const; | |
| 141 | |
| 142 protected: | |
| 143 // Called by BitrateObserver. | |
| 144 void OnNetworkChanged(uint32_t bitrate_bps, | |
| 145 uint8_t fraction_lost, | |
| 146 int64_t round_trip_time_ms); | |
| 147 | |
| 148 private: | |
| 149 bool EncoderPaused() const EXCLUSIVE_LOCKS_REQUIRED(data_cs_); | |
| 150 void TraceFrameDropStart() EXCLUSIVE_LOCKS_REQUIRED(data_cs_); | |
| 151 void TraceFrameDropEnd() EXCLUSIVE_LOCKS_REQUIRED(data_cs_); | |
| 152 | |
| 153 const uint32_t number_of_cores_; | |
| 154 | |
| 155 const rtc::scoped_ptr<VideoProcessing> vp_; | |
| 156 const rtc::scoped_ptr<QMVideoSettingsCallback> qm_callback_; | |
| 157 const rtc::scoped_ptr<VideoCodingModule> vcm_; | |
| 158 rtc::scoped_refptr<PayloadRouter> send_payload_router_; | |
| 159 | |
| 160 rtc::scoped_ptr<CriticalSectionWrapper> data_cs_; | |
| 161 rtc::scoped_ptr<BitrateObserver> bitrate_observer_; | |
| 162 | |
| 163 SendStatisticsProxy* const stats_proxy_; | |
| 164 I420FrameCallback* const pre_encode_callback_; | |
| 165 PacedSender* const pacer_; | |
| 166 BitrateAllocator* const bitrate_allocator_; | |
| 167 | |
| 168 // The time we last received an input frame or encoded frame. This is used to | |
| 169 // track when video is stopped long enough that we also want to stop sending | |
| 170 // padding. | |
| 171 int64_t time_of_last_frame_activity_ms_ GUARDED_BY(data_cs_); | |
| 172 VideoCodec encoder_config_ GUARDED_BY(data_cs_); | |
| 173 int min_transmit_bitrate_kbps_ GUARDED_BY(data_cs_); | |
| 174 uint32_t last_observed_bitrate_bps_ GUARDED_BY(data_cs_); | |
| 175 int target_delay_ms_ GUARDED_BY(data_cs_); | |
| 176 bool network_is_transmitting_ GUARDED_BY(data_cs_); | |
| 177 bool encoder_paused_ GUARDED_BY(data_cs_); | |
| 178 bool encoder_paused_and_dropped_frame_ GUARDED_BY(data_cs_); | |
| 179 std::map<unsigned int, int64_t> time_last_intra_request_ms_ | |
| 180 GUARDED_BY(data_cs_); | |
| 181 | |
| 182 ProcessThread* module_process_thread_; | |
| 183 | |
| 184 bool has_received_sli_ GUARDED_BY(data_cs_); | |
| 185 uint8_t picture_id_sli_ GUARDED_BY(data_cs_); | |
| 186 bool has_received_rpsi_ GUARDED_BY(data_cs_); | |
| 187 uint64_t picture_id_rpsi_ GUARDED_BY(data_cs_); | |
| 188 std::map<uint32_t, int> ssrc_streams_ GUARDED_BY(data_cs_); | |
| 189 | |
| 190 bool video_suspended_ GUARDED_BY(data_cs_); | |
| 191 }; | |
| 192 | |
| 193 } // namespace webrtc | |
| 194 | |
| 195 #endif // WEBRTC_VIDEO_ENGINE_VIE_ENCODER_H_ | |
| OLD | NEW |