123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418 |
- #ifndef API_VIDEO_CODECS_VIDEO_ENCODER_H_
- #define API_VIDEO_CODECS_VIDEO_ENCODER_H_
- #include <limits>
- #include <memory>
- #include <string>
- #include <vector>
- #include "absl/container/inlined_vector.h"
- #include "absl/types/optional.h"
- #include "api/fec_controller_override.h"
- #include "api/units/data_rate.h"
- #include "api/video/encoded_image.h"
- #include "api/video/video_bitrate_allocation.h"
- #include "api/video/video_codec_constants.h"
- #include "api/video/video_frame.h"
- #include "api/video_codecs/video_codec.h"
- #include "rtc_base/checks.h"
- #include "rtc_base/system/rtc_export.h"
- namespace webrtc {
- struct CodecSpecificInfo;
- constexpr int kDefaultMinPixelsPerFrame = 320 * 180;
- class RTC_EXPORT EncodedImageCallback {
- public:
- virtual ~EncodedImageCallback() {}
- struct Result {
- enum Error {
- OK,
-
- ERROR_SEND_FAILED,
- };
- explicit Result(Error error) : error(error) {}
- Result(Error error, uint32_t frame_id) : error(error), frame_id(frame_id) {}
- Error error;
-
-
-
-
- uint32_t frame_id = 0;
-
- bool drop_next_frame = false;
- };
-
-
-
-
- enum class DropReason : uint8_t {
- kDroppedByMediaOptimizations,
- kDroppedByEncoder
- };
-
- virtual Result OnEncodedImage(
- const EncodedImage& encoded_image,
- const CodecSpecificInfo* codec_specific_info) = 0;
- virtual void OnDroppedFrame(DropReason reason) {}
- };
- class RTC_EXPORT VideoEncoder {
- public:
- struct QpThresholds {
- QpThresholds(int l, int h) : low(l), high(h) {}
- QpThresholds() : low(-1), high(-1) {}
- int low;
- int high;
- };
-
- struct RTC_EXPORT ScalingSettings {
- private:
-
-
- struct KOff {};
- public:
-
-
-
-
-
- static constexpr KOff kOff = {};
- ScalingSettings(int low, int high);
- ScalingSettings(int low, int high, int min_pixels);
- ScalingSettings(const ScalingSettings&);
- ScalingSettings(KOff);
- ~ScalingSettings();
- absl::optional<QpThresholds> thresholds;
-
-
-
-
- int min_pixels_per_frame = kDefaultMinPixelsPerFrame;
- private:
-
-
- ScalingSettings();
- };
-
- struct ResolutionBitrateLimits {
- ResolutionBitrateLimits(int frame_size_pixels,
- int min_start_bitrate_bps,
- int min_bitrate_bps,
- int max_bitrate_bps)
- : frame_size_pixels(frame_size_pixels),
- min_start_bitrate_bps(min_start_bitrate_bps),
- min_bitrate_bps(min_bitrate_bps),
- max_bitrate_bps(max_bitrate_bps) {}
-
- int frame_size_pixels = 0;
-
- int min_start_bitrate_bps = 0;
-
- int min_bitrate_bps = 0;
-
- int max_bitrate_bps = 0;
- bool operator==(const ResolutionBitrateLimits& rhs) const;
- bool operator!=(const ResolutionBitrateLimits& rhs) const {
- return !(*this == rhs);
- }
- };
-
- struct RTC_EXPORT EncoderInfo {
- static constexpr uint8_t kMaxFramerateFraction =
- std::numeric_limits<uint8_t>::max();
- EncoderInfo();
- EncoderInfo(const EncoderInfo&);
- ~EncoderInfo();
- std::string ToString() const;
- bool operator==(const EncoderInfo& rhs) const;
- bool operator!=(const EncoderInfo& rhs) const { return !(*this == rhs); }
-
-
- ScalingSettings scaling_settings;
-
-
-
-
-
-
- int requested_resolution_alignment;
-
-
-
-
-
-
-
- bool apply_alignment_to_all_simulcast_layers;
-
-
- bool supports_native_handle;
-
- std::string implementation_name;
-
-
-
-
-
-
-
-
-
-
-
- bool has_trusted_rate_controller;
-
-
- bool is_hardware_accelerated;
-
-
-
-
-
- bool has_internal_source;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- absl::InlinedVector<uint8_t, kMaxTemporalStreams>
- fps_allocation[kMaxSpatialLayers];
-
- std::vector<ResolutionBitrateLimits> resolution_bitrate_limits;
-
-
- absl::optional<ResolutionBitrateLimits>
- GetEncoderBitrateLimitsForResolution(int frame_size_pixels) const;
-
-
-
-
-
- bool supports_simulcast;
- };
- struct RTC_EXPORT RateControlParameters {
- RateControlParameters();
- RateControlParameters(const VideoBitrateAllocation& bitrate,
- double framerate_fps);
- RateControlParameters(const VideoBitrateAllocation& bitrate,
- double framerate_fps,
- DataRate bandwidth_allocation);
- virtual ~RateControlParameters();
-
-
- VideoBitrateAllocation bitrate;
-
-
-
-
- double framerate_fps;
-
-
-
- DataRate bandwidth_allocation;
- bool operator==(const RateControlParameters& rhs) const;
- bool operator!=(const RateControlParameters& rhs) const;
- };
- struct LossNotification {
-
-
- uint32_t timestamp_of_last_decodable;
-
- uint32_t timestamp_of_last_received;
-
-
-
-
- absl::optional<bool> dependencies_of_last_received_decodable;
-
-
-
-
-
-
-
- absl::optional<bool> last_received_decodable;
- };
-
-
- struct Capabilities {
- explicit Capabilities(bool loss_notification)
- : loss_notification(loss_notification) {}
- bool loss_notification;
- };
- struct Settings {
- Settings(const Capabilities& capabilities,
- int number_of_cores,
- size_t max_payload_size)
- : capabilities(capabilities),
- number_of_cores(number_of_cores),
- max_payload_size(max_payload_size) {}
- Capabilities capabilities;
- int number_of_cores;
- size_t max_payload_size;
- };
- static VideoCodecVP8 GetDefaultVp8Settings();
- static VideoCodecVP9 GetDefaultVp9Settings();
- static VideoCodecH264 GetDefaultH264Settings();
- virtual ~VideoEncoder() {}
-
-
-
- virtual void SetFecControllerOverride(
- FecControllerOverride* fec_controller_override);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- virtual int32_t InitEncode(
- const VideoCodec* codec_settings,
- int32_t number_of_cores,
- size_t max_payload_size);
- virtual int InitEncode(const VideoCodec* codec_settings,
- const VideoEncoder::Settings& settings);
-
-
-
-
-
-
- virtual int32_t RegisterEncodeCompleteCallback(
- EncodedImageCallback* callback) = 0;
-
-
- virtual int32_t Release() = 0;
-
-
-
-
-
-
-
-
-
-
-
-
- virtual int32_t Encode(const VideoFrame& frame,
- const std::vector<VideoFrameType>* frame_types) = 0;
-
-
-
- virtual void SetRates(const RateControlParameters& parameters) = 0;
-
-
-
- virtual void OnPacketLossRateUpdate(float packet_loss_rate);
-
-
-
- virtual void OnRttUpdate(int64_t rtt_ms);
-
- virtual void OnLossNotification(const LossNotification& loss_notification);
-
-
-
-
- virtual EncoderInfo GetEncoderInfo() const;
- };
- }
- #endif
|