aboutsummaryrefslogtreecommitdiff
path: root/webrtc/video/vie_encoder.h
diff options
context:
space:
mode:
authorPeter Boström <pbos@webrtc.org>2015-12-09 12:13:30 +0100
committerPeter Boström <pbos@webrtc.org>2015-12-09 11:13:40 +0000
commit7623ce4aeb9130c937ba5836490cbb3a35679e79 (patch)
treef7d20b01beef47a88bc30fdc58fe9c8bc1e546ce /webrtc/video/vie_encoder.h
parentd3c944755ec546f46d5bdd84bff359fe6c4639e9 (diff)
downloadwebrtc-7623ce4aeb9130c937ba5836490cbb3a35679e79.tar.gz
Reland of Merge webrtc/video_engine/ into webrtc/video/ (patchset #2 id:300001 of https://codereview.webrtc.org/1507903005/ )
Reason for revert: Bot breakage caused by TickTime::UseFakeClock has been removed. Original issue's description: > Revert of Merge webrtc/video_engine/ into webrtc/video/ (patchset #2 id:20001 of https://codereview.webrtc.org/1506773002/ ) > > Reason for revert: > Breaks Dr Memory Light https://build.chromium.org/p/client.webrtc/builders/Win%20DrMemory%20Light/builds/4643 and all the Android Tests bots. > > Original issue's description: > > Merge webrtc/video_engine/ into webrtc/video/ > > > > BUG=webrtc:1695 > > R=mflodman@webrtc.org > > > > Committed: https://crrev.com/03ef053202bc5d5ab43460eebf5403232f157646 > > Cr-Commit-Position: refs/heads/master@{#10926} > > TBR=mflodman@webrtc.org,pbos@webrtc.org > NOPRESUBMIT=true > NOTREECHECKS=true > NOTRY=true > BUG=webrtc:1695 > > Committed: https://crrev.com/8237abf563bf4782ee104408b53cc8e55ce44518 > Cr-Commit-Position: refs/heads/master@{#10937} BUG=webrtc:1695 TBR=mflodman@webrtc.org,kjellander@webrtc.org NOPRESUBMIT=true Review URL: https://codereview.webrtc.org/1510183002 . Cr-Commit-Position: refs/heads/master@{#10948}
Diffstat (limited to 'webrtc/video/vie_encoder.h')
-rw-r--r--webrtc/video/vie_encoder.h195
1 files changed, 195 insertions, 0 deletions
diff --git a/webrtc/video/vie_encoder.h b/webrtc/video/vie_encoder.h
new file mode 100644
index 0000000000..b86287c129
--- /dev/null
+++ b/webrtc/video/vie_encoder.h
@@ -0,0 +1,195 @@
+/*
+ * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#ifndef WEBRTC_VIDEO_VIE_ENCODER_H_
+#define WEBRTC_VIDEO_VIE_ENCODER_H_
+
+#include <map>
+#include <vector>
+
+#include "webrtc/base/scoped_ptr.h"
+#include "webrtc/base/scoped_ref_ptr.h"
+#include "webrtc/base/thread_annotations.h"
+#include "webrtc/call/bitrate_allocator.h"
+#include "webrtc/common_types.h"
+#include "webrtc/frame_callback.h"
+#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
+#include "webrtc/modules/video_coding/include/video_coding_defines.h"
+#include "webrtc/modules/video_processing/include/video_processing.h"
+#include "webrtc/typedefs.h"
+#include "webrtc/video/video_capture_input.h"
+
+namespace webrtc {
+
+class BitrateAllocator;
+class BitrateObserver;
+class Config;
+class CriticalSectionWrapper;
+class EncodedImageCallback;
+class PacedSender;
+class PayloadRouter;
+class ProcessThread;
+class QMVideoSettingsCallback;
+class SendStatisticsProxy;
+class ViEBitrateObserver;
+class ViEEffectFilter;
+class VideoCodingModule;
+
+class ViEEncoder : public RtcpIntraFrameObserver,
+ public VideoEncoderRateObserver,
+ public VCMPacketizationCallback,
+ public VCMSendStatisticsCallback,
+ public VideoCaptureCallback {
+ public:
+ friend class ViEBitrateObserver;
+
+ ViEEncoder(uint32_t number_of_cores,
+ ProcessThread* module_process_thread,
+ SendStatisticsProxy* stats_proxy,
+ I420FrameCallback* pre_encode_callback,
+ PacedSender* pacer,
+ BitrateAllocator* bitrate_allocator);
+ ~ViEEncoder();
+
+ bool Init();
+
+ // This function is assumed to be called before any frames are delivered and
+ // only once.
+ // Ideally this would be done in Init, but the dependencies between ViEEncoder
+ // and ViEChannel makes it really hard to do in a good way.
+ void StartThreadsAndSetSharedMembers(
+ rtc::scoped_refptr<PayloadRouter> send_payload_router,
+ VCMProtectionCallback* vcm_protection_callback);
+
+ // This function must be called before the corresponding ViEChannel is
+ // deleted.
+ void StopThreadsAndRemoveSharedMembers();
+
+ void SetNetworkTransmissionState(bool is_transmitting);
+
+ // Returns the id of the owning channel.
+ int Owner() const;
+
+ // Drops incoming packets before they get to the encoder.
+ void Pause();
+ void Restart();
+
+ // Codec settings.
+ int32_t RegisterExternalEncoder(VideoEncoder* encoder,
+ uint8_t pl_type,
+ bool internal_source);
+ int32_t DeRegisterExternalEncoder(uint8_t pl_type);
+ int32_t SetEncoder(const VideoCodec& video_codec);
+
+ // Implementing VideoCaptureCallback.
+ void DeliverFrame(VideoFrame video_frame) override;
+
+ int32_t SendKeyFrame();
+
+ uint32_t LastObservedBitrateBps() const;
+ int CodecTargetBitrate(uint32_t* bitrate) const;
+ // Loss protection. Must be called before SetEncoder() to have max packet size
+ // updated according to protection.
+ // TODO(pbos): Set protection method on construction or extract vcm_ outside
+ // this class and set it on construction there.
+ void SetProtectionMethod(bool nack, bool fec);
+
+ // Buffering mode.
+ void SetSenderBufferingMode(int target_delay_ms);
+
+ // Implements VideoEncoderRateObserver.
+ void OnSetRates(uint32_t bitrate_bps, int framerate) override;
+
+ // Implements VCMPacketizationCallback.
+ int32_t SendData(uint8_t payload_type,
+ const EncodedImage& encoded_image,
+ const RTPFragmentationHeader& fragmentation_header,
+ const RTPVideoHeader* rtp_video_hdr) override;
+
+ // Implements VideoSendStatisticsCallback.
+ int32_t SendStatistics(const uint32_t bit_rate,
+ const uint32_t frame_rate) override;
+
+ // Implements RtcpIntraFrameObserver.
+ void OnReceivedIntraFrameRequest(uint32_t ssrc) override;
+ void OnReceivedSLI(uint32_t ssrc, uint8_t picture_id) override;
+ void OnReceivedRPSI(uint32_t ssrc, uint64_t picture_id) override;
+ void OnLocalSsrcChanged(uint32_t old_ssrc, uint32_t new_ssrc) override;
+
+ // Sets SSRCs for all streams.
+ void SetSsrcs(const std::vector<uint32_t>& ssrcs);
+
+ void SetMinTransmitBitrate(int min_transmit_bitrate_kbps);
+
+ // Lets the sender suspend video when the rate drops below
+ // |threshold_bps|, and turns back on when the rate goes back up above
+ // |threshold_bps| + |window_bps|.
+ void SuspendBelowMinBitrate();
+
+ // New-style callbacks, used by VideoSendStream.
+ void RegisterPostEncodeImageCallback(
+ EncodedImageCallback* post_encode_callback);
+
+ int GetPaddingNeededBps() const;
+
+ protected:
+ // Called by BitrateObserver.
+ void OnNetworkChanged(uint32_t bitrate_bps,
+ uint8_t fraction_lost,
+ int64_t round_trip_time_ms);
+
+ private:
+ bool EncoderPaused() const EXCLUSIVE_LOCKS_REQUIRED(data_cs_);
+ void TraceFrameDropStart() EXCLUSIVE_LOCKS_REQUIRED(data_cs_);
+ void TraceFrameDropEnd() EXCLUSIVE_LOCKS_REQUIRED(data_cs_);
+
+ const uint32_t number_of_cores_;
+
+ const rtc::scoped_ptr<VideoProcessing> vp_;
+ const rtc::scoped_ptr<QMVideoSettingsCallback> qm_callback_;
+ const rtc::scoped_ptr<VideoCodingModule> vcm_;
+ rtc::scoped_refptr<PayloadRouter> send_payload_router_;
+
+ rtc::scoped_ptr<CriticalSectionWrapper> data_cs_;
+ rtc::scoped_ptr<BitrateObserver> bitrate_observer_;
+
+ SendStatisticsProxy* const stats_proxy_;
+ I420FrameCallback* const pre_encode_callback_;
+ PacedSender* const pacer_;
+ BitrateAllocator* const bitrate_allocator_;
+
+ // The time we last received an input frame or encoded frame. This is used to
+ // track when video is stopped long enough that we also want to stop sending
+ // padding.
+ int64_t time_of_last_frame_activity_ms_ GUARDED_BY(data_cs_);
+ VideoCodec encoder_config_ GUARDED_BY(data_cs_);
+ int min_transmit_bitrate_kbps_ GUARDED_BY(data_cs_);
+ uint32_t last_observed_bitrate_bps_ GUARDED_BY(data_cs_);
+ int target_delay_ms_ GUARDED_BY(data_cs_);
+ bool network_is_transmitting_ GUARDED_BY(data_cs_);
+ bool encoder_paused_ GUARDED_BY(data_cs_);
+ bool encoder_paused_and_dropped_frame_ GUARDED_BY(data_cs_);
+ std::map<unsigned int, int64_t> time_last_intra_request_ms_
+ GUARDED_BY(data_cs_);
+
+ ProcessThread* module_process_thread_;
+
+ bool has_received_sli_ GUARDED_BY(data_cs_);
+ uint8_t picture_id_sli_ GUARDED_BY(data_cs_);
+ bool has_received_rpsi_ GUARDED_BY(data_cs_);
+ uint64_t picture_id_rpsi_ GUARDED_BY(data_cs_);
+ std::map<uint32_t, int> ssrc_streams_ GUARDED_BY(data_cs_);
+
+ bool video_suspended_ GUARDED_BY(data_cs_);
+};
+
+} // namespace webrtc
+
+#endif // WEBRTC_VIDEO_VIE_ENCODER_H_