| Index: webrtc/video/vie_encoder.h
|
| diff --git a/webrtc/video/vie_encoder.h b/webrtc/video/vie_encoder.h
|
| deleted file mode 100644
|
| index 6e9234f383f27a242d3880d865adc0bf8b672120..0000000000000000000000000000000000000000
|
| --- a/webrtc/video/vie_encoder.h
|
| +++ /dev/null
|
| @@ -1,316 +0,0 @@
|
| -/*
|
| - * 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 <memory>
|
| -#include <string>
|
| -#include <vector>
|
| -
|
| -#include "webrtc/api/video/video_rotation.h"
|
| -#include "webrtc/api/video_codecs/video_encoder.h"
|
| -#include "webrtc/call/call.h"
|
| -#include "webrtc/common_types.h"
|
| -#include "webrtc/common_video/include/video_bitrate_allocator.h"
|
| -#include "webrtc/media/base/videosinkinterface.h"
|
| -#include "webrtc/modules/video_coding/include/video_coding_defines.h"
|
| -#include "webrtc/modules/video_coding/utility/quality_scaler.h"
|
| -#include "webrtc/modules/video_coding/video_coding_impl.h"
|
| -#include "webrtc/rtc_base/criticalsection.h"
|
| -#include "webrtc/rtc_base/event.h"
|
| -#include "webrtc/rtc_base/sequenced_task_checker.h"
|
| -#include "webrtc/rtc_base/task_queue.h"
|
| -#include "webrtc/system_wrappers/include/atomic32.h"
|
| -#include "webrtc/typedefs.h"
|
| -#include "webrtc/video/overuse_frame_detector.h"
|
| -#include "webrtc/video_send_stream.h"
|
| -
|
| -namespace webrtc {
|
| -
|
| -class ProcessThread;
|
| -class SendStatisticsProxy;
|
| -class VideoBitrateAllocationObserver;
|
| -
|
| -// VieEncoder represent a video encoder that accepts raw video frames as input
|
| -// and produces an encoded bit stream.
|
| -// Usage:
|
| -// Instantiate.
|
| -// Call SetSink.
|
| -// Call SetSource.
|
| -// Call ConfigureEncoder with the codec settings.
|
| -// Call Stop() when done.
|
| -class ViEEncoder : public rtc::VideoSinkInterface<VideoFrame>,
|
| - public EncodedImageCallback,
|
| - public VCMSendStatisticsCallback,
|
| - public AdaptationObserverInterface {
|
| - public:
|
| - // Interface for receiving encoded video frames and notifications about
|
| - // configuration changes.
|
| - class EncoderSink : public EncodedImageCallback {
|
| - public:
|
| - virtual void OnEncoderConfigurationChanged(
|
| - std::vector<VideoStream> streams,
|
| - int min_transmit_bitrate_bps) = 0;
|
| - };
|
| -
|
| - // Number of resolution and framerate reductions (-1: disabled).
|
| - struct AdaptCounts {
|
| - int resolution = 0;
|
| - int fps = 0;
|
| - };
|
| -
|
| - // Downscale resolution at most 2 times for CPU reasons.
|
| - static const int kMaxCpuResolutionDowngrades = 2;
|
| - // Downscale framerate at most 4 times.
|
| - static const int kMaxCpuFramerateDowngrades = 4;
|
| -
|
| - ViEEncoder(uint32_t number_of_cores,
|
| - SendStatisticsProxy* stats_proxy,
|
| - const VideoSendStream::Config::EncoderSettings& settings,
|
| - rtc::VideoSinkInterface<VideoFrame>* pre_encode_callback,
|
| - EncodedFrameObserver* encoder_timing,
|
| - std::unique_ptr<OveruseFrameDetector> overuse_detector);
|
| - ~ViEEncoder();
|
| - // RegisterProcessThread register |module_process_thread| with those objects
|
| - // that use it. Registration has to happen on the thread where
|
| - // |module_process_thread| was created (libjingle's worker thread).
|
| - // TODO(perkj): Replace the use of |module_process_thread| with a TaskQueue.
|
| - void RegisterProcessThread(ProcessThread* module_process_thread);
|
| - void DeRegisterProcessThread();
|
| -
|
| - // Sets the source that will provide I420 video frames.
|
| - // |degradation_preference| control whether or not resolution or frame rate
|
| - // may be reduced.
|
| - void SetSource(
|
| - rtc::VideoSourceInterface<VideoFrame>* source,
|
| - const VideoSendStream::DegradationPreference& degradation_preference);
|
| -
|
| - // Sets the |sink| that gets the encoded frames. |rotation_applied| means
|
| - // that the source must support rotation. Only set |rotation_applied| if the
|
| - // remote side does not support the rotation extension.
|
| - void SetSink(EncoderSink* sink, bool rotation_applied);
|
| -
|
| - // TODO(perkj): Can we remove VideoCodec.startBitrate ?
|
| - void SetStartBitrate(int start_bitrate_bps);
|
| -
|
| - void SetBitrateObserver(VideoBitrateAllocationObserver* bitrate_observer);
|
| -
|
| - void ConfigureEncoder(VideoEncoderConfig config,
|
| - size_t max_data_payload_length,
|
| - bool nack_enabled);
|
| -
|
| - // Permanently stop encoding. After this method has returned, it is
|
| - // guaranteed that no encoded frames will be delivered to the sink.
|
| - void Stop();
|
| -
|
| - void SendKeyFrame();
|
| -
|
| - // virtual to test EncoderStateFeedback with mocks.
|
| - virtual void OnReceivedIntraFrameRequest(size_t stream_index);
|
| -
|
| - void OnBitrateUpdated(uint32_t bitrate_bps,
|
| - uint8_t fraction_lost,
|
| - int64_t round_trip_time_ms);
|
| -
|
| - protected:
|
| - // Used for testing. For example the |ScalingObserverInterface| methods must
|
| - // be called on |encoder_queue_|.
|
| - rtc::TaskQueue* encoder_queue() { return &encoder_queue_; }
|
| -
|
| - // webrtc::ScalingObserverInterface implementation.
|
| - // These methods are protected for easier testing.
|
| - void AdaptUp(AdaptReason reason) override;
|
| - void AdaptDown(AdaptReason reason) override;
|
| - static CpuOveruseOptions GetCpuOveruseOptions(bool full_overuse_time);
|
| -
|
| - private:
|
| - class ConfigureEncoderTask;
|
| - class EncodeTask;
|
| - class VideoSourceProxy;
|
| -
|
| - class VideoFrameInfo {
|
| - public:
|
| - VideoFrameInfo(int width,
|
| - int height,
|
| - bool is_texture)
|
| - : width(width),
|
| - height(height),
|
| - is_texture(is_texture) {}
|
| - int width;
|
| - int height;
|
| - bool is_texture;
|
| - int pixel_count() const { return width * height; }
|
| - };
|
| -
|
| - void ConfigureEncoderOnTaskQueue(VideoEncoderConfig config,
|
| - size_t max_data_payload_length,
|
| - bool nack_enabled);
|
| - void ReconfigureEncoder();
|
| -
|
| - void ConfigureQualityScaler();
|
| -
|
| - // Implements VideoSinkInterface.
|
| - void OnFrame(const VideoFrame& video_frame) override;
|
| -
|
| - // Implements VideoSendStatisticsCallback.
|
| - void SendStatistics(uint32_t bit_rate,
|
| - uint32_t frame_rate) override;
|
| -
|
| - void EncodeVideoFrame(const VideoFrame& frame,
|
| - int64_t time_when_posted_in_ms);
|
| -
|
| - // Implements EncodedImageCallback.
|
| - EncodedImageCallback::Result OnEncodedImage(
|
| - const EncodedImage& encoded_image,
|
| - const CodecSpecificInfo* codec_specific_info,
|
| - const RTPFragmentationHeader* fragmentation) override;
|
| -
|
| - void OnDroppedFrame() override;
|
| -
|
| - bool EncoderPaused() const;
|
| - void TraceFrameDropStart();
|
| - void TraceFrameDropEnd();
|
| -
|
| - // Class holding adaptation information.
|
| - class AdaptCounter final {
|
| - public:
|
| - AdaptCounter();
|
| - ~AdaptCounter();
|
| -
|
| - // Get number of adaptation downscales for |reason|.
|
| - AdaptCounts Counts(int reason) const;
|
| -
|
| - std::string ToString() const;
|
| -
|
| - void IncrementFramerate(int reason);
|
| - void IncrementResolution(int reason);
|
| - void DecrementFramerate(int reason);
|
| - void DecrementResolution(int reason);
|
| - void DecrementFramerate(int reason, int cur_fps);
|
| -
|
| - // Gets the total number of downgrades (for all adapt reasons).
|
| - int FramerateCount() const;
|
| - int ResolutionCount() const;
|
| -
|
| - // Gets the total number of downgrades for |reason|.
|
| - int FramerateCount(int reason) const;
|
| - int ResolutionCount(int reason) const;
|
| - int TotalCount(int reason) const;
|
| -
|
| - private:
|
| - std::string ToString(const std::vector<int>& counters) const;
|
| - int Count(const std::vector<int>& counters) const;
|
| - void MoveCount(std::vector<int>* counters, int from_reason);
|
| -
|
| - // Degradation counters holding number of framerate/resolution reductions
|
| - // per adapt reason.
|
| - std::vector<int> fps_counters_;
|
| - std::vector<int> resolution_counters_;
|
| - };
|
| -
|
| - AdaptCounter& GetAdaptCounter() RUN_ON(&encoder_queue_);
|
| - const AdaptCounter& GetConstAdaptCounter() RUN_ON(&encoder_queue_);
|
| - void UpdateAdaptationStats(AdaptReason reason) RUN_ON(&encoder_queue_);
|
| - AdaptCounts GetActiveCounts(AdaptReason reason) RUN_ON(&encoder_queue_);
|
| -
|
| - rtc::Event shutdown_event_;
|
| -
|
| - const uint32_t number_of_cores_;
|
| - // Counts how many frames we've dropped in the initial rampup phase.
|
| - int initial_rampup_;
|
| -
|
| - const std::unique_ptr<VideoSourceProxy> source_proxy_;
|
| - EncoderSink* sink_;
|
| - const VideoSendStream::Config::EncoderSettings settings_;
|
| - const VideoCodecType codec_type_;
|
| -
|
| - vcm::VideoSender video_sender_ ACCESS_ON(&encoder_queue_);
|
| - std::unique_ptr<OveruseFrameDetector> overuse_detector_
|
| - ACCESS_ON(&encoder_queue_);
|
| - std::unique_ptr<QualityScaler> quality_scaler_ ACCESS_ON(&encoder_queue_);
|
| -
|
| - SendStatisticsProxy* const stats_proxy_;
|
| - rtc::VideoSinkInterface<VideoFrame>* const pre_encode_callback_;
|
| - ProcessThread* module_process_thread_;
|
| - rtc::ThreadChecker module_process_thread_checker_;
|
| - // |thread_checker_| checks that public methods that are related to lifetime
|
| - // of ViEEncoder are called on the same thread.
|
| - rtc::ThreadChecker thread_checker_;
|
| -
|
| - VideoEncoderConfig encoder_config_ ACCESS_ON(&encoder_queue_);
|
| - std::unique_ptr<VideoBitrateAllocator> rate_allocator_
|
| - ACCESS_ON(&encoder_queue_);
|
| - // The maximum frame rate of the current codec configuration, as determined
|
| - // at the last ReconfigureEncoder() call.
|
| - int max_framerate_ ACCESS_ON(&encoder_queue_);
|
| -
|
| - // Set when ConfigureEncoder has been called in order to lazy reconfigure the
|
| - // encoder on the next frame.
|
| - bool pending_encoder_reconfiguration_ ACCESS_ON(&encoder_queue_);
|
| - rtc::Optional<VideoFrameInfo> last_frame_info_ ACCESS_ON(&encoder_queue_);
|
| - int crop_width_ ACCESS_ON(&encoder_queue_);
|
| - int crop_height_ ACCESS_ON(&encoder_queue_);
|
| - uint32_t encoder_start_bitrate_bps_ ACCESS_ON(&encoder_queue_);
|
| - size_t max_data_payload_length_ ACCESS_ON(&encoder_queue_);
|
| - bool nack_enabled_ ACCESS_ON(&encoder_queue_);
|
| - uint32_t last_observed_bitrate_bps_ ACCESS_ON(&encoder_queue_);
|
| - bool encoder_paused_and_dropped_frame_ ACCESS_ON(&encoder_queue_);
|
| - Clock* const clock_;
|
| - // Counters used for deciding if the video resolution or framerate is
|
| - // currently restricted, and if so, why, on a per degradation preference
|
| - // basis.
|
| - // TODO(sprang): Replace this with a state holding a relative overuse measure
|
| - // instead, that can be translated into suitable down-scale or fps limit.
|
| - std::map<const VideoSendStream::DegradationPreference, AdaptCounter>
|
| - adapt_counters_ ACCESS_ON(&encoder_queue_);
|
| - // Set depending on degradation preferences.
|
| - VideoSendStream::DegradationPreference degradation_preference_
|
| - ACCESS_ON(&encoder_queue_);
|
| -
|
| - struct AdaptationRequest {
|
| - // The pixel count produced by the source at the time of the adaptation.
|
| - int input_pixel_count_;
|
| - // Framerate received from the source at the time of the adaptation.
|
| - int framerate_fps_;
|
| - // Indicates if request was to adapt up or down.
|
| - enum class Mode { kAdaptUp, kAdaptDown } mode_;
|
| - };
|
| - // Stores a snapshot of the last adaptation request triggered by an AdaptUp
|
| - // or AdaptDown signal.
|
| - rtc::Optional<AdaptationRequest> last_adaptation_request_
|
| - ACCESS_ON(&encoder_queue_);
|
| -
|
| - rtc::RaceChecker incoming_frame_race_checker_
|
| - GUARDED_BY(incoming_frame_race_checker_);
|
| - Atomic32 posted_frames_waiting_for_encode_;
|
| - // Used to make sure incoming time stamp is increasing for every frame.
|
| - int64_t last_captured_timestamp_ GUARDED_BY(incoming_frame_race_checker_);
|
| - // Delta used for translating between NTP and internal timestamps.
|
| - const int64_t delta_ntp_internal_ms_ GUARDED_BY(incoming_frame_race_checker_);
|
| -
|
| - int64_t last_frame_log_ms_ GUARDED_BY(incoming_frame_race_checker_);
|
| - int captured_frame_count_ ACCESS_ON(&encoder_queue_);
|
| - int dropped_frame_count_ ACCESS_ON(&encoder_queue_);
|
| -
|
| - VideoBitrateAllocationObserver* bitrate_observer_ ACCESS_ON(&encoder_queue_);
|
| - rtc::Optional<int64_t> last_parameters_update_ms_ ACCESS_ON(&encoder_queue_);
|
| -
|
| - // All public methods are proxied to |encoder_queue_|. It must must be
|
| - // destroyed first to make sure no tasks are run that use other members.
|
| - rtc::TaskQueue encoder_queue_;
|
| -
|
| - RTC_DISALLOW_COPY_AND_ASSIGN(ViEEncoder);
|
| -};
|
| -
|
| -} // namespace webrtc
|
| -
|
| -#endif // WEBRTC_VIDEO_VIE_ENCODER_H_
|
|
|